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
ChgImposs RS550 Motore DC 8.2mm 14 Denti Ingranaggio Micro Motore 21V 29800RPM Motore per sega elettrica per Mini sega alternativa
24,44 €Sntieecr 6 Set DC Motore, Elettronica Mini Motori Rettangolare 1.5-3V 15000RPM con 66pz Plastica Gear, Custodia in Plastica per Batteria, Interruttore on/off per DIY Giocattoli Progetti Scientifici
ChgImposs RS550 Motore DC 8.2mm 14 Denti Ingranaggio Micro Motore 21V 28000RPM Motore per sega elettrica per Mini sega alternativa
19,99 €ZHITING Controllore motore DC, DC 9-50V 40A DC Controllo velocità motore Reversibile PWM Controller 12V 24V 36V 48V 2000W Interruttore inverso avanti
19,99 €Hailege 5pcs 1.5A 2 Way L298N L298 DC Motor Driver Drive Board Dual H-Bridge PWM Stepper Speed Controller Driver Module for Arduino
8,99 €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)
9,99 €HiLetgo 5pcs 1.5A 2 Way L298N L298 DC Motor Driver Drive Board Dual H-Bridge PWM Stepper Speed Controller Driver Module for Arduino
8,99 €JZK Stepper Motor L298N DC Stepping Motor Driver Dual Channel H-Bridge per Micro Arduino Scheda di Controllo Motori Driver Modulo Robot Smart car
L298N Modulo, Driver di Tipo a Doppio Canale H-Bridge, Scheda Controller Azionamento Motore per Azionare Il Motore Passo-Passo su Auto Intelligenti O Robot
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
Taiss 60 pezzi potenziometro kit B5K 10K 20K 50K 100K Ohm Potenziometro rotativo Potenziometro lineare tipo B cono con dadi, rondelle e 3 diversi colori di manopole in lega di alluminio F029
BOJACK 10 set B10K albero zigrinato 3 terminali Potenziometri rotativo conico lineare (WH148) 10K Ohm Resistori variabili kit di manopole in plastica blu
Taiss / 1 pz 22mm 5K Governatore Potenziometro rotativo Inverter Convertitore Resistenza a velocità variabile Potenziometro 5K LA42DWQ-22
13,99 €Hseamall 5PCS Potenziometro rotativo a 3 terminali per potenziometro lineare da 10 K OHM con cappucci e rondella
7,99 €Arduino UNO Rev3 [A000066]
Arduino Uno SMD Rev3
Arduino UNO WiFi REV2 [ABX00021]
Arduino UNO Mini Limited Edition [ABX00062]
Arduino MKR WiFi 1010 [ABX00023] & Uno REV3 [A000066]
85,98 €Il mio video
Puoi clonare il progetto direttamente da GitHub!
Approfondimenti
- Serial.begin()
- pinMode()
- digitalWrite()
- analogRead()
- analogWrite()
- map()
- Serial.print()
- Serial.println()
Commentati Recentemente