Code de recherche

Contrôler un moteur à courant continu à l'aide d'un driver de moteur L293D avec PWM Arduino

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
144-Arduino source for L293D motor driver (loop)
Langue: C++
/*
 * 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
145-Source for a simple L293D motor controller using Arduino (CW, CCW, and STOP)
Langue: C++
++
/*

 * 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

Fichiers📁

Aucun fichier disponible.