Go Down

Topic: [Risolto] Macchinina con due motori DC: gira a sinistra ma non a destra (Read 684 times) previous topic - next topic

ilfugiuliopascal

Dec 23, 2012, 03:58 pm Last Edit: Dec 24, 2012, 02:21 pm by ilfugiuliopascal Reason: 1
Buonasera,
scrivo in questa sezione perché non so se il mio problema è hardware o software. Uso Arduino Uno e sto cercando di costruire una macchinina telecomandata, con due motori in continua. Ho seguito varie guide trovate in rete, e ho fatto un mix delle informazioni trovate per ottenere ciò che mi serviva. Il risultato è che con i tasti wasd riesco a direzionarla, ma stranamente se le dico di andare avanti, a sinistra e indietro va, mentre a destra no. Nel codice non ho rilevato nessun indizio che possa identificare l'anomalia, in quanto simmetrico per destra e sinistra; lo stesso si può dire dei collegamenti. Ciò non dipende sicuramente dal motore: ho misurato la differenza di potenziale in vari punti del circuito, e quando do il comando di girare a destra la tensione è zero sulla breadboard. Inoltre il risultato è lo stesso anche se inverto i pin destra e sinistra: non gira comunque a destra. Allego il codice e uno schema dei circuiti di fritzing (mi scuso, visto che questo è sconsigliato dalle linee guida del forum, ma non so ancora usare KiCad o Eagle; sto però cercando di imparare uno dei due e spero quindi di ovviare a questo problema il prima possibile).
Grazie fin da subito se qualcuno vorrà aiutarmi

Code: [Select]
/*
* Controllo due motori in DC con la tastiera
* tasti wasd
* velocità preimpostate
* 22-12-2012
*/

const int left_enPin  = 5;  // H-Bridge left enable pin
const int left_in1Pin = 7;  // H-Bridge left pins
const int left_in2Pin = 4;

const int right_enPin  = 6;  // H-Bridge right enable pin
const int right_in1Pin = 3;  // H-Bridge right input pins
const int right_in2Pin = 2;

int value = 128;  //velocità motori
int cmd;  //comando inserito
int ciclo=0;  //ciclo

void setup()
{
 Serial.begin(9600);
 pinMode(left_in1Pin, OUTPUT);
 pinMode(left_in2Pin, OUTPUT);
 pinMode(right_in1Pin, OUTPUT);
 pinMode(right_in2Pin, OUTPUT);
}

void loop()
{
 if(ciclo == 0) {  //mostra i comandi solo all'inizio e quando viene premuto Stop
   Serial.println(">> COMANDI ROBOT <<\n w - Avanti \n d - Destra \n a - Sinistra \n s - Indietro \n e - Ruota Destra \n q - Ruota Sinistra \n 0 - Stop");
   Serial.println(" 1 - Velocita' 35/100");
   Serial.println(" 2 - Velocita' 50/100");
   Serial.println(" 3 - Velocita' 75/100");
   Serial.println(" 4 - Velocita' 100/100");
   Serial.println("// Velocita' impostata //");
   Serial.println(value);
   ciclo++;  
 }
 
 else {
   if (Serial.available() > 0) {
     cmd = Serial.read();
     Serial.flush();
   
     switch(cmd) {
     
       case 'w': {  //Avanti
         digitalWrite(left_in1Pin, LOW);    //imposta direzione rotazione motore sinistra
 digitalWrite(left_in2Pin, HIGH);
         digitalWrite(right_in1Pin, LOW);    //imposta direzione rotazione motore destra
 digitalWrite(right_in2Pin, HIGH);
         analogWrite(left_enPin, value);   //Controllo velocità PWM
         analogWrite(right_enPin, value);  
         delay(100);
         Serial.println("\nAVANTI");
       }  break;
     
       case 'd': {  //Destra
         digitalWrite(left_in1Pin, LOW);    //imposta direzione rotazione motore sinistra
 digitalWrite(left_in2Pin, HIGH);
         analogWrite(left_enPin, value);   //Controllo velocità PWM
         analogWrite(right_enPin, 0);  
         delay(100);
         Serial.println("\nDESTRA");
       }  break;
   
       case 'a': {  //Sinistra
         digitalWrite(right_in1Pin, LOW);    //imposta direzione rotazione motore destra
 digitalWrite(right_in2Pin, HIGH);
         analogWrite(left_enPin, 0);   //Controllo velocità PWM
         analogWrite(right_enPin, value);  
         delay(100);
         Serial.println("\nSINISTRA");
       }  break;
     
       case 's': {  //Indietro
         digitalWrite(left_in1Pin, HIGH);    //imposta direzione rotazione motore sinistra
 digitalWrite(left_in2Pin, LOW);
         digitalWrite(right_in1Pin, HIGH);    //imposta direzione rotazione motore destra
 digitalWrite(right_in2Pin, LOW);
         analogWrite(left_enPin, value);   //Controllo velocità PWM
         analogWrite(right_enPin, value);  
         delay(100);
         Serial.println("\nINDIETRO");
       }  break;
     
       case 'e': {  //Ruota Destra
         digitalWrite(right_in1Pin, HIGH); //Il motore a destra va indietro e quello a sinistra in avanti
         digitalWrite(right_in2Pin, LOW);
         digitalWrite(left_in1Pin, LOW);
         digitalWrite(left_in2Pin, HIGH);
         analogWrite(right_enPin, value);  
         analogWrite(left_enPin, value);
         delay(100);
         Serial.println("\nRUOTA DESTRA");
       } break;
     
       case 'q': {  //Ruota Sinistra
         digitalWrite(right_in1Pin, LOW); //Il motore a sinistra va indietro e quello a destra avanti
         digitalWrite(right_in2Pin, HIGH);
         digitalWrite(left_in1Pin, HIGH);
         digitalWrite(left_in2Pin, LOW);
         analogWrite(right_enPin, value);  
         analogWrite(left_enPin, value);
         delay(100);
         Serial.println("\nRUOTA SINISTRA");
       } break;
     
       case '1': {  //velocità 1 = 35%
         value = 89;
         Serial.println(value);
       } break;
     
       case '2': {  //velocità 2 = 50%
         value = 128;
         Serial.println(value);
       } break;
       
       case '3': {  //velocità 2 = 75%
         value = 192;
         Serial.println(value);
       } break;
       
       case '4': {  //velocità 2 = 100%
         value = 255;
         Serial.println(value);
       } break;
     
       case '0': {  //Stop
         analogWrite(right_enPin, 0);  
         analogWrite(left_enPin, 0);
         delay(100);
         Serial.println("\nSTOP\n");
         ciclo = 0;
       } break;
     
     }  //fine switch
   }  //fine if
 }  //fine else
 
}  //fine loop


http://imageshack.us/photo/my-images/254/duemotoriindcregolazion.jpg/
http://imageshack.us/photo/my-images/5/duemotoriindcregolazion.jpg/

uwefed


ilfugiuliopascal

È vero! Caspita che errore!
Ero così convinto che il ponte fosse simmetrico parte destra - parte sinistra che non ho neppure ricontrollato il datasheet.
Grazie mille per l'aiuto  :)

UweFederer

Si deve sempre controllare.
Del TLC5940 per esempio so che cambia la pediantura se é un DIL o un SMD.
Ciao Uwe

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy