Serwomotor
Problem - Serwomotor
Chcesz za pomocą Arduino lub Raspberry Pi precyzyjnie ustawić położenie silnika.
Rozwiązanie
Rozwiązaniem problemu jest serwomotor. Należy go podłączyć w sposób pokazany na rysunku 13.5.
Rysunek 13.5. Serwomotor podłączony do pinu GPIO
Serwomotory zwykle używają innego źródła zasilania niż Arduino lub Raspberry Pi, ponieważ wysoki prąd obciążeniowy w momencie uruchamiania silnika może spowodować tak duży spadek napięcia zasilania, że urządzenie sterujące się zresetuje. Jednak gdy używasz niewielkich serwomotorów o niskim obciążeniu, może wystarczyć zastosowanie tego samego źródła zasilania dla obu urządzeń.
Rezystor R1 ma chronić pin GPIO, jednak nie jest on niezbędny, ponieważ większość serwomotorów pobiera bardzo niewiele prądu z pinu sterowniczego. Jeśli jednak nie znasz specyfikacji używanego serwomotoru, zastosowanie R1 to sensowne zabezpieczenie.
Na rysunku 13.6 pokazany jest niewielki hobbystyczny serwomotor 9g. Złącze tego urządzenia jest dość standardowe, powinieneś jednak zajrzeć do specyfikacji.
Rysunek 13.6. Serwomotor 9g
Czerwone wyprowadzenie to plus zasilania silnika, brązowe to połączenie z masą, a pomarańczowe jest przeznaczone na sygnał sterujący.
Sygnał sterujący zwykle jest poprawnie obsługiwany przez układy logiczne o napięciu 3,3 V, jeśli jednak specyfikacja serwomotoru określa, że napięcie musi być wyższe, zastosuj konwerter poziomów.
Serwomotor - Oprogramowanie dla Arduino
W kodzie przyjęto, że pin sterowniczy serwomotoru jest podłączony do pinu 9 Arduino Uno. Gdy otworzysz narzędzie Serial Monitor, pojawi się prośba o wpisanie kąta ramienia serwomotoru.
#include
const int servoPin = 9;
Servo servo;
void setup() {
servo.attach(servoPin);
servo.write(90);
Serial.begin(9600);
Serial.println("Podaj kąt w stopniach");
}
void loop() {
if (Serial.available()) {
int angle = Serial.parseInt();
servo.write(angle);
}
}
Upewnij się, że opcja Line endings w narzędziu Serial Monitor ma wartość No line ending.
Metoda servo.write biblioteki servo ustawia ramię serwomotoru zgodnie z podawanym w stopniach kątem od 0 do 180°.
Serwomotor - Oprogramowanie dla Raspberry Pi
Odpowiednikiem szkicu Arduino przeznaczonym dla Raspberry Pi jest program ch_13_servo.py.
import time
servo_pin = 18
# Dostosuj te wartości, aby ruch serwomotoru odbywał się w pełnym zakresie
deg_0_pulse = 0.5 # W ms
deg_180_pulse = 2.5 # W ms
f = 50.0 # 50Hz = 20 ms między impulsami
period = 1000 / f # 20 ms
k = 100 / period # Cykl roboczy (od 0 do 100) w okresie 20 ms
deg_0_duty = deg_0_pulse * k
pulse_range = deg_180_pulse - deg_0_pulse
duty_range = pulse_range * k
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, f)
pwm.start(0)
def set_angle(angle):
duty = deg_0_duty + (angle / 180.0) * duty_range
pwm.ChangeDutyCycle(duty)
try:
while True:
angle = input("Kąt (od 0 do 180): ")
set_angle(angle)
finally:
print("Operacje porządkujące")
GPIO.cleanup()
Funkcja set_angle wykorzystuje zmienne deg_0_duty i duty_range, których wartość jest obliczana raz na początku programu w celu ustalenia cyklu roboczego generującego impuls o długości odpowiedniej, aby uzyskać podany kąt.
Serwomotory rzadko mają dokładnie ten sam zakres ruchów, dlatego ten program i jego wersja dla Arduino są doskonałym sposobem na ustalenie zakresu kątów dostępnego dla danego urządzenia.
Serwomotor - Opis
Na rysunku 13.7 pokazane jest, jak impulsy docierające do pinu sterowniczego serwomotoru zmieniają kąt ramienia.
Rysunek 13.7. Długość impulsu steruje położeniem ramienia serwomotoru
Serwomotor oczekuje impulsu co 20 ms, aby zachować położenie. Długość tego impulsu określa umiejscowienie ramienia. Normalnie ramię może wychylać się o ok. 180°. Krótki impuls, trwający od 0,5 do 1 ms, umieszcza ramię po jednej stronie zakresu. Impuls trwający 1,5 ms umieszcza ramię w położeniu środkowym, a długi impuls, do 2,5 ms, przenosi ramię w najdalszy punkt zakresu.
Podłączanie wielu serwomotorów
Jeśli chcesz podłączyć do Arduino lub Raspberry Pi wiele serwomotorów, pomocna może okazać się karta interfejsu dla serwomotorów, taka jak ServoSix (rysunek 13.8).
Rysunek 13.8. Karta ServoSix firmy Monk Makes
Stosowanie do generowania impulsów biblioteki GPIO Pythona może skutkować skokowymi ruchami serworamienia. Wynika to z nieprecyzyjnego zarządzania impulsami, gdy Raspberry Pi próbuje wykonywać kilka operacji jednocześnie.
Działanie serwomotoru można usprawnić, stosując usługę ServoBlaster, która konfiguruje niektóre piny GPIO wyłącznie do użytku dla serwomotoru. Możesz też posłużyć się biblioteką ServoSix (wykorzystuje ona usługę ServoBlaster), która konfiguruje piny na potrzeby serwomotoru na czas działania programu sterowniczego.
Inna możliwość to przekazanie w całości sterowania serwomotorami sprzętowi takiemu jak produkowana przez firmę Adafruit 16-kanałowa karta serwomotorów, do której przekazywane są komunikaty sterujące z Raspberry Pi.