pilotaggio motore DC con ponte H

ho ricontrollato più volte il circuito(mi sembra tutto esatto) però il motorino gira per un paio di secondi quando carico il programma e poi ancora quanto apro il monitor seriale.Una cosa strana però c'è: Ho provato a mettere una stampa del valore letto dal potenziometro e questa dava valori da 1 a 8 man mano che giravo la vite; tanto per provare ho provato a cambiare il potenziometro ma comunque stesso problema
Vi posto il programma.

int letpot=A0;
float vel;
char azione;
int avantisx=13;  
int indietrosx=12;  
int velocita=11;

void setup ()
{
 
  pinMode (avantisx, OUTPUT);
  pinMode (indietrosx, OUTPUT);
  pinMode (velocita, OUTPUT);
  pinMode (letpot, INPUT);
  Serial.begin(9600);
}

void loop ()
{
  while (Serial.available()==0)  
  {}
  azione=Serial.read ();
  
  vel = analogRead (letpot);
  Serial.println (vel);
  avanti (500);
  
  if (azione == 'w')
  {
    avanti (vel); 
 }
  
  if (azione == 's')
  {
    indietro (vel);
  }
}

void avanti (int v)
{ 
  digitalWrite (avantisx, LOW);
  digitalWrite (indietrosx, LOW);
 
  digitalWrite (avantisx, HIGH);
  digitalWrite (indietrosx, LOW);
  analogWrite (velocita, ((v/1023)*255));
  
}

void indietro (int v)
{
  digitalWrite (avantisx, LOW);
  digitalWrite (indietrosx, LOW);
  
  digitalWrite (avantisx, LOW);
  digitalWrite (indietrosx, HIGH);
  analogWrite (velocita, ((v/1023)*255));
 
}

Non ha molto senso la logica che hai implementato. Quel codice non fa quello che ti aspetti. la while() è bloccante.
Alla partenza del programma il motore deve girare o devi aspettare da seriale w ?

void loop()
{ if(Serial.available()>0)         // se c'e' un dato lo leggo altrimenti azione rimane il valore precedente
  { azione=Serial.read ();        
  }
  vel = analogRead (letpot);
  Serial.println (vel);
  if (azione == 'w')
  { avanti (vel); 
  }
  if (azione == 's')
  { indietro (vel);
  }
}

Se alla partenza deve andare avanti allora nelle variabili globali inizializza azione a w

char azione='w';

devo aspettare da seriale 'w' oppure 's'

Argo_Fra:
devo aspettare da seriale 'w' oppure 's'

allora non inizializzare azione a nulla (oppure a ' ' spazio). E ti ho tolto la avanti(500)

P.S. era meglio aprire il topic nella sezione Software :grin:

si hai ragione era meglio nella sezione SW.
Appena ho tempo monto il tutto e poi faccio sapere se funziona;
grazie!

Tieni conto che quando arriva w o s ad Arduino, finchè non mandi altri comandi azione varrà sempre quel carattere.
Perciò di continuo esegue avanti() o indietro()
Non mi ricordo come funzia il ponte H, devi di continuo mandare segnali sui pin?
Se non è necessario allora azzera il comando dopo avanti e indietro:

  if (azione == 'w')
  { avanti (vel); 
    azione=' ';  // azzera il comando
  }

In teoria non è necessario mandare di continuo segnali sui pin (dovrebbe tenere "in memoria" finche non dai un nuovo comando), ed è quello che avevo intenzione di fare.

ho modificato il mio programma così:

int letpot=A0;
int vel;
char azione;
int avantisx=13;  //motore sx
int indietrosx=12;  // motore sx
int velocita=11;

void setup ()
{
 
  pinMode (avantisx, OUTPUT);
  pinMode (indietrosx, OUTPUT);
  pinMode (velocita, OUTPUT);
  pinMode (letpot, INPUT);
  Serial.begin(9600);
}

void loop ()
{
  if (Serial.available()>0)  //  leggo qualcosa   
  {
    azione=Serial.read ();  // leggo un carattere: decido il verso di rotazione
  }
  
  if (azione == 'w')  // verso avanti
  {
    avanti (); 
 }
  
  if (azione == 's')  // verso indietro
  {
    indietro ();
  }
}

void avanti ()
{ 
  // MOTORE 
  digitalWrite (avantisx, HIGH);  // abilito i pin dell'integrato per far girare il motore in un verso
  digitalWrite (indietrosx, LOW);
  int v;
  
   v=map(letpot, 0, 1023, 0, 255);
  int a=analogRead (letpot);
  Serial.println(a);
  analogWrite (velocita, v);  // do un valore da 1 a 255 sul pin 1 dell'integrato (indico la velocità con cui deve girare il motore)
  //Serial.println(z);
}

void indietro ()
{
  digitalWrite (avantisx, LOW);// abilito i pin dell'integrato per far girare il motore in un verso
  digitalWrite (indietrosx, HIGH);
  int v;
  
  v=map(letpot, 0, 1023, 0, 255);
  
  analogWrite (velocita, v);// do un valore da 1 a 255 sul pin 1 dell'integrato (indico la velocità con cui deve girare il motore)
  Serial.println("indietro\n");
}

ho riscontrato ancora 2 problemi di cui non riesco a capirne il motivo:

  1. mettendo una stampa della variabile a (nella funzione avanti() ) sul monitor visualizza(ruotando il potenziometro) numeri da o a 638; non dovrebbe essere da 0 a 1023? (al potenziometro non sono state aggiunte resistenze in serie).
  2. la funzione map mi restituisce sempre il valore 3
    grazie

Il potenziometro lo hai collegato come partitore di tensione o direttamente tra il +5V e il pin di input?

Se vuoi questo è il codice che io uso per comandare un motore DC attraverso L293D e un Joystick

 byte motor1Pin1 = 3;    // pin 2 on L293D
byte motor1Pin2 = 4;    // pin 7 on L293D
byte enablePin = 9;    // pin 1 on L293D
int value = 512;
void setup() {
  // set the switch as an input:
  Serial.begin(9600);
  // set all the other pins you're using as outputs:
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enablePin, OUTPUT);

  // set enablePin high so that motor can turn on:
  digitalWrite(enablePin, HIGH);  
}

void loop() {
  // if the switch is high, motor will turn on one direction:
  value = analogRead(A0);
  Serial.println(value);
  
  if (value > 505) {
    value = map (value, 520, 1023, 40, 255);
    value = 255 - value;
    analogWrite(motor1Pin1, value);   // set pin 2 on L293D low
    digitalWrite(motor1Pin2, HIGH);  // set pin 7 on L293D high
  }
  // if the switch is low, motor will turn in the opposite direction:
  else if (value < 495){
    value = map (value, 0, 504, 40, 255);
    value = 255 - value;
    analogWrite(motor1Pin1, value);  // set pin 2 on L293D high
    digitalWrite(motor1Pin2, LOW);   // set pin 7 on L293D low
  }
  else{
    digitalWrite(motor1Pin1, HIGH);  // set pin 2 on L293D high
    digitalWrite(motor1Pin2, HIGH);
  }
  delay(10);
}

Argo_Fra:
... la funzione map mi restituisce sempre il valore 3

e non vedo che altro potrebbe fare.

nel tuo codice:

int letpot=A0;
-----
v=map(letpot, 0, 1023, 0, 255);

hai definito letpot come AO, cioè il pin dove lo hai collegato, NON la lettura del pin stesso.

v=map(analogRead(ledpot),0,1023,0,255)

doverbbe essere corretto.
ciao
pippo72