Pages: [1]   Go Down
Author Topic: [Risolto] Macchinina con due motori DC: gira a sinistra ma non a destra  (Read 484 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*
 * 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/
« Last Edit: December 24, 2012, 08:21:04 am by ilfugiuliopascal » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai invertito pin 16 con pin 9 del L293
Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

È 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  smiley
Logged

Global Moderator
Offline Offline
Newbie
*****
Karma: 13
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: