Code zoeken

Arduino-code en video: L293D-gelijkstroommotorcontroller (zonder snelheidsregeling)

Arduino-code en video: L293D-gelijkstroommotorcontroller (zonder snelheidsregeling)

Deze tutorial behandelt hoe je de L293D-motorcontroller met een Arduino gebruikt om een gelijkstroommotor aan te sturen. De L293D stelt je in staat om de motor zowel met de klok mee als tegen de klok in te laten draaien. Door deze handleiding te volgen, leer je hoe je de componenten bedraadt en de Arduino programmeert om de gewenste motorregeling te bereiken.

In dit project gebruiken we de L293D-motor driver om een enkele gelijkstroommotor aan te sturen. De motor kan van richting wisselen op basis van de commando's in de Arduino-code. Voor een beter begrip van de opstelling en code is het nuttig om de bijbehorende video te bekijken (in video op 00:00).

 

Hardware uitgelegd

De L293D is een geïntegreerde schakeling ontworpen voor het aansturen van motoren. Het kan twee gelijkstroommotoren tegelijkertijd aansturen of één stappenmotor. De chip gebruikt een H-brugconfiguratie om richtingsregeling mogelijk te maken door de polariteit van de spanning op de motor om te schakelen. Deze flexibiliteit maakt het een uitstekende keuze voor robotica- en automatiseringsprojecten.

Naast de L293D gebruiken we een Arduino-bord om stuursignalen naar de motor driver te sturen. De Arduino genereert de benodigde logische niveaus om de motor in te schakelen en de draairichting te bepalen. De opstelling vereist ook een gelijkstroommotor en een voeding die compatibel is met de spanningsvereisten van de motor.

Datasheet-details

Fabrikant Texas Instruments
Onderdeelnummer L293D
Logica/IO-spanning 5 V
Voedingsspanning 4,5 - 36 V
Uitgangsstroom (per kanaal) 600 mA
Piekstroom (per kanaal) 1,2 A
PWM-frequentierichtlijn 20 kHz
Ingangslogische drempels 2,5 V (typ.)
Spanningsval / RDS(on) / verzadiging 1,5 V (max)
Thermische limieten 150 °C (max)
Behuizing 16-DIP
Opmerkingen / varianten Kan twee motoren aansturen

 

  • Zorg ervoor dat de voedingsspanning niet hoger is dan 36 V.
  • Gebruik geschikte koeling bij gebruik nabij de maximale stroom.
  • Verbind altijd de aarde van de Arduino en de motor driver.
  • Controleer de bedrading om omgekeerde polariteitsaansluitingen te voorkomen.
  • Gebruik PWM-signalen om de snelheid te regelen indien nodig in toekomstige projecten.

Bedradingsinstructies

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

Om de L293D-motorcontroller met de Arduino te bedraden, begin je met het aansluiten van de voeding en aarde. Verbind pin 4 en pin 5 van de L293D met de aarde. Verbind vervolgens pin 1 (Vcc1) met de 5 V-uitgang van de Arduino. Voor Vcc2 (pin 8) sluit je een externe voeding aan, zorg ervoor dat deze overeenkomt met de motorspecificatie.

Verbind vervolgens de enable-pin (pin 1) met pin 8 op de Arduino om het vermogen van de motor te regelen. Voor de motorregelingsingangen verbind je pin 2 (1A) van de L293D met pin 2 op de Arduino en pin 7 (2A) met pin 7 op de Arduino. Sluit ten slotte de motorklemmen aan op pin 3 (1Y) en pin 6 (2Y) van de L293D.

L293D breadboard pin 1
L293D breadboard pin 1
L293D_breadboard_wiring_bb

Codevoorbeelden & uitleg

De volgende code initialiseert de pinnen en stelt de motorregeling in. De gebruikte identificaties omvatten P1A voor de eerste motorregelingspin en EN12 voor de enable-pin. De setup-functie configureert de pinnen als uitgangen.

void setup() {
  Serial.begin(9600); // setup Serial Monitor om informatie weer te geven
  pinMode(P1A, OUTPUT); // definieer pin als OUTPUT voor P1A
  pinMode(P2A, OUTPUT); // definieer pin als OUTPUT voor P2A
  pinMode(EN12, OUTPUT); // definieer pin als OUTPUT voor 1,2EN enable
}

In de loop wordt de motor gecommandeerd om in beide richtingen te draaien met pauzes ertussen. De staat van de motor wordt naar de seriële monitor geprint met Serial.println.

void loop() {
  Serial.println("Roteren met de klok mee");
  digitalWrite(EN12, HIGH); // Schakel 1A en 2A in
  digitalWrite(P1A, HIGH); // stuur HOOG signaal naar P1A
  digitalWrite(P2A, LOW); // stuur LAAG signaal naar P2A
  delay(3000); // motor draait 3 seconden
  digitalWrite(EN12, LOW); // Schakel 1A en 2A uit
}

Dit fragment laat zien hoe je de draairichting van de motor regelt door de logische niveaus naar P1A en P2A te wijzigen. De motor draait 3 seconden voordat hij stopt en van richting wisselt.

Hier is hoe L293D half-brug drivers worden gebruikt:

L293D als halve brug met de klok mee
L293D als halve brug met de klok mee
L293D als halve brug tegen de klok in
L293D als halve brug tegen de klok in

Demonstratie / Wat te verwachten

Wanneer de setup is voltooid en de code is geüpload, zou je moeten zien dat de motor 3 seconden in één richting draait, 2 seconden stopt, en vervolgens nog eens 3 seconden in de tegenovergestelde richting draait. De status van de motor wordt op de seriële monitor weergegeven, wat de acties bevestigt (in video op 12:00).

Veelvoorkomende valkuilen zijn onder meer het zorgen voor de juiste spanning op de motor en het controleren dat de motorverbindingen correct zijn. Als de motor niet reageert, controleer dan opnieuw de bedrading en de voedingsaansluitingen.

Video-tijdstempels

  • 00:00 - Introductie
  • 02:30 - Uitleg over bedrading
  • 05:00 - Doorloop van de code
  • 10:00 - Demonstratie van motorregeling

Afbeeldingen

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).
Taal: 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)
Taal: 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

Dingen die je misschien nodig hebt

Hulpmiddelen en referenties

Nog geen middelen.

Bestanden📁

Datasheet (pdf)