Blog
2016.01.02 10:08

Léptetőmotor illesztése Raspberry PI-hez

 

Az egyik legizgalmasabb téma a motorok vezérlése Raspberry PI-vel. Ez az alapja mindenféle izgő-mozgó mechanikai feladatnak. Segítségével készíthetünk különféle robotokat, mozgathatunk óramutatót, vagy akár készíthetünk tojásfestő gépet húsvétra. A léptető motor egy olyan elektromágneses eszköz, amely átalakítja a digitális impulzusokat mechanikus, tengely körüli forgássá. Előnye: olcsó, nagy megbízhatóságú, magas forgatónyomaték kis fordulatszámon, és egyszerű masszív szerkezet, mely szinte bármilyen környezetben működik. A léptető motorok precíz pozicionálást tesznek lehetővé anélkül, hogy bármiféle  visszacsatolást kellene építeni a pozíció követésére. Folyamatos körforgásra képesek, ellentétben a hagyományos szervómotorokkal.

 

 

Hozzávalók:

* 1 db Raspberry PI

* 1 db Unipoláris 4 fázisú 5 vezetékes léptetőmotor (5V) Raspberry PI-hez

* 1 db Léptetőmotor vezérlő ULN2003 - 5 vezetékes 4 fázisú motorokhoz


6 db Jumper kábel

Mielőtt hozzákezdünk, néhány sorban megismerheted a léptetőmotor működésének elvét.

Unipoláris Léptetőmotor működési elve és vezérlése

A léptetőmotorok nagyon sok dologban különböznek az AC és DC Szervó motoroktól, néhány általános jellemzőjük:

  • Kefe nélküliek - A forgó és az állórész között nincs mechanikai kontaktus, a mozgást az elektromágneses tér változása hozza létre a forgórészben.
  • Tartó nyomaték - A léptetőmotorok nagyon jó tartó nyomatékkal rendelkeznek alacsony sebességtartományban.
  • Nyílt hurkú pozicionálás - Minden bizonnyal a legfontosabb és legérdekesebb tulajdonsága a léptetőmotornak, hogy pozícióba állítható minden egyéb eszköz nélkül, nincs szükség pozíciómérő eszközökre, enkóderekre. Ezt a vezérlési módot nevezzük nyílt hurkú szabályozásnak, másnéven egyszerűen vezérlésnek. Nagy előnye a zárt hurkú szabályozással szemben, hogy nincs szükség olyan eszközökre, melyek információt szolgáltatnak a tengely pozíciójáról.
  • Terhelés független - A forgási sebesség független a tengely terhelésétől, a motor teljes sebességtartományban képes a teljes nyomatékot leadni. Azonban egy bizonyos sebesség felett a motor már nem képes követni a mágneses tér változását, ilyenkor lépésvesztés következik be, mely a nyílt hurkú vezérlés esetén, mivel a tengely pozíciójáról nincs visszajelzés, pozíciótévesztést eredményez. Tehát a léptetőmotoros vezérlés olyan rendszerekben használható problémamentesen, ahol ismert a maximális sebességigény és ez a motor maximális névleges sebessége alatt marad, illetve ismert a maximális nyomatékigény és értelemszerűen ez is a motor névleges nyomatéka alatt tartható.

Néhány fontos jellemző, mely a léptetőmotorokhoz köthető

  • Lépésszám/fordulat - megmutatja, hogy a motor hány lépésből teszi meg a teljes 360°-os fordulatot.
  • Névleges áram - megmutatja, hogy mekkora áramnak szabad maximum átfolyni a motortekercseken.
  • Tartó nyomaték - álló helyzetből ekkora erőt kell kifejteni ahhoz, hogy kimozdítsuk a motortengelyt, ha a névleges áram erősséggel van gerjesztve.

Léptetőmotor típusai

Vezérlés szempontjából két motortípus létezik a bipoláris és az unipoláris léptetőmotor, de a továbbiakban csak az unipoláris motorokkal foglalkozunk majd. Az unipoláris motorok kivezetéseinek (vezetékeinek) száma 5,6 vagy 8.

Unipoláris léptetőmotor felépítése

Az unipoláris léptetőmotorok 2 független tekerccsel rendelkeznek. Mindkét tekercs rendelkezik középkivezetéssel, vagyis a tekercs közepét megcsapolják és ezt szintén kivezetik a motorarmatúrából. A tekercsek Ohm-os ellenállása viszonylag alacsony néhány Ohm-os nagyságrendű. A középkivezetés könnyedén azonosítható egy ellenállás mérő műszerrel.

Motortekercsek áram alatt

Ha egy tekercsen át áram folyik, az mágneses teret hoz létre és magához vonzza az állandó mágneses forgórészt. Mivel két tekercs található a motorban, de mindkettő két részre van bontva, ezért logikailag 4 pozíció létezik. Mindössze annyi dolgunk van, hogy a tekercseket sorban egymás után helyezzük feszültség alá, ezzel a motor forgó mozgást fog végezni. A szomszédos tekercs feszültség alá helyezésével a forgó rész egy bizonyos szöget fog elfordulni.

Léptetőmotor felépítésének modellje

A középkivezetéseket fixen a motortáp pozitív kapcsára kötve és a tekercsvégeket sorba a föld potenciálra kapcsoltatva a motor forgó mozgást végez. A forgás iránya attól függ, hogy melyik szomszédos tekercset kapcsoljuk be legközelebb. A legegyszerűbb hajtási mód az egyfázisú hajtás, melynél egy időben mindig egy tekercs van bekapcsolva. A gyakorlatban használatos hajtási módok egyike a kétfázisú, vagy egészlépéses üzemmód, amikor mindig két szomszédos tekercset helyezünk feszültség alá. Ennek a hajtási módnak az előnye a megnövelt nyomaték. A gyakorlatban használt másik elterjedt hajtási mód a féllépéses üzemmód, melynek során hol egy, hol pedig két tekercs kerül bekapcsolásra. Ennek a módszernek az előnye az egészlépéseshez képest, hogy a motor felbontása így duplájára nő, vagyis a teljes fordulatot kétszer annyi lépésből lehet megtenni. Ezenkívül a motortest nemkívánatos rezonanciája is csökken ezzel a hajtási módszerrel.

Áramerősség korlátozás

Mivel a léptetőmotorok tekercseinek Ohm-os ellenállása igen alacsony, ezért már alacsony feszültség rákapcsolásakor is igen nagy áram folyhat át a tekercseken. A tekercseken átfolyó áram hőt termel, ezért szükségszerűvé válik az átfolyó áramerősség korlátozása. A korlátozást megoldhatnánk egyetlen a tekerccsel sorbakötött ellenállással, ez azonban nem egy ideális megoldás, hiszen ekkor a tekercseket csak kisebb árammal tudnánk gerjeszteni, melynek hatására az elérhető nyomaték nagymértékben lecsökkenne. A legjobb módszer, ha a motor pozíció váltásakor az aktuális tekercset egy bizonyos ideig gerjesztjük, majd egy rövid idő eltelte után a gerjesztőáramot lekorlátozzuk, hogy a tekercs ne melegedjen túl. Ezt  PWM, impulzus-szélesség modulációs eljárással tudjuk megvalósítani legegyszerűbben és leghatékonyabban.

Mi az a PWM?

A PWM (pulse-width moderation) impulzus szélesség modulációs eljárás igen elterjedt a vezérléstechnikában. Lényege, hogy mikrovezérlő vagy más elektronikai eszköz segítségével modulált jelet hozunk létre és a tekercset ezzel a jellel gerjesztjük, nem pedig egyenárammal. A PWM jellemzői az alapfrekvencia és a kitöltési tényező. Az alapfrekvencia meghatározza, hogy a modulált jel hányszor változik másodpercenként. Bevett szokás, hogy az alapfrekvenciát 20KHz felettire választják, mert ez a frekvencia az emberi fül számára már nem hallható. A kitöltési tényező azt határozza meg, hogy egy perióduson belül a négyszögjel a teljes periódusidő hány százalékában vesz fel logikai 1-es értéket. A kitöltési tényező változtatásával tehát változtatni tudjuk a motortekercsre kapcsolt effektív feszültséget és így a tekercsen átfolyó áramerősséget. A dokumentumban felhasználásra kerültek Rustle Laidman szövegének magyar nyelvre fordított részletei illetve ábrái Forrás:

http://www.hun.cncdrive.com/tudasbazis/stp.htm

Akkor ezek után lássunk hozzá.

Lépések:

1, Csatlakoztasd a léptetőmotor csatlakozoját a vezérlő panelhez úgy, ahogy az alábbi képen látod.

2, Ezek után adj neki tápot és kábelezd össze a jumper kábelek segítségével a Raspberry PI GPIO portjaival az alábbi táblázat szerint:

Raspberry PI csatlakozó Motorvezérlő csatlakozó Funkció Motor csatlakozó szín
5V - pin2 ‘+’ táp
GND - pin6 ‘-’ GND
GPIO18 - pin12 IN1 Tekercs_A1 blue (kék)
GPIO23 - pin16 IN2 Tekercs_A2 purple (lila)
GPIO24 - pin18 IN3 Tekercs_B1 yellow (sárga)
GPIO25 - pin22 IN4 Tekercs_B2 orange (narancs)

3, Telepítsd a Python kódot és próbáld ki!

 

Üzemmódok:

  • 1 fázisú vezérlés
  • 2 fázisú vezérlés
  • “fél” lépéses mód

Az alábbi táblázat három jellemző vezérlési módot mutat be. A vezérlési szekvenciáknál az ‘1’-es érték jelenti, hogy áramot vezetünk a megfelelő tekercsbe.

 

Vezérlési szekvencia Üzemmód Leírás

2b 1b 2a 1a
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
Wave Drive, Egy fázisú Az egy fázisú módban a legisebb az energia szükséglet. Egyidőben csak egy fázist vezérlünk. Ebben a módban egy körbefordulás 4 lépésből áll.

2b 1b 2a 1a
0 0 1 1
0 1 1 0
1 1 0 0
1 0 0 1
Hi-Torque, két fázisú Nagy nyomaték - Ebben a módban egyszerre két szomszédos tekercset gerjesztünk. Ezáltal nagy nyomatékot tud biztosítani a motor. Ebben a módban egy körbefordulás 4 lépésből áll.

2b 1b 2a 1a
0 0 0 1
0 0 1 1
0 0 1 0
0 1 1 0
0 1 0 0
1 1 0 0
1 0 0 0
1 0 0 1
“Half-Step” Fél-lépéses mód Fél-lépéses mód - Gyakorlatilag megduplázzuk a motor lépés-felbontását. Azonban a nyomaték nem egyenletes minden lépésnél. (Mivel ez a mód az előző kettőnek a kombinációja, - kapcsolunk a két mód között - ezért azok működésére jellemző nyomatékértékek alakulnak ki minden lépésnél). Ez a léptetési szekvencia csökkenti a motor rezonanciáját, melynél néha megakadhat a motor. Ebben a módban egy körbefordulás 8 lépésből áll.

Python kód a vezérléshez:

Az alábbi kód használatához szükséges a GPIO csomag megléte a Raspberry PI-n.

Másold be az alábbi kódot a

stepper.py

fájlba, és utána futtasd a

sudo python stepper.py

parancsot.

A kód futtatáskor bekéri, hogy hány miliszekundum legyen az egyes lépés-fázisok között. Érdemes 5-nél nagyobbat választani. Valamint kéri, hogy hány lépést tegyen az óramutató járásával egyező illetve az óramutató járásával ellentétes irányba. Ezen paraméterek megadása után a három féle módban végrehajtja a motor vezérlést.

import RPi.GPIO as GPIO

import time

GPIO.setmode(GPIO.BCM)

enable_pin = 7

coil_A_1_pin = 18

coil_A_2_pin = 23

coil_B_1_pin = 24

coil_B_2_pin = 25


GPIO.setup(enable_pin, GPIO.OUT)

GPIO.setup(coil_A_1_pin, GPIO.OUT)

GPIO.setup(coil_A_2_pin, GPIO.OUT)

GPIO.setup(coil_B_1_pin, GPIO.OUT)

GPIO.setup(coil_B_2_pin, GPIO.OUT)

GPIO.output(enable_pin, 1)


def backwards1p(delay, steps):

for i in range(0, steps):

  setStep(0, 0, 0, 1)

  time.sleep(delay)

  setStep(0, 0, 1, 0)

  time.sleep(delay)

  setStep(0, 1, 0, 0)

  time.sleep(delay)

  setStep(1, 0, 0, 0)

  time.sleep(delay)

def forward1p(delay, steps):  

for i in range(0, steps):

  setStep(1, 0, 0, 0)

  time.sleep(delay)

  setStep(0, 1, 0, 0)

  time.sleep(delay)

  setStep(0, 0, 1, 0)

  time.sleep(delay)

  setStep(0, 0, 0, 1)

  time.sleep(delay)



def backwards2p(delay, steps):

for i in range(0, steps):

  setStep(0, 0, 1, 1)

  time.sleep(delay)

  setStep(0, 1, 1, 0)

  time.sleep(delay)

  setStep(1, 1, 0, 0)

  time.sleep(delay)

  setStep(1, 0, 0, 1)

  time.sleep(delay)

def forward2p(delay, steps):  

for i in range(0, steps):

  setStep(1, 0, 0, 1)

  time.sleep(delay)

  setStep(1, 1, 0, 0)

  time.sleep(delay)

  setStep(0, 1, 1, 0)

  time.sleep(delay)

  setStep(0, 0, 1, 1)

  time.sleep(delay)


def backwardshs(delay, steps):

for i in range(0, steps):

  setStep(0, 0, 0, 1)

  time.sleep(delay)

  setStep(0, 0, 1, 1)

  time.sleep(delay)

  setStep(0, 0, 1, 0)

  time.sleep(delay)

  setStep(0, 1, 1, 0)

  time.sleep(delay)

  setStep(0, 1, 0, 0)

  time.sleep(delay)

  setStep(1, 1, 0, 0)

  time.sleep(delay)

  setStep(1, 0, 0, 0)

  time.sleep(delay)

  setStep(1, 0, 0, 1)

  time.sleep(delay)


def forwardhs(delay, steps):

for i in range(0, steps):

  setStep(1, 0, 0, 1)

  time.sleep(delay)

  setStep(1, 0, 0, 0)

  time.sleep(delay)

  setStep(1, 1, 0, 0)

  time.sleep(delay)

  setStep(0, 1, 0, 0)

  time.sleep(delay)

  setStep(0, 1, 1, 0)

  time.sleep(delay)

  setStep(0, 0, 1, 0)

  time.sleep(delay)

  setStep(0, 0, 1, 1)

  time.sleep(delay)

  setStep(0, 0, 0, 1)

  time.sleep(delay)

def setStep(w1, w2, w3, w4):

GPIO.output(coil_A_1_pin, w1)

GPIO.output(coil_A_2_pin, w2)

GPIO.output(coil_B_1_pin, w3)

GPIO.output(coil_B_2_pin, w4)



try:

  while True:

      delay = raw_input("Delay between steps (milliseconds)?")

      f_steps = raw_input("How many steps forward? ")

      b_steps = raw_input("How many steps backwards? ")

      print "Half step"

      forwardhs(int(delay) / 1000.0, int(f_steps))

      backwardshs(int(delay) / 1000.0, int(b_steps))

      time.sleep(2)

      print "One Phase"

      forward1p(int(delay) / 1000.0, int(f_steps))

      backwards1p(int(delay) / 1000.0, int(b_steps))

      time.sleep(2)

      print "Two Phase"

      forward2p(int(delay) / 1000.0, int(f_steps))

      backwards2p(int(delay) / 1000.0, int(b_steps))

      time.sleep(2)


except KeyboardInterrupt:

  print "  Quit"

  # Reset GPIO settings

  GPIO.cleanup()

------------

;