Pilotare un motore brushless con ESC e Arduino

Ciao a tutti!



Dato che mi sto interessando al mondo dei droni e ad alcuni progetti che necessitano di un motore dalle elevate prestazioni,
ho iniziato a smanettare con due componenti molto conosciuti dagli aeromodellisti:
i motori brushless e gli ESC.



Partiamo dalla definizione di motore brushless:



"Il motore brushless ("senza spazzole") è un motore elettrico a corrente continua con il rotore a magneti permanenti e lo statore a campo magnetico ruotante. A differenza di un motore a spazzole non ha quindi bisogno di contatti elettrici striscianti (spazzole) sull'albero motore per funzionare. La commutazione della corrente circolante negli avvolgimenti dello statore, e quindi la variazione dell'orientamento del campo magnetico da essi generato, avviene elettronicamente."
(da Wikipedia, "Motore brushless")



Quindi il motore brushless deve essere pilotato da un dispositivo elettronico che generi "una commutazione della corrente circolante negli avvolgimenti dello statore",
questo dispositivo si chiama ESC (Electronic Speed Control).



Ecco un semplice ESC:




Come potete vedere ha vari cavi, i tre cavi rossi nella parte superiore sono quelli per il collegamento col motore, il rosso e nero in basso servono per il collegamento con la batteria, mentre al connettore a 3 contatti collegherò la centralina per il controllo della velocità del motore (in questo caso il mio Arduino)



Ed ecco ora il classico video di esempio, nel quale controllerò un motore brushless di una certa potenza (lo devo tenere con una tenaglia) regolandone la velocità con un potenziometro collegato ad Arduino.




Realizzare tutto questo è relativamente semplice, vi basterà realizzare il tutto seguendo lo schema elettrico qui sotto e caricare lo sketch che trovate in seguito (la guida va bene anche per ESC e motori di diverse dimensioni).



Ecco lo schema, per alimentare Arduino ho lasciato collegato il cavo usb al pc, ma se volete utilizzare il vostro progetto alimentando il tutto con la batteria al litio vi basterà collegare anche il cavetto rosso che arriva dall'ESC (nel disegno sotto è scollegato) al pin 5V di Arduino, ma fate attenzione che sul vostro ESC ci sia scritto BEC 5V e non valori di tensione più alti perchè altrimenti rischierete di friggere il vostro Arduino.



Ed ecco lo sketch da caricare nel vostro Arduino,
come potrete vedere il motore verrà controllato in PWM sfruttando la libreria "Servo",
ruotando il potenziometro si avrà un aumento di giri del motore, infatti il valore letto sul pin A0 verrà scalato con la funzione "map" e convertito in PWM sul pin 9.


  1. #include <Servo.h>
  2. int potpin = A0;
  3. int val;
  4. Servo motor_1;
  5. void setup()
  6. {
  7.   motor_1.attach(9);
  8.   Serial.begin(9600);
  9.   delay(10000);
  10. }
  11. void loop()
  12. {
  13.   val = analogRead(potpin);            
  14.   val = map(val, 0, 1023, 0, 180);
  15.   motor_1.write(val);                  
  16. }


Se avete problemi nella regolazione della velocità del motore (ad esempio il motore inizia a girare solo quando avere ruotato quasi tutto il potenziometro) è probabile che dobbiate eseguire la taratura del vostro ESC (grazie a +Massimo per questa dritta)
Per fare questo la procedura da seguire è questa:

- Collegate l'Arduino, il potenziometro e l'ESC come nello schema sopra (il motore e la batteria lasciateli scollegati)
- Alimentate l'Arduino (ad esempio con il cavo usb) e ruotate il potenziometro nella posizione massima
- Alimentate l'ESC collegandolo alla batteria lipo, a questo punto l'ESC dovrà emettere dei beep.
- Ora ruotate il potenziometro nella posizione minima (si dovranno sentire altri segnali acustici)
- Scollegate la batteria lipo, a questo punto il vostro ESC sarà calibrato



L'ultimo consiglio che vi voglio dare è di fare molta attenzione nell'acquisto dei componenti, infatti le batterie al litio hanno una tensione nominale per ogni cella di 3.7 Volt.
In commercio troverete batterie con valori multipli di 3.7, questo valore viene identificato con la lettera "S", ad esempio se trovate una batteria "3S" avrà una tensione nominale di 11.1Volt (3.7 x 3).
Ovviamente tutti i componenti dovranno essere compatibili tra loro, quindi anche ESC e motore dovranno supportare la tensione fornita dalla batteria.



Finito! se avete dubbi o domande lasciate pure un commento qui sotto, cercherò di rispondervi al più presto, ciao!

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

33 commenti:

  1. Ciao, articolo interessante, volevo farti una domanda da niubbo questo utente esegue una modifica hardware nel syma x8, per quanto riguarda il software secondo te bisogna seguire questa tua procedura? Grazie.

    RispondiElimina
  2. E' possibile prelevando il segnale da uno dei tre fili di alimentazione del brushless, contare i giri?

    RispondiElimina
    Risposte
    1. Ciao, bella idea, non ci avevo mai pensato, in effetti dovrebbe uscire una sorta di sinusoide, quindi leggendo il picco di tensione potresti contare un giro. Sicuramente la tensione sarebbe troppo alta per entrare direttamente su un pin di Arduino potresti abbassarla con un partitore di tensione.
      Che dire, prova! se poi ti va facci sapere, potrebbe tornare utile a molti. Ciao

      Elimina
    2. Ho intenzione di prendere Arduino e provarci, ma parto completamente da zero.
      In questo momento non ho la più pallida idea su come fare... :-)

      Elimina
    3. Ciao ragazzi anche io vorrei controllare il motore e sapere quanti RPM sta facendo. È possibile farlo solo con un encoder ?

      Elimina
    4. Its possible. If it's on the same board then a pontential divided circuit may be ok. But if using separate board you will need a virtual ground.

      Elimina
  3. ma quindi una volta collegato ad arduino si comanda come un normale servo motore? comunque bellla guida mi è stata utile.

    RispondiElimina
    Risposte
    1. grazie, si in base al valore che gli dai girerà piú o meno velocemente in una direzione o nell'altra. Ciao!

      Elimina
    2. grazie mille mi sei stato molto utile

      Elimina
  4. Ciao, grazie per aver pubblicato questo articolo....mi chiedo: quando trovato (tramite il potenziometro) la velocità con cui voglio far girare il motore, potrei utilizzare un semplice switch per accenderlo e spegnerlo? grazie

    RispondiElimina
    Risposte
    1. Certo, scriverai al posto di "motor_1.write(val);" il valore trovato in un range tra 0 e 180, es "motor_1.write(150);" ovviamente non sempre ma solo se il contatto è chiuso. Ciao!

      Elimina
  5. ciao,
    vorrei sapere che modello devo prendere di esc, motore e batterie da usare su arduino uno r3.
    Grazie in anticipo,
    Alberto

    RispondiElimina
    Risposte
    1. ciao, Arduino controlla l'esc tramite il cavo di segnale, non gestisce la parte di potenza. Quindi non fa differenza la potenza del motore o il tipo di batteria (a meno che non la colleghi anche all'arduino).

      Elimina
    2. quindi mi dovrebbe interessare solo l'esc. Quello che hai mostrato sopra va bene?

      Elimina
  6. Ciao
    volessimo usare un telecomando con ricevente (segnale analogico) da collegare ad Arduino anzichè il potenziometro, si riuscirebbe a far funzionare il motore utilizzando lo stesso programma?
    Grazie in anticipo
    Luca

    RispondiElimina
    Risposte
    1. Si, basta che il segnale analogico abbia un range 0-5volt

      Elimina
  7. Mi hanno consigliato di comprare questo telecomando (vedi link) per comandare questo motore brushless con Arduino:
    https://hobbyking.com/en_us/hobby-king-2-4ghz-4ch-tx-rx-v2-mode-1.html

    Sapresti dirmi se potrebbe andare bene e nel caso in cui non sia così sapresti consigliarmene uno con ricevente in grado di darmi un segnale analogico con un range da 0 a 5V?
    Scusa ma ho un po' di problemi a capire dove riesco a trovare queste caratteristiche (range di tensione e tipo di segnale d'uscita) :)
    Grazie in anticipo
    Luca

    RispondiElimina
    Risposte
    1. Quel modello specifico non saprei, però questo l'ho provato personalmente e va bene.
      http://www.danielealberti.it/2016/09/arduino-radiocomandato.html
      ciao!

      Elimina
    2. Ciao Daniele Alberti posso chiedere a te che tu ne capisci per aumentare l' efficenza la velicit di due motori elettrici da 48 v che schema dovrei usare e quale arduino ed esc

      Elimina
  8. Perché hai usato la libreria servo per scrivere sull'output? Non andava bene una semplice analoglWrite?

    RispondiElimina
  9. ciao, visto che sono a zero in questo argomento, mi potresti dare una mano a costruire un aggeggio simile con l'aggiunta di inversione di rotazione del motore tramite un pulsante.
    fammi sapere. ciao

    RispondiElimina
  10. Ciao Daniele, complimenti per la guida. Avrei una domanda: ho un motore brushless che funziona a 11.1V,e un Arduino nano, la batteria devo prenderla da 14.8 (11.1v + 3.3 di Arduino)? Grazie a chi risponderà.

    RispondiElimina
    Risposte
    1. Ciao, no la batteria deve essere 11.1 (3 celle) devi però comprare un ESC con un'uscita apposita per alimentare la scheda (sono piuttosto comuni). Ciao

      Elimina
    2. Ciao scusa, il progetto funziona, ma ho un problema, gli esc si riscaldano subito, e il tutto è alimentato con 12 volt e 3 amo, sapresti dirmi come fare per evitare che si surriscaldino?

      Elimina
  11. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  12. ciao premetto che sono un profano in materia di elettronica quindi molto probabilmente la mia domanda ti sembrera stupida,ho una centralina collegata a 2 motiri quelli delle motine elettriche da bambino tipo peg perego.una volta collegato batteria motore ecc. funziona tutto con il potenziometro della centralina,ma quando provo a collegare ai fili del potenziometro l acceleratore a manopola e accendo la moto parte non sentendo la manopola ,dove sta il problema

    RispondiElimina
  13. Ma il verso di rotazione come faccio a cambiarlo?

    RispondiElimina
  14. Io ho seguito le istruzioni ma il motore si blocca dopo pochi giri, devo attendere un po' per farlo ripartire, fa qualche giro e si blocca nuovamente...

    RispondiElimina
  15. Ciao, dei domande:
    1) posso usare un alimentatore invece che le.batterie?
    2) posso invertire il senso di rotazione oppure è unidirezionale?

    Grazie

    RispondiElimina
  16. ciao, ottimo tutorial !
    è possibile comandare due motori contemporaneamente?

    RispondiElimina
  17. salve ! questo e proprio quello che riguarda il mio progetto , solo un piccolo dettaglio vorrei sapere per favore , vorrei aggiungere due switch momentanei uno per la massima velocità e l altro regolabile con potenziometro o settanta da un valore medio, come posso fare? sia nel collegamento dei due interruttori sia nello sketch, grazie molto

    RispondiElimina
  18. Ciao Interessante il tuo articolo. E' passato oltre 1 anno dalla sua pubblicazione.
    Mi chiedo se hai fatto prove anche con i motori Brushless per gimbal.
    Quindi a giri bassisimi, magari pilotato da un encoder rotativo.

    RispondiElimina
  19. Complimenti per l'articolo!
    Non sono afferratissimo con gli sketch e non riesco a capire perché l'IDE continua a darmi questo errore:

    Arduino:1.8.10 (Windows 10), Scheda:"Arduino/Genuino Uno"

    avr-gcc: error: CreateProcess: No such file or directory

    Più di una libreria trovata per "Servo.h"
    Usata: C:\Users\sergi\Desktop\Workshop\arduino-1.8.10\libraries\Servo
    exit status 1
    Errore durante la compilazione per la scheda Arduino/Genuino Uno.

    Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
    "Mostra un output dettagliato durante la compilazione"
    in "File -> Impostazioni"


    Grazie mille

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post