Contrôler un moteur à courant continu à l'aide d'un driver de moteur L293D avec PWM Arduino
Ce projet démontre comment contrôler la vitesse et la direction d'un moteur à courant continu en utilisant une puce de moteur L293D et les capacités de modulation de largeur d'impulsion (PWM) d'Arduino. Cette configuration permet un contrôle précis du moteur, ce qui la rend adaptée à une variété d'applications.
Voici quelques idées de projet utilisant cette configuration :
- Robotique :Contrôlez le mouvement des roues d'un petit robot.
- Dispositifs automatisés :Créez des rideaux automatiques, des stores ou un petit convoyeur.
- Contrôle du ventilateur :Ajustez la vitesse d'un ventilateur de refroidissement en fonction des relevés de température.
- Suiveurs solaires :Placez de petits panneaux solaires pour suivre le soleil tout au long de la journée.
Matériel/Composants
- Arduino Uno (ou carte compatible)
- L293D Driver de moteur IC
- Moteur CC (classé pour les limites de tension et de courant du L293D, jusqu'à 600 mA)
- Alimentation 9V (pour le moteur)
- Fils de connexion
- Plaque de prototypage (recommandée)
Guide de câblage
La puce L293D agit comme une interface entre l'Arduino et le moteur à courant continu. Elle permet à l'Arduino de contrôler à la fois la vitesse et la direction du moteur. La puce nécessite une alimentation séparée pour le moteur car l'Arduino ne peut pas fournir suffisamment de courant pour la plupart des moteurs. (dans la vidéo à 04:04)
%%CÂBLAGE%%
Explication du code
Le code Arduino contrôle le pilote L293D, qui à son tour contrôle le moteur DC. Le code utilise la PWM pour faire varier la vitesse du moteur et des signaux numériques pour changer de direction.
Voici les principaux paramètres configurables dans le code :
#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)
LeL293D()La fonction contrôle la direction et la vitesse du moteur. 'L' fait tourner le moteur dans le sens des aiguilles d'une montre, 'R' le fait tourner dans le sens inverse.spdle paramètre contrôle la vitesse (0-255) etenactive (1) ou désactive (0) le moteur. (dans la vidéo à 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
}
}
Projet vivant/Démonstration
La vidéo démontre le projet en action, montrant les changements de vitesse et de direction du moteur. Les lectures de l'oscilloscope visualisent les signaux PWM contrôlant le moteur. (dans la vidéo à 11:07)
Chapitres
- Introduction au contrôle de moteur DC avec L293D
- [00:30] Démonstration et explication du projet
- [01:12] Aperçu du pilote de moteur L293D
- [02:08] Spécifications du moteur à courant continu
- [02:30] Explication de la fiche technique du L293D
- [04:40] Explication et démonstration du câblage
- [07:05] Explication du code Arduino
- [11:07] Démonstration du projet et lectures de l'oscilloscope
/*
* 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
Ressources et références
Fichiers📁
Aucun fichier disponible.