Cerca codice

Controllare un motore DC utilizzando un driver di motore L293D con PWM Arduino

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
144-Arduino source for L293D motor driver (loop)
Lingua: 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)
Lingua: 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

File📁

Nessun file disponibile.