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.
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:
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
EsportsMJJ 775 Motore Dc 12V-36V 3500-9000Rpm Motore Grande Coppia Motore Ad Alta Potenza
11,99 €Angeek 10 mini motori da 3-6 V CC per giocattoli fai da te Arduino, modello 130
9,99 €KKmoon 775 DC 12V-36V 3500-9000RPM Motore Elettrico con Cuscinetti a Sfera ad alta Potenza, Coppia Elevata, a Basso Rumore, Elettrici Accessori
12,99 €DollaTek 10Pcs DC 3V - 6V 130 Motore 17000 RPM per Arduino Fai da Te
6,99 €DC 12-24v Micro Science Projects Motore cilindrico elettrico Giocattolo motore Hobby remoto Piccoli motori per progetti scientifici di giocattoli fai da te
10,09 €BliliDIY Modulo Driver Motore Dc Dc Mos Tubo Ad Alta Potenza L298N / H Bridge Drive/Supporto Segnale Pwm Ppm
34,88 €hgbygvuy 5pcs H Bridge Rimosso Controllo 5A 3V-14V Dual DUL DC Motor Drive Module Tensione contrario PWM Regol Regol Regol Doppia Super L298N S
58,89 €hgbygvuy 20pcs Trefold Channel L298N DC Motor Driver Board PWM Speed Doppio modulo Stepper Bridge S
62,53 €DollaTek Scheda Controller Mini Drive Stepper Motor Controller Doppio modulo L298N H CC Stepper Bridge per Arduino Robot Smart Car
6,99 €Akozon Motore Stepper Modulo H L298N Bridge Modulo Passo-Passo Scheda Driver Motore per Smart Car Robot
10,19 €GTIWUNG 20Pcs Potenziometro Rotativo a Cono Lineare B5K B10K B20K B50K B100K Ohm WH148 Albero 3pin con Dado e Rondella, Regolabile 3-Terminale B-Tipo Rotante Potenziometro con Pomello Berretto
10,55 €arendo - Presa Dimmer con potenziometro - Potenziometro per lampadine a incandescenza - Max 275 Watt - Bianco
13,99 €RUNCCI-YUN 20pcs Potenziometro Rotativo, Arduino Potenziometri, Potenziometri Lineari, B5k B10k B20k B50k B100k Ohm Wh148 Regolabile 3-Terminale B-Tipo Rotante Potenziometro Con Pomello Berretto
10,50 €Hseamall 5PCS Potenziometro rotativo a 3 terminali per potenziometro lineare da 10 K OHM con cappucci e rondella
7,49 €PeakLead 8PCs Potenziometro del Trimmer di Ricambio per PS3, PS4, Xbox One, Controller Switch PRO, resistori per Potenziometri Trim Parti di Riparazione per Joystick Analogico Stick
Arduino Uno REV3 [A000066]
Elegoo UNO R3 Board Scheda ATmega328P ATMEGA16U2 con Cavo USB Compatibile con i progetti IDE di Arduino Conforme alla direttiva RoHS
11,99 €AZDelivery Scheda Microcontrollore con Cavo USB e con eBook
9,49 €AZDelivery Ethernet Shield W5100 con Slot per Schede MicroSD per Arduino UNO R3 con eBook
11,99 €HiLetgo 5pcs Uno R3 ATmega328P ATMEGA16U2 Enclosure Case Kits Transparent Acrylic Enclosure Case Uno Case Enclosure Box for Arduino Uno R3 with Screws And Install Instructions Pack of 5
10,00 €Il mio video

L298N pilotare un motore DC con Arduino
Puoi clonare il progetto direttamente da GitHub!
Approfondimenti
- Serial.begin()
- pinMode()
- digitalWrite()
- analogRead()
- analogWrite()
- map()
- Serial.print()
- Serial.println()
- l298n (114)
- l298n arduino (72)
- motore dc arduino (28)
- controllo motore cc con arduino (24)
- arduino l298 (16)
- l298n arduino sketch (13)
- lm298 arduino (12)
- arduino e motore dc (11)
- l298 con arduino (4)
- controllo motore arduino (2)