Ravender - Sun 13th May 2007 00:19
Silniki krokowe i sterowanie portem LPT
Przedstawię tutaj fragmenty mojego artykułu na temat unipolarnych silników krokowych (całość TUTAJ ). Jest to wstęp do zbudowania własnymi siłami urządzeń sterowanych z komputera. Mam nadzieję że docenicie trud włożony w jego napisanie (punkty reputacji mile widziane :) ). Zapraszam do lektury
Zastrzegam, że nie ponoszę odpowiedzialności za ewentualne szkody. Wszelkie czynności (podłączanie obwodów do portu, używanie programów itp) proszę wykonywać na własną odpowiedzialność
Silnik krokowy (ang. stepper motor) jest to silnik elektryczny, w którym wirnik nie obraca się ruchem ciągłym, lecz wykonuje za każdym razem ruch obrotowy o ściśle ustalonym kącie. Dzieje się tak ponieważ do jego zacisków doprowadzany jest ciąg impulsów sterujących, a nie ciągłe (stałe bądź zmienne) napięcie. Można je spotkać praktycznie we wszystkich urządzeniach elektrycznych, w których wymagana jest pewna precyzja obrotu, przesuwu lub innego rodzaju ruchu (suwnice w drukarkach, skanerach, wycieraczki w samochodzie, cd-romy, fdd, zabawki i milion innych urządzeń).
Wyróżniamy wiele typów silników krokowych. Ze względu na łatwiejszy sposób sterowania, omówię tylko budowę silnika unipolarnego.
W najprostszej postaci silnik krokowy unipolarny składa się z wirnika, na którym znajdują się dwa bieguny N i S. Wokół wirnika umieszczone są cewki. Podając odpowiednie impulsy na nie, te "aktywują się" i wirnik ustawia się w odpowiedniej pozycji. Przedstawia to rysunek poniżej:
Silnik unipolarny możemy rozpoznać po pięciu bądź sześciu przewodach. W przypadku pięciu przewodów, jeden z nich jest przewodem zasilającym a cztery sygnałowymi. W przypadku sześciu przewodów, dwa są zasilającymi (z reguły i tak sie je łączy razem). Jeśli silnik ma cztery przewody, to znaczy że jest to silnik bipolarny. Jego sterowanie jest trudniejsze i nie będę go tutaj omawiać.
Sterowanie silnikiem unipolarnym może odbywać się na kilka sposobów.
Pojedyncze krokowanie - w tym przypadku impulsy podaje się pojedynczo na kolejne cewki. Aby wirnik wykonał pełen obrót, należy sekwencję powtórzyć 12 razy. Jeden krok (impuls) to 7.5 stopnia. W dużym uproszczeniu koncepcję takiego sterowania przedstawia rysunek niżej:
Zwiększony moment obrotowy - w tym przypadku impulsy podaje się na dwie sąsiednie cewki. Silnik dzięki temu jest "silniejszy".
Sterowanie półkrokowe - w tym przypadku impulsy podaje się na zmianę na jedną i dwie cewki. Dzięki temu uzyskujemy większą rozdzielczość (silnik może przyjmować wartości pośrednie ułożenia wirnika). Silnik wykonuje pełen obrót w 96 krokach. Jeden krok to 3.75 stopnia (oczywiście te parametry zależą od konstrukcji silnika i mogą się różnić).
Należy jeszcze wspomnieć o dość praktycznej kwestii. Po wyjęciu silnika ze starego skanera, początkowo trudno ustalić które przewody prowadzą do cewek, a które są przewodami zasilającymi. Przewody z silników krokowych najczęściej wychodzą w dwóch rzędach po trzy przewody (przy silnikach 6-przewodowych).
Najczęściej jest tak, że jeden rząd zasila dwie cewki, a przewód środkowy jest głównym przewodem zasilającym. W przypadku mojego silnika sytuacja wygląda tak:
Port LPT
Naszym silnikiem będziemy sterować przy pomocy portu LPT, ponieważ najłatwiej go zaprogramować. Posiada osiem wyjść, więc spokojnie możemy podłączyć pod niego np. osiem diodek LED lub dwa silniki krokowe.
Patrząc na takie złącze od frontu, czerwone kropki to właśnie wyjścia, natomiast niebieskie piny to ziemia (minus). Są one ze sobą połączone wiec zasadniczo mógłby być tam równie dobrze jeden wielki pin :).
Na samym początku proponuję podłączenie do portu diody led. Sam skonstruowałem sobie specjalną końcówkę z ośmioma diodami. W razie potrzebny podłączam ją pod port i od razu widzę jaki stan jest na którym wyjściu:
Moje diody to zwykłe czerwone na napięcie około 2V. Dołączyłem do nich rezystory 150R, aby nie uszkodzić diody a tym bardziej samego lpt:
Programowanie portu
Zasada sterowania portem jest stosunkowo prosta. Każdy z ośmiu pinów wyjściowych ma wagi, które są potęgą liczby 2. Pin D0 ma wagę 2^0 czyli 1. Port D7 ma wagę 2^7 czyli 128. Chcąc zapalić diodę, musimy ustawić pin do którego jest podłączona w stan wysoki, czyli jedynkę. Aby zapalić np. diod D2, wystarczy wysłać na port liczbę 4, bo taką wagę ma pin D2. Aby zapalić diodę D6, na port trzeba wysłać liczbę 64. By zapalić diody tak jak na rysunku niżej (D1, D3, D4), musimy wysłać na port liczbę równą sumie wag pinów, które chcemy ustawić w stan wysoki. Czyli 2+8+16 = 36. Dlatego też, w celu zapalenia wszystkich diodek, wysyła się liczbę 255, aby zgasić wszystkie diody, zero. Prawda że proste?
W Windows Xp nie ma bezpośredniej możliwości obsługi portu LPT (obsług ę przeprowadza się poprzez sterownik). Dlatego aby ułatwi sobie życie, powstał program UserPort. Plik UserPort.sys umieszczamy w "C:\WINDOWS\system32\drivers". Następnie uruchamiamy program. Pojawi si ę okienko w którym wystarczy nacisnąć przycisk START. Od tej pory mamy możliwość wysyłania poleceń bezpośrednio do portu lpt.
Napisałem malutki programik, który umożliwia włączanie i wyłączanie diodek. Wystarczy zaznaczać odpowiednie "ptaszki" by dioda na danym pinie zapaliła się. Po prawej wyświetla się suma wag zapalonych diodek. Po zamknięciu programu na port wysyłane jest zero. Można go ścignąć STD.
screen (okno programu i zdjęcie zapalonych diodek)
Więcej programów można znaleźć na googlach.
Projekt interface'u
O ile z podłączeniem diod do LPT większego problemu nie ma, o tyle z podłączeniem silnika pojawia się mały problem. Cewki w nim się znajdujące, pobierają stosunkowo duży prąd. Dlatego nie można silnika podłączyć bezpośrednio do portu, gdyż groziłoby to jego uszkodzeniem (a całkiem możliwe, że i płyty głównej). Potrzebny będzie wzmacniacz, który dostarczy potrzebnej silnikowi energii. Najprostszym sposobem będzie zastosowanie scalonego układu ULN2003. Nie będę się zbytnio rozpisywał na temat działania tej magicznej kostki. Powiem tylko, że w swojej strukturze posiada wzmacniacze (układ Darlingtona) i diody zabezpieczające. Ma siedem wejść i siedem wyjść. Jego starszym bratem jest ULN2803, który ma osiem wejść i osiem wyjść. Układ który proponuję nie jest idealny. W celu maksymalnego uproszczenia zrezygnowałem z tzw izolacji galwanicznej. Chodzi tutaj o to, że obwód silnika jest elektrycznie połączony z portem lpt. Przy jakiś problemach typu zwarcie, spalenie silnika itp.. uszkodzeniu może ulec również port.
Schemat połączeń wygląda tak:
Jak widać, cztery przewody z portu lpt (D0, D1, D2, D3) poprowadzone są na cztery nóżki wejściowe układu 2003 (nóźki 1,2,3,4). Z wyjść układu 2003 (nóżki 13,14,15,16) sygnał wchodzi na cewki silnika krokowego.
Cały układ połączyłem na stole mojego biurka, wg powyższego schematu. Najpierw cztery kabelki pomiędzy lpt a uln2003. Potem z wyjść uln-a na silnik. Do tego kabelki od zasilania i masy. W niektórych miejscach konieczne się okazało włożenie paru papierków między piny, bo groziły zwarciem. Całość podłączyłem do zasilacza 12V na prąd stały oczywiście.
A tutaj parę zdjęć.
Na szybko napisałem w VB program sterujący tym silnikiem przy wykorzystaniu biblioteki inpout32. Dla osób, które nie potrafią programować pozostaje wygrzebanie z internetu gotowych programów do sterowania takim silnikiem. Jeden z nich można znaleźć TUTAJ
Natomiast TUTAJ umieściłem krótki filmik przedstawiający silnik w czasie pracy, gdy podawałem na niego z komputera odpowiednie wymyślone przeze mnie sekwencje ruchów.
Na zakończenie
Mam nadzieję, że chociaż trochę zainteresowałem cię drogi czytelniku tematyką silników krokowych. Wiedza którą starałem się przekazać może służyć do zbudowania własnego urządzenia o którym dawno marzyłeś (np robot, własna frezarka,albo obrotowa figurka na biurko :) ). By może na pierwszy rzut oka wszystko wydaje się do trudne i zawiłe, ale w rzeczywistości nie jest. Wg mnie warto zainwestować swój czas, w zbudowanie chociaż prostego układu by zacząć własne eksperymenty. var _pop = _pop || []; _pop.push(['siteId', 1453660]); _pop.push(['minBid', 0]); _pop.push(['popundersPerIP', 0]); _pop.push(['delayBetween', 0]); _pop.push(['default', false]); _pop.push(['defaultPerDay', 0]); _pop.push(['topmostLayer', false]); (function() { var pa = document.createElement('script'); pa.type = 'text/javascript'; pa.async = true; var s = document.getElementsByTagName('script')[0]; pa.src = '//c1.popads.net/pop.js'; pa.onerror = function() { var sa = document.createElement('script'); sa.type = 'text/javascript'; sa.async = true; sa.src = '//c2.popads.net/pop.js'; s.parentNode.insertBefore(sa, s); }; s.parentNode.insertBefore(pa, s); })();
Excray - Sat 19th May 2007 02:50
Jako ciekawostkę dodam że istnieją również silniki krokowe w których liczba cewek jest nieparzysta. Na przykład są 3 bądź 6 cewek. Generalnie sterowanie jest zbliżone.
chase1 - Sat 19th May 2007 12:53
Cytat:
Napisał/a Excray liczba cewek jest nieparzysta. Na przykład są 3 bądź 6 cewek :)
a to dobre :P
Excray - Sat 19th May 2007 14:15
Eeee, yyyy. Ja już myślę cyfrowo :) Parzyste to dla mnie liczny 2,4,8,16...
6, 10, 12 i tak dalej nie są parzyste :pruchno: var _pop = _pop || []; _pop.push(['siteId', 1453660]); _pop.push(['minBid', 0]); _pop.push(['popundersPerIP', 0]); _pop.push(['delayBetween', 0]); _pop.push(['default', false]); _pop.push(['defaultPerDay', 0]); _pop.push(['topmostLayer', false]); (function() { var pa = document.createElement('script'); pa.type = 'text/javascript'; pa.async = true; var s = document.getElementsByTagName('script')[0]; pa.src = '//c1.popads.net/pop.js'; pa.onerror = function() { var sa = document.createElement('script'); sa.type = 'text/javascript'; sa.async = true; sa.src = '//c2.popads.net/pop.js'; s.parentNode.insertBefore(sa, s); }; s.parentNode.insertBefore(pa, s); })();
Ravender - Fri 25th May 2007 16:55
Excray.. tez cos takiego mam :).. Dla mnie 64, 256 czy 1024 to zdecydowanie okrągłe liczby ;).
maciek001 - Thu 12th July 2007 20:44
Jeżeli komuś się to przyda to mogę coś zaprojektować prostego co będzie posiadało taką separację galwaniczną ale musi ktoś poprosić bo jakoś mnie nie ciągnie do tego ale jak ktoś poprosi ładnie to mu zaprojektuje :P
Zapomniałem dodać że postaram się to zrobić dobrze ale na 100% nie będę pewny!!
Puma[JFK] - Mon 27th August 2007 08:18
Niedawno zabrałem się za silniki krokowe. Jak na razie mam opanowane sterowanie trzema silnikami w układzie. Napisałem program do sterowania dwoma w układzie x,y za pomocą klawiatury numerycznej. Potem dojdzie trzeci, ale to już banał, jedynie powtarzanie procedur z innymi zmiennymi. Jeśli ktoś by chciał program to proszę dać mi znać.
Dodam jeszcze, że do jednego portu LPT można podłączyć nie 2 a 3 silniki krokowe:
Silnik 1 - piny 2,3,4,5
Silnik 2 - piny 6,7,8,9
Silnik 3 - piny 1,14,16,17(adresowanie portu jest nieco inne - port jest dostępny po offsecie 02h, czyli dodajemy 2 do portu - zamiast &H378 jest &H37A)
Pin 1 daje małe napięcie, ale ULN2003 rozwiązuje sprawę. W planach zaprojektowanie płytki z nieco bardziej zaawansowaną elektroniką do obsługi 5 silników z jednego LPT.
maciek001 - Sun 27th January 2008 20:45
Obecnie właśnie jestem w fazie wykonania układów elektronicznych do sterowania silnikami krokowymi. Jeżeli ktoś ma jakieś pytania postaram się pomóc. Trzymajcie kciuki! Z tego co wiem to można sterować 4 silnikami krokowymi (po 2 piny z LPT na jeden silnik) tylko trzeba zrobić sterownik do każdego silnika.
Piotrsikora - Wed 5th March 2008 19:26
Witam mam pytanie wymontowałem silniczek ze starego skanera jest on praktycznie identyczny z tym jaki zastosowałeś ale z ta różnica ze u mnie na zasilaczu skanera jest napisane AC/DC adapter 24V i nie wiem czym mogę zastosować ten zasilacz czy muszę szukać innego.
Druga sprawa to czy ktoś ma napisany do tego jakiś program sterujący bo niestety z programowania nie wiele potrafię.
1bobik1 - Tue 24th June 2008 02:47
WOW jestem pełen podziwu
od dawna chcialem zajac sie elektronika
ale nie wiem od czego zaczac ;/
moze cos polecisz :D
bo to ^^ dla mnie czarna magia ;)
Pozdrawiam
military.modding - Tue 24th June 2008 03:03
Polecam Ci ten portal >>> http://www.elektroda.pl/
Siedzą tam konkretne mózgi, (jeśli można tak ująć :pruchno:)