Set 042012
 

Da una vecchia stampante ho recuperato un motore passo passo funzionante.

Cercando il modo di controllarlo con il mio Arduino Uno, mi sono imbattuto in una serie di problematiche.

Per iniziare, si tratta di un modello bipolare e, come è noto a tutti gli hobbisti nel campo della robotica, far girare questi motori è una vera rogna.

La difficoltà sta nel fatto che non è sufficiente alimentare le 2 bobine, ma bisogna alternativamente invertirne la polarità.

Inoltre il motore è piuttosto grosso ed ha dei valori di targa di 3A a 1,53V che richiedono un pilotaggio “robusto”.

In genere questi oggetti si controllano con un H-bridge (solitamente L293) di cui al momento sono sprovvisto. Se anche l’avessi, di sicuro il circuito integrato non sarebbe in grado di fornire la corrente necessaria al motore che è di circa 7A alla tensione di riferimento di 5V.

Rovistando nella cassetta dei componenti di recupero mi è caduto l’occhio su una manciata di robusti power mosfet a canale P ed N. Verificato che il “gate-source threshold voltage” è compreso tra +2V e +4V e che la corrente di drain è di oltre 15A ho provato a pensare a come avrei potuto costruire un semplice driver.

L’idea che mi è venuta, e che poi ho scoperto essere all’incirca l’implementazione di un H-bridge, è la seguente:

stadio

Collegando ad ogni polo del motore un circuito come quello sopra e mettendo l’ingresso a massa, senza carico dovrei avere in uscita una tensione di 5V.

Al contrario con un ingresso di 5V dovrei ottenere 0V in uscita. In pratica entrano in conduzione alternativamente Q1 e Q2.

Purtroppo non trattandosi di mosfet a livello logico che commutano (vanno in saturazione) con segnali al di sotto dei 5V, con un carico consistente come la bobina del nostro motore da 0.5 Ohm, le tensioni in uscita saranno inferiori. Ma visto che il motore ha un valore di targa per la tensione di 1,53V, non me ne preoccupo.

Nella cassetta degli scarti ho reperito una manciata di power mosfet a canale P ed N (IRF9532 e IRF531) che garantiscono una corrente di drain di 3 A a 5V il che riporterebbe la tensione sulla bobina proprio attorno valore di targa.

Non è necessario aggiungere un diodo di protezione EMF tra drain e source perchè i componenti ne sono già dotati.

Utilizzando 4 circuiti come quello sopra ed alternando i segnali in ingresso si può quindi cambiare la polarità delle 2 bobine del motore.

Ecco lo schema risultante:

driver

 

 

Sicuramente non è una soluzione elegante, ma dovrebbe funzionare. Ho cablato al volo i pochi componenti necessari su una basetta di compensato (avevo finito le millefori…. :-() con questo orrendo risultato:

Per la rotazione, considerando le bobine A e B con i loro terminali A0,A1 e B0,B1, i segnali in ingresso possono seguire uno dei due schemi sottostanti:

Schema 1

STEP    1  2  3  4

     A0= 1  0  0  0

     A1= 0  0  1  0

     B0= 0  1  0  0

     B1= 0  0  0  1 

Schema 2

STEP    1  2  3  4

     A0= 1  1  0  0

     A1= 0  0  1  1

     B0= 1  0  0  1

     B1= 0  1  1  0 

Schema 3

STEP    1  2  3  4  5  6  7  8

     A0= 0  0  0  0  0  1  1  1

     A1= 0  1  1  1  0  0  0  0

     B0= 1  1  0  0  0  0  0  1

     B1= 0  0  0  0  1  0  0  0

 
Lo schema 1 è quello che si usa di solito per fare i test alimentando una sola bobina alla volta.
Lo schema 2 ha sempre entrambe le bobine alimentate. Consuma più corrente, ma garantisce livelli di coppia maggiori e quindi la possibilità di raggiungere velocità più elevate.  Se il driver funziona correttamente, anche a motore fermo farete fatica a muovere il rotore con le mani. Quindi è l’ideale per progetti di robotica in cui è importante la precisione del posizionamento ed il mantenimento della posizione una volta raggiunta.
Lo schema 3 implementa l’half stepping. Il che significa che si riesce a raddoppiare la risoluzione del motore. Nel mio caso invece di 200 step a giro (1,8°/step) ne ottengo 400 a prezzo di una riduzione della coppia che poi risulta non costante durante il ciclo. 
 

Dai primi test senza collegarlo all’Arduino ho misurato una tensione di 2V (+/-) sul canale A con una corrente sulla bobina di 4A circa che corrisponde ai grossomodo valori di targa. Fin qui tutto bene.

Sul secondo canale (B) purtroppo le cose non vanno tanto bene perché scendiamo a 0.8V.  Questo può essere sicuramente dovuto al fatto che ho usato un mosfet leggermente diverso perchè avevo finito gli altri…. In effetti osservando le curve della caratteristica di trasferimento dell’IRF510 usato in sostituzione, noto che la corrente di drain è di solo 1A a 5V quindi i conti tornano.

Collego comunque il tutto all’Arduino e mi stupisco nel vedere il motore girare perfettamente in entrambe le direzioni e a velocità differenti. 

Probabilmente la poca corrente erogata sulla bobina B è sufficiente anche se la coppia ne risente e a bassa velocità il motore sembra perdere colpi. Lo sbilanciamento del driver è evidente anche dalla differenza di temperatura dei dissipatori delle parti corrispondenti.

Sostituendo l’IRF510 con il corrispondente IRF531 (cannibalizzato da un’ altra scheda….) il funzionamento è perfetto.

Sia a bassissima velocità che con regimi di rotazione elevati è molto difficoltoso bloccare il rotore con le mani, a dimostrazione di un valore di coppia piuttosto elevato.

La precisione di posizionamento è perfetta: facendo girare avanti e indietro il motore a varie velocità per diversi minuti, a fine ciclo il rotore si riposiziona come alla partenza, a testimonianza del fatto che non perde neppure uno step.

La velocità massima di rotazione non è molto elevata: con valori di coppia ottimali si arriva al massimo a 300 rpm.

Questa limitazione non dovrebbe essere dovuta al driver. Infatti i mosfet commutano molto velocemente. Per regimi più elevati è necessario adottare alcuni accorgimenti che si possono trovare nell’ampia letteratura presente su internet.

Tali accorgimenti, come quello del resistore in serie sulla bobina (alcuni usano una lampadina…) richiedono di aumentare la tensione e la corrente sugli avvolgimenti del motore, cosa che si può fare con una piccola modifica per portare il segnale a +5V di arduino ad un livello più elevato ed alimentando il driver con una tensione più alta (p. es 12V) avendo cura di non eccedere i valori massimi di corrente di drain per i mosfet e dissipandoli correttamente. 

Per chi non ci credesse che funziona ecco il video:

Per concludere l’accrocchio di cui sopra non ha la pretesa di sostituire i driver commerciali (p. es l’ottimo EasyDrive), ma è facilissimo da costruire e richiede pochi componenti.

Sicuramente non si tratta di una soluzione elegante, ma ho l’impressione che sia piuttosto robusta soprattutto scegliendo i mosfet opportuni.

Inoltre utilizzando il PWM di Arduino credo sia possibile implementare il microstepping tenendo i mosfet in zona lineare ().(NO, freq. PWM troppo bassa)

Per contro richiede 4 fili anche se con l’aggiunta di un paio di transistor utilizzando lo Schema 2 (vedi sopra) è possibile pilotare i poli corrispondenti del singolo canale con tensioni opposte e ridurre a 2 i segnali in ingresso.

Analogamente è possibile con una piccola modifica utilizzare tensioni > 5V migliorando le prestazioni del motore pur con un assorbimento di corrente più consistente.

Aggiornamento 22/10/2012

Ecco la versione 2.0 del driver.

Oltre all’assemblaggio decisamente migliorato sono stati utilizzati mosfet più adatti (IRLIZ24N e IRLIB9343).

Sono presenti inoltre 4 trimmer che servono a regolare la corrente sugli avvolgimenti.

A riprova del fatto che il circuito è utilizzabile per pilotare stepper robusti con il motore del test e alimentazione a 5V riesce a raggiungere quasi i 5A.

Grazie alla regolazione di corrente ho potuto effettuare prove prolungate con motori più piccoli senza correre il rischio di danneggiarli.

 

  Una risposta a “Controllo stepper bipolare senza H-bridge con Arduino”

  1. […] questo modo sono stati messi a frutto i cazzeggi riportati nel mio precedente articolo sul pilotaggio dei motori passo-passo con arduino ed un driver a mosfet […]

 Lascia un commento

Puoi usare questi tag e attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)