Arduino en de L293D Motor Driver
Release status: Tutorial
Description | Arduino en de L293D Motor Driver
|
License | |
Author | |
Contributors | |
Based-on | [[]]
|
Categories | |
CAD Models | |
External Link |
Inleiding
De L293D-motorbesturings-IC is een van de goedkoopste en gemakkelijk verkrijgbare IC'svoor het regelen van snelheid en draairichting van gelijkstroom- en stappenmotoren. In deze tutorial laat ik je zien hoe je deze motordriver met Arduino kunt gebruiken bij het aansturen van een eenvoudige DC-motor en een 28BYJ-48 unipolaire stappenmotor.
L293D Motor Driver IC-overzicht
Deze motordriver wordt geleverd als o.a. een 16-pins DIP IC-pakket met twee H-brugcircuits en kan daarom twee gelijkstroommotoren tegelijk of één stappenmotor aansturen. Het onderstaande diagram toont de pin-out van deze motordriver.
Er zijn twee voedingspinnen, VCC1 en VCC2.
- VCC1: is de voeding voor de IC-circuits en moet 5V zijn. Het is verbonden met de Arduino 5V.
- VCC2: is de voeding voor de H-Bridge-circuits voor het laten draaien van de motoren en ligt in het bereik van 4,5 V tot 36 V.
- GND: is de gemeenschappelijke grond en het koellichaam.
OUT1 en OUT2 zijn de uitgangsklemmen voor motor A, terwijl OUT3 en OUT4 uitgangsklemmen zijn voor motor B. Hier worden de gelijkstroommotoren met spanningen tussen 4,5 en 36 V aangesloten. Elk kanaal op de IC kan tot 600mA leveren aan de DC-motor, maar de hoeveelheid stroom die aan de motor wordt geleverd, is afhankelijk van de voeding van het systeem.
ENA en ENB zijn de snelheidsregelpennen voor respectievelijk motor A en B. Wanneer deze pinnen een HOOG signaal krijgen, zullen de motoren draaien en wanneer ze LAAG zijn, stoppen de motoren met bewegen. De rotatiesnelheid wordt echter beter geregeld met behulp van PWM-signalen.
IN1, IN2, IN3 en IN4 pinnen zijn voor het regelen van de draairichting van de motoren. De draairichting wordt bepaald door de logica op deze pinnen.
Hoe de motordriver functioneert
Werking van de L293D-motordriver
Motortoerentalregeling met behulp van PWM
PWM stelt ons in staat om de spanning op de motor te regelen in de vorm van blokgolfpulsen met een bepaalde frequentie. De spanning die op de motor wordt aangelegd, bepaalt de rotatiesnelheid van de motor door de breedte van deze blokgolf, een zogenaamde duty cycle, te variëren. De duty-cycle wordt gegeven in procenten en hoe hoger de duty-cycle, hoe hoger de spanning over de motor, wat ook de rotatiesnelheid verhoogt.
Wanneer de inschakelduur 100% is, is de puls constant HOOG en krijgt de motor het volle vermogen en draait hij op zijn nominale uitgangssnelheid, terwijl een inschakelduur van 0% betekent dat het pulssignaal constant LAAG is, dus geen spanning over de motor en de motor zal stoppen met draaien.
Draairichtingsregeling met behulp van H-Bridge
De draairichting van een gelijkstroommotor wordt bepaald door de stroomrichting door de motor. Dit wordt bereikt met behulp van een H-brugschakeling die wordt gebruikt voor het omschakelen van de polariteit van een spanning die wordt toegepast op een belasting zoals in dit geval een motor.
Hoe een H-brug werkt
Een H-brug bestaat uit vier MOSFET's of transistors die als schakelaars zijn bedraad. Wanneer twee van deze schakelaars tegelijkertijd in een bepaald formaat worden geactiveerd, wordt de stroomrichting gewijzigd, wat vervolgens de draairichting van de motor verandert. U kunt het onderstaande diagram raadplegen om te zien hoe de H-brug werkt.
Als de schakelaars S1 en S4 gesloten zijn zal de stroom van links naar rechts door de motor lopen waardoor de motor in een bepaalde richting gaat draaien, in dit geval met de klok mee. Evenzo, als schakelaars S2 en S3 gesloten zijn, zal er stroom van rechts naar links lopen en draait de motor in de tegenovergestelde richting.
Schakel S1 en S2 niet samen of S3 en S4 samen in. Deze toestand wordt doorschieten genoemd en kan de MOSFET's of transistors beschadigen.
De L293D-motorstuurmodule heeft twee H-Bridge-circuits en kan daarom twee gelijkstroommotoren tegelijk aansturen. De pinnen IN1, IN2, IN3 en IN4 zijn eigenlijk voor het aansturen van de schakelaars van het H-brugcircuit van de L293D-module.
Als IN1 LAAG is en IN2 HOOG, dan draait motor A in een bepaalde richting en als IN1 HOOG is en IN2 LAAG, dan draait de motor in de tegenovergestelde richting. Als alle ingangen hetzelfde signaal hebben, bijvoorbeeld IN1 en IN2 zijn beide LAAG en beide HOOG, dan stopt de motor met draaien.
Onderstaande tabel laat zien hoe de draairichting van motor A en B verandert afhankelijk van de status van de ingangspennen IN1, IN2, IN3 en IN4.
MOTOR A | CW?CCW | MOTOR-B | ||
---|---|---|---|---|
IN-! | IN-2 | IN-3 | IN-4 | |
0 | 0 | stop | 0 | 0 |
0 | 1 | CW | 0 | 1 |
1 | 0 | CCW | 1 | 0 |
1 | 1 | stop | 1 | 1 |
DC-motorbesturing met behulp van de L293D-motordriver en Arduino
De twee DC-motoren worden aangesloten op de motoraandrijver zoals weergegeven in het onderstaande schema. Aangezien ik eenvoudige motoren gebruik met een vermogen van ongeveer 3 tot 9V, wordt de VCC2-pin aangesloten op een externe 9V-voeding. De VCC1-pin wordt verbonden met Arduino 5V. Alle aardingen in het circuit moeten zijn aangesloten.
The enable pins ENA and ENB should be connected to PWM enabled pins of the Arduino like in this case pin 3 and 6. Input pins IN1, IN2, IN3 and IN4 are connected to any other digital output pins like pins 4,5,7 and 8 respectively.
One motor is connected across OUT1 and OUT2 and the second motor is connected across OUT3 and OUT4.
Code voor het aansturen van een gelijkstroommotor
De onderstaande code is voor het besturen van een enkele DC-motor. Dit betekent dat de motor slechts één kant van de L293D-motordriver gebruikt, namelijk ENA, IN1 IN2, OUT1 en OUT2. Er zijn geen bibliotheken nodig om de motor met Arduino te besturen.
// Motor A connections
int enA = 3;
int in1 = 4;
int in2 = 5;
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);z
// Turn off motor - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
void directionControl() {
analogWrite(enA, 200); // Set motor speed (PWM values are 0 to 255)
// Turn on motor A
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 255; i++) {
analogWrite(enA, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
Beschrijving van de code
Het belangrijkste gebied dat het vermelden waard is in de code is in de loop-sectie waar we twee door de gebruiker gedefinieerde functies gebruiken; directionControl(): Deze functie laat de motor gedurende twee seconden met een bepaalde snelheid in een specifieke richting draaien. Draait vervolgens de draairichting van de motor nog twee seconden om en schakelt ten slotte de motoren uit.
speedControl(): Deze functie versnelt de motor van nul tot maximale snelheid en vertraagt hem vervolgens terug naar nul. De rotatiesnelheid wordt geregeld door PWM-signalen met behulp van de analogWrite()-functie.
Aansturen van een stappenmotor met behulp van de L293D Motor Driver
Een stappenmotor kan worden aangesloten op de L293D-motordriver door gebruik te maken van de twee H-Bridge-circuits in de driver, waarbij elk van deze H-bruggen een van de elektromagnetische spoelen van de stappenmotor aanstuurt. In onderstaand schema is te zien hoe de stappenmotor is aangesloten op de H-Bridges.
De draairichting van de stappenmotor zal afhangen van de volgorde waarin de elektromagnetische spoelen van de motor worden bekrachtigd en de rotatiesnelheid wordt bepaald door hoe vaak deze spoelen worden bekrachtigd. Er zijn verschillende soorten stappenmotoren maar in dit geval ga ik de 28BYJ-48 unipolaire stappenmotor gebruiken.
De 28BYJ-48 stappenmotor verbinden met de L293D-motordriver en Arduino
De motor wordt aangesloten zoals weergegeven in het onderstaande schema. Deze motor heeft vijf draden, hoewel er vier draden worden gebruikt om de spoelen aan te sluiten op de L293D-driver, dat wil zeggen A+ (oranje), A- (roze), B- (geel) en B+ (blauw). Ze zijn respectievelijk verbonden met uitgangspennen OUT4, OUT3, OUT2 en OUT1.
Zowel de ENA- als de ENB-pinnen zijn verbonden met een 5V-uitgang, zodat de motor altijd is ingeschakeld. De ingangspennen IN1, IN2, IN3 en IN4 van de L293D IC zijn verbonden met vier digitale uitgangspennen 8, 10, 9 en 11 van de Arduino.
Code voor het aansturen van de stappenmotor
We zullen de Stepper.h-bibliotheek gebruiken om de motor te besturen.
#include <Stepper.h>
const int stepsPerRevolution = 2048; // Number of steps per output rotation
// Create Instance of Stepper library
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11); //blue,yellow,pink,orange
void setup(){
myStepper.setSpeed(8); // set the speed at 8 rpm
Serial.begin(9600); // initialize the serial port
}
void loop(){
// step one revolution in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(1000);
// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(1000);
}
Soms moet u meer dan één van deze motordrivers gebruiken, bijvoorbeeld in robotprojecten. Dan heb je een motor driver shield nodig zoals het L293D motor driver shield voor Arduino.