Arduino, motori DC PWM e amperaggio

Salve a tutti, è il mio primo post qua, ho appena comprato l'Arduino 2009 e son in attesa della consegna, ma stavo già pensando allo schema del circuito che voglio realizzare.

Il mio scopo è comandare un motore DC (un servomotore modificato per 360° di rotazione al quale ho tolto tutta l'elettronica di gestione del PWM, quindi a tutti gli effetti è rimasto un motore DC da 4.8V-6V), gestendo la velocità in PWM.

Attualmente lo comando dalla seriale e mandando un impulso PWM al gate di un MOSFET BUZ71A, che è sovradimensionato per l'utilizzo. L'alimentazione la do' con 4 stilo AA, e il motore assorbe 240 mA in rotazione senza carico e circa 400-450 mA se blocco l'albero con la mano, quindi a motore in stallo.

Ora io vorrei comandarlo tramite Arduino per eliminare la seriale e per gestire altri aspetti del mio progetto che non posso fare con la seriale, e visto che ci sono magari sfruttare i 500 mA della porta USB per eliminare anche l'alimentazione esterna che devo usare con il mio attuale circuito su seriale.

Spiegato tutto ciò quello che chiedo è questo: quanti milliampere posso prelevare se collego il mio motore DC tra i pin 5V e il GND dell'arduino, comandando il motore con un transistor PN2222A collgato a un pin PWM dell'arduino per poter variare la velocità? Ho letto che per ogni pin passano al massimo 40 mA, ma questo vale per i pin di input e output digitali e analogici oppure vale anche per il pin 5V colegato a massa? Poi secondo voi per gestire il PWM mi basta il PN2222A, che sopporta sino a 600 mA, quindi ci sto dentro, oppure son costretto o è meglio continuare a usare un MOSFET come il BUZ71A? Vorrei non dover essere costretto a usare le 4 stilo AA, ma se mi dite che non è possibile fare come stavo pensando vuol dire che metterò le pile e replicherò il circuito che uso attualmente ma comandato attraverso l'Arduino invece che direttamente con la seriale... non una semplificazione, ma ci guadagnerei in ampliamento di possibilità nello gestire altri segnali.

Grazie a tutti quelli che vorranno darmi il loro parere e aiuto, io sono più che altro un programmatore VB6 - VB.NET con l'hobby dell'elettronica e del DIY, quindi le mie nozioni di elettronica le imparo mano mano che mi occorrono nei progetti che affronto.

Grazie a tutti Sergio

Io ti consiglio di non prelevare mai da qualsiasi uscita (sia essa analogica, digitale o 5V) una corrente >40 mA. In un'applicazione con motori e sensori io considero sempre che il lavoro "pesante" dell'alimentazione di questi ultimi devono farlo le batterie. Arduino deve essere il "cervello" del processo e basta. In questo modo la corrente in uscita dall'arduino è pochissima e il rischio di problemi è lontanissimo. Facendo ovviamente attenzione alla corrente in ingresso nei pin di arduino.. :D Se hai bisogno di regolare la velocità ed il verso di rotazione di un motore DC utilizza un ponte h integrato (L293D va benissimo per la corrente assorbita dal tuo motorino) e risolverai subito :) di guide sull'L293D con l'arduino ne trovi in rete.. se poi hai altre perplessità basta chiedere. spero di esserti stato d'aiuto.

Avevo sempre evitato di studiare l' L293D, pensavo fosse più difficile da capire, e avevo realizzato un ponte H da me, utilizzando un transitor PN2222A, un MOSFET e un relay DPDT, spendendo quasi 10 euro. Invece avrei potuto usare un L293D e spendere meno di 4 euro e avere tutto integrato e un circuito più pulito.

Penso che al 99.9% userò l'integrato, magari collego entrambe le uscite allo stesso motore così ho 1.2A di continua a disposizione e un margine superiore, tanto mi serve comandare solo un motore.

Rimane il fatto che mi tocca usare l'alimentazione esterna con 4 stilo AA, anche se un tentativo di alimentare anche la linea motori del L293D con l'uscita 5V dell'arduino lo volgio fare, magari funziona, alla fine a me servono solo 200-300 mA. Non è che mi friggo la mia Arduino nuova di zecca?

Grazie tanto per l'aiuto, mi hai dato la spinta decisiva a documentarmi sull'integrato e ad abbandonare il vecchio ponte H.

Di nulla! :) Per quanto detto sopra, ti consiglio di nuovo di non usare l'arduino per alimentare il motore ;)

buon lavoro!

Eccomi di nuovo qua.
Ieri mi hanno consegnato l’arduino 2009 e l’ho già messo in funzione, mi sto divertendo un casino, si può fare veramente un casino di roba, basta solo immaginazione e inventiva.

venendo a noi ho un paio di cose da chiedere.
Ho realizzato un circuito con un ponte H, non ho trovato il L293D nella mia città (l’ho ordinato e son in attesa che mi arrivi) e quindi mi son dovuto accontentare di un L293B. La differenza, oltre a un limite più alto in amperaggio è che non ha i diodi di protezione integrati; poco male, tanto per prototipazione su una bredboard ho messo su 4 diodi 1N4007 e dovrei essere a posto.
Comandando tramite firmata il ponte H riesco a far muovere il mio servo modificato; il problema è che mentre senza carico dal ponte H escono circa 4.97V e ci siamo con il motore collegato (e naturalmente in funzione) ho un calo di tensione e scendo sino a 3.3V - 3.5V circa.
L’assorbimento del motore è circa 100 mA, misurato con un amperometro digitale in serie. Questo succede sia che io alimenti i motori tramite la linea vs dell’integrato direttamente con i 5V provenienti dalla linea 5V dell’Arduino sia che l’alimentazione provenga da 4 stilo AA NiMH che quindi dovrebbero avere anche un amperaggio maggiore e non avere questi problemi di carico.
Ho provato anche a alimentare l’Arduino con i 12V esterni ma il comportamento è sempre lo stesso.
I 5V del pin dell’arduino sono giusto (vabbe’ 4.97V ma non stiamo a sottilizzare, siamo nei margini di tolleranza).
Avete qualche idea del perchè succeda ciò? Ho provato anche a eliminare i diodi, ma il risultato non cambia, e quindi li ho rimessi.
Non penso che la colpa sia del L293B, ma come mi arriva il L293D faccio il confronto.

Ah, un’altra cosa sapete come mai per comunicare con vb.net e le librerie firmata devo caricare la oldstandardfirmata sull’arduino mentre se carico lo standardfirmata non funziona, non comunica?

Grazie a tutti per l’aiuto dato sino ad adesso, spero mi sappiate aiutare ancora, sono agli inizi della programmazione dei microprocessori e l’arduino mi piace davvero tanto.

Sergio

Tempo fa usai anche io un L293B, hai detto bene, è identico all'L293D ma senza diodi di protezione. Come hai collegato i diodi? Perché utilizzi la libreria firmata? come primo test basta fare un semplice programmino per le PWM. Ad occhio direi che il tuo problema è o di programmazione oppure di utilizzo elettronico del ponte H. Appena puoi dammi qualche informazione in più sul circuito elettronico che hai progettato e sul programmino che hai fatto.

ps: la gestione dei motori con un ponte h tramite microcontrollore si basa sull'utilizzo delle uscite PWM. Documentati sui metodi utilizzati (PWM diretta, Sign-Magnitude PWM, Locked Anti-phase PWM...)

I diodi penso di averli collegati correttamente, ne ho messo 4, come ho trovato nello schema che sta nei datasheet del L293B. Allego anche la foto del mio circuito, eccola qua: http://img193.imageshack.us/img193/663/arduino2.jpg

Scusa se magari è difficile da capire, ho usato solo fili gialli, ma è semplicemnte un ponte H, ai pin 2 e 4 ho collegato i pin 2 e 7 del IC, che comandano il verso del motore se sono uno LOW e l'altro HIGH, o se sono entrambi HIGH lo bloccano in posizione. ai pin 7 e 8 dell'arduino ho messo 2 led, al pin 11 dell'arduino ho collegato il pin 1 dell IC per comandarlo in PWM o in digitale (cioè acceso alla massima velocità).

Penso di aver collegato tutto giusto.

Quanto alle librerie firmata le uso per interfacciare l'arduino con Visual Basic.NET, in quanto sono programmatore VB da una decina d'anni e più e di C non ne conosco molto la sintassi, anche se non è molto difficile impararla, i fondamenti di programmazione alla fine son comuni. Il mio progetto è comandare il motore da un'applicazione per Windows, mi occorre muovere il motore a passi molto piccoli, ma ho visto che non mi occorre necessariamente il PWM, da IDE di arduino ottengo movimenti molto piccoli mettendo il motore al massimo in digitale per 4 o 8 millisecondi e poi pettere il pin a 0 togliendo corrente al motore. Ora mi occorre però farlo da VB.NET perchè mi occorre l'interfaccia grafica. Per fare le prove ho usato i sample delle librerie firmata per VB.NET; mi rimane da provare direttamente dall'ide arduino, ma non penso cambi nulla, alla fine il problema è che senza carico ho 5V, mentre se metto il motore scendo a 3.6V, questo anche uscendo in digitale dal pin 11, quindi mandando il motore sempre al massimo.

non conosco le differenze tra le modalità PWM che mi hai scritto, ora mi documento un po'.

Il + delle batterie dalle foto non è collegato a nulla?

Non capisco i due condensatori con cosa siano collegati. Soprattutto quello più a destra.. è in serie tra l'alimentazione arduino 5V ed il pin 8 dell'integrato?

Se è così potrebbe essere questo il problema... prova ad eliminare i condensatori e collegare il + delle batterie direttamente al pin 8 dell'integrato.

Ps: con i condensatori vuoi "pulire" l'alimentazione?

scusa, nello spostare la basetta per la foto il + del pacco batterie è saltato, comunque era collegato alla stessa linea del filo giallo a destra che porta al pin 8 dell'integrato, cioè la linea voltage per i motori. I condensatori penso di averli collegati correttamente, sono collegati tra la linea positiva a 5V e la linea di GND per la logica del L293B che viene direttamente dall'arduino e l'altro la il positivo che viene dal pacco batterie e la linea GND, quindi penso siano ok, comunque ho provato anche senza i condensatori per la pulizia dell'alimentazione ma non cambia nulla.

Per ora ho lasciato in standby questo problema, sto mettendo insieme tutte le altri parti che occorrono al mio progetto, e son in attesa del L293D, così da provare con quello se si ripresenta il problema.

Grazie comunque per interessarti al mio problema.

Ho trovato una risposta al problema del voltage drop in uscita dal L293 sotto carico. L'ho trovata leggendo dei thread qui sul forum . Il responsabile è proprio l' L293, che ha proprio un voltage drop di circa 1.5V tra l'alimentazione fornita al pin che porta ai motori e l'alimentazione in uscita dai pin 3 e 6, quell iche vanno ai motori. Quindi per avere 5 o 6V per i miei motori userò una batteria da 7.5V, magari al litio così sono a posto.

Ciao Sergio, anzi tutto ti faccio i complimenti per la rapidità con cui ti 6 buttato su svilupii di una certa complessità su Arduino. Sto approcciando in questi giorni il protocollo di comunicazione Firmata e come te ho scaricato i tools messi a disposizione su http://www.acraigie.com/programming/firmatavb/default.html per lo sviluppo in VB.Net. Colgo l'occasione della tua preparazione per chiederti un po'di cose: - hai scoperto come mai sembra che la comunicazione funzioni solo con l'esempio oldStandardFirmata? - Premetto che ho Windows 7 , e ho verificato che, se carico il progetto su arduino con il classico ambiente di sviluppo, e poi vado in debug dell'applicazione in VB, mi insorgono una marea di eccezioni e nulla funziona, a quel punto, se stacco l'usb di arduino e diconnetto e riconnetto il mio utente dal pc, ricollego arduino senza ricaricare il progetto e vado in debug dell'applicazione in VB queste eccezioni non insorgono più, succede anche a te? Se si come hai risolto? - Altro problema che ho è la ricezione dei digitali, sembra che non si generi mai l'evento che avvia il metodo FirmataVB1_DigitalMessageReceieved, mentre per quanto riguarda i comandi delle uscite digitali e l'acquisizione delle analogiche non ho avuto problemi. Hai qualche idea in riguardo? - Sempre con il protocollo firmata, hai mai provato a scrivere dal PC una variabile su arduino che non fosse un'uscita fisica, ma una variabile gestita nella logica? Se si, puoi postarmi un esempio? Ti ringrazio in anticipo per la disponibilità

Per quanto riguarda la seconda e terza domanda, tutto si è risolto da quando ho provato il client in VB.NET ArduinoFirmataVBExtended. Mentre, relativamente alla scrittura/lettura dall'applicazione in VB.NET di una variabile gestita nella logica di Arduino, penso che i due metodi in C sendSysex(byte command, byte bytec, byte* bytev) attach(byte command, callbackFunction myFunction) riguardino questa problematica lato Arduino, anche se non ho ancora chiaro come debba essere strutturato il comando e come inviarlo/leggerlo dall'applicazione VB. Qualcuno ha mai provato questi 2 metodi?