Buona sera a tutti, sono nuovo del forum (e di arduino!).
Per prima cosa complimenti a tutta la community e a tutti coloro che hanno reso possibile la piattaforma arduino, è davvero fenomenale!
Detto questo avrei un dubbio che non riesco a risolvere data la mia buona dose di ignoranza di elettronica... Tra i primi esperimenti sto progettando un robottino a cingoli con il classico ponte-h L293D. Ho letto in rete molti post sui forum riguardo a come interfacciarlo e il datasheet corrispondente.
Dopo alcune prove con motoriduttori solarbotics GM3 è andato tutto bene (arduino usb e alimentazione esterna per i motori 5V).
Ora però devo lavorare con entrambe le alimentazioni esterne e pilotare due motori che hanno come tensione di lavoro 1.5v-3v (Free-run current @ 3V 150 mA). Dalle specifiche tecniche di arduino e del driver, ho dei valori contrastanti:
Arduino (external):
min 7v
max 12v
L293D:
vcc1 4-5v -7v (tipica 5v, quella da arduino)
vcc2 (external, per i motori) min=vcc1, max=36v
Quindi significa che alimentando tutto dall'esterno, nel pin 8 del driver devo mettere almeno 7V, cosa che mi darebbe problemi con i motori... cambio motori o devo mettere dei circuiti supplementari per adattarla?
Ho cercato un po' in rete e sul forum, qualcuno mette nel pin 8 i 3v senza badare alle specifiche del datasheet, ma non so se sia una gran bella cosa... Chiedo a voi esperti
Grazie mille e scusate se ho detto un mare di cavolate
ciao synthesis
Ignorare le specifiche del Datasheet non é mai una cosa furba. Il costruttore garantisce il corretto funzionamento o il non rompersi del integrato a quelle condizioni.
Allora alle tue domande.
Ci sono 2 gruppi di Arduino riguardante la tensione di funzionamento: 5V e 3,3V Quelli a 3,3 V puoi alimentarli con 2 pile da 1,5V. Per il L293D Ti servono 5V per la parte digitale di pilotaggio e una seconda tensione per la parte alimentazione dei motori che deve essere al minimo uguale alla tensione della parte digitale.
Le specifiche del Arduino per un alimentazione tramite il connettore da alimentatore sono 7 a 12V perché allo stabilizzatore montato sul arduino serve almeno 1,5 V in piú per riuscire a lavorare bene a stabilizzare i 5V e con 12 V la potenza dissipata dal stabilizzatore diventa cosí grande che si riscalda troppo.
Percui ti propongo: Usa 4 pile da 1,5V e hai 6V; Per avere i 5V usa o un alimentatore switching tipo: http://www.robot-italy.com/product_info.php?cPath=6_35&products_id=532 e lo regoli a 5V oppure un stabilizzatore da 5V low dropout. (Se Ti serve un codice Te lo devo cercare) con questi 5V alimenti sia l'arduino sulla pin 5V che la parte digitale del L293D. La parte di potenza la alimenti direttalmente dai 6V delle batterie.
Ciao uwefed, grazie mille per la tua risposta veloce e precisa. Forse non mi sono spiegato bene nella esposizione del problema, comunque i solarbotics GM3 funzionavano senza problemi quando li ho testati con usb per arduino + alimentazione esterna per L293D a 5v, il problema è che devo pilotare motori differenti dai GM3 che hanno specifiche 1.5v-3v (sono da mini 4 wd) perchè ho un gearbox che ospita quelli.
ciao synthesis
vedo 3 possibilitá piú o meno belle:
metti la tensione dei motori a 5V e metti 3 diodi in serie al motore altri 3 in direzione inversa. cosí perdi 2 V,1 sui diodi. ( soluzione poco elegante)
cerciamo un altro integrato che funzioni a 3,3V. non ho ancora trovato niente.
Non so cosa costa di meno trovare e comprare un altro integrato che funziona a 3V oppure cambiare i motori con motori a 5 o 6 Volt.
Ciao Uwe
Ho fatto una analisi delle soluzioni da te proposte, con 2 motori dovrei mettere la serie di diodi sia in uno che nell'altro, cosa che forse mi aumenterebbe la "complessità" del circuito... L'L293D funziona bene ed è abbastanza documentato in giro per la rete quindi mi sa che devo andare nella direzione di una sostituzione dei motori con altri che abbiano un range di tensioni che fa al caso mio... A breve li compro poi inizio a fare i test!
ciao synthesis
Ci sono tanti integrati ben trovabili e documentati; non devi fissarti sul L293D.
Quando ho tempo cerco qualcosa che potrebbe far al caso tuo.
Ciao Uwe
con L293D puoi usare 2 PWM per alimentare 2 motori.
Se alimenti i motori a 5 volt ma con PWM fisso, diciamo, al 30%, in pratica ai motori arriva una tensione media di 5*0.3=1.5 V
Poi bisogna usare un trucchetto per aumentare la frequenza del PWM di Arduino che è molto bassa altrimenti i motori non lavorano bene ed assorbono troppa corrente.
Giocando un pò con i timer sono riuscito a portare la frequenza del PWM ad 8KHz.
Oltre a non intrometterti assolutamente a spropostito penso tu stia dando info preziose
Se alimenti i motori a 5 volt ma con PWM fisso, diciamo, al 30%, in pratica ai motori arriva una tensione media di 5*0.3=1.5 V
Quindi, dimmi se ho ben capito, intendi usare PWM sui pin di enable (1 e 9) di L293D per variare la tensione di uscita dei motori ed, eventualmente, anche la loro velocità?
Mi associo alla richiesta di calamaro per il giochetto con i timer
@synthesis:
col PWM puoi variare la velocità dei motori, in questo caso però ho pensato solo di abbassarre la tensione media che arriva ai tuoi motori.
Nulla vieta che cambiando il valore del duty cycle pwm tu possa fare entrambe le cose.
per gli altri:
Dopo aver provato il pwm a bassa frequenza dell'Arduino e notato che il motore DC assorbiva molto e girava male ho cercato info ed ho scoperto che la frequenza pwm dovrebbe essere superiore a 10KHz (da 10 a 20).
per variare la frequenza PWM dei piedini 5 e 6 ho fatto:
void setup()
{
//setta il registro del prescaler del Timer TCCR0B con il divisore per 8 per ottenere
// una frequenza PWM di circa 8KHz sui piedini 5 e 6
TCCR0B = TCCR0B & 0b11111000 | 0x02;
....
}
Ho provato l'istruzione sopra misurando l'uscita con l'oscilloscopio ed effettivamente dà circa 8KHz, stabile e precisa. Svantaggio: siccome il Timer TCCR0B interferisce con il comando delay() e con millis() ti ritrovi i tempi sballati di un fattore 8. (cioé delay(8000) ritarda di 1 secondo: poco male, basta moltiplicare x8 il numero che passi a delay() ).
Ho provato proprio con L293D ma non ho lo schema a portata di mano.
Ci sono 2 utilizzi del pwm: io ho usato quello (LAP?) che se il duty cycle =0% il motore va al massimo in un senso, se =100% va al massimo nell'altro senso, al 50% resta fermo e nei valori intermedi assume una velocità intermedia.
ciao a tutti
Riguardo la frequenza PWM so, che Massimo Banzi ha detto, che la frequenza é stata messa cosí bassa perché in delle prove precedenti dava problemi con i motori.
Non so spiegarvi il perché o percome.
Una riposta potrebbe dare Massimo.
Ciao Uwe
@uwefed
Il componente A3953 che hai consigliato sembra proprio che faccia al caso mio, ho letto un po' il datasheet... penso che a breve farò un ordine, magari ci metto dentro altre cose per ammortizzare le spedizioni!
@Rbb
Come hai fatto a settare il tutto in quel modo (0%, 100% e 50%)? Io avevo in mente di inviare valori 0%, 100% per l'escursione dalla velocità minima e massima e invertire la polarità degli ingressi per il cambio di direzione, ma affettivamente come dici tu sembra più comodo!
Un'altra curiosità: se uso PWM, in base al duty cycle simulo un valore analogico e fin qui ok... ma se io uso gli enable del L293D in PWM e una alimentazione dei motori (pin 8) più alta delle specifiche dei motori stessi rischio di danneggiarli anche con duty cycle basso?
Il rapporto di Acceso-Spento é dato dal numero che indichi nella funzione analogWrite() . I valori possibili sono da 0 a 255, che corrisponde a da 0 al 100% di tempo di accensione.
Alcune uscite digitali possono essere usati in modalitá PWM con una frequenza abbastanza bassa (intorno ai 500 Hz). Si puó settare diversamente questa frequenza.
La tensione la quale devi considerare é la media sul tempo. Percui se hai 5V con un rapporto Acceso - Spento di 50% é in linea di massima come se avresti 2,5V. (c'é l'impedenza del motore che influisce un po')
A dei tempi troppo corti hai un influenza notevole dell'impedenza del motore che limita la corrente e percui il rapporto tempo accensione - tensione non é piú lineare.
Ciao Uwe
Quindi se ho ben capito non si pone più il problema iniziale, cioè se ho i miei motorini DC a che lavorano massimo a 3V e allo stesso tempo devo alimentare l'L293D con almeno 5V per i motori (per le specifiche), posso semplicemente regolare il PWM per non superare mai il 60%...
Ciao synthesis
La Tua frase é un po complicata.
L293D: Ti servono 5V per la parte logica e almeno 5V per la parte potenza. Devi avere 4 batterie e un regolatore di tensione che produce 5V.
Se vai a 2 batterie e a 3V con un arduino da 3,3V Ti risparmi il regolatore e devi usare per sempio due A3953 al posto del L293D.
Comunque puoi usare il PWM per regolare la velocitá dei motori.
Non so se Ti ho risposto
Ciao Uwe
Il mio discorso era in generale: la mia idea era di prendere 5V da un regolatore poi con quelli alimentare sia arduino che la parte di potenza del driver, poi anche se io ho potenza a 5V e i motori a 3V, setto il PWM al 60% massimo, così non eccedo mai i 3V sui motori.
Se il mio discorso è giusto posso alimentare i motori dall'L293D con qualsiasi alimentazione poi calcolo le giuste percentuali del duty cycle per avere una media in linea con le specifiche dei motori...
Non so se mi sono spiegato bene