Controllare il verso di rotazione dei motorini in corrente continua con Arduino

Ponte H L298N, se stai lavorando ad un progetto in cui c’è bisogno di controllare la velocità ed il senso di rotazione di marcia di un motore in corrente continua dc, allora è quello di cui hai bisogno.

Cosa fa sostanzialmente questo Ponte H ???

Configurazioni_di_controllo_di_un_ponte_H

Guardando l’immagine qui sopra la prima cosa che si nota è la forma delineata dal circuito che è quella della lettera H, da cui il nome Ponte H, successivamente notiamo il motore posto al centro del circuito proseguendo nell’osservazione dell’immagine troviamo sostanzialmente i due capi che rispettivamente rappresentano Vcc e Gnd che andrà applicata al motore, mentre dai lati troviamo 4 interruzioni LA CHIAVE DEL CIRCUITO in pratica sono dei transistor suddivisi in coppia sui lati, i quali permettono lo scambio della rotazione del motore.
A questo punto è abbastanza logico capire che la coppia non potrà mai avere saturi entrambi i transistor ma potrà avere solo un transistor saturo ed uno interdetto rispettivamente uno chiuso e uno aperto, senza mai andare a saturare (chiudere) insieme i due transistor che formano la coppia, quindi volendo dare un nome(sigla) ai lati tanto per convenzione, il circuito potrà presentare solo le seguenti situazioni:

APERTO-CHIUSO (latoA) | CHIUSO-APERTO (latoB)
CHIUSO-APERTO (latoA) | APERTO-CHIUSO (latoB)

L298N_PONTE_H_arduino

In questo articolo il nostro ponte H sarà il driver L298N dotato delle seguenti caratteristiche:

  • Double H Bridge Motor Driver Module
  • Logical Voltage: 5VDrive
  • Voltage: 5V-35VLogical
  • Current: 0mA-36mA Drive Current 2A(MAX single bridge)
  • Storage Temperature: -20 to +135Max
  • Power: 25W
  • Size: Approx. 43 x 43 x 27mm/ 1.69″ x 1.69″ x 1.07″

Pinout della scheda:

pinout_l298n

a questo punto possiamo collegare il nostro motorino sull’output A e la 12Vdc ai rispettivi terminali.
A questo punto dobbiamo collegare 2 pin digitali rispettivamente su IN1 e IN2 ed un pin PWM su ENA.
Io ho scelto i pin 22 e 24 per IN1 e IN2 mentre il pin 8 PWM per ENA.

A questo punto bisogna scrivere lo sketch, semplici righe di codice che non necessitano di alcuna libreria………… iniziamo quindi a porci la prima domanda… come facciamo a variare la velocità del motore???
Per variare la velocità la solita istruzione digitalWrite(pinVel, HIGH); non andrà bene perché sappiamo che applicando una tensione costante nel tempo la velocità del motore rimarrà invariata, ecco perché sul pin ENA abbiamo collegato un pin Arduino con possibile segnale PWM in uscita, questo significa che possiamo modificare il segnale in uscita oltre il classico LOW e HIGH in un range che va da 0 a 255 … andando quindi a modificare il DUTY CYCLE del segnale, modificando nel tempo la durata della parte alta del segnale nel suo istante di tempo/periodo determinato dal timer al quale è collegata l’uscita Arduino, ottenendo così delle diverse velocità.

PWM

Il resto è abbastanza facile perché con IN1 e IN2 decidiamo il verso di marcia del motore semplicemente applicando tensione ad uno piuttosto che a l’altro, ad esempio con HIGH sul pin 22 il motore ruota verso destra, mentre settando HIGH sul 24 e LOW sul 22 il motore ruota verso sinistra o viceversa.

Di seguito uno sketch di test:

– Inviando a da seriale il motore salirà gradualmente di giri fino al picco massimo per poi tornare a scendere fino a fermarsi : il verso di marcia scelto è sx

– Inviando d da seriale il motore salirà gradualmente di giri fino al picco massimo per poi tornare a scendere fino a fermarsi: il verso di marcia scelto è dx

– Inviando 1 da seriale il motore inizia a ruotare fino al successivo comando.

– Inviando 0 da seriale il motore si ferma(se in movimento) fino al successivo comando.

N.B.
Il verso del motore dipenderà da come sarà collegato all’output A, quindi se la rotazione non corrisponde al verso dello sketch basta invertire i fili del motore

L298N_PONTE_H_motore_arduino

Di seguito lo sketch che usato per il video:

#define pinVel 8
#define pinSx 22
#define pinDx 24


void setup()
{
  Serial.begin(9600);
  pinMode(pinVel, OUTPUT);
  pinMode(pinSx, OUTPUT);
  pinMode(pinDx, OUTPUT);
}


void loop()
{
  if (Serial.available()) {
    char mode = Serial.read();
    Serial.flush();
    setModeTest(mode);
  }
}


void setModeTest(char mode) {
  if (mode == 'a') {
    digitalWrite(pinDx, LOW);
    digitalWrite(pinSx, HIGH);
    Serial.println("MODE: Sx");
    start();
  }
  else if (mode == 'd') {
    digitalWrite(pinSx, LOW);
    digitalWrite(pinDx, HIGH);
    Serial.println("MODE: Dx");
    start();
  }
  else if (mode == '0') {
    Serial.println("MODE: Stop");
    analogWrite(pinVel, 0);
  }
  else if (mode == '1') {
    Serial.println("MODE: Start");
    digitalWrite(pinDx, LOW);
    digitalWrite(pinSx, HIGH);
    analogWrite(pinVel, 255);
  }
} // END setModeTest


void start()
{
  for (int i = 0; i < 2; i++) {
    if (i % 2 == 0) {
      for (int j = 1; j < 256; j++) {
        Serial.print("Vel: ");
        Serial.println(j);
        analogWrite(pinVel, j);
      } // END FOR j
    }
    else {
      for (int j = 255; j >= 0; j--) {
        analogWrite(pinVel, j);
        Serial.print("VEL: ");
        Serial.println(j);
      } // END FOR j
    } // END ELSE
  } //END FOR i
} // END test

l’articolo termina qui, con un video ed un link dove viene descritto come ottenere la stessa cosa senza Arduino con l’uso di un solo relè..
E come a solito buon lavoro e buon divertimento ;)

  • Share post