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 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
CHEVVY 6 Set Mini Motori 3V Kit Motori DC con Supporto Motore Ventilatore Foglia Motore Elettrico 5000 RPM Mini Motori Circuiti Elettrici Per Esperimento DIY Fisica Educativa
11,99 €DollaTek 10Pcs DC Motor 140 Mini Motore Elettrico DC 3-5V 6300 RPM per Giocattoli Fai da Te
Angeek 10 mini motori da 3-6 V CC per giocattoli fai da te Arduino, modello 130
8,99 €20 Pezzi Mini Motori da 3V Mini Motori Elettrici Micro DC Motore 15000 RPM Modello 130 Mini Motori per Giocattoli Fai da Te Esperimenti Scientifici
9,99 € (0,50 € / unità)EsportsMJJ 775 Motore Dc 12V-36V 3500-9000Rpm Motore Grande Coppia Motore Ad Alta Potenza
16,99 €DollaTek Scheda Controller Mini Drive Stepper Motor Controller Doppio modulo L298N H CC Stepper Bridge per Arduino Robot Smart Car
Modulo di controllo driver motore L298N per Arduino, robot auto intelligente, MEGA R3 2560, ESP32, ESP8266, Dual H-Bridge DC modulo passo-passo
15,89 €DUBEUYEW L298N Modulo Scheda Controller di Azionamento Motore Dual H Bridge DC Stepper per Arduino Smart Car Robot MEGA R3 2560 ESP32 ESP826 (2 Pezzi)
10,69 €ARCELI 5 PCS L298N Modulo scheda controller azionamento motore Dual H Bridge Modulo passo-passo CC per Arduino
14,59 €Greluma 4 pezzi L298N Modulo scheda controller azionamento motore Dual H Bridge DC Stepper per Arduino
13,98 €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
9,80 €Taiss 20 Pezzi Potenziometro Kit con manopola B1K 2K 5K 10K 20K 50K 100K 250K 500K 1M Ohm Potenziometro Rotary manopola 3 pin Potenziometro Lineare Tipo B Volume Controllo F054
10,99 €DEWIN Potenziometro Rotativo del Regolatore, Potenziometro da 10k con Montaggio a Pannello VSD VFD per Inversione di Velocità Variabile
10,89 €RUNCCI-YUN 2pcs Controller di Velocità PWM Motore DC,potenziometro 12 volt,regolatore di tensione 12v,Regolatore di Tensione Variabile1.8v-12v,Modulo Interruttore Regolabile Velocità
6,99 €RUNCCI-YUN 20PCS 10K Potenziometro rotativo a 3 terminali per potenziometro lineare da 10 K con cappucci e rondella
8,99 €Arduino UNO Rev3 [A000066]
Arduino UNO R4 WiFi [ABX00087] - Renesas RA4M1 / ESP32-S3 - Wi-Fi, Bluetooth, USB-C, CAN, DAC, OP AMP, connettore Qwiic, matrice LED 12x8
30,80 €Diymore 1PCS Scheda di Sviluppo,AT328P-R3 Microcontrollore CH340 16MHz 5V
8,99 €ELEGOO Advanced Starter Kit per progetti per Principianti con Kit di apprendimento Italiano Compatibile con i progetti IDE di Arduino
AZDelivery Scheda Microcontrollore con Cavo USB e con eBook
13,99 €Il mio video
L298N pilotare un motore DC con Arduino
Puoi clonare il progetto direttamente da GitHub!
Commentati Recentemente