Skanery, które pod koniec lat 90. ubiegłego stulecia były bardzo popularnymi urządzeniami biurowymi, dzisiaj są zastępowane przez różne urządzenia wielofunkcyjne. Stare i niepotrzebne sprzęty często można znaleźć porzucone w punktach odbioru elektrośmieci. O ile ze zintegrowanych płytek elektroniki (poza przetwornicami zasilającymi neonówki), raczej nie ma większego pożytku, o tyle warto się zainteresować występującymi w nich komponentami mechanicznymi. Znajdziemy tam silnik krokowy i gotowe układy trakcyjne z przekładniami, paskami zębatymi i prętami prowadnic. Z jednego z takich starych i nikomu niepotrzebnych urządzeń postanowiłm zrobić prosty slider fotograficzny (Fig. 1) - czyli urządzenie mechaniczne płynnie przesuwające przymocowaną kamerę wzdłuż jakiegoś odcinka.
W urządzeniu, które pozyskałem znajdował się silnik krokowy Mototech S35S5-6002 (Fig. 2).
Silnik posiada 5 wyprowadzeń elektrycznych. Nie udało mi się znaleźć jego noty katalogowej. Aby poznać funkcje poszczególnych końcówek takiego nieznanego silnika, należy zmierzyć rezystancje pomiędzy jego wyprowadzeniami, a wyniki zapisać w tabeli prawdy (Tab. 1).
pomarańczowy | żółty | czarny | czerwony | brązowy | |
---|---|---|---|---|---|
pomarańczowy | x | 122Ω | 122Ω | 61Ω | 122Ω |
żółty | 122Ω | x | 123Ω | 61Ω | 122Ω |
czarny | 123Ω | 123Ω | x | 61Ω | 122Ω |
czerwony | 61Ω | 61Ω | 61Ω | x | 61Ω |
brązowy | 122Ω | 122Ω | 122Ω | 61Ω | x |
Rezystancje mierzone pomiędzy wszystkimi wyprowadzeniam, za wyjątkiem wyprowadzenia czerwonego wynosiły około 122Ω. Z kolei opory pomiędzy końcówką czerwoną a dowolną inną był o połowę niższy. Stąd wynika, że to unipolarny, 4-fazowy silnik krokowy (Fig. 3). Z informacji jakie udało się pozyskać wynika, że jego napięcie znamionowe wynosi 12V.
Unipolarne silniki krokowe mają 5, 6 lub 8 wyprowadzeń (Fig. 4). Sterowanie nimi nie wymaga posiadania podwójnego mostka H (jak w przypadku silników bipolarnych). Zamiast tego, dla każdej cewki należy użyć tranzystora o wysokim wzmocnieniu (darlingtona) i diody rozładowującej (ang. flyback diode; Fig. 5). Wykorzystuje się ją aby zapobiec skokom napięcia, gdy zasilanie cewki jest wyłączone, a silnik krokowy chwilowo działa jak generator.
Sterowanie silnikami unipolarnymi polega na generowaniu przez układ mikrokontrolera impulsowych sygnałów, które poprzez tranzystory zasilają poszczególne cewki. Przepływ prądu przez cewkę w odpowiednim kierunku, zgodnie z regułą lewej dłoni generuje pole magnetyczne, które przyciąga rotor silnika powodując jego obrót. W kolejnych taktach działania mikrokontrolera, do odpowiednich cewek podawane są kolejno sygnały. W ten sposób utrzymuje się ruch obrotowy wirnika. Istnieją różne konfiguracje impulsów napędzających silniki. W prezentowanym przypadku biblioteka steper.h
generuje cztery następujące kolejno po sobie ciągi sygnałów (Fig. 6, Tab. 2).
krok | Cewka | |||
---|---|---|---|---|
LA | LB | LC | LD | |
1 | 1 | 0 | 0 | 1 |
2 | 1 | 1 | 0 | 0 |
3 | 0 | 1 | 1 | 0 |
4 | 0 | 0 | 1 | 1 |
W praktyce, w urządzeniach sterujących unipolarnymi silnikami krokowymi zamiast pojedynczych tranzystorów darlingtona wykorzystuje się odpowiednie układy scalone. W prezentowanym urządzeniu, zastosowano układ ULN2003A (Fig. 7). ULN2003A to zestaw siedmiu tranzystorów NPN Darlingtona o mocy wyjściowej 500 mA i 50 V (każde wyjście). Wejścia układu są kompatybilne z logiką 5-woltową.
Gdy potrzebujemy sterować unipolarnymi silnikami krokowymi, wykorzystuje się gotowe moduły sterowników. Jest ich na rynku całe mnóstwo. Najczęściej wykorzystują one układy ULN2003A lub podobne. Sterownik, który będzie wykorzystywany w tym projekcie (Fig. 8) jest wyposażony w diody świecące wskazujące na to, która cewka jest w danej chwili zasilana. Moduł umożliwia zasilanie silników o napięciu znamionowym 5-12V.
Moduł z Fig. 8 jest wyposażony w:
Schemat modułu przedstawia Fig. 9.
Układ będzie zasilany za pomocą pakietu trzech ogniw litowo-jonowych połączonych szeregowo o napięciu wyjściowym ok. 12,5V (Fig. 10). Sercem urządzenia będzie Arduino Nano. Aby zapewnić mikrokontrolerowi odpowiednie napięcie zasilania, dodatkowo zastosujemy przetwornicę step-down LM2596.
Do zbudowania układu będziemy potrzebowali:
Źródło zasilania podłączamy do górnej magistrali zasilającej płytki prototypowej. Aby zabezpieczyć układ przed skokami napięcia o niskich czestotliwościach, spowodowanymi zmianami obciążenia, równolegle do szyny zasilającej wpinamy kondensator elektrolityczny 220uF, 25V. Mikrokontroler wymaga zasilania napięciem 5V, dlatego, jak już wspomniano, dodatkowo wykorzystujemy przetwornicę LM2596. Jej wejście podłączamy do magistrali zasilającej 12,5V. Przetwornicę regulujemy potencjometrem aby dostarczała napięcie 5V. Wyjście przetwornicy podpinamy do dolnej magistrali zasilającej. Łączymy masy obu szyn zasilających. Piny VCC i GND mikrokontrolera podłączamy do magistrali zasilającej 5V. Możliwie blisko zacisków zasilających Arduino wpinamy kondensator ceramiczny 100nF. Będzie on filtrował zasilanie i zabezpieczał mikrokontroler przed niepożądanymi skokami napięcia o bardzo wysokiej częstotliwości. Wejścia VCC i GND sterownika silników krokowych ULN2003A podłączamy do magistrali zasilającej 12,5V. Wejścia IN1, IN2, IN3 i IN4 sterownika ULN2003A podłączamy odpowiednio do pinów cyfrowych 8, 9, 10 i 11 układu Arduino. Do wyjść A, B, C, D sterownika ULN2003A podpinamy silnik krokowy Mototech S35S5-6002. W przypadku zastosowania innych silników krokowych, jeżeli ich praca będzie nieprawidłowa, kolejność podłączanych cewek LA, LB, LC i LD należy dobrać eksperymentalnie. "+" zasilania silników krokowych podłączamy do magistrali zasilającej 12,5V. Upewnijmy się, że jumper "on/off" sterownika znajdujący się obok pinu "VCC" jest włożony. Zapewni to optyczną kontrolę sterowania cewkami za pomocą diod LED wbudowanych w sterownik. Do układu dodajemy potencjometr. Do jego skrajnych nóżek podłączamy 5V. Nóżkę środkową łączymy z pinem analogowym A6 Arduino. Ostatnimi urządzeniami wejściowymi, które dodamy do układu są dwa wyłączniki krańcowe. Zastosowano rozbiórkowe krańcówki ze starych napędów DVD (Fig. 12). Łączymy je równolegle. Naciśnięcie dowolnej przycisku będzie w programie wyzwalało zmianę kierunku obrotów silnika. Krańcówki podłączamy do pinu cyfrowego D2 Arduino. Przyciski nie wymagają zastosowania rezystorów podciągających. Zastosujemy podciąganie programowe.
Zmontowany układ wraz z zastosowanym układem trakcji przedstawia Fig. 13.
Urządzenie będzie przesuwało kamerę ze stałą prędkością regulowaną potencjometrem. Po zwarciu styków dowolnego przełącznika krańcowego, mikrokontroler zmieni kierunek obrotów silnika, po czym wznowi jego pracę z wczesniej ustaloną prędkością obrotową. Slider będzie się więc poruszał w kółko w jedną, a potem w drugą stronę.
#include <Stepper.h> #define stepsPerRevolution 32 // change this to the number of steps on your motor // create an instance of the stepper class, specifying // the number of steps of the motor and the pins it's // attached to Stepper stepper(stepsPerRevolution, 8, 9, 10, 11); const int button = 2; // direction control button is connected to Arduino pin 2 const int pot = A7; // speed control potentiometer is connected to analog pin A7 void setup() { Serial.begin(9600); pinMode(button, INPUT_PULLUP); // configure button pin as input with internal pull up enabled } int direction_ = 1, speed_ = 0; boolean flag = 0; // status of the limit switch (0 - off; 1 - on) byte count = 0; // number of counts to change of the flag variable to the normal value = 0 void loop() { Serial.println(digitalRead(button)); if (( digitalRead(button) == 0 ) && (flag == 0)) { // if the limit switch is on and it is the 1'st moment of the pressing... direction_ *= -1; // reverse direction variable flag = 1; // change the flag variable to 1 } if (( digitalRead(button) == 0 ) && (flag == 1)) { // if the limit switch is on but it is not the 1'st moment of the pressing... count++; // increment the count variable if (count > 20) { // if the count variable > 20: flag = 0; // change the flag variable to the normal value = 0 count = 0; // change the count variable to 0 } } int val = analogRead(pot); // read analog value from the potentiometer // map digital value from [0, 1023] to [2, 500] //(min speed = 2 and max speed = 500 rpm) if ( speed_ != map(val, 0, 1023, 2, 500) ) { // if the speed was changed speed_ = map(val, 0, 1023, 2, 500); stepper.setSpeed(speed_); // set the speed of the motor } stepper.step(direction_); // move the stepper motor }