Controlando un motor de corriente continua utilizando un controlador de motor L293D con PWM de Arduino
Este proyecto demuestra cómo controlar la velocidad y la dirección de un motor de corriente continua utilizando un chip controlador de motor L293D y las capacidades de Modulación por Ancho de Pulso (PWM) de Arduino. Esta configuración permite un control preciso del motor, lo que la hace adecuada para una variedad de aplicaciones.
Aquí hay algunas ideas de proyectos utilizando esta configuración:
- Robótica:Controla el movimiento de las ruedas de un pequeño robot.
- Dispositivos automatizados:Crea cortinas automáticas, persianas o una pequeña cinta transportadora.
- Control del ventilador:Ajusta la velocidad de un ventilador de enfriamiento según las lecturas de temperatura.
- Siguetrackers solares:Coloca paneles solares pequeños para seguir al sol durante todo el día.
Hardware/Componentes
- Arduino Uno (o placa compatible)
- Controlador de motor IC L293D
- Motor de CC (calificado para los límites de voltaje y corriente del L293D, hasta 600mA)
- Fuente de alimentación de 9V (para el motor)
- Conexión de cables
- Placa de prueba (recomendado)
Guía de cableado
El chip L293D actúa como una interfaz entre el Arduino y el motor de corriente continua. Permite que el Arduino controle tanto la velocidad como la dirección del motor. El chip requiere una fuente de alimentación separada para el motor porque el Arduino no puede suministrar suficiente corriente para la mayoría de los motores. (en el video a las 04:04)
%%WIRING%%
Explicación del código
El código de Arduino controla el driver L293D, que a su vez controla el motor de corriente continua. El código utiliza PWM para variar la velocidad del motor y señales digitales para cambiar la dirección.
Aquí están los parámetros configurables clave en el código:
#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)
ElL293D()la función controla la dirección y velocidad del motor. 'L' establece el motor para que gire en sentido horario, 'R' lo establece para que gire en sentido antihorario. Elspdel parámetro controla la velocidad (0-255) yenactiva (1) o desactiva (0) el motor. (en el video a las 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
}
}
Proyecto Vivo/Demostración
El video demuestra el proyecto en acción, mostrando la velocidad del motor y los cambios de dirección. Las lecturas del osciloscopio visualizan las señales PWM que controlan el motor. (en el video a las 11:07)
Capítulos
- [00:00] Introducción al Control de Motores de CC con L293D
- [00:30] Demostración y explicación del proyecto
- [01:12] Descripción general del controlador de motor L293D
- [02:08] Especificaciones del Motor de CC
- [02:30] Explicación de la hoja de datos de L293D
- [04:40] Explicación y demostración del cableado
- [07:05] Explicación del código de Arduino
- [11:07] Demostración del proyecto y lecturas del osciloscopio
/*
* 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
Recursos y referencias
Archivos📁
No hay archivos disponibles.