Go Down

Topic: [Risolto] Macchinina con due motori DC: gira a sinistra ma non a destra (Read 601 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