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
/*
* 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