I servomotori R/C (Radio Controlled), molto usati nella modellistica, hanno trovato un nuovo campo di utilizzo nella realizzazione di piccoli robot, come i robot esploratori. In questo articolo esamineremo le caratteristiche dei servomotori e vedremo come poterli controllare tramite un microcontrollore. Per dimostrare come sia possibile controllarli tramite un micro avente potenza di calcolo e dotazioni hardware relativamente ridotte, verrà illustrata una applicazione d’esempio in cui un PIC16F876 viene utilizzato per pilotare due servi in configurazione X-Y. Con una applicazione Windows appositamente sviluppata vedremo inoltre come pilotare i due servi tramite PC utilizzando un joystick (al seguente link un approfondimento con Arduino).
I SERVOMOTORI R/C
I servomotori R/C sono costituiti da un motore DC e da un sistema di controllo con feedback della posizione; completano l’apparato un insieme di ingranaggi ed un albero di uscita. La qualità del servo dipende fortemente dalla costruzione di tali parti meccaniche, plastiche nei modelli più economici, metalliche in quelli più costosi. Il tutto è racchiuso in un piccolo involucro dalle dimensioni standardizzate. Presentano esternamente tre collegamenti: alimentazione, massa e segnale di controllo. Vanno alimentati con una tensione dc compresa tra i 4 ed i 6V: il valore nominale è di 4.8 Vdc.
I servo sono controllati esternamente tramite impulsi di larghezza variabile. La larghezza degli impulsi varia tra un valore minimo ed uno massimo dipendenti dal modello in uso, tuttavia esiste uno standard comunemente accettato secondo cui un impulso della larghezza di 1500 ms pone l’albero del servo nella sua posizione centrale (o neutra). Gli impulsi vanno inoltre ripetuti ogni 20-30 ms. Partendo dalla posizione centrale, un impulso avente una larghezza inferiore a 1500 ms farà ruotare l’albero in senso antiorario, in maniera proporzionale alla variazione della larghezza dell’impulso. Viceversa, se l’impulso ha una larghezza superiore a 1500 ms, l’albero ruoterà in senso orario. Generalmente i servo R/C possono ruotare di circa ±90° rispetto alla posizione centrale: in questo caso la larghezza dell’impulso varierà tra i 600 ms per la posizione a -90°, ed i 2400 ms per la posizione a +90°. Tali valori non sono però standard e vanno verificati per ciascun modello di servo. Il sistema di controllo è costituito essenzialmente da un monostabile, un comparatore, un dispositivo di feedback (un potenziometro) e dal driver del motore. Il principio di funzionamento è il seguente: l’arrivo dell’impulso di controllo fa scattare il monostabile che genererà un impulso di una certa larghezza. La larghezza di questo impulso dipende dalla posizione del cursore del potenziometro: osserviamo che il cursore ruota solidamente con l’albero del motore. Quindi il comparatore riceve in ingresso due segnali: il segnale di controllo e l’impulso prodotto dal monostabile. Se i due segnali presentano larghezze differenti, l’uscita del comparatore scatterà pilotando il driver che a sua volta alimenterà il motore facendolo ruotare finchè i due impulsi non avranno la stessa larghezza. Per esemplificare, supponiamo che il motore sia inizialmente nella sua posizione centrale: facendo riferimento alla figura 1 vediamo cosa succede se gli impulsi di controllo hanno una larghezza inferiore a 1500 ms, ad esempio di 1000 ms.
All’arrivo dell’impulso di controllo, il monostabile genererà il suo impulso largo 1500 ms, dopo 1000 ms l’uscita del comparatore scatterà pilotando il driver in modo che su un polo del motore sia presente una tensione di -1V e sull’altro polo una tensione di +1 V. Il motore inizierà allora a ruotare in senso antiorario: si noti che tale tensione continuerà ad alimentare il motore finchè gli impulsi di controllo e quello del monostabile non avranno la stessa larghezza. Ricordiamo che gli impulsi di controllo si ripetono ogni 20-30 ms. Nel caso contrario, se l’impulso di controllo ha una larghezza superiore ai 1500 ms, ad esempio di 2000 ms, il monostabile genererà il suo impulso largo 1500 ms, dopo 1500 ms l’uscita del comparatore scatterà pilotando il driver in modo che su un polo del motore sia presente una tensione di +1V e sull’altro polo una tensione di -1 V. Il motore inizierà a ruotare questa volta in senso orario, finchè gli impulsi di controllo e quello del monostabile non avranno la stessa larghezza. In realtà il comparatore fornirà in uscita due segnali PWM in opposizione di fase che costituiscono i segnali di errore. Quando la differenza nella larghezza dei due impulsi (e quindi il segnale di errore) risulta inferiore ai 5 ms, il driver viene disattivato per prevenire l’oscillazione del motore. Da quanto detto, risulta che i servi R/C possono ruotare nella posizione voluta (posizionamento assoluto) con una tolleranza di ±0.5°. I servomotori R/C sono dei dispositivi attivi: ciò significa che se, per effetti dovuti al carico, la rotazione dell’albero varia, automaticamente si crea il segnale di errore che fa scattare il driver. Quindi il motore verrà alimentato in modo da generare una rotazione che si oppone al disturbo. La forza massima che il servo può esercitare corrisponde alla coppia nominale: esistono servo con coppie da 1.8 Kg*cm fino a 30 Kg*cm ed oltre. Un altro parametro che caratterizza i servo R/C è lo slew rate: il tempo necessario affinchè il servo cambi la propria posizione. Poiché il controllo riguarda la posizione del servo e non la velocità di rotazione, possiamo solo definire il caso peggiore, che corrisponde alla rotazione da un estremo all’altro. Generalmente una rotazione di 180° richiede tempi di 0.6 s per i servo con coppia di 3 Kg*cm. Più di recente sono stati introdotti sul mercato i servi R/C a controllo digitale: questi, pur essendo perfettamente compatibili con i servi analogici tradizionali, in quanto vengono pilotati nello stesso modo, presentano caratteristiche superiori. Infatti, permettono una precisione superiore nel mantenere la posizione (precisione a regime) ed hanno una coppia maggiore. Anche lo slew rate è migliore. Sono controllati da un microcontrollore e possono essere programmati, permettendo di variare l’escursione massima, la posizione centrale e l’ampiezza della zona centrale, la velocità di rotazione. Permettono inoltre di stabilire una posizione di sicurezza (fail-safe). Hanno un costo all’incirca doppio rispetto ai servi analogici di coppia corrispondente. Un’altra introduzione recente è quella di servi R/C con rotazione completa a 360°: sono particolarmente utili per applicazioni robotiche in quanto possono essere utilizzati anche per la trazione del robot stesso. In effetti per ottenere ciò sono dotati di driver potenziati in modo da poter alimentare il motore con continuità (normalmente i servi con rotazione <360° devono alimentare il motore solo per brevi periodi). Questi servi permettono inoltre di variare la velocità di rotazione.
Confronto con motori DC dotati di encoder incrementale
Una possibile alternativa all’uso dei servomotori R/C è costituita dai motori DC dotati di encoder incrementale. L’encoder è costituito da un disco solidale con il motore che presenta due serie di tacche lungo la sua circonferenza, sfasate tra loro di 90° (cioè sono in quadratura). Mediante un sistema ottico, si è in grado di rilevare la velocità ed il verso di rotazione del motore. Quindi, tale tipo di servo risulta più adatto al controllo di velocità piuttosto che di posizione. Infatti, sebbene sia possibile determinare delle variazioni di posizione, diversamente dai servo R/C non è possibile determinare la posizione assoluta dell’albero. Per pilotare un servo di tale tipo è necessario almeno un segnale PWM per ogni motore. L’alimentazione del motore va effettuata tramite un driver esterno, normalmente un H-bridge, ad esempio i noti L293 o L298 di ST Microelectronics. Per quanto riguarda la decodifica del segnale prodotto dall’encoder, questa può essere effettuata via firmware, oppure utilizzando un apposito modulo QEI (Quadrature Encoder Interface) nei micro che ne siano provvisti. In questo caso è possibile usare un micro della famiglia PIC18Fxx31 od un più potente dsPIC30F/33F della serie Motor Control. Infine, è necessario implementare nel firmware un controller ad anello chiuso. I controller più usati sono i PID (Proporzionale – Integrale – Derivativo) o delle sottocategorie. Ricordiamo che il controller deve essere progettato per garantire le proprietà di precisione, stabilità e robustezza di un sistema ad anello chiuso, diversamente il sistema può entrare facilmente in oscillazione: perciò è necessario conoscere esattamente le caratteristiche fisiche del motore utilizzato o procedere ad una rilevazione sperimentale delle caratteristiche del sistema di controllo. Un sistema di controllo di tale genere può arrivare a richiedere fino al 90% delle capacità di elaborazione di un PIC16F876 per un solo motore, mentre lo stesso micro è in grado di pilotare facilmente una decina di servo R/C.
CONTROLLO DI DUE SERVOMOTORI R/C CON PIC16
Verrà illustrata una applicazione d’esempio in cui un PIC16F876 viene utilizzato per pilotare due servi in configurazione X-Y. Con una applicazione Windows appositamente sviluppata, vedremo inoltre come pilotare i due servi tramite PC utilizzando un joystick. Il PIC sarà comandato dal PC tramite un collegamento seriale RS232. Potremmo utilizzare tale sistema ad esempio per controllare l’orientazione di una telecamera: l’asse X del joystick controllerà il brandeggio e l’asse Y l’elevazione della stessa.
L’hardware del controllo
L’hardware dell’applicazione si basa sull’uso del microcontrollore Microchip PIC16F876 (Al seguente link un approfondimento). Si tratta di un micro RISC ad 8 bit molto diffuso, equipaggiato con una memoria FLASH da 8k x 14bit e 368 Byte di RAM. Possiede inoltre 256 bytes di EEPROM, molto utile per memorizzare dati di calibrazione (ad esempio i valori delle posizioni estreme e centrale dei servi). Tra le periferiche in dotazione annovera 3 timer, 2 moduli CCP (Capture/Compare/PWM), una interfaccia USART (Universal Synchronous/Asynchronous Receiver Transmitter) ed una SPI/I2C (Serial Peripheral Interface/Inter-Integrated Circuit). Nella descrizione dello schema che seguirà faremo riferimento alla figura 2.
I due servomotori SM1 ed SM2 sono collegati rispettivamente ai pin 12 (RC1) e 13 (RC2) del PIC: da questi pin verranno emessi i segnali di controllo che abbiamo descritto. Come servi potremo usare gli Hitec HS-422HD, accreditati di una coppia di 3.3 Kg*cm @ 4.8 Vdc, con una velocità di 180° di rotazione in 0.63s. Ugualmente bene andranno i Futaba S3003 o altri servi simili. Il clock del sistema viene generato tramite il quarzo da 4MHz collegato tra i pin 9 e 10 (OSC1 e OSC2). Utilizzeremo il modulo USART per collegare il micro ad una interfaccia RS232: al pin 18 avremo il segnale RX ed al pin 17 il segnale TX. L’integrato MAX232 di Maxim Integrated viene utilizzato per convertire i livelli TTL usati dal PIC nei livelli RS232. Ricordiamo infatti che lo standard RS232 (EIA/TIA-232E) prevede due segnali con ampiezza minima di -5V per il livello 1 e di +5V per il livello 0. Il MAX 232 genera le tensioni di ±10V necessarie per il driver RS232 a partire da una sola tensione di alimentazione di 5V, grazie a due generatori di tensione a pompa di carica. I condensatori elettrolitici C1-C4 sono usati da tali generatori. Tramite il connettore DB9 potremo collegare il nostro sistema all’interfaccia RS232 del PC. Qualora sul PC non fosse disponibile una RS232 (come ad esempio sui portatili di costruzione recente) potremo usare un qualsiasi convertitore USB-RS232. Per alimentare il sistema servirà un alimentatore in grado di erogare una tensione di 5Vdc stabilizzati con una corrente max di circa 1A, se utilizzeremo i servi proposti.
Il firmware
Per generare i due segnali di controllo abbiamo diverse alternative: le principali consistono nell’uso dei moduli PWM o nell’uso diretto dei timer del PIC. Il PIC16F876 possiede due moduli PWM, denominati CCP1 e CCP2: il periodo di ripetizione degli impulsi è determinato dal Timer2, mentre il duty cycle (la parte di larghezza variabile degli impulsi), dai registri CCPR1L:CCP1CON<5:4> e CCPR2L:CCP2CON<5:4>.
Potremmo allora usare i moduli PWM per pilotare i servi in maniera analoga al controllo di un motore DC, senza dover neanche ricorrere a delle routine di interrupt (i registri del modulo PWM si ricaricano da soli alla fine del duty cycle, così come il Timer2). Purtroppo però, alla frequenza di clock di 4MHz, il Timer2 deve scattare al massimo ogni 4ms circa (ricordiamo che gli impulsi andrebbero ripetuti ogni 20-30 ms): ciò determina un sovraccarico del servo che ne può comportare la distruzione. Potremmo abbassare la frequenza di clock, ma per ottenere una risoluzione sufficiente nel duty cycle, sarebbe necessario usare un clock inferiore al MHz, cosa che ci lascerebbe ben poco tempo per far effettuare al PIC altri task. Opteremo allora per l’uso diretto dei timer del PIC, oltretutto in tal modo saremo in grado di controllare più di 2 servi, se occorre. Nell’utilizzo dei timer siamo di fronte ancora una volta a due alternative: pilotare i servi emettendo i segnali di controllo in contemporanea o in sequenza. La prima scelta però imporrebbe di far scattare la routine di interrupt del timer che genera la parte variabile dell’impulso ogni 10-15ms, limitando anche in questo caso la possibilità di eseguire altri task. Sceglieremo allora di emettere i due segnali in sequenza. All’accensione del PIC viene eseguita la routine RESET nella quale vengono effettuate le inizializzazioni del micro: porte I/O, opzioni del Timer0 del PIC, ed altro. Viene quindi richiamata la routine UARTINIT, che provvede alla inizializzazione dell’UART. L’UART viene settato a 9600 baud, 8 bit dati e 1 bit di stop, senza parità. Quindi viene richiamata la routine RCSERVO: è la routine principale che si occupa di impostare i timer e gestire la ricezione dei dati ricevuti tramite la RS232. Nella descrizione del firmware seguente faremo riferimento al flow chart in figura 3.
In questa routine vengono innanzitutto eseguite le necessarie inizializzazioni ed abilitati gli interrupt. Successivamente viene settato il Timer0 impostando un tempo di 20ms e viene attivato l’interrupt del timer. Il blocco successivo setta Timer2 impostando un tempo corrispondente alla posizione centrale del Servo 1. Timer2 è un timer ad 8 bit (impostato tramite il registro PR2), con un prescaler ed un postscaler. Il periodo del Timer2 viene calcolato come segue:
[(PR2) + 1] * 4 * Tclock * (Timer2 prescale value)
Impostando il prescaler a 1:16, il timer incrementa a passi di 16 ms, per cui la posizione iniziale del servo, che corrisponde ad un impulso di 1500 ms, darà un valore di PR2 pari a:
PR2=1500/16-1=93.
Viene quindi attivato il servo SM1 ponendo ad 1 il pin RC1, dopodichè si attiva l’interrupt del Timer2. Il ciclo successivo effettua il polling del flag che indica la ricezione di un dato tramite l’UART: se il flag è attivo, viene attivata la ricezione dei dati di posizione relativi ai servi SM1 ed SM2 e vengono aggiornate le variabili S1PULSE ed S2PULSE. Queste variabili saranno usate dalle routine di interrupt dei timer per modificare la larghezza degli impulsi di controllo. Al valore ricevuto via RS232 viene sommato un numero fisso pari a 30, corrispondente alla larghezza minima dell’impulso di 500 ms. L’impulso può variare tra 500 e 2500 ms, che corrispondono ad una rotazione tra -100° e +100°; se l’impulso è più breve del minimo supportato dal servo, questo continua ad alimentare il motore mantenendolo nella posizione estrema. Analogamente se l’impulso è più lungo del massimo supportato. Si può ovviare a ciò modificando opportunamente il codice. Vediamo ora il diagramma di flusso della routine di interrupt del Timer2, TIMER2ISR. Facciamo riferimento al flow chart in figura 4.
Questa routine viene richiamata la prima volta allo scadere dell’impulso di controllo del servo SM1, cioè dopo 1500 ms. Se è la prima volta che la routine viene richiamata, viene disattivato il servo SM1 ponendo a 0 il pin RC1, quindi viene settato il Timer2 con il valore di S2PULSE e viene riattivato l’interrupt. Infine viene attivato il servo SM2 ponendo ad 1 il pin RC2. Se invece è la seconda volta che la routine viene richiamata, viene disattivato il servo SM2 e viene disattivato anche il Timer2. Vediamo infine il diagramma di flusso della routine di interrupt del Timer0, TIMER0ISR. Facciamo riferimento al diagramma di flusso in figura 5.
Questa routine viene richiamata allo scadere dei 20 ms del ciclo di ripetizione degli impulsi. Il Timer0 viene nuovamente settato per un’altro ciclo di 20 ms, e viene riattivato l’interrupt dello stesso. Poiché l’interrupt del Timer0 scatta dopo che il Timer2 ha effettuato due cicli (con cui vengono controllati i servi SM1 ed SM2), sarà ora necessario riattivare Timer2. Timer2 viene allora settato con il valore di S1PULSE, il servo SM1 viene riattivato ponendo ad 1 il pin RC1, ed infine viene attivato nuovamente l’interrupt di Timer2. Alla successiva invocazione di Timer2 questo ricomincerà i due cicli descritti in precedenza. Nel listato 1 è riportata la routine principale del firmware, RCSERVO.
RCSERVO ;*****ABILITA GLI INTERRUPT PER LE PERIFERICHE****** BSF INTCON,PEIE ; ABILITA GLI INTERRUPT (GIE) BSF INTCON,GIE ; INIZIALIZZAZIONE VARIABILI CLRF BUFFER MOVLW D’93’ ; INIZIALIZZA SERVO1 PR2=93=>1500 us BANKSEL DUMMY_VAR MOVWF S1PULSE MOVWF S2PULSE ; INIZIALIZZA SERVO2 PR2=93=>1500 us ;————————————————————————————— ;1) SETTA TIMER0 A 20 ms ED ATTIVA INTERRUPT ;INTERRUPT: ALLO SCADERE RIATTIVA SERVO1 E TIMER2 CON I ;DATI DEL SERVO1 ;—————————————————————————————;PERIODO DI RIPETIZIONE DEGLI IMPULSI: 20ms (USA TIMER0) ;setta i registri di timer0, abilita interrupt (T0IE) ;20 ms @ 4MHz: prescaler=/128 (n=6), timer VALUE=256-156 ;TMR0=VALUE MOVLW D’100’ MOVWF TMR0 BANKSEL OPTION_REG MOVFW OPTION_REG ANDLW B’11000000’ ; MANTIENE BIT 7:6 IORLW B’00000110’ ; SETTA I BIT 5:0 MOVWF OPTION_REG ; CON INTERRUPT BANKSEL INTCON BCF INTCON,T0IF BSF INTCON,T0IE ; ORA L’INTERRUPT E’ ABILITATO! ;————————————————————————————— ; 2) SETTA TIMER2 a (FISSO+VAR.)*16 us (SERVO1) ; ED ATTIVA INTERRUPT ; ATTIVA SERVO 1 ;————————————————————————————— ;[(PR2) + 1] * 4 * Tck * PRESCALE = ;[(FISSO+VAR.) + 1] * 4 * ; 0.25 * 16 us ; FRONTE SALITA IMPULSO MOTORE BSF PORTC,RCPULSE ; pone RCPULSE=1 MOVLW D’93’ ; posizione iniziale 1500 us BANKSEL PR2 MOVWF PR2 ; TMR2 prescale=16, TMR2 ON MOVLW B’00000110’ BANKSEL T2CON MOVWF T2CON BCF TIMER2OVER,OVER ; ORA OVER VA DISATTIVATO ; ATTIVA INTERRUPT DEL TIMER2 BANKSEL PIR1 BCF PIR1,TMR2IF ; resetta il flag BANKSEL PIE1 BSF PIE1,TMR2IE ; ORA L’INTERRUPT E’ ABILITATO! ;————————————————————————————— ;3) ABILITA UART, POLLING RICEZIONE ED AGGIORNAMENTO ; PARTE VAR. IMPULSO ;————————————————————————————— ; ATTIVAZIONE UART PER RICEZIONE DATI DI CONTROLLO ; BUFFER->CARATTERI RICEVUTI, NUM. CARATTERI=2->NUARTCHAR MOVLW D’2’ BANKSEL DUMMY_VAR MOVWF NUARTCHAR BANKSEL RCSTA BSF RCSTA,CREN ; ABILITA LA RICEZIONE ; LOOP DI CONTROLLO RICEZIONE DATI DA UART RCSERVOLOOP ; CONTROLLA SE L’UART HA RICEVUTO CARATTERI BTFSS PIR1,RCIF GOTO RCSERVOLOOP ; rifa’ il ciclo ;(I) BUFFER: VALORE RITORNATO CALL UARTRXRC1 ; ROUTINE DI LETTURA DATI UART ; AGGIORNAMENTO S1PULSE: PARTE VARIABILE IMPULSO SERVO 1 ; LETTURA BUFFER MOVFW BUFFER ADDLW D’30’ ; aggiunge il valore fisso => 500 us BANKSEL DUMMY_VAR MOVWF S1PULSE ; NUOVO VALORE della posizione ; AGGIORNAMENTO S2PULSE: PARTE VARIABILE IMPULSO SERVO 2 ; LETTURA BUFFER MOVFW BUFFER+1 ADDLW D’30’ ; aggiunge il valore fisso => 500 us MOVWF S2PULSE ; NUOVO VALORE della posizione MOVLW D’2’ ; N. DI CARATTERI DA RICEVERE MOVWF NUARTCHAR BANKSEL RCSTA BSF RCSTA,CREN ; ABILITA LA RICEZIONE GOTO RCSERVOLOOP ; rifa’ il ciclo RETURN
Listato 1 |
L’applicazione per PC
Con l’applicazione Windows, è possibile pilotare i due servi tramite PC utilizzando un joystick. Come abbiamo visto, il PIC sarà comandato dal PC tramite un collegamento seriale RS232. Nella finestra di dialogo dovremo selezionare una porta COM libera da utilizzare, avendo cura di scegliere una porta disponibile sul PC. Se non si è sicuri di quale porta COM è installata sul PC, lo si può verificare aprendo il Pannello di controllo e selezionando: Sistema>Hardware>Gestione periferiche: alla voce Porte (COM e LPT) saranno indicate le porte COM installate. Nella figura 6 è raffigurata l’operazione di selezione della porta. Potremo osservare che muovendo il joystick compariranno le posizioni in gradi dei due servi, come è raffigurato nella figura 7.
Al posto del joystick si potrà usare una qualunque altro dispositivo di puntamento assoluto, come ad esempio un gamepad. Nel caso in cui la comunicazione si interrompa, il programma terminerà automaticamente dopo una decina di secondi.
I servomotori sono dispositivi meccanici di piccola potenza molto utilizzati nella realizzazione di robot di dimensioni modeste con cui effettuare rotazioni o evitare ostacoli come i robot car. Non solo in modo continuativo ma anche con rotazioni complete a 360 gradi e a diversa velocità.
Rappresentano il cuore di ogni sistema robotico. In linea generale la tecnologia di costruzione è semplice, ma tutta l’elettronica di controllo svolge un ruolo importante per poter gestire sistemi di feedback.
Ciao Maurizio,
Sono previsti degli shield Espertino per pilotare dei servi? O essendo Arduino-compatible
si possono usare quelli?
Essendo arduino compatibile si possono usare le shield di Arduino…
Oltre alla robotica, un altro settore in cui i servomotori sono molto diffusi è il modellismo (aerei, elicotteri, navi, rover, ecc.). E’ sicuramente un tipo di applicazione in cui il PWM dimostra tutta la sua efficacia.
Come mai la scelta del PIC16F876? E’ sicuramente un micro diffuso e dal costo contenuto ma salendo di fascia, si possono trovare dei PIC molto interessanti per il controllo dei motori e servomotori.
E’ il micro consigliato da Microchip in una specifica Application Note, ed anche uno dei più diffusi.
Molto interessante l’articolo sui servomotori R-C impostato su un’applicazione di esempio. Oltre ad essere utile come guida per chi volesse realizzaee un proprio progetto, l’articolo è didatticamente più potente del mero articolo informativo. Brava Redazione!
In che ambiente avete compilato l’ASSEMBLER allegato? Lo chiedo perche’ magari l’utente “medio” ha piu’ esperienza sull’IDE MPLABX per PIC che e’ gratuito, lavorando quindi in C, piuttosto che direttamente in ASSEMBLER.
Anche con MPLAB X riesci a compilare l’assembler.
Grazie della info, lo immaginavo. ma non ho mai provato a farlo. Mi chiedevo appunto se l’autore avesse usato questo ambiente per sviluppare l’articolo.
Articolo interessante, in rapporto grandezza/potenza come li vedete i motori brushless, è un tipo di motore su cui piacerebbe iniziare a metterci le mani
Articolo molto utile sopratutto per la parte dedicata alla descrizione del funzionamento dei servo.
Per quanto riguarda il progetto del controller, ormai si trovano moduli già completi e a prezzi molto contenuto che permettono il controllo di un numero di servo anche elevato.
Per quanto riguarda l’interfaccia con il PIC avrei preferito direttamente la gestione tramite USB, per evitare un convertitore, dato che la RS232 è ormai scomparsa dai PC.