Problema gestione dei motori di un robot

Salve tutti.
Mi scuso in anticipo se ho sbagliato sezione, ma sono nuovo del forum e del mondo arduino.
Scrivo perchè da poco ho iniziato un progetto che riguarda la modifica di un piccolo ragno giocattolo, il quale utilizza due motorini elettrici, uno per muovere le zampe di destra e uno per quelle di sinistra,ogni motore era alimentato da una pila a 1.5Vla mia idea era quella di utialzare un sensore di prossimità per fare cambiare direzione al robot quando incontra un ostacolo tutto controllato con arduino.
Per questo ho utilizzato un sensore Sharp 2D120XF e un L293D per la gestione dei motori.
Il problema è che ora i due motori alimentati attraverso il L293D non riesco più ad avere la forza necessaria per muovere le zampe del robot (cosa a mio avviso strana inquanto prima erano alimentati a 1.5v mentre adesso sono alimentati a 5v) allego le foto del modello del giocattolo e i miei collegamenti per essere più preciso . Mi potreste gentilmente dire dove ho sbagliato ho che allora soluzione potrei adottare grazie in anticipo.

Ad occhio I tuoi motorini assorbono circa 100mA ciascuno ed in fase di spunto almeno due volte tanto.

Ma tutto questo con una tensione di 1.5V: triplicandola hai anche triplicato questo assorbimento.

Arduino può erogare al massimo 500mA @ 5V e 50mA @ 3.3V

Ti conviene usare un regolatore di tensione switching tarato a 1.5V anche per evitare che i motori si brucino.

Ricordati anche di inserire i diodi di protezione!

in sostanza devi fornire un'alimentazione esterna ai motori e potresti anche farlo sfruttando in questo modo il pacco di batterie del robot stesso

grazie per le vostre risposte.
volevo anche chiedere perche se collego i motori direttamnte ai 5V (non utilizzando il L293D ) questi funzionano alla perfezzione ??
sciorty mi potresti disegnare i collegamenti che devo fare per alimentare esternamente tutti e due i motori(con ogni motore alimentato da una singola pila a 1.5V) e quali sono le uscite per il rispettivo controllo di entrambi i motori ?
perché non riesco proprio a capire come funziona la logica del L293D :frowning:

L'293D è un doppio ponte h, il che significa che al suo interno dispone di due circuiti che saranno più o meno così. Lo si usa perchè non puoi collegare i motori direttamente ai pin di arduino per varie ragioni (troppo assorbimento, induttanze e robe varie..), quindi c'è la necessità di alimentare i motori da un altra fonte e di usare l'arduino per aprire e chiudere questa fonte e quindi anche direzionare le polarità per i sensi di rotazione. Quello che deve fare l'arduino quindi non è altro che dare un segnale che apra o chiuda i transistor. Se sono tutti accesi o tutti spenti non ci sarà differenza di potenziale ai capi del motore e risulterà quindi spento.

L'integrato si aspetta l'ingresso dell'alimentazione esterna sul piedino 8. Capirai quindi che l'alimentazione che l'integrato in questione fornisce ai due motori è la stessa, considerandoli collegati in parallelo (correggetemi se sbaglio)

Piccola correzione a quanto detto precedentemente.

La differenza sostanziale tra 293 e 293D è che nel secondo sono già presenti i diodi di clamp il che semplifica notevolmente il cablaggio: se stai usando questo ultimo integrato, i diodi che ti ho raccomandato non sono necessari.

La seconda differenza è la piedinatura: nel primo ci sono 4 (2 per parte) piedini di ground, mentre le secondo i pin sono 6 (3 per parte).

Non sono solamente riferimenti elettrici, ma servono anche a dissipare il calore collegati ad una aletta di raffreddamento oppure allo stesso piano di massa del PCB.

Sto facendo delle prove per cercare di capire megli ma sopratutto per cercare di farlo funzionare,Ho provato a fare i collegamenti per alimentare i motori esternamente attraverso le due stilo come si vede nello schema di sciorty ma anche in questo modo l'unico motore collegato per la prova non da segno di volersi muovere.
Arrivato a questo punto mi viene da pensare che forse sbaglio anche il programma. Ho scritto un minuscolo programma giusto per vedere se il motore era in grado di ruotare ma niente potreste gentilmente dare un occhio anche a quello che ho scritto ??

int M2o=4; 
 int M2a=2;
 int M=9;
 
 void setup() {
 pinMode(M2o,OUTPUT);
 pinMode(M2a,OUTPUT);
 pinMode(M,OUTPUT);
 }
 
 void loop() {
   digitalWrite(M,HIGH);
    digitalWrite(M2a,LOW);
    digitalWrite(M2o,HIGH);
 }

tornando ai componenti il motor drive di cui dispongo è questo http://www.robot-italy.net/downloads/ST-L293D.pdf.

Se hai fatto come nello schema, a parte 5v e massa assieme nella pista in alto, dovrebbe funzionare.. ammesso che il motore funzioni e che la tensione che gli dai sia sufficiente.
Hai provato giusto per curiosità a collegare motore ed il pacco di batterie che usi per vedere cosa succede?

Si,si collegando i motori direttamente al pacco batterie o direttamente ad Arduino funziona perfettamente.
Non so più cosa fare mi esistono magari altre soluzioni per gestire il funzionamento e il senso do rotazione di due motori contemporaneamente???

Magari avrai semplicemente bruciato il driver, se ne hai la possibilità provane un altro!

Oggi se riesco Ne compro uno nuovo. Cosa non devo assolutamente fare per bruciate un nuovo driver??

Sicuramente non collegarci motori che assorbano più della corrente nominale.. poi fare attenzione alle polarità dell'alimentazione!

Se il motor driver fosse bruciato non andrebbe proprio verro?
Perché quando faccio i collegamenti come nell'immagine del primo post che ho pubblicato i motori girano ma non hanno la forza di spostare niente.
A parte la poca forza dei motori sto provando a scrivere il programma. Ho un altro dubbio riguardo all’ utilizzo del sensore di prossimità http://www.sparkfun.com/datasheets/Sensors/Infrared/GP2D120XJ00F_SS.pdf questo è il programma che sto scrivendo

 int M1a=11; // motore di sinistra movimento zampe  avanti
 int M1i=10; // motore di sinistra movimento zampe indietro 
 int M2a=5; // motore di sinistra movimento zampe  avanti
 int M2i=6; // motore di sinistra movimento zampe indietro 
 int distanza  =0;
 
 void setup() {
 pinMode(M1i,OUTPUT);
 pinMode(M1a,OUTPUT);
 pinMode(M2i,OUTPUT);
 pinMode(M2a,OUTPUT);
}

 void loop() {
 distanza= analogRead(A0); 
 digitalWrite(M1i,LOW);
 digitalWrite(M2i,LOW); 
 digitalWrite(M1a,HIGH); // avanzamento del robot 
 digitalWrite(M2a,HIGH);  
 if( distanza  >=900){
 digitalWrite(M1i,LOW);
 digitalWrite(M2a,LOW);
 digitalWrite(M2i,HIGH);
 digitalWrite(M1a,HIGH); //rotazione di 90°
 delay(2000);
 distanza= analogRead(A0); }
 }

il mio problema è che il programma entra nel ciclo if quando il sensore arriva a 5cm da un oggetto mentre a me servirebbe che entrasse nel ciclo if quando si trova ad una distanza di 10cm ho provato ha modificare il valore della condizione del if ma l'unica condizione che funzione è 900(già abbastanza strana ) per qualsiasi altro numero che scrivo entra nel ciclo if indipendentemente dalla distanza del sensore dall'oggetto. Cosa sbaglio??

sempre93:
Se il motor driver fosse bruciato non andrebbe proprio verro?
Perché quando faccio i collegamenti come nell'immagine del primo post che ho pubblicato i motori girano ma non hanno la forza di spostare niente.

Questo è strano! Allora il problema sta nella tua alimentazione esterna.. Se hai le specifiche dei motori, almeno Vmax, puoi provare con un'altro pacco di batterie, magari la stessa con cui alimenti arduino.

Comunque per misurare la distanza in cm non basta un semplice analogRead, quindi spiega meglio come proporzioni il dato "crudo" dell'analogRead alla distanza in cm :slight_smile:

come dice sciorty, non basta un semplice analogread.

se guardi il datasheet vedrai che il segnale di uscita non e' lineare
dai un'occhiata a questo link

Sono riuscito a trovare in rete una libreria per i sensori sharp e adesso il mio sensore funziona alla perfezione purtroppo non riesco ancora a provare il robottino siccome non sono ancora riuscito a comprare un nuovo motor driver :frowning: il programma che ho scritto è questo:

#include <DistanceGP2Y0A21YK.h>
 int M1a=9; // motore di sinistra movimento zampe  avanti
 int M1i=8; // motore di sinistra movimento zampe indietro 
 int M2a=5; // motore di sinistra movimento zampe  avanti
 int M2i=6; // motore di sinistra movimento zampe indietro 
 int distanza=0;
 int S=7;  //  interruttore
 int V=12;// led Verde
 int B=11; //led Blu
 int R=10; // led Rosso
 int val=0; 
 DistanceGP2Y0A21YK Dist; 
 
 void setup() {
 pinMode(M1i,OUTPUT);
 pinMode(M1a,OUTPUT);
 pinMode(M2i,OUTPUT);
 pinMode(M2a,OUTPUT);
 pinMode(S,INPUT);
 pinMode(B,OUTPUT);
 pinMode(R,OUTPUT);
 pinMode(V,OUTPUT);
 Dist.begin(A0);
}

 void loop() {
 val=digitalRead(S);
 if(val==1){
 distanza = Dist.getDistanceCentimeter();
 if(distanza>8){
 digitalWrite(R,LOW);
 digitalWrite(B,LOW); 
 digitalWrite(V,HIGH);
 digitalWrite(M1i,LOW);
 digitalWrite(M2i,LOW); 
 digitalWrite(M1a,HIGH); //avanzamento del robot 
 digitalWrite(M2a,HIGH); 
 distanza = Dist.getDistanceCentimeter();
 }
   if(distanza<=8){
     digitalWrite(R,LOW);
     digitalWrite(V,LOW);
     digitalWrite(B,HIGH);
     digitalWrite(M1i,LOW);
     digitalWrite(M2a,LOW);
     digitalWrite(M2i,HIGH);
     digitalWrite(M1a,HIGH); //rotazione antioraria  di 90° 
     delay(1000);
     distanza = Dist.getDistanceCentimeter();
      if(distanza<=8){
     digitalWrite(R,HIGH);
     digitalWrite(M1a,LOW);
     digitalWrite(M2i,LOW);
     digitalWrite(M2a,HIGH); //rotazione oraria di 180°
     digitalWrite(M1i,HIGH);
     delay(2000);
     distanza = Dist.getDistanceCentimeter();
     if(distanza<=8){
     digitalWrite(B,LOW);
     delay(1000); // rotazione oraria di 90°
     }}}}
val=digitalRead(S);   
if(val==0){
digitalWrite(R,LOW);
digitalWrite(B,LOW); 
digitalWrite(V,LOW);
digitalWrite(M1i,LOW);
digitalWrite(M2i,LOW);
digitalWrite(M1a,LOW);
digitalWrite(M2a,LOW);
delay(400);
digitalWrite(R,HIGH);
delay(400);
}}

volevo chiedervi ancora una cosa, secondo voi è possibile interfacciare arduino con un joystick ps3 dualshock 3 in modo da controllare i due motori con le due levette del controller della ps3??
se si di che componenti avrei bisogno?? io in rete sono riuscito solo a trovare questo ---->Usare un controller PS3 per controllare un NXT Bot su base Arduino 1/2 | Elettronica Open Source
secondo voi esisto anche altre soluzioni??

Altre soluzioni che non prevedano l'uso di un pc come tramite ci sarebbero ma non so dirti con quale difficoltà potrebbero essere messe in pratica..
Nello specifico il controller della ps3 pare che usi il protocollo bluetooth 2.0 e per gestire questa comunicazione l'autore del progetto di cui hai fornito il link utilizza una libreria per processing, che a sua volta comunica con l'arduino tramite dei moduli radio XBee.
Con un modulo slave bluetooth su arduino potresti in teoria interfacciarti al controller!

quindi se uso un controller ps3 il tramite di un pc per la comunicazione è la cosa migliore . e avrei bisogno solo di : 2 Xbee 1mW Wire Antennas, Xbee Explorer USB, Xbee Wireless Shield più il mio robot e il controller ps3. invece se volessi escludere il pc in che alrti modi potrei comandare il mio robot da remoto ??

Gli xbee dispongono di un loro set di istruzioni credo e quindi puoi usarli anche in standalone senza affiancargli un microcontrollore. Quindi non obbligatoriamente xbee a meno che il tuo budget te lo consenta.. Poi con 1mW sinceramente non so quanto fai, forse potresti muoverti all'interno di un edificio!
Comunque esistono altri moduli radio seriali che costano meno, li avevo visti tempo fa ma basta cercar qualcosa come "arduino radio serial module"

Per quanto riguarda la comunicazione diretta tra joystick ed arduino avresti bisogno di un modulo bluetooth ricevitore, ma sinceramente non saprei come aiutarti qui, magari cerca sul forum o controlla se riesci a reperire i codici di progetti simili!

Grazie mille per tutti i chiarimenti ho ancora una domanda secondo voi è possibile comandare il mio robot da un telefono android?? Se si esistono delle guide ???