10
IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 1 Materiale didattico L2 CORSO L2 ARDUINO UNO Scheda Hardware & Software 2 – Motore in continua Schede controller

CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 1 Materiale didattico L2

CORSO L2 ARDUINO UNO

Scheda Hardware & Software

2 – Motore in continua

Schede controller

Page 2: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 2 Materiale didattico L2

Indice Panoramica sulle tipologie di motori elettrici

Motore passo-passo (step motor)

Motori DC brushless

Motori DC per muovere un robot

Specifiche tecniche del motore a due assi 6V DC Smart-Car

Connessioni del motore con un Transistor (e prova con Arduino)

Con transistor e regolazione di velocità

Motore DC pilotato da un ponte H

Shield Arduino Motor R3

Panoramica sulle tipologie di motori elettrici I motori elettrici rappresentano uno dei più comuni ed usati attuatori anche nei progetti realizzati con Arduino. I motori danno movimento a innumerevoli applicazioni in cui è necessario generare un movimento rotatorio. Con semplici dispositivi meccanici è poi facile trasformare anche il movimento rotatorio in altri tipi di movimento. Di motori elettrici possiamo distinguere 2 principali categorie:

Motori alimentati in corrente continua DC, che possono essere con o senza spazzole (brushless), oppure passo-passo (chiamati anche stepper)

Motori alimentati in corrente alternata AC, che possono essere sincroni o asincroni

Motore passo-passo E’ un tipo di motore molto usato, è può essere tranquillamente essere pilotato da Arduino. Quando si pensa ad un progetto, resta più difficile comprendere quando è il caso di preferire tale tipo di motore, rispetto a quelli in corrente continua. Il motore passo-passo spesso chiamato anche step o stepper è un motore elettrico sincrono in corrente continua senza spazzole che può suddividere la propria rotazione in un grande numero di step. La posizione del motore può essere controllata accuratamente senza dover ricorrere al controllo ad anello chiuso (feedback) se la taglia ed il tipo di motore sono scelti in modo adeguato all’applicazione. Trovano il loro miglior impiego nei progetti in cui hai bisogno di controllare in modo accurato la posizione dell’albero. Alcuni esempi:

stampanti 3D

macchine a controllo numerico o Cnc

robotica per controllo bracci

dolly photo e photo lazy (in ambito di riprese cinematografiche) In pratica si ricorre ad un motore passo-passo tutte le volte che in un progetto serve sapere la posizione meccanica del pezzo senza l’utilizzo di altri sensori o sistemi di verifica. In un motore passo passo le caratteristiche sono fornite dal costruttore: quale è il numero di passi che il motore impiega a compiere 360°, di conseguenza si può ricavare l’angolo percorso ad ogni passo ( 360°/passi ) per cui in un Dolly Photo in cui imposti il numero di passi da eseguire prima di ogni scatto puoi lasciar lavorare la macchina fotografica e conoscere in qualsiasi momento quanti scatti sono stati eseguiti semplicemente sapendo quanti passi ha già fatto.

Page 3: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 3 Materiale didattico L2

Motori DC brushless I motori brushless sono i motori in continua senza spazzole. La loro costituzione prevede che il campo magnetico sia generato sul rotore mentre sullo statore viene fissata l'armatura. L'accoppiamento collettore-spazzole viene sostituito da un commutatore elettronico che inverte la polarità della alimentazione per ogni mezzo giro (180°) effettuato dal rotore; l'eliminazione di questo sistema rende questo tipo di motore meno rumoroso e di più semplice manutenzione rispetto a quello ad eccitazione indipendente. La posizione del rotore rispetto allo statore viene rilevata da

un sensore magnetico che comanda la tensione di alimentazione degli avvolgimenti dello statore in funzione della posizione del campo generato dal rotore. La tensione erogata dal sensore è massima quando le linee di flusso del campo sono perpendicolari alla superficie del sensore; in tale circostanza, la polarità della tensione si inverte, invertendo il campo. Come nel caso del motore ad eccitazione indipendente si ha una inversione di corrente negli avvolgimenti di armatura ad ogni 180° di rotazione del rotore. In figura è riportato uno schema bipolare dove vi è un unico avvolgimento statorico (unipolare) che assume due polarità magnetiche opposte a secondo del verso di percorrenza della corrente erogata dai due amplificatori di potenza (norton) che eseguono la commutazione (fra le loro due tensioni di saturazione inferiore e superiore) comandati dal circuito di controllo, collegato al sensore. Uno schema bipolare, non garantisce una coppia uniforme e viene realizzata solo per piccoli motori a coppia costante, come le ventole dei computer o i motori-driver dei dischi.

Motori DC per muovere un robot I motori a corrente continua (DC dall'inglese direct current) sono alimentati solo da una copia di fili (positivo e negativo). All’interno è presente una parte che gira detta rotore o armatura, e una parte fissa che genera un campo magnetico (nell’esempio i due magneti colorati) detta statore. Un interruttore rotante detto commutatore o collettore a spazzole inverte due volte ad ogni giro la direzione della corrente elettrica che percorre i due avvolgimenti generando un campo magnetico che entra ed esce dalle parti arrotondate dell’armatura. Nascono forze di attrazione e repulsione con i magneti permanenti fissi. Le spazzole comportano però una dissipazione di energia. In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo si usano uno o più componenti di collegamento che permettono di pilotare in modo opportuno il motore: può essere un transistor di potenza, oppure un ponte H . I motori alimentati in corrente continua sono particolarmente indicati nei progetti in cui occorre:

la rotazione continua

360° di movimento continuo

elevata velocità o coppia ( motoriduttori )

controllare la velocità di rotazione

Page 4: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 4 Materiale didattico L2

In pratica con un motore in corrente continua si possono realizzare:

le ruote di un robot;

un azionamento meccanico mediante trasmissione a cinghia o ruote dentate;

uno slider per telecamera;

una avvolgi tenda o tapparella;

Specifiche tecniche del motore a due assi 6V DC Smart-Car Adatto in modo particolare per giocattoli elettronici, robot e modellismo. Può essere alimentato con una tensione variabile tra 3 e 6 V. Naturalmente questo determina pure una variazione del numero di giri al minuto dell’asse del motore. Materiale: plastica gialla Dimensioni: 7.1 x 2 x 2.1 cm Tipologia: Motore a velocità variabile biassiale, con protezione anti-interferenza

Tensione a vuoto senza carico velocità a vuoto Alimentazione 6V giri al minuto 200 ± 10% - corrente ≤ 200 mA Alimentazione 3V giri al minuto 90 ± 10% - corrente ≤ 150 mA E’ evidente che con assorbimenti di corrente come quelli indicati Arduino non può pilotare direttamente un motore. Serve un dispositivo di controllo che fornisca la potenza adeguata.

Connessioni del motore con un Transistor Il modo più semplice per far girare un motore DC è usare un transistor, se riesci a procurartene uno, usa un transistor darlington TIP120, altrimenti va bene un generico NPN. Il transistor funge da interruttore elettronico: applicando la tensione di 5V sulla base tramite un pin digitale di Arduino, emettitore e collettore vengono "connessi", cortocircuitati, permettendo così il passaggio della corrente. Il motivo per cui è necessario un transistor che preleva la tensione da un connettore esterno è che può sopportare correnti di centinaia di milliAmpere, a differenza di un pin di Arduino che ne può erogare solamente alcune decine, insufficienti a far ruotare un motore. Questo metodo è vantaggioso perché richiede un solo pin di Arduino, ma può far girare il motore in una sola direzione. Vediamo un primo circuito con un transistor e un pulsante: il programma manterrà il motore acceso finché il pulsante è premuto.

Page 5: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 5 Materiale didattico L2

Analizziamo i collegamenti: la base del transistor è collegata al pin 9 attraverso una resistenza, che nello schema vale 1kΩ; l'emettitore a massa; il collettore ad un piedino del motore; l'altro terminale del motore va connesso ad un'alimentazione esterna, come una batteria. Ai due terminali del motore è necessario inoltre collegare un diodo, con polarità contraria a quella della corrente che lo alimenta: serve per evitare cortocircuiti mentre il motore rallenta o in caso venga ruotato manualmente. Infine, colleghiamo un piedino del bottone al pin 2 di Arduino e l'altro piedino a massa.

Questo è il listato di Arduino per il circuito sopra.

1. const int bottone = 2; // pin del bottone 2. const int motore = 9; // pin del motore 3. 4. void setup() 5. // inizializza il bottone come input con pull-up

6. // e il motore come output

7. pinMode(motore, OUTPUT);

8. pinMode(bottone, INPUT_PULLUP);

9. 10. 11. void loop() 12. // Il motore ha lo stesso stato del bottore,

13. // ovvero se premi il bottone, il motore gira

14. digitalWrite(motore, digitalRead(bottone));

15.

Con transistor e regolazione di velocità Un secondo esempio, mostra come è possibile modulare la velocità del motore grazie il PWM ruotando un potenziometro, collegato al pin analogico A0:

1. const int potenziometro = 0; // pin del potenziometro

2. const int motore = 9; // pin del motore

3. 4. void setup() 5. // inizializza il motore come output

6. pinMode(motore, OUTPUT);

7. 8. 9. void loop() 10. // Riporta il valore analogico da 0-1023 a 0-255

11. byte valore = map(analogRead(potenziometro),0,1023,0,255);

12. // Il motore gira con velocità proporzionale alla rotazione del potenziometro

13. analogWrite(motore,valore);

14.

Page 6: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 6 Materiale didattico L2

Motore DC pilotato da un ponte H Il ponte H è un chip che contiene un po' di transistor di potenza e diodi di sicurezza, e consente di pilotare due motori DC (in entrambi i versi). In questo esempio si usa un L293D, ma il funzionamento è analogo per il SN754410NE, adatto per motori che richiedono più corrente.

Anche se i collegamenti dovrebbero essere chiari, è bene soffermarci su alcuni dettagli importanti: l'alimentazione dei motori (motor supply, pin 8) non dovrebbe essere connessa ai 5V di Arduino perché, come spiegato prima, non eroga corrente a sufficienza. Va invece collegato al pin VIN, oppure ad una batteria esterna; I pin di enable (1 e 9) servono per attivare i due motori: si presuppone che questi siano sempre in funzione, per cui potrebbero essere collegati direttamente ai 5V; Infine, se si usa solo un motore, basta omettere i pin che riguardano il motore2 (9-10-11-14-15); Gli input controllano lo stato dei relativi output: il motore gira applicando segnali opposti sulla coppia di input, e negli altri casi il motore è fermo.

Input 1 Input 2 Motore

HIGH LOW Senso "orario"

LOW HIGH Senso "antiorario"

LOW LOW Stallo

HIGH HIGH Stallo

1. #define motorel 9 2. #define motorer 10 3. 4. void setup() 5. // inizializza il bottone come input

6. // e il motore come output

7. pinMode(motorel, OUTPUT);

8. pinMode(motorer, OUTPUT);

9. pinMode(bottone, INPUT);

10. 11. 12. void loop() 13. // Tenendo premuto il bottone si inverte il senso di rotazione

14. digitalWrite(motorel, digitalRead(bottone));

15. digitalWrite(motorer, !digitalRead(bottone));

16. delay(50); // Una piccola pausa per evitare "rimbalzi di segnale"

17.

Page 7: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 7 Materiale didattico L2

Anche con il ponte H puoi utilizzare i piedini PWM per variare la velocità dei motori.

Shield Arduino Motor R3 Dopo aver esaminato le differenti realizzazioni di driver specifici per motori in continua, prendiamo ora in esame lo shield di Arduino che implementa il ponte H senza dover obbligarci a costruire il circuito elettronico precedente. Si tratta dello Shield Arduino Motor3, o shield equivalente non originale. E’ basato su L298, un driver full bridge doppio progettato per il comando di carichi induttivi come relè, solenoidi, motori DC e a passo. Consente di comandare 2 motori DC con la scheda Arduino, con un controllo indipendente di velocità e direzione di ciascuno. È inoltre possibile

misurare l'assorbimento di corrente di ciascun motore, oltre a varie ulteriori funzioni. Lo shield è compatibile TinkerKit, pertanto consente di creare rapidamente progetti montando moduli TinkerKit sulla scheda. Specifiche tecniche

Tensione di funzionamento: 5V a 12V

Controller motori: L298P, controllo di 2 motori DC o 1 motore passo-passo

Corrente massima: 2A per canale o 4A massima (con alimentazione esterna)

Rilevamento di corrente: 1.65V / A

Con un’alimentazione esterna lo shield può fornire fino a 12V e 2A per canale motore o 4A su un singolo canale. L’obiettivo è quello di realizzare il “kit di robotica di base” e per contenere i costi farò uso, per questa prima versione, di comunissimi motorino DC, come quelli riportati nell’immagine che segue che possono essere acquistati a costi molto contenuti su qualsiasi store cinese on-line. Certamente non aspettatevi prestazioni elevate, ma sono sufficienti per incominciare.

Page 8: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 8 Materiale didattico L2

Questi motorini hanno un assorbimento massimo di non più di 100 mA e tensione di alimentazione tra i 3 e i 6V. Il collegamento dei motorini deve essere effettuato per ciascun motorino al canale A e B come riportato nell’immagine che segue. Come potete notare esistono i due ingressi Vin e GND su cui potrete collegare un’alimentazione dedicata esclusivamente al funzionamento dei motori, ma se desiderate potete tranquillamente alimentare motori e scheda con la sola fonte di tensione con cui alimentate la scheda Arduino, però non è la soluzione che io preferisco, perché l’alimentazione separata permette di evitare che le batterie si scarichino velocemente in quanto si trovano costrette ad alimentare sia il controllo (Arduino), che la potenza (motori), inoltre evita che Arduino si possa danneggiare in quanto la quantità di potenza che il regolatore di tensione potrebbe sopportare rischierebbero di essere troppo elevate. Per evitare quindi possibili danni alla scheda Arduino su cui è montato lo shield, vi consiglio di usare un alimentatore esterno che fornisce una tensione compresa tra 7 e 12V. Per effettuare questa operazione bisogna effettuare una piccola modifica alla scheda, prevista dalle specifiche di Arduino, che consiste nel tagliare il jumper “Vin Connect” posto sul lato posteriore dello shield così come riportato nell’immagine che segue. Il limite massimo per la Vin è di 18V.

Lo shield motori è dotato di pin che sono utilizzati esclusivamente da esso ed impiegati all’interno dei vostri sketch per comandare direzione (polarità) e velocità dei motori (PWM) ed ovviamente arrestare, avviare i motori e monitorare l’assorbimento di corrente su ogni canale.

Page 9: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 9 Materiale didattico L2

La tabella che segue specifica come usare la scheda per pilotare i motori:

Funzione Canale A Canale B

Direzione pin digitale 12 pin digitale 13

Velocità (PWM) pin digitale 3 pin digitale 11

Freno pin digitale 9 pin digitale 8

Assorbimento Corrente pin analogico A0 pin analogico A1

Dalla tabella si comprende quindi che il motore collegato al canale A sarà controllato dai pin 12, 3, 9 ed il il motore collegato al canale B sarà controllato dai pin 13, 11, 8. I pin di “Direzione” impostano il senso di rotazione, un valore HIGH permetterà la rotazione in un senso, mentre un valore LOW permetterà la rotazione in senso opposto. I pin “Velocità (PWM) consentono l’impostazione della velocità del motore, un valore pari a 0 ferma i motori, un valore pari a 255 permette la rotazione alla massima velocità. Trattandosi di un pin di tipo PWM valori intermedi tra 0 e 255 vi permetteranno di impostare velocità intermedie. Sugli ingressi Analogici A0 e A1 sarà prese una tensione proporzionale alla corrente assorbita da ogni motore pari a 1.65V per ogni Ampere che viene assorbito. Esempi Dopo aver inserito il Motor Shields su Arduino, collegate Arduino mediante la porta USB al computer ed aprite l’IDE di programmazione. Prima di incominciare è opportuno eseguire per ogni motore tre passi che permettono la mesa in moto del motore: Predisposizione della direzione di rotazione del motore (polarità dell’alimentazione) HIGH o

LOW. Ricordo che i motorini in CC utilizzati non hanno un positivo e un negativo, invertendo la polarità i motori potranno girare in senso opposto.

Portare a LOW il pin di brake della shield motori. Dovete immaginare il pin di brake come al freno a mano dell’automobile, per poter muovere l’auto bisogna disattivare il freno a mano, nel nostro caso disattivare corrisponde a LOW.

Mettere in moto il motore impostando la velocità del motore mediante il PWM (comando analogWrite) sull’apposito pin.

Collegamento di 1 solo motore Sul motor shield inserire i collegamenti del motore rispettivamente sul morsetto positivo (+) del canale A ed il morsetto negativo (-) del canale A. Come indicato all’inizio di questo post l’alimentazione per il motorino, da collegarsi su Vin e GND, non è indispensabile, ma se utilizzata aumenta le performance del motorino, quindi il mio consiglio è quello di utilizzare una fonte di alimentazione esterna aggiuntiva e collegare il positivo della batteria su “Vin” ed il negativo su GND.

Page 10: CORSO L2 ARDUINO UNO - WordPress.com...In ogni caso i motori – a prescindere dalla tipologia - assorbono una corrente che Arduino non è in grado di erogare dai suoi pin: per questo

IIS Aldini Valeriani Sirani - ROBOTS project Scheda 2 # 10 Materiale didattico L2

Esempio 1: controllo di 1 motore sul canale A

1. // ------------------------------------------------- 2. 3. // Controllo di un motore mediante 4. // l'Arduino Motor Shields R3 5. 6. // Avanti alla massima velocità 7. // Indietro a velocità 1/2 della velocità massima 8. // ------------------------------------------------- 9. 10. void setup() 11. // Impostazione canale A 12. pinMode(12, OUTPUT); // Inizializzazione del pin direzione del motore canale A 13. pinMode(9, OUTPUT); // Inizializzazione del pin brake del motore canale A 14. 15. 16. void loop() 17. 18. // direzione in avanti alla massima velocità 19. 20. digitalWrite(12, HIGH); // Impostazione della direzione “avanti” del motore canale A 21. digitalWrite(9, LOW); // Disattivazione del brake del motore per il canale A 22. analogWrite(3, 255); // Massima velocità del motore collegato al canale A 23. 24. delay(3000); // tempo di rotazione in avanti 25. 26. digitalWrite(9, HIGH); // Attivazione del brake del motore per il canale A 27. 28. delay(1000); // tempo di stop del motore 29. 30. // direzione indietro con velocità metà della velocità massima 31. 32. digitalWrite(12, LOW); // Impostazione della direzione “indietro” motore al canale A 33. digitalWrite(9, LOW); // Disattivazione del brake del motore per il canale A 34. analogWrite(3, 127); // Metà della velocità massima del motore collegato al canale A

35. 36. delay(3000); // tempo di rotazione in avanti 37. 38. digitalWrite(9, HIGH); // Attivazione del brake del motore per il canale A 39. 40. delay(1000); // tempo di stop del motore 41.