L298N pilotare un motore DC con Arduino

Gli esperimenti continuano! Dopo il primo articolo “elettronico” in cui spiegavo come interfacciare un sensore ad ultrasuoni HC-SR04 con Arduino, in quello di oggi parlo del modulo L298N, conosciuto anche come L298N DualFull-Bridge Motor Driver.
Si tratta di un modulo basato appunto sull’integrato L298, principalmente utilizzato per pilotare motori, relè, solenoidi e motori passo passo. In alcune configurazioni lo si può vedere a comando di potenti led o led strip. Tranne nel caso in cui si voglia pilotare un motore passo passo (lo vedremo in un articolo futuro) le due uscite possono essere comandate autonomamente.
Una breve descrizione per dirti che è composto da due connettori laterali ai quali collegare i motori (o i carichi in generale), e da connettori frontali dove collegare l’alimentazione e le connessioni logiche atte a pilotare i carichi. Qui puoi trovare il datasheet dell’integrato in se, mentre qui sotto ti ho messo una foto per rendere meglio l’idea delle connessioni.

Pinout L298N

Pinout L298N

Altre info tecniche per dirti che il modulo può funzionare con tensioni dai 5 ai 35 volt e fornire 2A di corrente per ogni uscita. Il modulo L298N presenta inoltre una chicca abbastanza utile in certi casi, quando alimentato a 12 volt, dal connettore di alimentazione, in corrispondenza dell’uscita +5v è possibile prelevare una tensione regolata a 5 volt per alimentare un eventuale Arduino o altri componenti del progetto. Per abilitare questa funzione lasciare in sede il jumperino presente dietro i connettori di alimentazione, ma se il nostro modulo è alimentato con tensioni maggiori di 12 volt questo jumper va rimosso per impedire che venga danneggiato il regolatore di tensione a 5 volt.
Nell’esperimento di oggi prenderò in considerazione soltanto un’uscita (Output A della foto), in quanto l’intento è quello di pilotare un solo motore, ma come potrai ben notare, l’utilizzo del modulo L298N è estremamente semplice che comandarne un secondo non comporta nulla di complicato, se non aggiungere qualche riga di codice in più 😉

Lo schema:

Schema dei collegamenti per questo esempio

Schema dei collegamenti per questo esempio

Uno dei motivi principali per i quali vengono utilizzati questi moduli, è quello di evitare di dover alimentare carichi dispendiosi tramite il povero Arduino, che come ben sappiamo, non ha voglia di far passare troppa corrente in uscita dai suoi pin. Per fare questo, il modulo L298N è predisposto in modo da poter fornire ai motori o ai carichi in genere, un’alimentazione esterna indipendente dalle connessioni logiche di chi lo pilota.
Quindi vediamo una batteria da 12 Volt collegata ai connettori +12 e GND del modulo. Cosa importante però, è la massa in comune, questa garantirà il funzionamento della logica di comando. La breadboard messa nello schema serve proprio a far notare il particolare della massa in comune.
Dall’uscita Output A, ai connettori M1 e M2, ho collegato il motore DC. Non ha importanza la polarità dei cavi, perchè a determinare il senso di marcia saranno il modulo L298N e Arduino.
Quindi passiamo alle connessioni logiche, come già detto, lo scopo è quello di pilotare un solo motore, quindi sono stati interessati solo tre pin di comando. I pin in questione sono EN1, IN1 e IN2. Il primo detto anche Enable, ha un duplice scopo, abilitare o meno il segnale in uscita indipendentemente dai valori in ingresso, e qualora lo si voglia, determinare la potenza del segnale in uscita applicando ad esso un segnale di tipo PWM, dall’inglese pulse-width modulation. Ricapitolando, se al pin Enable applichiamo una tensione alta, lo stato di abilitato è true, quindi l’uscita connessa al motore dipenderà dagli stati logici di IN1 e IN2, viceversa se applichiamo una tensione bassa, lo stato di enable sarà false, ed indipendentemente dagli stati di IN1 e IN2 il segnale in uscita sarà nullo, il motore non si muove. Se invece al pin EN1 applichiamo un segnale di tipo PWM, la potenza di uscita sarà proporzionale a questo segnale… (dal codice capirai meglio).
Proprio per sfruttare la capacità PWM dei pin Enable, ho deciso di aggiungere un potenziometro al progetto, così da poter variare il valore in ingresso sul pin EN1 e far accelerare o decelerare il motore. Arduino leggerà il valore analogico del potenziometro tramite il pin A0, e dopo averlo opportunamente mappato, lo darà in pasto al pin EN1 del modulo L298N tramite il suo pin 11.

Ricordo che non tutti i pin di Arduino sono PWM ready, cioè abilitati a fornire questo tipo di segnale. Nella maggior parte dei casi (Arduino che montano i processori ATmega168 o ATmega328), questa funzione è abilitata sui pin 3, 5, 6, 9, 10 e 11. Sulla Arduino Mega, i pin abilitati sono dal 2 al 13 e dal 44 al 46. Vecchie versioni di Arduino con processore ATmega8 supportano questa funzione solo sui pin 9, 10 e 11.

Il codice

Dico sempre che è buona norma commentare il codice, ed io lo faccio ampiamente… quindi non sto a descrivere quello che ho fatto ma ti invito a leggere i commenti del codice. Se qualcosa non ti è chiaro, a fondo articolo trovi un video dimostrativo e ancora più giù c’è la zona discussioni dove commentare ed eventualmente fare domande 😉

/*
 * L298N pilotare un motore DC con Arduino
 * Programmino per imparare il funzionamento del Modulo L298N e del suo utilizzo con Arduino
 *
 * Autore  : Andrea Lombardo
 * Web     : http://www.lombardoandrea.com
 * Post    : http://bit.ly/L298N-ARDUINO-MOTOREDC
 * Git     : https://github.com/AndreaLombardo/Arduino-L298N-Motore-DC
 */ 

//definizione dei pin
static int pinAcceleratore = A0; //pin analogico deputato a leggere i valori del potenziometro
static int mA = 12; //pin digitale per determinare gli stati logici da inviare al modulo
static int mB = 13; //pin digitale per determinare gli stati logici da inviare al modulo
static int pinPotenza = 11; //pin digitale tramite il quale inviare un segnale di tipo PWM tramite la funzione analgWrite()

//variabili usate per gestire e mostrare i valori di operaizone
int accelerazione;  //valore letto dal pin A0
int potenza;  //valore in uscita dal pin 11

void setup() {
  //inizializzo la comunicazione seriale cosi da mostrare i valori nel Mointor Seriale
  Serial.begin(9600);

  //inizializzo variabili
  accelerazione = 0;
  potenza = 0;

  //definisco tipologia pin
  pinMode(pinAcceleratore, INPUT); //input in quanto legge il valore analogico del pin A0
  pinMode(mA, OUTPUT); //output perche' definisce lo stato logico del pin IN1 del modulo L298N
  pinMode(mB, OUTPUT); //output perche' definisce lo stato logico del pin IN2 del modulo L298N
  pinMode(pinPotenza, OUTPUT);  //output perche' definisce il valore PWM del pin EN1 del modulo L298N

  //pullDown sensore pinAcceleratore
  digitalWrite(pinAcceleratore, LOW);

  //Definisco il senso di marcia del motore
  /*
    mA |   mB  | Evento
  -----|-------|----------------------
  LOW  | LOW   | fermo
  LOW  | HIGH  | Movimento in un senso
  HIGH | LOW   | Movimento senso opposto
  HIGH | HIGH  | Fermo
  */
  
  digitalWrite(mA, LOW);
  digitalWrite(mB, HIGH);

}


void loop() {
  
  //leggo il valore analogico del potenziometro sul pin A0.
  accelerazione = analogRead(pinAcceleratore);
  
  /*
  Il range dei valori analogici e' da 0 a 1024 mentre il range dei valori PWM  e' da 0 a 255
  per mantenere questa proporzionalita' eseguo la mappatura dei valori
  */
  potenza = map(accelerazione, 0, 1024, 0, 255);

  //Invio i dati letti al Monitro seriale, cosi da poterli vedere a video
  Serial.print("Accelerazione = ");
  Serial.print(accelerazione);
  Serial.print(" - potenza = ");
  Serial.println(potenza);
  
  //invio costantemente il valore PWM della potenza in modo da far variare la velocita' del motore in base alla posizione del potenziometro
  analogWrite(pinPotenza, potenza);
}

Quello che ho mostrato nel codice è solo un minuscolo esempio di quelle che sono le potenzialità di questo modulo in abbinamento ad Arduino. Velocità e senso di marcia del motore possono essere modificati e alterati continuamente in base alle condizioni dettate dal codice, così che creare sistemi automatici diventa semplice e divertente… Unico limite è la fantasia!

    Come sempre

  • Assicurati che tutti i collegamenti siano corretti;
  • Ricordati di impostare la porta COM del tuo Arduino;
  • Imposta la stessa velocità seriale definita in Serial.begin(9600), nel Monitor Seriale
  • E ricorda che io non mi assumo nessuna responsabilità per eventuali danni o disastri che causi 😀

Prodotti Amazon




Il mio video


Puoi clonare il progetto direttamente da GitHub!

Approfondimenti

Potrebbero interessarti anche...

Available for Amazon Prime