Arduino Shield – Motor Shield (L293D)
Hardware
Informatie
L293D Motor shield is een zeer nuttige shield met standaard componenten. Het bevat twee L293D motor drivers en een 74HC595 schuifregister. Het schuifregister breidt 3 pinnen van de Arduino uit tot 8 pinnen om de richting te controleren voor de motor.
L293D is een monolithische geïntegreerde , hoogspanning , hoge stroom , 4 -channel motor driver.
In principe betekent dit dat u deze chip kun je gelijkstroom motoren en voedingen gebruiken tot maximaal 10 Volt en de chip kan een maximale stroom van 600mA per kanaal leveren.
– Kan 4 DC motoren of 2 stappenmotoren of 2 Servo’s aansturen.
– Tot 4 tweerichting-DC motoren met afzonderlijke 8 – bit toerental.
– Tot 2 stappenmotoren ( unipolaire of bipolaire ) met enkele spoel , dubbele spoel of interleaved stepping.
– 4 H – bruggen: per brug biedt 0.6A ( 1,2 A piekstroom ) met thermische beveiliging , kan de motoren aansturen op 4.5V tot 10V DC.
– Pull-down weerstanden houden motoren uitgeschakeld tijdens het opstarten.
– reset-knop.
– 2 externe terminal Power Interface , voor aparte logica / motor.
– compatibel met Arduino Uno, Mega , Diecimila & Duemilanove.
Overzicht van de vermogens:
LET OP: Het is altijd aan te raden om de motor shield via een externe voeding te voeden, dit om geen grote stromen via de USB poort te laten lopen, vergeet daarom niet de JUMPER PWR te verwijderen! (anders voed je met de externe voeding de USB poort van je computer en deze kan hoger zijn dan 5v)
De layout van deze shield:
Overige informatie (ENG):
What pins are not used on the motor shield?
All 6 analog input pins are available. They can also be used as digital pins (pins #14 thru 19)
Digital pin 2, and 13 are not used.
The following pins are in use only if the DC/Stepper noted is in use:
Digital pin 11: DC Motor #1 / Stepper #1 (activation/speed control)
Digital pin 3: DC Motor #2 / Stepper #1 (activation/speed control)
Digital pin 5: DC Motor #3 / Stepper #2 (activation/speed control)
Digital pin 6: DC Motor #4 / Stepper #2 (activation/speed control)
The following pins are in use if any DC/steppers are used
Digital pin 4, 7, 8 and 12 are used to drive the DC/Stepper motors via the 74HC595 serial-to-parallel latch
The following pins are used only if that particular servo is in use:
Digitals pin 9: Servo #1 control
Digital pin 10: Servo #2 control
How can I connect to the unused pins?
The analog pins (analog 0-5 also known as digital pins 14-19) are broken out in the bottom right corner.
Pin 2 has a small breakout since its the only truly unused pin
The remaining pins are not broken out because they could be used by the motor shield. If you are sure that you are not using those pins then you can connect to them by using stacking headers when assembling the kit or soldering onto the top of the header with wires, or using a “Wing shield”
I have two stepper motors and I want to run them simulaneously but the example code can only control one and then the other?
The stepper motor library step() routine does not have the ability to run both motors at a time. Instead, you will have to ‘interleave’ the calls. For example, to have both motors step forward 100 times you must write code like this:
1 2 3 4 |
for (i=0; i<100; i++) { motor1.step(1, FORWARD, SINGLE); motor2.step(1, FORWARD, SINGLE); } |
Wat heb je nodig?
1) Arduino UNO/MEGA board
2) Arduino Motor Shield Library
Aansluiten en aansturen van motors
De code om een stappenmotor op M1 te laten draaien in verschillende richtingen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <AFMotor.h> AF_DCMotor motor(1); // create motor #1 void setup() { Serial.begin(9600); // set up Serial library at 9600 bps Serial.println("Motor test!"); motor.setSpeed(200); // set the speed to 200/255 } void loop() { Serial.print("tick"); motor.run(FORWARD); // turn it on going forward delay(1000); Serial.print("tock"); motor.run(BACKWARD); // the other way delay(1000); Serial.print("tack"); motor.run(RELEASE); // stopped delay(1000); } |
Ps. je kan “motor kanaal” 1 t/m 4 selecteren door de X te vervangen in het kanaal te gebruiken:
AF_DCMotor motor(X);
Een voorbeeld met 2 motoren geeft dan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <AFMotor.h> AF_DCMotor motor1(1); // create motor #1 AF_DCMotor motor2(2); // create motor #2 void setup() { Serial.begin(9600); // set up Serial library at 9600 bps Serial.println("Motor test!"); motor1.setSpeed(200); // set the speed to 200/255 motor2.setSpeed(200); // set the speed to 200/255 } void loop() { Serial.print("tick"); motor1.run(FORWARD); // turn it on going forward motor2.run(FORWARD); // turn it on going forward delay(1000); Serial.print("tock"); motor1.run(BACKWARD); // the other way motor2.run(BACKWARD); // the other way delay(1000); Serial.print("tack"); motor1.run(RELEASE); // stopped motor2.run(RELEASE); // stopped delay(1000); } |
De code om motor M1 in toerental te regelen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <AFMotor.h> AF_DCMotor motor(1); void setup() { Serial.begin(9600); // set up Serial library at 9600 bps Serial.println("Motor test!"); // turn on motor motor.setSpeed(200); motor.run(RELEASE); } void loop() { uint8_t i; Serial.print("tick"); motor.run(FORWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tock"); motor.run(BACKWARD); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } Serial.print("tech"); motor.run(RELEASE); delay(1000); } |
Aansluiten en aansturen van stappenmotors
Let op: Een “Bi-polar” stappenmotor is relatief eenvoudig door te meten, er komen 4 draden uit, welke aangesloten zijn op 2 spoelen, met een simpele “pieper” kan je de 2 speolen eenvoudig doormeten, een spoel sluit je dan aan op M1 en de ander op M2
Heb je een stappenmotor met 6 draden, dan is het hoogstwaarschijnlijk een “UNI-polar” model, je kan dan de GND aan elkaar zetten en aansluiten.
Aansluiten op de shield:
De code om een stappenmotor op M1/M2 te laten draaien met verschillende instellingen:
In mijn bevindingen, daait de instelling met “Microsteps” het soepelste!
Motor Kanaal:
1 = M1 + M2
2 = M3 + M4
Motor instellingen:
360 graden / 7,5 graad per stap = 48 stappen, de instelling is dan:
AF_Stepper motor(48, 1);
360 graden / 1,8 graad per stap = 200 stappen, de instelling is dan:
AF_Stepper motor(200, 1);
Het script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <AFMotor.h> // Connect a stepper motor with 200 steps per revolution (1.8 degree) // to motor port #2 (M1 and M2) AF_Stepper motor(200, 1); void setup() { Serial.begin(9600); // set up Serial library at 9600 bps 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); } |
Script #2
Dit script laat 2 stappenmotoren van “1.8 degree” om de buurt een kant op draaien op de “microstep” instelling.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <AFMotor.h> AF_Stepper motor1(200, 1); AF_Stepper motor2(200, 2); void setup() { motor1.setSpeed(10); // 10 rpm motor2.setSpeed(10); // 10 rpm } void loop() { motor1.step(100, FORWARD, MICROSTEP); motor2.step(100, FORWARD, MICROSTEP); motor1.step(100, BACKWARD, MICROSTEP); motor2.step(100, BACKWARD, MICROSTEP); } |
Script #3
2 Motoren tegelijk laten draaien (microstep is te langzaam, daarvoor is nu gekozen voor “SINGLE”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <AFMotor.h> AF_Stepper motor1(200, 1); AF_Stepper motor2(200, 2); void setup() { motor1.setSpeed(10); // 10 rpm motor2.setSpeed(10); // 10 rpm } void loop() { motor1.step(1, FORWARD, SINGLE); motor2.step(1, FORWARD, SINGLE); } |
Aansluiten en aansturen van servo’s
LET OP: Zorg er voor dat als je kleine servo’s gebruikt van 5 volt je de JUMPER PWM eraf haalt als de externe spanning hoger is!, bijvoorbeeld SG90 servo’s kunnen via de USB gevoed worden, dat is geen probleem.
Om een servo aan te sluiten, kan je het standaard servo script gebruiken
Servo Kanaal:
2 = Arduino D9
1 = Arduino D10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <Servo.h> Servo myservo; // create servo object to control a servo int pos = 0; // variable to store the servo position void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } } |
Script #2
Dit script laat 2 servo’s om de buurt een kant op draaien.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <Servo.h> Servo myservo1; // create servo object to control a servo Servo myservo2; // create servo object to control a servo int pos1 = 0; // variable to store the servo position int pos2 = 0; // variable to store the servo position void setup() { myservo1.attach(9); // attaches the servo on pin 9 to the servo object myservo2.attach(10); // attaches the servo on pin 10 to the servo object } void loop() { for (pos1 = 0; pos1 <= 180; pos1 += 1) { // goes from 0 degrees to 180 degrees myservo1.write(pos1); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos2 = 0; pos2 <= 180; pos2 += 1) { // goes from 0 degrees to 180 degrees myservo2.write(pos2); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos1 = 180; pos1 >= 0; pos1 -= 1) { // goes from 180 degrees to 0 degrees myservo1.write(pos1); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos2 = 180; pos2 >= 0; pos2 -= 1) { // goes from 180 degrees to 0 degrees myservo2.write(pos2); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } } |
Bronnen:
14core.com
14core.com
mcuoneclipse.com
learn.adafruit.com