Sterowanie silnikami krokowymi i serwomechanizmami za pomocą pyMCU

Sterowanie różnego rodzaju precyzyjnymi silnikami krokowymi i serwami modelarskimi za pomocą pyMCU i Pythona

Serwomechanizmy, czy serwa znajdziemy w zdalnie sterowanych zabawkach, gdzie np. będą skręcać koła pojazdu, czy unosić lotki samolotu. Silniejsze i większe serwa znajdziemy w różnych układach automatyki, czy maszyn. Mogą np. poruszać chwytakami i ich ramionami na linii produkcyjnej. W uproszczeniu serwo to silnik, przekładnie i elektroniczny układ potrafiący ustawiać silnik w ściśle określonej pozycji. Proste serwa mogą obracać się w ograniczonym zakresie (np. 180 stopni), ale są też serwa ciągłe zdolne do ciągłego ruchu w daną stronę. Serwa można także wykorzystać przy konstrukcji robotów kroczących, np. heksapodów - czyli mechanicznych pajęczaków.

Silniki krokowe przydają się tam gdzie potrzebujemy precyzji ruchu a nie prędkości zwykłych silników na prąd stały. Pod wpływem impulsu elektrycznego silnik przesuwa się o jeden krok. W zwykłych silnikach bez np. enkoderów nie da się tak precyzyjnie sterować ruchem silnika. Silniki krokowe znajdziemy w różnych maszynach precyzyjnych, np. CNC.

Serwomechanizm

W sklepach z częściami dla robotów (także tych z szeroką ofertą dla Arduino i innych mikrokontrolerów) znajdziemy różne serwa. Od małych modelarskich po większe i bardziej precyzyjne o większym momencie siły (zdolne operować na większych masach/obciążeniach). Ja wykorzystałem chyba najtańsze i bardzo popularne serwo modelarskie TowerPro SG90 9G. Można je kupić w dowolnych ilościach od Chińczyków na dx.com jak i wielu sklepach w Polsce. Jest mniejsze niż paczka zapałek.

Serwo TowerPro SG90 9G podłączone do pyMCU

Z serwa wychodzą trzy przewody: GND (-), VCC (+) oraz przewód sygnałowy. W tym modelu mamy żółty (sygnał), pomarańczowy (+) i brązowy kabel (-). W zależności od producenta kolory mogą się różnić i trzeba sprawdzić w dokumentacji który jest który. Po podłączeniu zasilania serwo nic nie zrobi. Będzie czekać na impulsy na przewodzie sygnałowym. Standardowo robi się to modulacją szerokości impulsów (PWM) z poziomu kontrolera serwomechanizmów. W przypadku pyMCU piny PWM działają na zbyt wysokiej częstotliwości by obsługiwać serwa. Żeby temu zaradzić piny cyfrowe mogą wysyłać impulsy i emulować zachowanie PWM.

Małe serwo TowerPro SG90 9G nie wymaga zbyt wielkiego natężenia prądu i może być zasilane przez samo pyMCU (z USB). Dla większych serw wystarczy zastosować oddzielne zasilanie i podłączyć uziemienie (GND) pyMCU z uziemieniem zasilania jak przedstawiono to w tym artykule.

Żółty kabel łączę z pinem D1, pomarańczowy z VCC, a brązowy z GND. Serwo jest gotowe do działania. Zaczniemy od takiego oto kodu przesuwającego serwo kilka razy od jednej do drugiej skrajnej pozycji:

import pymcu
 
mb = pymcu.mcuModule()

for i in range(0, 4):
  mb.pulseOut(1,800,40)
  mb.pulseOut(1,2000,40)

Metoda pulseOut służy nam tutaj do "udawania" impulsów PWM. Pierwszy argument to numer pinu (1), drugi czas trwania impulsu, a trzeci to liczba powtórzeń. W odróżnieniu od PWM ta metoda wysyła skończoną ilość impulsów. Od jego długości zależy położenie serwa. Dla tego konkretnego modelu zakres jego obrotu mieści się pomiędzy 800 a 2000 ms. Ilość powtórzeń ma wpływ na czas w jakim musi serwo dotrzeć do podanej pozycji (jeżeli impulsów jest zbyt mało to po zakończeniu ich wysyłania serwo stanie). Jeżeli serwo znajdzie się w docelowej pozycji to będzie ją utrzymywać dopóki otrzymywać będzie sygnały (gdyby np. masa z jaką pracuje zaczęła go przesuwać to starałoby się powrócić do zadanej pozycji).

Napisałem też prostą aplikację PyQt4 do sterowania ruchem takiego serwa. Za pomocą strzałek prawo/lewo jak i przycisków w aplikacji można przesuwać po kawałku w jedną lub w drugą stronę:

Aplikacji PyQt4 do sterowania serwomechanizmem

Do pracy z wieloma serwami lub gdy chcemy mieć lepszą kontrolę nad ich pracą warto użyć kontrolera serw stosującego PWM - odpowiednią płytkę oferuje Adafruits (I2C) oraz Pololu (USB/TTL). Niebawem pewnie któreś z nich trafi na mój warsztat. Kontrolery te są bez problemu dostępne w Polsce. (kamami, nettigio, electropark, botland itd.)

Silniki krokowe

Silniki krokowe są znacznie bardziej zaawansowane niż zwykłe silniki DC. Jako przykład wybrałem tani chiński silnik 28BYJ-48 w zestawie z kontrolerem ULN2003. Można go kupić za niecałe 20 PLN na dx.com, allegro, czy w niektórych sklepach z robotyką. Jak na gotowy zestaw jest bardzo tani, a zarazem nadal użyteczny. Można nim sterować z pyMCU, Arduino, Raspberry czy innych mikrokontrolerów. Dzięki kontrolerowi ULN2003 (ogólnie kontrolerowi silnika krokowego) poruszanie silnikiem sprowadza się się do ustawiania 4 pinów w stan wysoki i niski w odpowiedniej sekwencji kroków (specyficznej dla danego silnika krokowego).

silnik krokowy 28BYJ-48 ze sterownikiem ULN2003

Na płytce mamy dwa piny +/- na zasilanie silnika, oraz cztery piny do jego kontroli. Ja do zasilania użyłem 9V baterii z kablami poprowadzonymi poprzez przetwornicę step-down do 5V. Cztery piny podłączyłem do pinów cyfrowych pyMCU - D1-D4. Kod poruszający silnikiem wygląda następująco:

import pymcu

mb = pymcu.mcuModule()


steps = [
    [1],
    [1, 2],
    [2],
    [2, 3],
    [3],
    [3, 4],
    [4],
    [1, 4]
]

pins = [1, 2, 3, 4]
current_step = 0

for i in range(0, 2000):
    high_pins = steps[current_step]
    mb.pinLow(pins)
    mb.pinHigh(high_pins)
    current_step += 1
    if current_step == len(steps):
        current_step = 0
    mb.pausems(5)

Lista steps zawiera listę kroków jakich oczekuje silnik (każdy krok to jakieś piny w stanie wysokim, a pozostałe w niskim). W zależności od modelu taka lista może wyglądać inaczej. Żeby silnik poruszał się wstecz wystarczy odwrócić kolejność elementów w sekwencji.

W pętli 2000 powtórzeń skrypt przechodzi przez tą sekwencję wiele razy wprawiając silnik w widoczny ruch. Na końcu kodu pętli wstawione jest opóźnienie (pausems) potrzebne na wykonanie ruchu przez silnik. Zwiększenie tej wartości spowolni pracę silnika (pojawią się przerwy pomiędzy krokami). Zbyt krótka przerwa i silnik przestanie poprawnie reagować na impulsy. Jeżeli zbudujemy robota będzie on poruszał się powoli.

pyMCU sterujące silnikiem za pomocą czterech pinów

W sklepach znajdziemy wiele różnych silników krokowych (większych, silniejszych). Do ich obsługi można wykorzystać jeden z dostępnych kontrolerów silników krokowych (czy to oparty na ULN2003, czy na innym układzie) - oferuje je Pololu, Adafruits jak i inne firmy produkujące np. "robotyczne" tarcze do Arduino. Sterowanie nimi powinno sprowadzać się do podobnego schematu.

Amatorzy silniki tego typu wykorzystują np. do konstrukcji własnych maszyn CNC zdolnych rysować ołówkiem, czy wypalać coś na papierze za pomocą małego lasera. Wymaga to jednak trochę materiałów konstrukcyjnych i pomysłu :)

blog comments powered by Disqus

Kategorie

Strony