Problema motore dc

ciao a tutti, il problema è questo.. sto programmando un driver l293d affinchè piloti un motorino dc di una macchinina radiocomandata. il codice è questo

#include <SoftwareSerial.h>

SoftwareSerial BluetoothSerial = SoftwareSerial(0, 1); //si richiama il modulo bluetooth

const int input1m1 = 9; //input1 per il motore 1
const int input2m1 = 10;//input2 per il motore 2
const int enableM1 = 11;//regolatore motore 1
char marcia;
int velmotore = 0;

void setup() {
Serial.begin(9600);
BluetoothSerial.begin(9600); //si stabliscono le variabii generali
pinMode(input1m1, OUTPUT);
pinMode(input2m1, OUTPUT);
pinMode(enableM1, OUTPUT);
digitalWrite(enableM1, LOW); //il circuito parte con motore spento
pinMode(5, OUTPUT);

}

void loop() {
if (BluetoothSerial.available()){
marcia=BluetoothSerial.read(); //vengono lette le marce e di conseguenza la velocità

if(marcia=='1'){
velmotore = 25;
}

if(marcia=='2'){
velmotore = 51;
}

if(marcia=='3'){
velmotore = 76;
}

if(marcia=='4'){
velmotore = 102;
}

if(marcia=='5'){
velmotore = 127;
}

if(marcia=='6'){
velmotore = 153;
}

if(marcia=='7'){
velmotore = 178;
}

if(marcia=='8'){
velmotore = 204;
}

if(marcia=='9'){
velmotore = 229;
}

if(marcia=='q'){
velmotore = 254;
}

if(marcia=='F'){
digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
digitalWrite(input2m1, LOW);
analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
Serial.print("avanti");
}

else{
analogWrite(enableM1, 0); //senza comando il motore si ferma
}

if(marcia=='B'){
digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
digitalWrite(input2m1, HIGH);
analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
}
else{
analogWrite(enableM1, 0); //senza comando il motore si ferma
}
}
}

in poche parole il motorino gira solo in un verso, dall altra non vuol proprio saperne di andare. ho pensato fosse un problema di motore ma se inverto gli output cambia verso e gira ma non va più dall' altra parte.
il driver è nuovo e i collegamenti li ho fatti bene.

p.s. piloto tramite bluetooth se non si fosse capito! :stuck_out_tongue:

La prossima volta usa il tag </> per inserire il codice.
Ho aggiunto il comando S (stop) e G (go) e migliorato i confronti:

#include <SoftwareSerial.h>

SoftwareSerial BluetoothSerial = SoftwareSerial(0, 1); //si richiama il modulo bluetooth

const int input1m1 = 9; //input1 per il motore 1
const int input2m1 = 10;//input2 per il motore 2
const int enableM1 = 11;//regolatore motore 1
char marcia;
int velmotore = 0;

void setup() {
  Serial.begin(9600);
  BluetoothSerial.begin(9600);  //si stabliscono le variabii generali
  pinMode(input1m1, OUTPUT);
  pinMode(input2m1, OUTPUT);
  pinMode(enableM1, OUTPUT);
  digitalWrite(enableM1, LOW); //il circuito parte con motore spento
  pinMode(5, OUTPUT);
}

void loop() {
  if (BluetoothSerial.available()) {
    marcia = BluetoothSerial.read(); //vengono lette le marce e di conseguenza la velocità

    if (marcia == '1') {
      velmotore = 25;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == '2') {
      velmotore = 51;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == '3') {
      velmotore = 76;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == '4') {
      velmotore = 102;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == '5') {
      velmotore = 127;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == '6') {
      velmotore = 153;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == '7') {
      velmotore = 178;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == '8') {
      velmotore = 204;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == '9') {
      velmotore = 229;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == 'q') {
      velmotore = 254;
      analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
    else if (marcia == 'F') {  // FORWARD
      digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
      digitalWrite(input2m1, LOW);
      Serial.print("avanti");
    }
    else if (marcia == 'B') {  // BACKWARD
      digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
      digitalWrite(input2m1, HIGH);
      Serial.print("indietro");
    }
    else if (marcia == 'S') {  // STOP
      analogWrite(enableM1, LOW);
      Serial.print("STOP");
    }
    else if (marcia == 'G') {  // GO
      analogWrite(enableM1, HIGH);
      Serial.print("GO");
    }
  }
}

non capisco l' utilità di quei comandi. il mio problema è un altro. io vorrei sapere perche non gira in un verso. grazie comunque per la risposta

Il problema è proprio negli ultimi if del tuo sketch: analizza meglio il flusso del programma.

in che senso? senza aggiungere nuovi comandi, o utilizzando quelli gia presenti come si potrebbe risolvere?

scusate l' up. ma gentilmente potreste rispondere?

 SoftwareSerial BluetoothSerial = SoftwareSerial(0, 1);

Non puoi usare gli stessi pin della seriale hardware.

analizza questo codice:

if(marcia=='F')
     {
     digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
     digitalWrite(input2m1, LOW);
     analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
     Serial.print("avanti");
     }
else
     {
     analogWrite(enableM1, 0); //senza comando il motore si ferma
     }
 
if(marcia=='B')
    {
    digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
    digitalWrite(input2m1, HIGH);
    analogWrite(enableM1, velmotore); //si imposta la velocità grazie al pin PWM
    }
else
   {
   analogWrite(enableM1, 0); //senza comando il motore si ferma 
   }

se il carattere é F allora viene pilotato il motore in una direzione e poi quel carattere non é B e percui viene spento dal secondo else.

Viceversa se é B...

Ciao Uwe

scusa ma non ho capito cosa intendi. comunque l' else dopo 'F' o 'B' serve a tenere fermo il motore se il pulsante che invia il segnale è spento

Clash230:
scusa ma non ho capito cosa intendi. comunque l' else dopo 'F' o 'B' serve a tenere fermo il motore se il pulsante che invia il segnale è spento

Sí, ma il else del B tiene fermo il motore pilotato dal F. Per questo gira solo in una direzione.

e come posso fare allora?

devo togliere l' else di 'B' per risolvere? nient' altro?