Cerca codice

Codice Arduino e video: Controllore motore DC L293D (senza controllo della velocità)

Codice Arduino e video: Controllore motore DC L293D (senza controllo della velocità)

Questo tutorial spiega come usare il driver motore L293D con un Arduino per controllare un motore DC. L293D ti permette di far ruotare il motore sia in senso orario sia in senso antiorario. Seguendo questa guida imparerai come collegare i componenti e programmare l'Arduino per ottenere il controllo del motore desiderato.

In questo progetto utilizzeremo il driver per motore L293D per controllare un singolo motore DC. Il motore potrà invertire la direzione in base ai comandi presenti nel codice Arduino. Per comprendere meglio la configurazione e il codice, è utile guardare il video associato (nel video a 00:00).

L'hardware spiegato

Il L293D è un circuito integrato progettato per pilotare motori. Può controllare simultaneamente due motori in corrente continua o un motore passo-passo. Il chip utilizza una configurazione a ponte ad H per consentire il controllo della direzione invertendo la polarità della tensione applicata al motore. Questa flessibilità lo rende una scelta eccellente per progetti di robotica e automazione.

Oltre al circuito integrato L293D, useremo una scheda Arduino per inviare segnali di controllo al driver del motore. L'Arduino genererà i livelli logici necessari per abilitare il motore e determinare la direzione di rotazione. La configurazione richiederà inoltre un motore DC e un alimentatore compatibile con i requisiti di tensione del motore.

Dettagli della scheda tecnica

Produttore Texas Instruments
Numero di parte L293D
Tensione logica/IO 5 V
Tensione di alimentazione da 4.5 a 36 V
Corrente di uscita (per canale) 600 mA
Corrente di picco (per canale) 1.2 A
Linee guida sulla frequenza PWM 20 kHz
Soglie logiche di ingresso 2,5 V (tip.)
Caduta di tensione su RDS(on) / saturazione 1,5 V (massimo)
Limiti termici 150 °C (max)
Pacchetto DIP a 16 poli
Note / varianti Può controllare due motori

  • Assicurarsi che la tensione di alimentazione non superi i 36 V.
  • Utilizzare un dissipatore di calore adeguato quando si opera vicino alla corrente massima.
  • Collega sempre la massa di Arduino e del driver del motore.
  • Controllare il cablaggio per evitare connessioni con polarità invertita.
  • Usa segnali PWM per controllare la velocità, se necessario, in progetti futuri.

Istruzioni di cablaggio

Arduino wiring for L293D motor driver with battery
Arduino wiring for L293D motor driver with battery
Arduino wiring for L293D motor driver
Arduino wiring for L293D motor driver

Per collegare il driver per motori L293D all'Arduino, inizia collegando alimentazione e massa. Collega i pin 4 e 5 del L293D alla massa. Poi collega il pin 1 (Vcc1) all'uscita 5 V dell'Arduino. Per Vcc2 (pin 8), collegalo a un'alimentazione esterna, assicurandoti che corrisponda alla tensione specificata per il motore.

Collega quindi il pin di abilitazione (pin 1) al pin 8 dell'Arduino per controllare l'alimentazione del motore. Per gli ingressi di controllo del motore, collega il pin 2 (1A) del L293D al pin 2 dell'Arduino e il pin 7 (2A) al pin 7 dell'Arduino. Infine, collega i terminali del motore ai pin 3 (1Y) e 6 (2Y) del L293D.

piedino 1 del L293D sulla protoboard
pin 1 del L293D sulla breadboard
L293D_protoboard_cablaggio_bb

Esempi di codice e guida passo passo

Il codice seguente inizializza i pin e configura il controllo del motore. Gli identificatori usati includonoP1Aper il primo pin di controllo del motore eEN12per il pin di abilitazione. La funzione setup configura i pin come uscite.

void setup() {
  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 enable
}

Nel loop, il motore viene comandato a ruotare in entrambe le direzioni con ritardi intermedi. Lo stato del motore viene stampato sul monitor seriale usandoSerial.println.

void loop() {
  Serial.println("Rotating CW");
  digitalWrite(EN12, HIGH); // Enable 1A and 2A 
  digitalWrite(P1A, HIGH); // send HIGH signal to P1A
  digitalWrite(P2A, LOW); // send LOW signal to P2A
  delay(3000); // motor runs for 3 seconds
  digitalWrite(EN12, LOW); // Disable 1A and 2A
}

Questo estratto mostra come controllare la direzione di rotazione del motore cambiando i livelli logici inviati aP1AeP2A. Il motore funziona per 3 secondi prima di fermarsi e invertire la direzione.

Ecco come si usano i driver a mezzo ponte L293D:

L293D come mezzo ponte in senso orario
L293D come mezzo ponte in senso orario
L293D come semiponte, senso antiorario
L293D come driver a mezzo ponte, in senso antiorario

Dimostrazione / Cosa aspettarsi

Quando la configurazione è completa e il codice è caricato, dovresti osservare il motore ruotare in una direzione per 3 secondi, fermarsi per 2 secondi e poi ruotare nella direzione opposta per altri 3 secondi. Lo stato del motore verrà stampato sul monitor seriale, confermando le azioni (nel video alle 12:00).

Gli errori più comuni includono assicurarsi che al motore venga fornita la tensione corretta e verificare che i collegamenti del motore siano corretti. Se il motore non risponde, ricontrollare il cablaggio e i collegamenti dell'alimentazione.

Marcatori temporali del video

  • 00:00- Introduzione
  • 02:30- Spiegazione del cablaggio
  • 05:00- Revisione del codice
  • 10:00- Dimostrazione del controllo del motore

Immagini

L293D breadboard pin 1
L293D breadboard pin 1
L293D_breadboard_wiring_bb
L293D_breadboard_wiring_bb
L293D as halft bridge CCW
L293D as halft bridge CCW
L293D as halft bridge CW
L293D as halft bridge CW
Arduino wiring for L293D motor driver with battery
Arduino wiring for L293D motor driver with battery
Arduino wiring for L293D motor driver
Arduino wiring for L293D motor driver
79-Arduino code L293 DC motor driver (Advanced).
Lingua: C++
++
/*
 * This is the Arduino code L293 DC motor driver (Advanced).
 Using this code you can control a motor to rotate in both directions: clockwise (CW) 
 and counter-clockwise (CCW).

 *  * 
 // Written by Ahmad S. for Robojax.com on 
// February 25, 2018 at 18:30 in Ajax, Ontario, Canada
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 

 * watch L293 video for details https://youtu.be/jAmDliHcTJ0
 * Code is available at http://robojax.com/learn/arduino

 * 

*/
// DC motor 1 control
#define P1A 2 // define pin 2 as for P1A
#define P2A 7 // define pin 7 as for P2A
#define EN12 8 // define pin 8 as for 1,2EN enable



// DC motor 2 control 
#define P3A 10 // define pin 10 as for P3A
#define P4A 13 // define pin 13 as for P4A
#define EN34 9 // define pin 9 as for EN3 and EN4 enable

/*
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 
 */

void setup() {
  // L293 Motor Control Code by Robojax.com 2018025
  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
   
  pinMode(P3A, OUTPUT);// define pin as OUTPUT for P3A
  pinMode(P4A, OUTPUT);// define pin as OUTPUT for P4A
  pinMode(EN34, OUTPUT);// define pin as OUTPUT for 3,4EN   
  // L293 Motor Control Code by Robojax.com 2018025   
}

void loop() {
  // L293 Motor Control Code by Robojax.com 2018025


    Serial.println("Rotating CW");
    digitalWrite(EN12 ,HIGH);// Enable 1A and 2A 
    digitalWrite(P1A,HIGH);// send + or HIGH signal to P1A
    digitalWrite(P2A,LOW);// send - or LOW signal to P2A       
    delay(3000);// motor runs for 3 seconds
    digitalWrite(EN12 ,LOW);// Disable 1A and 2A
    delay(2000);// motor stop for 3 seconds 
    Serial.println("Motor Stopped"); 

  // L293 Motor Control Code by Robojax.com 2018025
    // now changing the direction of rotation of motor
    Serial.println("Rotating CCW");
    digitalWrite(EN12 ,HIGH);// Enable 1A and 2A     
    digitalWrite(P1A,LOW);// send + or HIGH signal to P1A
    digitalWrite(P2A,HIGH);// send - or LOW signal to P2A  
    delay(3000);// motor runs for 3 seconds
    digitalWrite(EN12 ,LOW);// Disable 1A and 2A
    delay(2000);// motor stop for 3 seconds    
    Serial.println("Motor Stopped");   
     

  Serial.println("=========== Loop done"); 
  delay(500);
  // L293 Motor Control Code by Robojax.com 2018025 
}
80-Arduino code: L293 DC motor driver (Advanced)
Lingua: C++
/*


 * This is the Arduino code L293 DC motor driver (Advanced).
Using this code you can control a motor to rotate in both directions: clockwise (CW) 
and counter-clockwise (CCW).

 *  * 
 // Written by Ahmad S. for Robojax.com on 
// February 25, 2018 at 18:30 in Ajax, Ontario, Canada
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 

* Watch L293 video for details: https://youtu.be/jAmDliHcTJ0
 * Code is available at: http://robojax.com/learn/arduino

 * 

*/
// DC motor 1 control
#define P1A 2 // define pin 2 as for P1A
#define P2A 7 // define pin 7 as for P2A
#define EN12 8 // define pin 8 as for 1,2EN enable


// DC motor 2 control 
#define P3A 10 // define pin 10 as for P3A
#define P4A 13 // define pin 13 as for P4A
#define EN34 9 // define pin 9 as for EN3 and EN4 enable

/*
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 
 */

void setup() {
  // L293 Motor Contro Code by Robojax.com 2018025
  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
   
  pinMode(P3A, OUTPUT);// define pin as OUTPUT for P3A
  pinMode(P4A, OUTPUT);// define pin as OUTPUT for P4A
  pinMode(EN34, OUTPUT);// define pin as OUTPUT for 3,4EN 

  // L293 Motor Contro Code by Robojax.com 2018025   
}

void loop() {

 if(value == 45){
  rotateMA("CW",HIGH); // start motor in CW
 }
  delay(3000); 
  rotateMA("CW",LOW); // stop motor
  delay(2000);

  rotateMA("CCW",HIGH); // start motor in CCW
  delay(3000); 
  rotateMA("CW",LOW); /// stop motor
  delay(2000);  
  
  // L293 Motor Contro Code by Robojax.com 2018025 
}// loop ends


/**
 * function: rotateMA(String di,int action)
 * Sends power to motor A
 * di is a string and can be "CW" or "CCW"
 * to use: 
 * rotateMA("CW",HIGH);// to rotate motor  CW
 * rotateMA("CCW",HIGH);// to rotate motor CCW
 *  to stop the motor:
 * rotateMA("CW",LOW);// to stop motor 
 */
void rotateMA(String di,int endis)
{
    // L293 Motor Contro Code by Robojax.com 2018025
 if(di =="CW"){
    Serial.println(" Rotating CW");
    digitalWrite(EN12 ,endis);// Enable 1A and 2A 
    digitalWrite(P1A,HIGH);// send + or HIGH signal to P1A
    digitalWrite(P2A,LOW);// send - or LOW signal to P2A       
  

 }else{
  // L293 Motor Contro Code by Robojax.com 2018025
    // now changing the direction of rotation of motor
    Serial.println(" Rotating CCW");
    digitalWrite(EN12 ,endis);// Enable 1A and 2A  
    digitalWrite(P1A,LOW);// send + or HIGH signal to P1A
    digitalWrite(P2A,HIGH);// send - or LOW signal to P2A  

 }   
   // L293 Motor Contro Code by Robojax.com 2018025
}//rotateMA ends here

Cose di cui potresti avere bisogno

Risorse e riferimenti

Nessuna risorsa ancora.

File📁

Nessun file disponibile.