Folosirea Motor Driver Shield L293D pentru Controlul Motoarelor DC, Stepper și servo cu Arduino
Shieldul L293D Motor Driver & 74HC595 Shift Register
Poate comanda:
4 motoare cc bidirecționale cu selectare a vitezei pe 8 biți (0-255)
2 motoare pas cu pas (unipolare sau bipolare) interleaved sau micro-stepping.
2 servomotoare
L293D este un driver de motor H-Bridge dual-channel care poate comanda o pereche de motoare DC sau un motor pas cu pas.
Pentru că shieldul are două chipuri de L293D, aceasta înseamnă că poate comanda în mod individual până la patru motoare de curent continuu, ceea ce îl face ideal pentru construirea unei platforme robot cu patru roți. Poate livra până la 0,6A pe motor.
Are de asemenea, un registru de deplasare 74HC595 care extinde 4 pini digitali ai Arduino la cele 8 direcții de control ale celor două cipuri L293D.
Alimentarea
Există trei feluri în care se pot alimenta motoarele prin intermediul shieldului.
O sursă de alimentare unică DC atât pentru Arduino cât și pentru motoare: (dacă doriți să aveți o singură sursă de curent continuu atât pentru Arduino, cât și pentru motoare, conectați-o doar la mufa DC de pe arduino sau la blocul EXT_PWR cu 2 pini de pe shield. Jumperul de alimentare rămâne la locul lui. Puteți utiliza această metodă numai atunci când tensiunea de alimentare a motorului este mai mică de 9V.)
Sau (Recomandat) Arduino alimentat prin USB și motoarele printr-o sursă de curent continuu: (conectați cablul USB, conectați alimentarea de motoare la blocul EXT_PWR de pe shield. Asigurați-vă că jumperul este scos.)
Sau două surse de alimentare cu curent continuu, una pentru Arduino și alta pentru motoare: (dacă doriți să aveți 2 surse separate de alimentare DC pentru arduino și motoare. Conectați sursa de alimentare pentru Arduino în mufa DC și conectați alimentarea de motoare la EXT_PWR. Asigurați-vă că jumperul este scos.)
Shieldul mai are: o matrice de rezistoare pulldown pentru a menține motoarele oprite în timpul alimentării.
LED-ul de la bord indică faptul că alimentarea motoarelor este în regulă. Dacă nu este aprins, motoarele nu vor funcționa.
Are și butonul de resetare al lui Arduino.
AVERTIZARE
NU furnizați tensiune la intrarea EXT_PWR atunci când jumperul este în shield. Poate deteriora shieldul și, de asemenea, Arduino!
Conexiuni de iesire
Conexiunile de ieșire ale ambelor cipuri L293D sunt la marginea shieldului cu două terminale cu șurub cu 5 pini, M1, M2, M3 și M4. Puteți conecta la aceste terminale patru motoare de curent continuu cu tensiuni cuprinse între 4,5 și 24V.
Fiecare canal de pe modul poate furniza până la 600mA motorului DC. Dar curentul furnizat la motor depinde și de sursa de alimentare a sistemului.
De asemenea, puteți conecta două motoare pas cu pas la bornele de ieșire. Un motor pas cu pas la motor M1-M2 și altul la M3-M4.
Terminalul GND este prevăzut în situația în care aveți un motor pas cu pas unipolar.
Shieldul are și liniile de ieșire PWM de 16 biți pentru două servomotoare cu 3 pini.
Pinii nefolositi de la Arduino
Nu sunt utilizați Pinii digitali 2, 13 și pinii analogici A0-A5.
AFMotor Library
O gasiti pe: https://github.com/adafruit/Adafruit-Motor-Shield-library
Folosirea L293D Shield
Acum, că știm totul despre Shield, putem începe să o legăm la Arduino!
Începeți prin conectarea shieldului în partea superioară a lui Arduino.
Acum conectați motorul la bornele motoarelor M1, M2, M3 sau M4. În exemplul nostru îl conectăm la M4.
Apoi, conectați alimentarea motoarelor. Deși puteți conecta motoarele de curent continuu cu tensiuni cuprinse între 4,5 și 24V la shield, în exemplul nostru folosim motoare DC de 9V. Deci, vom conecta sursa externă de alimentare de 9V la terminalul EXT_PWR.
Exemplu de cod:
#include <AFMotor.h>
AF_DCMotor motor(4);
void setup()
{
//Set initial speed of the motor & stop
motor.setSpeed(200);
motor.run(RELEASE);
}
void loop()
{
uint8_t i;
// Turn on motor
motor.run(FORWARD);
// Accelerate from zero to maximum speed
for (i=0; i<255; i++)
{
motor.setSpeed(i);
delay(10);
}
// Decelerate from maximum speed to zero
for (i=255; i!=0; i--)
{
motor.setSpeed(i);
delay(10);
}
// Now change motor direction
motor.run(BACKWARD);
// Accelerate from zero to maximum speed
for (i=0; i<255; i++)
{
motor.setSpeed(i);
delay(10);
}
// Decelerate from maximum speed to zero
for (i=255; i!=0; i--)
{
motor.setSpeed(i);
delay(10);
}
// Now turn off motor
motor.run(RELEASE);
delay(1000);
}
Explicatie:
Codul începe prin includerea AFMotor.h.
AF_DCMotor (motorPort #);
Trebuie să declaram numărul portului la care este conectat motorul. Pentru portul M1 scrieți 1, pentru M2 scrieți 2 și așa mai departe.
Dacă doriți să conectați mai multe motoare , declarați separat pentru fiecare motor. De exemplu, următorul fragment de cod creează două AFmotor.
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
În Setup, pur și simplu setam turația de rotire.
Funcția setSpeed (viteză) stabilește viteza motorului. Viteza variază de la 0 la 255, cu 0 fiind oprit și 255 ca accelerație maximă.
Puteți seta viteza ori de câte ori doriți în cod.
Funcția Run (cmd) stabilește modul de funcționare al motorului.
Valorile valide pentru comandă sunt:
FORWARD – derulat înainte (direcția actuală de rotație va depinde de cablarea motorului)
BACKWARD – rulați înapoi (rotirea va fi în direcția opusă față de FORWARD)
RELEASE – Opriți motorul. Aceasta elimină puterea de la motor și este echivalentă cu setSpeed (0).
Pentru motorul stepper unipolar 28BYJ-48
Dacă utilizați motorul stepper unipolar 28BYJ-48, motorul respectiv se alimenteaza la 5V și oferă 48 de pași pe revoluție. Deci, conectați alimentarea externă de 5V la terminalul EXT_PWR.
Nu uitați să scoateți jumperul PWR. Acum conectați motorul la terminalele motorului pas cu pas M1-M2 (port # 1) sau M3-M4 (port # 2). În exemplul nostru îl conectăm la M3-M4.
Pentru NEMA 17 bipolar stepper
Dacă utilizați motorul bipolar NEMA 17, de obicei alimentat la 12V și oferă 200 de pași pe revoluție. Deci, conectați sursa externă de alimentare de 12V la terminalul EXT_PWR.
Nu uitați să scoateți jumperul PWR.
Acum conectați motorul la terminalele motorului pas cu pas M1-M2 (port # 1) sau M3-M4 (port # 2). În exemplul nostru îl conectăm la M3-M4.
Arduino Code
Următorul cod vă va oferi o înțelegere completă cu privire la modul de control al unui motor stepper unipolar sau bipolar cu shieldul L293D și este același pentru ambele motoare, cu excepția parametrului stepsPerRevolution.
Modificați acest parametru conform specificațiilor motorului înainte de a încerca schița. De exemplu, pentru NEMA 17 setați-l la 200 și pentru 28BYJ-48 setați-l la 48.
Exemplu cod:
#include <AFMotor.h>
// Number of steps per output rotation
// Change this as per your motor's specification
const int stepsPerRevolution = 48;
// connect motor to port #2 (M3 and M4)
AF_Stepper motor(stepsPerRevolution, 2);
void setup() {
Serial.begin(9600);
Serial.println("Stepper test!");
motor.setSpeed(10); // 10 rpm
}
void loop() {
Serial.println("Single coil steps");
motor.step(100, FORWARD, SINGLE);
motor.step(100, BACKWARD, SINGLE);
Serial.println("Double coil steps");
motor.step(100, FORWARD, DOUBLE);
motor.step(100, BACKWARD, DOUBLE);
Serial.println("Interleave coil steps");
motor.step(100, FORWARD, INTERLEAVE);
motor.step(100, BACKWARD, INTERLEAVE);
Serial.println("Micrsostep steps");
motor.step(100, FORWARD, MICROSTEP);
motor.step(100, BACKWARD, MICROSTEP);
}
Explicatie:
Codul începe prin includerea bibliotecii AFMotor.h.
Al doilea motor AF_Stepper (48, 2); creează un obiect al bibliotecii. Aici trebuie să declarați pașii per revoluție ai motorului și numărului portului la care este conectat motorul ca parametri.
În secțiunea de configurare și buclă a codului, pur și simplu sunăm sub două funcții pentru a controla direcția de turație și de rotire a unui motor.
Funcția setSpeed (rpm) stabilește viteza motorului, în cazul în care rpm este numărul de rotații pe minut dorit.
Funcția step
(pasi, direcție, tipul pasilor) este apelată de fiecare dată când doriți să se miște motorul. #step este numărul de pași pe care doriți să îi urmați. direcția este FORWARD sau BACKWARD, iar valorile valide pentru tipul pasului sunt:
SINGLE – o singură bobină este energizată la un moment dat.
DOUBLE – Două bobine sunt alimentate la un moment dat pentru un cuplu mai mare.
INTERLEAVE – alternați între unic și dublu pentru a crea o jumătate de pas între ele. Acest lucru poate duce la o funcționare mai ușoară, dar din cauza jumătății suplimentare, viteza este redusă la jumătate.
MICROSTEP – Pentru a crea un număr de „micro-pași” între fiecare pas complet. Acest lucru are ca rezultat o rezoluție mai fină și rotație mai ușoară, dar cu o pierdere de cuplu.
Comanda Servo Motors cu L293D Shield
Comanda servo cu L293D este la fel de simplă.
Shieldul are ieșire PWM de 16 biți pentru două servomotoare cu 3 pini.
Pinii 9 și 10 de la Arduino.
Puterea servo vine de la regulatorul de 5 V de la Arduino, deci nu trebuie să conectați nimic la terminalul EXT_PWR.
Exemplu cod:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
void setup()
{
// attaches the servo on pin 10 (or pin 9) to the servo object
myservo.attach(10);
}
void loop()
{
// sweeps from 0 degrees to 180 degrees
for(pos = 0; pos <= 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
// sweeps from 180 degrees to 0 degrees
for(pos = 180; pos>=0; pos-=1)
{
myservo.write(pos);
delay(15);
}
}
Succes!