Arduino L293 motorshield voor DC-, servo-, en stappenmotoren

Adafruit motorshield L293 t.b.v. DC, stappen- en servomotoren


Benodigde library: https://learn.adafruit.com/adafruit-motor-shield/library-install
(Let op dat je na downloaden de naam van de map in de Arduino library map verandert in AFMotor)
 

 
I. DC motoren:
 

Na installatie van de Adafruit motorshield library in de Arduino IDE staat in het voorbeelden menu van de Arduino IDE "Adafruit motorshield library" toegevoegd. In het submenu kun je het programma "motortest" selecteren:
 
#include <AFMotor.h>
 
AF_DCMotor motor(4);

void setup() {
  Serial.begin(9600);           
  Serial.println("Motor testen");

  // zet motor aan
  motor.setSpeed(200);
   motor.run(RELEASE);
}

void loop() {
  uint8_t i;
 
  Serial.print("op- en afbouwen motorsnelheid vooruit");
 
  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("op- en afbouwen motorsnelheid achteruit");
  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);
}
 
 
OPGELET:
  • Maak de power jumper los. Installeer de power jumper pas nadat je een externe spanningsbron op de Arduino na installatie van de code hebt aangesloten via de jack plug. 
  • Het motorshield werkt alleen met motoren boven de 3 Volt en maximaal 25 Volt. 

II. Stappenmotoren

M1_A en M1_B eerste spoel (volgens onderstaand schema rood, groen), M2_A en M2_B tweede spoel.
 

 voorbeeld van begincode:
 
// Connector X1:
//     M1 on outside = MOTOR1_A   (+) north
//     M1 on inside  = MOTOR1_B   (-)
//     middle        = GND
//     M2 on inside  = MOTOR2_A   (+)
//     M2 on outside = MOTOR2_B   (-) south
//
//   Connector X2:
//     M3 on outside = MOTOR3_B   (-) south
//     M3 on inside  = MOTOR3_A   (+)
//     middle        = GND
//     M4 on inside  = MOTOR4_B   (-)
//     M4 on outside = MOTOR4_A   (+) north 
 
Op de "M1_A, M1_B" klemmen kan dus de desbetreffende bekabeling van de (bipolaire !) stappenmotor worden aangesloten. (Een unipolaire stappenmotor heeft minimaal 5 draden) 
 
De kleurcodes van stappenmotoren kunnen onderling verschillen. Om er achter te komen of de betreffende bedrading een spoel vormt kun je de uiteinde van de kabels "tegen elkaar aan houden" en proberen de as van de stappenmotor rond te draaien. Indien je tijdens het draaien aan de motoras duidelijk meer weerstand ondervindt heb je een spoel-kabelpaar te pakken. In geval van onderstaand schema zou dat dus kunnen gelden voor de kleuren rood en groen -  geel en blauw.

stappenmotor code, een kennismaking met single, double, microstep en interleave:


// JRL technasium 22-10-15
// Connector X1:
//     M1 on outside = MOTOR1_A   (+) north
//     M1 on inside  = MOTOR1_B   (-)
//     middle        = GND
//     M2 on inside  = MOTOR2_A   (+)
//     M2 on outside = MOTOR2_B   (-) south
//
//   Connector X2:
//     M3 on outside = MOTOR3_B   (-) south
//     M3 on inside  = MOTOR3_A   (+)
//     middle        = GND
//     M4 on inside  = MOTOR4_B   (-)
//     M4 on outside = MOTOR4_A   (+) north
 

#include <AFMotor.h>
AF_Stepper motor(200,1); // het object "motor" met 200 stappen aangesloten aan klem M1 (belangrijk in geval van single aansturing).
int tijd=1000; // instelling vertragingstijd tussen de diverse instellingen

void setup() {
motor.setSpeed(100); // instelling van de motorsnelheid in rotaties/minuut
Serial.begin(9600); 
}

void loop() 
{
Serial.println("microsteps"); // via seriele monitor zichtbaar maken welke toestand de stappenmotor zich bevindt.
motor.step(600,FORWARD,MICROSTEP); 
// gebruikt PWM
// 600 stappen, motor draait voorwaarts in microstappen 
motor.step(200,BACKWARD,MICROSTEP);
// 200 stappen, motor draait terug in microsteps

delay(tijd);

Serial.println("interleave");
/* beide spoel worden geactiveerd dusdanig dat het aantal ingestelde stappen worden verdubbeld.
*/ voordeeL; nauwkeurig instelbaar/
motor.step(600,FORWARD,INTERLEAVE); 
// 600 stappen, motor draait voorwaarts in interleave 
motor.step(200,BACKWARD,INTERLEAVE);
// 200 stappen, motor draait terug in interleave

delay (tijd);

Serial.println("double");
// double: beide spoelen worden geactiveerd, meer stroomverbruik maar ook meer vermogen.
motor.step(600,FORWARD,DOUBLE); 
// 600 stappen, motor draait voorwaarts in interleave 
motor.step(200,BACKWARD,DOUBLE);
// 200 stappen (1 rotatie van de as), motor draait terug in interleave

delay(tijd);

Serial.println("single"); 
// single: slechts 1 spoel wordt geactiveerd, voordeel minder stroomverbruik.
motor.step(600,FORWARD,SINGLE); 
// 600 stappen , motor draait voorwaarts in interleave 
motor.step(200,BACKWARD,SINGLE);
// 200 stappen (1 rotatie van de as), motor draait terug in interleave

delay(tijd);

}

2 stappenmotoren tegelijk, links- en rechtsom:
----------


// AFMotor library (https://github.com/adafruit/Adafruit-Motor-Shield-library)
// AFMotor support (https://github.com/adafruit/AccelStepper)
// Public domain!

#include <AccelStepper.h>
#include <AFMotor.h>

// op iedere poort M1,M2 en M3,M4 een stappenmotor verbinden
AF_Stepper motor1(200, 1);
AF_Stepper motor2(200, 2);


// motor 1
void forwardstep1() {  
  motor1.onestep(FORWARD, SINGLE); // aansturing verwisselbaar in DOUBLE, INTERLEAVE of MICROSTEP!
}
void backwardstep1() {  
  motor1.onestep(BACKWARD, SINGLE);
}
// motor 2
void forwardstep2() {  
  motor2.onestep(FORWARD, SINGLE);
}
void backwardstep2() {  
  motor2.onestep(BACKWARD, SINGLE);
}

// de twee motorpoorten verbinden aan het AccelStepper object
AccelStepper stepper1(forwardstep1, backwardstep1);
AccelStepper stepper2(forwardstep2, backwardstep2);

void setup()
{  
  // instellen snelheid, acceleratie en stappen
    stepper1.setMaxSpeed(50.0);
    stepper1.setAcceleration(200.0);
    stepper1.moveTo(1000);
    
    stepper2.setMaxSpeed(50);
    stepper2.setAcceleration(200.0);
    stepper2.moveTo(1000);
    
}

void loop()
{
    // richtingveranderingen draaias
    if (stepper1.distanceToGo() == 0)
stepper1.moveTo(-stepper1.currentPosition());
     if (stepper2.distanceToGo() == 0)
 stepper2.moveTo(-stepper2.currentPosition());
    stepper1.run();
    stepper2.run();
}