Controllare un motore DC utilizzando un driver di motore L293D con PWM Arduino
Questo progetto dimostra come controllare la velocità e la direzione di un motore DC utilizzando un chip driver per motori L293D e le capacità di modulazione della larghezza dell'impulso (PWM) di Arduino. Questo setup consente un controllo preciso del motore, rendendolo adatto a una varietà di applicazioni.
Ecco alcune idee di progetti utilizzando questa configurazione:
- Robotica:Controlla il movimento delle ruote di un piccolo robot.
- Dispositivi automatizzati:Crea tende automatizzate, persiane o un piccolo nastro trasportatore.
- Controllo della ventola:Regola la velocità di una ventola di raffreddamento in base alle letture di temperatura.
- Tracker solari:Posiziona piccoli pannelli solari per seguire il sole durante tutta la giornata.
Hardware/Componenti
- Arduino Uno (o scheda compatibile)
- Circuito integrato driver motore L293D
- Motore DC (conforme ai limiti di tensione e corrente dell'L293D, fino a 600mA)
- Alimentatore 9V (per il motore)
- Cavi di collegamento
- Breadboard (raccomandato)
Guida al cablaggio
Il chip L293D funge da interfaccia tra l'Arduino e il motore DC. Permette all'Arduino di controllare sia la velocità che la direzione del motore. Il chip richiede un'alimentazione separata per il motore perché l'Arduino non può fornire sufficiente corrente per la maggior parte dei motori.
%%CABLAGGIO%%
Spiegazione del codice
Il codice Arduino controlla il driver L293D, che a sua volta controlla il motore DC. Il codice utilizza PWM per variare la velocità del motore e segnali digitali per cambiare direzione.
Ecco i principali parametri configurabili nel codice:
#define P1A 10 // Arduino pin connected to L293D input 1A
#define P2A 11 // Arduino pin connected to L293D input 2A
#define EN12 9 // Arduino pin connected to L293D enable pin (1,2EN)
const int speedStep = 15; // Increment for speed changes
const int speedDelay = 1000; // Delay between speed steps (in milliseconds)
TheL293D()La funzione controlla la direzione e la velocità del motore. 'L' imposta il motore per ruotare in senso orario, 'R' lo imposta per ruotare in senso antiorario. Ilspdil parametro controlla la velocità (0-255) eenabilita (1) o disabilita (0) il motore. (nel video alle 09:24)
void L293D(char dir,int spd, int en)
{
if(dir =='L') // Clockwise rotation
{
// ...
analogWrite(P1A,spd); // Set speed using PWM
digitalWrite(P2A,LOW);
}else{ // Counter-clockwise rotation
// ...
digitalWrite(P1A,LOW);
analogWrite(P2A,spd); // Set speed using PWM
}
}
Progetto dal Vivo/Demostrazione
Il video dimostra il progetto in azione, mostrando i cambiamenti di velocità e direzione del motore. Le letture dell'oscilloscopio visualizzano i segnali PWM che controllano il motore. (nel video a 11:07)
Capitoli
- [00:00] Introduzione al controllo del motore CC con L293D
- [00:30] Dimostrazione e spiegazione del progetto
- [01:12] Panoramica del Driver di Motore L293D
- [02:08] Specifiche del Motore DC
- [02:30] Spiegazione del Datasheet L293D
- [04:40] Spiegazione e dimostrazione del cablaggio
- [07:05] Spiegazione del codice Arduino
- [11:07] Dimostrazione del progetto e letture dell'oscilloscopio
/*
* This is the Arduino code to control the speed of a motor using an L293D DC motor driver.
Watch instructions for this video: https://youtu.be/akQoGNUzhHI
// Written for Robojax.com video
* Code is available at http://robojax.com/learn/arduino
*
// Written by Ahmad S. for Robojax.com on
// August 11, 2018 at 13:23 in Ajax, Ontario, Canada
// This code is AS IS without warranty. You may share it if you keep this note with the code.
*/
// DC motor control
#define P1A 10 // define pin 10 as P1A
#define P2A 11 // define pin 11 as P2A
#define EN12 9 // define pin 9 as the 1,2EN enable
const int speedStep =15;
const int speedDelay = 1000;// delay between speed increment
void setup() {
// L293 Motor Control Code by Robojax.com 20180811
Serial.begin(9600);// setup Serial Monitor to display information
pinMode(P1A, OUTPUT);// define pin as OUTPUT for P1A
pinMode(P2A, OUTPUT);// define pin as OUTPUT for P2A
pinMode(EN12, OUTPUT);// define pin as OUTPUT for 1,2EN
Serial.println("Robojax");
Serial.println("L293D Motor Speed Control");
// L293 Motor Control Code by Robojax.com 20180811
}
void loop() {
// L293D Motor Control Code by Robojax.com 20180811
for(int speed=0; speed<=255; speed +=speedStep)
{
L293D('L',speed, 0);//
delay(speedDelay);// delay between each step
}
delay(50);// 50 millisecond delay
// L293D Motor Control Code by Robojax.com 20180810
}//loop end
/*
* L293D(char dir,int spd, int en)
* dir is a character: 'L' for clockwise direction
* or 'R' for counter-clockwise direction
* en is an integer: 1 to rotate, 0 to stop
* spd is the speed value from 0 to 255
*/
void L293D(char dir,int spd, int en)
{
if(dir =='L')
{
if(en ==0){
Serial.println("CW Motor Stopped");
}else{
Serial.print("Rotating CW: ");
Serial.println(spd);//print actual speed value
}
digitalWrite(EN12 ,en);// Enable 1A and 2A
analogWrite(P1A,spd);// send PWM with spd value to P1A
digitalWrite(P2A,LOW);// LOW signal to P2A
}else{
if(en ==0){
Serial.println("CCW Motor Stopped");
}else{
Serial.print("Rotating CCW: ");
Serial.println(spd);//print actual speed value
}
digitalWrite(EN12 ,en);// Disable 1A and 2A
digitalWrite(P1A,LOW);// Keep this pin LOW
analogWrite(P2A,spd);// send PWM with spd value to P2A
}
}//L293D end
++
/*
* This is the Arduino code to control the speed of a motor using an L293D DC motor driver.
* This code will control the motor with different directions and speed.
Watch instructions for this video: https://youtu.be/akQoGNUzhHI
// Written for Robojax.com video
* Code is available at http://robojax.com/learn/arduino
*
// Written by Ahmad Shamshiri for Robojax.com on
// August 11, 2018 at 13:23 in Ajax, Ontario, Canada.
// This code is AS IS without warranty. You may share it if you keep this note with the code.
*/
// DC motor control
#define P1A 10 // define pin 10 as P1A
#define P2A 11 // define pin 11 as P2A
#define EN12 9 // define pin 9 as the 1,2EN enable
const int speedStep =15;
const int speedDelay = 1000;// delay between speed increment
void setup() {
// L293 Motor Control Code by Robojax.com 20180811
Serial.begin(9600);// setup Serial Monitor to display information
pinMode(P1A, OUTPUT);// define pin as OUTPUT for P1A
pinMode(P2A, OUTPUT);// define pin as OUTPUT for P2A
pinMode(EN12, OUTPUT);// define pin as OUTPUT for 1,2EN
Serial.println("Robojax");
Serial.println("L293D Motor Speed Control");
// L293 Motor Control Code by Robojax.com 20180811
}
void loop() {
// L293D Motor Control Code by Robojax.com 20180811
L293D('L',255, 1);// maximum speed to the LEFT
delay(3000);// wait for 3 seconds
L293D('L',255, 0);// stop motor
delay(2000);// wait for 2 seconds
L293D('L',127, 1);// half speed to the LEFT
delay(3000);// wait for 3 seconds
L293D('L',255, 0);// stop motor
delay(2000);// wait for 2 seconds
L293D('R',90, 1);// slow to the RIGHT
delay(3000);// wait for 3 seconds
L293D('L',255, 0);// stop motor
delay(2000);// wait for 2 seconds
// L293D Motor Control Code by Robojax.com 20180810
}//loop end
/*
* L293D(char dir,int spd, int en)
* dir is a character: 'L' for clockwise (CW) direction
* or 'R' for counter-clockwise (CCW) direction.
* en is an integer: 1 to rotate, 0 to stop.
* spd is the speed value from 0 to 255.
*/
void L293D(char dir,int spd, int en)
{
if(dir =='L')
{
if(en ==0){
Serial.println("CW Motor Stopped");
}else{
Serial.print("Rotating CW: ");
Serial.println(spd);//print actual speed value
}
digitalWrite(EN12 ,en);// Enable 1A and 2A
analogWrite(P1A,spd);// send PWM with spd value to P1A
digitalWrite(P2A,LOW);// LOW signal to P2A
}else{
if(en ==0){
Serial.println("CCW Motor Stopped");
}else{
Serial.print("Rotating CCW: ");
Serial.println(spd);//print actual speed value
}
digitalWrite(EN12 ,en);//enable 1A and 2A
digitalWrite(P1A,LOW);// Keep it LOW P1A
analogWrite(P2A,spd);// send PWM with spd value to P2A
}
}//L293D end
Risorse e riferimenti
File📁
Nessun file disponibile.