Motore non inverte direzione

Buongiorno,
Sono piuttosto novizio sulla programmazione di Arduino.
Sto costruendo un robot rover per mia figlia per testare il suo vero interesse alla robotica visto che si è iscritta a un ITI con questo ramo.
Hardware: Arduino Uno / Shield L293D motor driver / sensore ultrasuoni HC-SR04

Ho buttato giù questo sketch.
In linea di massima funziona.
Va avanti, ma in caso di ostacolo deve girare. Gira ma ruota solo la ruota sinistra. La destra non si muove.
Ho provato diverse soluzioni ma non c’è verso.
Se invece carico un semplice programma con i soli comandi inversi il motore gira in tutti e due i sensi.
Sembra che non prenda il comando sono if.
Grazie in anticipo per l’aiuto.

#include <AFMotor.h>

AF_DCMotor L_motor(2); 
AF_DCMotor R_motor(1); 

const int trigPin = 10; 
const int echoPin = 11; 
long durata;
int distanza;

void setup() {
  
Serial.begin(9600); 

pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 

L_motor.setSpeed(100); 
R_motor.setSpeed(100); 
R_motor.run(RELEASE); 
L_motor.run(RELEASE); 
}

void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2); 

digitalWrite(trigPin, HIGH); 
delayMicroseconds(5); 
digitalWrite(trigPin, LOW); 

durata = pulseIn(echoPin, HIGH); 

distanza= durata*0.034/2; 

if(distanza<10) 
{ 
  L_motor.run(FORWARD); 
  R_motor.run(FORWARD); 
  delay(2000); 
}
else
  {
  L_motor.run(BACKWARD); 
  R_motor.run(FORWARD); 
  };
}

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO

… poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione e sistemato il codice nel post qua sopra, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Dando un’occhiata rapida credo che sia sbagliata la logica dietro l’ultimo if, cioè se la distanza è minore di 10 dovresti avere le ruote che girino in senso opposto. Inoltre è presente un punto e virgola di troppo subito dopo la penultima parentesi graffa. Dico così:

#include <AFMotor.h>

AF_DCMotor L_motor(2); 
AF_DCMotor R_motor(1); 

const int trigPin = 10; 
const int echoPin = 11; 
long durata;
int distanza;

void setup() {
  
Serial.begin(9600); 

pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 

L_motor.setSpeed(100); 
R_motor.setSpeed(100); 
R_motor.run(RELEASE); 
L_motor.run(RELEASE); 
}

void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2); 

digitalWrite(trigPin, HIGH); 
delayMicroseconds(5); 
digitalWrite(trigPin, LOW); 

durata = pulseIn(echoPin, HIGH); 

distanza= durata*0.034/2; 

if(distanza<10) 
{ 
  L_motor.run(BACKWARD); 
  R_motor.run(FORWARD); 
  delay(2000); 
}
else {
   L_motor.run(FORWARD); 
   R_motor.run(FORWARD);
  }
}

Grazie per la risposta Giusto hai ragione. Mi ero accorto e ho corretto il senso di rotazione e tolto il ;. Ma il problema rimane. Se passa attraverso l' if il motore sx non gira. O meglio. Passati i 2 secondi fa un micro accenno indietro ma poi ripartono tutte e due le ruote in avanti. La frequenza di lavoro dei motore può essere?

Potrebbe essere ma non posso darti la certezza, purtroppo non ho mai avuto a che fare con progetti del genere... dovresti aspettare la risposta di qualcuno più esperto. Tu intanto fai qualche prova e facci sapere!