Áttekintés

A Motorshield kit egyike a legkedveltebb Adafruit készleteknek, így a cégnél az eredeti verzió fejlesztése mellett döntöttek. A javított panel (v2) a DC és a léptető motorok még könnyebb, még egyszerűbb működtetését teszi lehetővé, kiváló alap bármilyen robotikai projekthez. A panel alaptulajdonsága, a 4 db. DC illetve a 2 db. léptetőmotor vezérlési lehetősége megmaradt, de történt több fejlesztés is:

  • az eredeti L293 darlington meghajtót a TB6612 mosfet vezérlő váltotta fel, ami 1,2A-t, (csúcsban, rövid időre, kb. 20ms-ig 3A-t) szolgáltat alacsony feszültségesés mellett, így a motorok nagyobb nyomatékot szolgáltatnak.
  • beépített védődiódák
  • az Arduino PWM kimenete helyett dedikált PWM áramkör a panelen
  • a motorok sebesség és egyéb paramétereinek vezérlése I2C buszon keresztül
  • kompatibilitás különböző Arduino típusokkal, pl. Uno, Leonardo, Due, Mega R3
  • moduláris felépítés, a választható címzésnek köszönhetően (5bit) akár 32db. motorvezérlő panel használható egyszerre, így maximálisan 64 léptető vagy 128 DC motor vezérlése oldható meg
  • polaritás védelem, fejlesztett prototípus építő terület a panelen

A panel főbb paraméterei:

  • két csatlakozó 5V-os „hobby” szervomotorok számára (vezérlés az Arduino precíziós nagyfelbontású időzítőjéről)
  • 4db H-híd: TB6612-es lapkakészlet, 1,2A állandósult, 3A (20ms) csúcsterhelhetőség mellett, beépített hővédelem, illetve önindukciós hatást védő diódák. Működési feszültség: 4,5V – 13,5V
  • 4db kétirányú DC motor, 8-bites sebesség beállítási lehetőség motoronként. (0,5%-os felbontás)
  • 2db léptetőmotor (unipoláris vagy bipoláris) single coil, double coil illetve interleaved vagy micro-step üzemmód)
  • a motorok alaphelyzetben tiltva a táp bekapcsolásakor
  • csavaros sorkapcsok a motorok illetve a tápfeszültség egyszerű csatlakoztathatóságának érdekében (18-26AWG)
  • Arduino reset gomb a panelon
  • Polaritás védett sorkapocs és beállító-jumper a független külső tápfeszültség bekötéséhez
  • kompatibilitás: Arduino UNO, Leonardo, ADK/Mega R3, Diecimila és Duemilanove. Due 3.3v-ra jumperelve. Mega/ADK R2 és a korábbi változatok, 2 vezetékes jumpereléssel.
  • Arduino szoftverkönyvtár példaprogramokkal

Összeszerelés – csatlakozók és sorkapcsok beforrasztása

A panelhez a szokásos tüskesort adja a gyártó, ezzel megoldható az arduino-hoz történő csatlakoztatás, de amennyiben több motorvezérlőt szeretnénk használni, akkor ne ezt a fajta csatlakozósávot forrasszuk be!

Tüskesor beforrasztása

Az első lépés a tüskesor előkészítése, ehhez használhatunk pl. egy Arduino Uno-t a kép alapján:

A tüskesorra helyezzük rá a motorvezérlő panelt:

Majd forrasszuk be a kiálló tüskéket:

Az elkészült motorvezérlő panel:

A külön vásárolható, speciális Arduino csatlakozósávval megoldható több motorvezérlő alkalmazása:

Adafruit Motor Shield V2 library telepítése

Ahhoz, hogy az eszközt használni tudjuk, telepítenünk kell a szükséges library-t. A telepítést az Arduino IDE programban tudjuk elvégezni.

Az első lépés a Vázlat menüpont Könyvtár tartalmazása menüpontjának Könyvtárak kezelése pontját kiválasztani:

A felugró panelon gépeljük be az Arduino motor shield megnevezést, majd a betöltődő eredmények közül válasszuk az Arduino Motor Shield V2 library-t!

Miután az elem mellett megjeleneik az INSTALLED felirat, a Fájl – Példák menüpont alatt elérhetővé válnak a motorvezérlő panel mintaprogramjai:

Tápfeszültség ellátás:

A motorok nagy áramfelvételű fogyasztók, így csatlakoztatásuk előtt fontos, hogy tisztában legyünk áramfelvétel/tápfeszültség paramétereikkel!

Fontos adat, hogy a motorvezérlő panel 5V-12V közötti tápfeszültséggel működő motorokhoz készült. A panel vezérlő chip-jei motoronként 1,2A-t szolgáltatnak, rövid időre, csúcsértékben (20msec) 3A leadására képesek. Ha az üzemeltetendő motor áramfelvétele pl. tartósan 2A, a vezérlő áramkörök melegedni fognak, megfelelő hűtés nélkül tönkremehetnek!

A motorok nem működtethetőek 9V-os elemről!

Szervók:

A szervók tápellátása megoldható az Arduino stabilizált 5V-os tápellátásáról, így működtethetőek akár a panel USB, akár a beépített hengeres tápcsatlakozójáról!

DC és léptetőmotor:

Ezek a motorok nagy áramfelvétellel és általában 5V-nál nagyobb tápfeszültséggel működnek, így működtetésük nem ajánlott az Arduino stabilizált 5V-os tápjáról!

Két megoldás is kínálkozik a motorok megfelelő tápellátására:

A DC barrel jack csatlakozó védő-diódával, a sorkapocs FET védelemmel van ellátva, így fordított polaritás esetén sem az Arduino, sem a vezérlőpanel nem sérül.

Egyszeres tápellátás:

Ha a tápellátást egy 6-12V DC kimenetű fali adapterrel vagy elem-csomaggal (battery pack) akarjuk megoldani, akkor egyszerűen csatlakoztassuk az adaptert az Arduino táp-csatlakozójába, vagy a táp-sorkapocsba és használjuk a jumper rövidzárat. Elem esetén ne a kis teljesítményű 9V-os elemet, hanem 4 – 8 AA elemet használjunk.

Megjegyzés: amennyiben a tápellátás nem stabilizált, az Arduino panelnél reset problémák léphetnek fel a tápfeszültség ingadozása miatt.

Független tápellátás:

Az Arduino az USB csatlakozóján, a motorok a sorkapcson keresztül kapnak tápellátást. Ebben az esetben ne alkalmazzuk a jumper rövidzárat! Ilyenkor a szétválasztott táplálás következtében a motor és a vezérlő logika táplálása független egymástól.

A másik függetlenített tápellátási megoldás, ha az Arduino az un. DC barrel jack-en (a hengeres tápcsatlakozó) keresztül, a motorok pedig a sorkapcson keresztül kapnak ellátást. Ebben az esetben se alkalmazzuk a jumper rövidzárat!

Függetlenül a tápellátás módjától elmondható, hogy megfelelő bekötés esetén a panel zöld színű táp LED-je világítani fog!

Szervó motorok használata:

A kis méretű, un. hobby szervók használata nagyon egyszerű, kössük őket a panel háromtűs csatlakozójának valamelyikére és már indítható is a program. A panel az Arduino 9-es illetve 10-es kimenetét használja a szervók működtetésére, programunkban ezekre a lábakra hivatkozzunk! A tápellátás az USB portról, vagy a DC jack csatlakozóról történhet.

Amennyiben külső tápellátás szükséges, vágjuk át a tápvonalat a panel hátoldalán, és a szervókat az Opt Servo feliratú jumperen keresztül lássuk el tápfeszültséggel. Ezt a megoldást azonban csak megfelelő ismeretek birtokában lévők válasszák!

Példaprogram:

/* 
This is a test sketch for the Adafruit assembled Motor Shield for Arduino v2
*/

#include <servo.h>

Servo myservo;  // servo objektum létrehozása

int pos = 0;    // változó létrehozása a  servo pozíció tárolásához

void setup() {
  myservo.attach(9);  // vezérlő kimenet (pin) beállítása
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // 0 fok- tól 180 fok-ig 
    // in steps of 1 degree
    myservo.write(pos);              // servo 'pos' fok-ba állítása
    delay(15);                       // 15 ms várakozás
  }
  for (pos = 180; pos >= 0; pos -= 1) { // 180 fok- tól 0 fok-ig
    myservo.write(pos);              // servo 'pos' fok-ba állítása
    delay(15);                       // 15 ms várakozás
  }
}

DC motorok használata:

A DC motorok talán a legelterjedtebben alkalmazott eszközök a különböző robotikai projektekben. A vezérlő panel maximálisan négy darab DC motor vezérlésére alkalmas, mindkét forgási irányban. A motorok sebessége 0,5% pontossággal szabályozható, ez nagyon finom és pontos beállítást tesz lehetővé!

Motorok csatlakoztatása:

A motorok csatlakoztatása nagyon egyszerű, vezetékeiket kössük a panel M1, M2, M3, illetve M4 jelzésű sorkapcsaihoz.

Példaprogram:

/* 
This is a test sketch for the Adafruit assembled Motor Shield for Arduino v2
*/

#include <Wire.h>
#include <Adafruit_MotorShield.h>

// motor shield objektum létrehozása az alap I2C címen
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
// egyéb I2C cím beállítása:
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61); 

// DC motor 'port' kiválasztása: M1, M2, M3 or M4. A mintaprogramban: M1
Adafruit_DCMotor *myMotor = AFMS.getMotor(1);
// egyéb motor'port' beállítása:
//Adafruit_DCMotor *myOtherMotor = AFMS.getMotor(2);

void setup() {
  Serial.begin(9600);           // soros port beállítása
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");

  AFMS.begin();  // frekvencia beállítás: 1.6KHz
  //AFMS.begin(1000);  // eltérő frekvencia megadása, pl.: 1KHz
  
  // sebesség beállítás 0 (min) és 255 (max) között:
  myMotor->setSpeed(150);
  myMotor->run(FORWARD);
  // 
  myMotor->run(RELEASE);
}

void loop() {
  uint8_t i;
  
  Serial.print("tick");

  myMotor->run(FORWARD);
  for (i=0; i<255; i++) {
    myMotor->setSpeed(i);  
    delay(10);
  }
  for (i=255; i!=0; i--) {
    myMotor->setSpeed(i);  
    delay(10);
  }
  
  Serial.print("tock");

  myMotor->run(BACKWARD);
  for (i=0; i<255; i++) {
    myMotor->setSpeed(i);  
    delay(10);
  }
  for (i=255; i!=0; i--) {
    myMotor->setSpeed(i);  
    delay(10);
  }

  Serial.print("tech");
  myMotor->run(RELEASE);
  delay(1000);
}

Léptető motorok használata:

A léptető motorok gyakori alkatrészei a különböző robotikai illetve CNC projekteknek. A vezérlő panel két motor vezérlésére alkalmas. A telepített programkönyvtár egyaránt használható unipoláris illetve bipoláris motorok esetében is.

Ötvezetékes unipoláris motorok esetén a középső tekercs kivezetést a sorkapocs GND pontjához kell kötni, míg a négyvezetékes bipoláris motoroknál a középső kivezetés elmarad. A vezérlésre használandó kód azonos lehet.

Az alábbi mintaprogram a léptető motor négy lehetséges üzemmódját teszteli:

single coil: lépésenként egy tekercs aktív

double coil: egyszerre két tekercs aktív, nagyobb a nyomaték

interleave coil: felváltva használja a fenti üzemmódokat, dupla felbontás, fél sebesség

microstep: a vezérlés PWM-el történik a lépések közötti lágy átmenet elérése érdekében

Példaprogram:

/* 
This is a test sketch for the Adafruit assembled Motor Shield for Arduino v2
*/
#include <Wire.h>
#include <Adafruit_MotorShield.h>

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
// csatlakoztatás az alapértelmezett I2C címre, eltérő esetben adjuk meg a címet:
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61); 

// léptető motor csatlakoztatás 200 lépés per fordulat (1.8 fok)
// portcím: #2 (M3 és M4)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);


void setup() {
  Serial.begin(9600);          
  Serial.println("Stepper test!");

  AFMS.begin();  
   myMotor->setSpeed(10);  // 10 rpm   
}

void loop() {
  Serial.println("Single coil steps");
  myMotor->step(100, FORWARD, SINGLE); 
  myMotor->step(100, BACKWARD, SINGLE); 

  Serial.println("Double coil steps");
  myMotor->step(100, FORWARD, DOUBLE); 
  myMotor->step(100, BACKWARD, DOUBLE);
  
  Serial.println("Interleave coil steps");
  myMotor->step(100, FORWARD, INTERLEAVE); 
  myMotor->step(100, BACKWARD, INTERLEAVE); 
  
  Serial.println("Microstep steps");
  myMotor->step(50, FORWARD, MICROSTEP); 
  myMotor->step(50, BACKWARD, MICROSTEP);
}

A forráskódok letölthetőek:

A cikkben használt A1438 Motor/Stepper/Servo Shield for Arduino v2 Kit, megvásárolható a MálnaPC Webshopjában a Léptetőmotorral, a DC motorral és a szervomotorral együtt!