Problema direzione motori Dc con Joystick - Shield L298P

Buongiorno makers! Sono un autoriparatore di 30 anni e mi sto cimentando con diversi progettini semplici con Arduino. Sto cercando di muovere due motorini DC 12V comandati tramite un joystick e utilizzando una shield L298P. Gli sketch online sono numerosi per questo semplicissimo progetto però, sorpresa delle sorprese, i motorini girano sempre nella stessa direzione! Ho provato a giocare con gli HIGH & LOW ma senza successo.
Cosa mi sfugge??
Per favore aiutatemi!

//Joystick Pins
int x_key = A0;                                               
int y_key = A1;                                               
int x_pos;
int y_pos;

//Motor Pins
int EN_A = 11;      //Enable pin for first motor
int IN1 = 9;       //control pin for first motor
int IN2 = 8;       //control pin for first motor
int IN3 = 7;        //control pin for second motor
int IN4 = 6;        //control pin for second motor
int EN_B = 10;      //Enable pin for second motor
//Initializing variables to store data
int motor_speed;
int motor_speed1;

void setup ( ) {
  Serial.begin (9600); //Starting the serial communication at 9600 baud rate
  //Initializing the motor pins as output
  pinMode(EN_A, OUTPUT);
  pinMode(IN1, OUTPUT);  
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);  
  pinMode(IN4, OUTPUT);
  pinMode(EN_B, OUTPUT);

  //Initializng the joystick pins as input
  pinMode (x_key, INPUT) ;                     
  pinMode (y_key, INPUT) ;                      
}

void loop () {
    x_pos = analogRead (x_key) ;  //Reading the horizontal movement value
    y_pos = analogRead (y_key) ;  //Reading the vertical movement value
   
if (x_pos < 400){     //Rotating the left motor in clockwise direction
    motor_speed = map(x_pos, 400, 0, 0, 255);   //Mapping the values to 0-255 to move the motor
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(EN_A, motor_speed);
  }

else if (x_pos>400 && x_pos <600){  //Motors will not move when the joystick will be at center
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
  }
  
else if (x_pos > 600){    //Rotating the left motor in anticlockwise direction
    motor_speed = map(x_pos, 600, 1023, 0, 255);
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(EN_A, motor_speed);
  }
   
if (y_pos < 400){         //Rotating the right motor in clockwise direction
    motor_speed1 = map(y_pos, 400, 0, 0, 255);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(EN_B, motor_speed1);
  }

else if (y_pos>400 && y_pos <600){
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
  }
  
else if (y_pos > 600){        //Rotating the right motor in anticlockwise direction
    motor_speed1 = map(y_pos, 600, 1023, 0, 255);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(EN_B, motor_speed1);
  }
  }

Buongiorno, :slight_smile:
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 ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Quale shield?
Ciao Uwe

https://images.app.goo.gl/buhP5o1zixS1MfRH8

è identica a questa. Spero si veda la foto.

Prova a semplificare il codice esaminando il funzionamento di UN SOLO MOTORE. Fissa nel setup() i valori di IN1 e IN2 e nel loop() esegui solamente la lettura di UN potenziometro (X per motore1) e l'azionamento di UN pwm (motore1) e vedi se la velocità aumenta e diminuisce. Poi aggiungi motore2 anche qui leggendo il valore DELL'ALTRO potenziometro e azionando L'ALTRO pwm (motore2), vedendo se la velocità aumenta e diminuisce. Non è necessario nessun "if". Leggi il valore di X, regola la velocità di motore1, leggi il valore Y, regola la velocità di motore2.

Fatto questo, prova a cambiare i valori di IN1 e IN2 nel setup(), ricordando che LOW LOW e HIGH HIGH = motore fermo; LOW HIGH = motore avanti; HIGH LOW = motore indietro, e vedi se il verso del motore1 cambia. Se cambia, prova a spostare il settaggio di IN1 e IN2 dal setup() al loop(), Lo stesso per motore2.

Se così tutto funziona puoi introdurre gli "if" e tentare l'avanti-indietro PRIMA per motore1 e POI per motore2.

Ciao,
P.

Ho fatto una prova cercando di seguire il più fedelmente possibile il tuo consiglio. Considera che non ho quasi nessuna conoscenza in programmazione, se non modificando qualche sketch trovato in rete. Posto il codice qua sotto: ho anche eliminato il map del joystick per togliere un'altra variabile e ho impostato manualmente la velocità del motore. Purtroppo scambiano HIGH e LOW il motore gira sempre nella stessa direzione e anche impostando HIGH-HIGH o LOW-LOW il motore gira al regime impostato. (Il regime cambia in base al valore che inserisco quindi il pwm funziona).

//Joystick Pins
int x_key = A0;                                               
int y_key = A1;                                               
int x_pos;
int y_pos;

//Motor Pins
int EN_A = 11;      //Enable pin for first motor
int IN1 = 9;       //control pin for first motor
int IN2 = 8;       //control pin for first motor
int IN3 = 7;        //control pin for second motor
int IN4 = 6;        //control pin for second motor
int EN_B = 10;      //Enable pin for second motor
//Initializing variables to store data
int motor_speed;
int motor_speed1;

void setup ( ) {
  Serial.begin (9600); //Starting the serial communication at 9600 baud rate
  //Initializing the motor pins as output
  pinMode(EN_A, OUTPUT);
  pinMode(IN1, OUTPUT);  
  pinMode(IN2, OUTPUT);


  //Initializng the joystick pins as input
  pinMode (x_key, INPUT) ;                                         
}

void loop () {
    x_pos = analogRead (x_key) ;  //Reading the horizontal movement value

    motor_speed = 100   //Mapping the values to 0-255 to move the motor
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(EN_A, motor_speed);
  }

Viene da pensare che i pin che controllano la direzione (cioè 8 e 9) non siano quelli giusti. Sono elencati nelle istruzioni della shield?

Ecco, questa cosa non la sapevo. Pensavo bastasse dichiarare un pin qualunque, semmai facendo attenzione ai pwm.
Scusate l'ignoranza.
Devo basarmi su questo schema?
https://store.arduino.cc/arduino-motor-shield-rev3

Leggi la parte DOCUMENTATION Input and Output qui.

Ciao,
P.

Ovviamente ho risolto impostando correttamente i pins!
Grazie mille ragazzi, funziona!

Ho letto anche della possibilità di utilizzare solo 2 pins per ogni motore e non 3. Cosa che mi lascia perplesso date le mie conoscenze limitatissime che si basano perlopiù sull'intuizione.