Cerca codice

Come controllare la velocità di un motore DC con un modulo ESP32 e L298N

Come controllare la velocità di un motore DC con un modulo ESP32 e L298N

Il controllo dei motori DC può essere un compito semplice con i componenti e la comprensione giusti. In questo tutorial, esploreremo come controllare due motori DC utilizzando il microcontroller ESP32 e il modulo driver motore L298N. Alla fine di questa guida, sarai in grado di regolare la velocità e la direzione dei tuoi motori in base ai segnali PWM provenienti dall'ESP32, consentendo applicazioni versatili nella robotica e nell'automazione.

ESP32_L298N_DC_principale

Il video che accompagna questo tutorial fornisce una dimostrazione visiva dell'intero processo, inclusi cablaggio e programmazione (nel video a :00).

Hardware Spiegato

Modulo di controllo motore L298N
Modulo di Controllo Motore L298N

Per ottenere il controllo del motore, utilizzeremo l'ESP32 e il modulo driver per motori L298N. L'ESP32 è un potente microcontrollore con capacità Wi-Fi e Bluetooth, rendendolo ideale per progetti IoT. L'L298N è un driver per motori a ponte H che ci consente di controllare la direzione e la velocità dei motori utilizzando segnali PWM. Il modulo L298N presenta due circuiti a ponte H, il che significa che possiamo controllare due motori in modo indipendente. Ogni ponte H consente di controllare la direzione del motore (in senso orario o antiorario) e la velocità variando il segnale PWM. Collegando i pin di abilitazione e di ingresso dell'L298N all'ESP32, possiamo manipolare i motori in modo efficace.

Dettagli della scheda tecnica

Produttore STMicroelectronics
Numero di parte L298N
Tensione logica/IO 5 V
Tensione di alimentazione 5-46 V (VS)
Corrente di uscita (per canale) 2 A max/canale (max. ass.)
Corrente di picco (per canale) 2,5 A
Linee guida sulla frequenza PWM 1 kHz - 15 kHz
Soglie logiche di ingresso 2,5 V (alto), 1,5 V (basso)
Caduta di tensione / RDS(on)/ saturazione 1,8 V a 2 A
Limiti termici 150 °C
Pacchetto Connettore Multiwatt a 15 pin
Note / varianti Driver di motore a ponte H duale

  • Assicurati che il valore di tensione del motore corrisponda alla tensione di alimentazione dell'L298N.
  • Usa un adeguato dissipatore di calore per un funzionamento continuo ad alte correnti.
  • Collegare i masse di tutti i componenti per evitare riferimenti flottanti.
  • Utilizzare una frequenza PWM adatta all'applicazione (1-15 kHz).
  • Fai attenzione alle valutazioni massime di corrente per prevenire il surriscaldamento.
  • Testare la direzione del motore prima di finalizzare il cablaggio per evitare danni.
  • Considera i condensatori di disaccoppiamento sull'alimentazione per la stabilità.

Istruzioni per il cablaggio

ESP32_L298N_wiring

Collegare l'L298N all'ESP32, inizia collegando i due motori DC ai terminali di uscita dell'L298N. Collega il Motore 1 ai terminali etichettati comeOUT1eOUT2, e Motore 2 aOUT3eOUT4La polarità dei motori non importa poiché il L298N gestirà la direzione. Successivamente, collega la tua alimentazione esterna a theVMSeGNDterminali sull'L298N. Assicurati che la tensione sia appropriata per i tuoi motori, tipicamente tra 5V e 46V. Il5VIl terminale sull'L298N può essere utilizzato per alimentare l'ESP32 se necessario, ma assicurati che siano soddisfatti i requisiti di corrente. Per i pin di controllo, collegaENAal GPIO 19,IN1a GPIO 18, eIN2a GPIO 5 per il Motore 1. Per il Motore 2, collegareIN3a GPIO 17,IN4a GPIO 16, eENBal GPIO 4. Infine, collega i poli negativi dell'ESP32 e dell'L298N insieme per garantire un riferimento comune.

Esempi di codice e guida passo passo

I seguenti frammenti di codice illustrano come controllare i motori utilizzando la libreria L298N progettata per l'ESP32. La libreria semplifica il processo di invio di comandi ai motori. Innanzitutto, viene inclusa la libreria necessaria e vengono definiti i parametri del motore:


#include 
#define ENA 19
#define IN1 18
#define IN2 5
#define IN3 17
#define IN4 16
#define ENB 4
Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, IN3, IN4, ENB, CHB);

In questo frammento, definiamo i pin di controllo per entrambi i motori. L'istanza della libreriarobotviene creato, che verrà utilizzato per controllare i motori durante tutto il programma. Successivamente, impostiamo la comunicazione seriale e inizializziamo l'istanza del robot nelsetup()funzione:


void setup() {
  Serial.begin(115200);
  robot.begin();
}

Questo inizializza la comunicazione seriale per il debug e prepara la libreria di controllo del motore per il funzionamento. Infine, la logica di controllo principale viene posta nelloop()funzione, dove possiamo ruotare i motori e regolarne la velocità:


void loop() {
  robot.rotate(motor1, 80, CW); // run motor1 at 80% speed in CW direction
  delay(3000); // wait for 3 seconds
  robot.brake(1); // brake motor1
  delay(2000); // wait for 2 seconds
}

Questo estratto dimostra come ruotare il Motore 1 all'80% della velocità in senso orario per tre secondi prima di frenare. Il codice completo include logica aggiuntiva per il Motore 2 e velocità variabili, che possono essere viste nel programma completo caricato sotto l'articolo.

Dimostrazione / Cosa Aspettarsi

Quando eseguito, i motori dovrebbero rispondere ai segnali PWM inviati dall'ESP32. Vedrai il Motore 1 ruotare in senso orario a una velocità dell'80%, seguito da un'azione di frenata. Il programma include anche la logica per gestire le variazioni di velocità in modo graduale, che può essere testata osservando l'accelerazione del motore dal 0% al 100% (nel video alle 05:00). Gli errori comuni includono il non collegare correttamente i terreni, il che può portare a comportamenti erratici, e il superamento delle capacità di corrente dell'L298N, causando il surriscaldamento. Assicurati di monitorare il comportamento del motore e di regolare i parametri secondo necessità.

Timestamp video

  • 00:46 Introduzione
  • 04:07 Cablaggio ESP32 con L298N
  • 06:10 Preparazione dell'IDE Arduino per lavorare con le schede ESP32
  • 08:15 Codice Arduino spiegato
  • 15:00 Dimostrazione del controllo di un singolo motore
  • 16:00 Dimostrazione del controllo di 2 motori CC
  • 17:00 Dimostrazione di alimentazione dell'ESP32 tramite L298N e alimentazione esterna

Immagini

Modulo di Controllo Motore L298N
Modulo di Controllo Motore L298N
ESP32_L298N_DC_main
ESP32_L298N_DC_main
ESP32_L298N_wiring
ESP32_L298N_wiring
278-Library Example for L298N Module to control DC motors
Lingua: C++
/*
 * Library Example for L298N Module to control DC motors
 * 
 * This code is to control a single motor. For two motor control, please open L298N_DC_2_Motors.
 * This code is ready for ESP32.
 * Watch video instructions for this code:  https://youtu.be/2JTMqURJTwg
 * 
 * Written by Ahmad Shamshiri on December 24, 2019 
 * in Ajax, Ontario, Canada. www.robojax.com
 * 
 * 
  * 
 * Get this code and other Arduino codes from Robojax.com.

or make a donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#include <Robojax_L298N_DC_motor.h>
// motor 1 settings
#define CHA 0
#define ENA 19 // this pin must be PWM enabled pin if Arduino board is used
#define IN1 18
#define IN2 5

// motor 2 settings
#define IN3 17
#define IN4 16
#define ENB 4// this pin must be PWM enabled pin if Arduino board is used
#define CHB 1

const int CCW = 2; // do not change
const int CW  = 1; // do not change

#define motor1 1 // do not change
#define motor2 2 // do not change

// for single motor
//Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, true);	

// for two motors without debug information	// Watch video instruction for this line: https://youtu.be/2JTMqURJTwg
Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA,  IN3, IN4, ENB, CHB);

// for two motors with debug information
//Robojax_L298N_DC_motor robot(IN1, IN2, ENA, CHA, IN3, IN4, ENB, CHB, true);

void setup() {
  Serial.begin(115200);
  robot.begin();
  //L298N DC Motor by Robojax.com

}

void loop() {
  
 // robot.demo(1);
  robot.rotate(motor1, 80, CW);//run motor1 at 60% speed in CW direction
  robot.rotate(motor2, 70, CCW);//run motor1 at 60% speed in CW direction
  
  delay(3000);

  robot.brake(1);
  robot.brake(2);  
  delay(2000);


  robot.rotate(motor1, 100, CW);//run motor1 at 60% speed in CW direction
  delay(3000);
  
  robot.rotate(motor2, 100, CCW);//run motor1 at 60% speed in CW direction
  
  robot.brake(1);
  robot.brake(2);   
  delay(2000);  

  for(int i=0; i<=100; i++)
  {
    robot.rotate(motor1, i, CW);// turn motor1 with i% speed in CW direction (whatever is i) 
    delay(100);
  }
  delay(2000);
  
  robot.brake(1);
  delay(2000);  
  
  for(int i=0; i<=100; i++)
  {
    robot.rotate(motor2, i, CW);// turn motor1 with i% speed in CW direction (whatever is i) 
    delay(100);
  }
  delay(2000);
  
  robot.brake(2);
  delay(2000);    
  // Robojax L298N Library. Watch video instruction https://youtu.be/2JTMqURJTwg
}

Cose di cui potresti avere bisogno

Risorse e riferimenti

File📁

Librerie Arduino (zip)

File Fritzing