W trzeciej już części zaczniemy trochę poruszać elementami, dzisiaj przedstawię jak symulować sterowanie w arduino silników i serwomechanizmów. Jako, że serwomechanizmy są niezwykle proste do sterowani, to zacznę od nich.
Sterowanie serwomechanizmu
Najpierw trochę teorii, serwomechanizm to układ który ustawia się zależnie od zadanego sygnału i utrzymuje tą pozycje. Typowy serwomechanizm modelarski może obracać się w zakresie 180°. Do sterowania służy jedno wejście serwomechanizmu, na które musimy podawać impulsy z częstotliwością 50Hz, a czas trwania tych impulsów musi wynosić 1,5 – 2,5 ms. Zależnie od czasu trwania impulsu serwo ustawi się pod odpowiednim kątem. Jeżeli impulsy nie będą pojawiały się co 20ms (50Hz) to serwomechanizm przestanie utrzymywać ustawioną pozycję.
W arduino na szczęście mamy gotową bibliotekę do obsługi serwomechanizmów, więc całe to kontrolowanie impulsów nam odpada. Aby wypróbować działanie skonstruujmy taki układ:
Serwo zasilamy prosto z arduino, a linie sygnałową podpinamy do wyjścia PWM, w tym przypadku do 9. Program będzie miał za zadanie ruszać serwem od jednego skrajnego wychylenia do następnego. I tak w kółko.
#include <Servo.h> Servo servo; int pos = 0; void setup() { servo.attach(9); } void loop() { for(pos = 0; pos < 180; pos += 1) { servo.write(pos); delay(15); } for(pos = 180; pos>=1; pos-=1) { servo.write(pos); delay(15); } }
Pierwsza linia do dołączenie biblioteki Servo.h, następnie tworzymy zmienną servo i zmienną pos służącą do przechowywania położenia serwomechanizmu. W funkcji setup() do zmiennej serwo dołączamy pin 9, robimy to przy pomocy funkcji attach(). Funkcja loop() zbudowana jest z dwóch pętli for, jedna zlicza w górę, a druga w duł. wewnątrz przy pomocy funkcji write() wpisujemy pozycję na jaką ma się ustawić serwo, a następnie czekamy 15 ms, aż serwomechanizm wykona zadany ruch. Poniżej przedstawiam efekt działania.
Teraz spróbujmy sterować serwomechanizmem przy pomocy potencjometru, a dla większego rozbudowania dajmy dwa serwomechanizmy.
Układ będzie podobny do tego co był przy sterowaniu diodą RGB w pierwszej części cyklu.
Potencjometry to zwykłe dzielniki napięcia. Serwa wpięte są wpięte w wyjścia PWM o numerach 9 i 10. Program nawet jest prostszy niż poprzednio.
#include <Servo.h> Servo servo1; Servo servo2; int pot1 = 0; int pot2 = 1; int val1; int val2; void setup() { servo1.attach(9); servo2.attach(10); } void loop() { val1 = analogRead(pot1); val2 = analogRead(pot2); val1 = map(val1, 0, 1023, 0, 179); val2 = map(val2, 0, 1023, 0, 179); servo1.write(val1); servo2.write(val2); delay(15); }
Początek jest standardowy, tworzymy zmienne i mówimy gdzie co jest,a w funkcji setup() dopinamy piny do serwomechanizmów. W funkcji loop() odczytujemy wartości z wejść analogowych, następnie przekształcamy przy użyciu funkcji map() i wysyłam do serwomechanizmów wyliczoną pozycję. Na koniec tylko odczekanie 15 ms na ustawienie się serwa z zadane miejsce.
Na powyższym przykładzie widać, że sterowanie serwomechanizmem może być naprawdę łatwe. Warto pamiętać, że w rzeczywistości serwa nie mają idealnych parametrów i zakres ruchów jest zależny od konkretnego modelu. Teraz przejdźmy do sterowania silnikami prądu stałego.
Silniki prądu stałego DC
Silniki prądu stałego mają bardzo duże zastosowanie w urządzeniach z którymi spotykamy się na co dzień, między innymi dla tego, że ich prędkość obrotowa jest proporcjonalna do napięcia zasilania, a kierunek obrotów można zmienić dzięki zmianie polaryzacji zasilania. I właśnie w pierwszym przykładzie o silnikach to zasymiluję.
W układzie niema żadnego mikrokontrolera, a do sterowania służą przełączniki, które zależnie od położenia dają na silnik plus albo minus. Kiedy przełączniki są w tej samej pozycji to różnica potencjałów pomiędzy jednym a drugim wejściem silnika wynosi 0V, więc nie przepływa prąd i nie wytwarza się siła. W efekcie silnik stoi w miejscu. Układ tego typu nazywa się mostkiem h (h-bridge) i jest podstawowym układem służącym do sterowania silnikami DC. W dalszej części przedstawię bardziej rozwinięte mostki h scalone w jednym układzie. Efekt pracy tego mostka jest taki:
Jak widać po zmianie przełączników zmienia się kierunek obrotów silnia, a po zmianie napięcia zasilania przez silnik przepływa większy prąd a jego obroty rosną. Niestety w symulatorze prędkość obrotów nie jest proporcjonalna do rzeczywistej, więc proponuje się sugerować wskaźnikiem na środku wirnika.
Sterowanie silnika DC przy pomocy tranzystora
Ten przykład pokarze jak sterować z arduino silnikiem, a dokładniej jak zmieniać jego prędkość obrotową. Do regulacji wykorzystamy oczywiście PWM, a będzie to wyglądało bardzo podobnie jak przy diodzie, z tym, że będziemy sterować prądem bazy tranzystora i w ten sposób zmieniać napięcie dla silnika, czyli jego prędkość obrotową. Aby to wykonać musimy posiadać taki układ:
A program to dokładnie to samo, co przy diodzie LED regulowanej PWM.
int pot = 0; int motor = 3; int val = 0; void setup() { pinMode(motor, OUTPUT); pinMode(pot, INPUT); } void loop() { val = analogRead(pot); analogWrite(motor, val); }
A poniższy film przedstawia jak to działa.
Regulacja kierunku obrotów, czyli wstawiamy mostek H
W tym przykładzie będziemy regulować przy pomocy kontrolera prędkość obrotową silnika. Jak o mostka cha użyjemy układu L293D, który jest chyba najpopularniejszym układem tego typu. Poniżej przedstawiam układ jaki trzeba zmontować.
A do sterowania prosty program, który co sekundę będzie zmieniał kierunek obrotów silnika.
int out1 = 12; int out2 = 13; int enable = 9; void setup() { pinMode(out1, OUTPUT); pinMode(out2, OUTPUT); pinMode(enable, OUTPUT); } void loop() { digitalWrite(enable, HIGH); digitalWrite(out1, HIGH); digitalWrite(out2, LOW); delay(1000); digitalWrite(out1, LOW); digitalWrite(out2, HIGH); delay(1000); }
Zmienne out1, out2 i enable przechowują numery pinów do których jest podpięty mostek H, Następnie sutawiamy te piny jako wyjście. W funkcji loop() w pierwszej linii ustawiamy enable na stan wysoki, a następnie w odstępach 1s zmieniamy stany na wyjściach sterujących sinikiem.
Teraz ostatnim krokiem jest sterowanie prędkością obrotową przy pomocy kontrolera, oczywiści wykorzystamy do tego PWM i wejście enable mostka H. Do schematu dokładamy tylko potencjometr, którym będziemy zadać prędkość obrotów.
W programie musimy dołączyć sterowanie PWM na wyjście enable, a dla lepszego zobrazowania działania ustawiamy silnik na obroty tylko w jedną stronę.
int out1 = 12; int out2 = 13; int enable = 9; int pot = 0; int val = 0; void setup() { pinMode(out1, OUTPUT); pinMode(out2, OUTPUT); pinMode(enable, OUTPUT); pinMode(pot, INPUT); } void loop() { val = analogRead(pot); val = map(val, 0, 1023, 0, 255); analogWrite(enable, val); digitalWrite(out1, HIGH); digitalWrite(out2, LOW); }
A poniższy film pokazuje jak to wszystko razem działa.
O silnikach i serwomechanizmach to tyle. W następnej części opiszę obsługę czujników dostępnych w 123DCircuits.
Super artykuł. Niestety jeszcze nie ma w 123DCircuits funkcji “VarSpeedServo” dla serwo motorku. A szkoda bo przydatna funkcja. Pozdrawiam.