[PRZYKŁAD] Sterowanie wieloma serwomechanizmami – 16-kanałowy sterownik serwomechanizmów oraz KAmduino UNO
Aby ułatwić korzystanie z modułu sterownika, można zainstalować bibliotekę przygotowaną przez producenta. Znajduje się ona pod linkiem: LINK, oraz w repozytorium bibliotek (Szkic >> Zarządzaj bibliotekami). Dokumentacja biblioteki znajduje się pod linkiem: DOKUMENTACJA.
Teraz zaprezentuję kod programu, który ma za zadanie sterowanie serwami (pełen kod znajduje się sekcji Do pobrania). Najpierw wszystkie osiągają minimalne, a następnie maksymalne wychylenie. Po tym ta sekwencja zostaje przedstawiona kolejno na każdym serwomechanizmie.
Na początku programu należy dołączyć niezbędne biblioteki, zainicjalizować ich działanie oraz zadeklarować stałe długości impulsu dla skrajnych położeń serwa.
// [PRZYKŁAD] Sterowanie wieloma serwomechanizmami - 16-kanałowy sterownik serwomechanizmów oraz KAmduino UNO // Autor: Patryk Mądry // Mikrokontroler 2018 r. #include <Wire.h> #include <Adafruit_PWMServoDriver.h> Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // Domyslny adres 0x40 //Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41); // Inny adres sterownika 0x41 #define SERVOMIN 150 // Minimalna długość impulsu dla skrajnego położenia serwa #define SERVOMAX 550 // Maksymalna długość impulsu dla skrajnego położenia serwa int ktore_serwo = 0; int ilosc_serw = 4;
Następnie w funkcji konfiguracyjnej należy uruchomić bibliotekę, ustawić częstotliwość sygnałów PWM, oraz ustawić serwomechanizmy w określonej skrajnej pozycji.
void setup() { pwm.begin(); pwm.setPWMFreq(60); // Ustawienie częstotliwości pwm.setPWM(0, 0, 150 ); pwm.setPWM(1, 0, 150 ); pwm.setPWM(2, 0, 150 ); pwm.setPWM(3, 0, 150 ); delay(1000); }
Aby poruszyć serwomechanizmem należy wywołać funkcję pwm.setPWM(A,B,C). Przyjmuje ona 3 parametry: pierwszy z nich (A) definiuje, na którym kanale (0-15) ma być generowany sygnał PWM, drugi (B) określa czas przejścia ze stanu niskiego na wysoki, oraz parametr (C), określa czas przejścia sygnału ze stanu wysokiego na niski. W tym przypadku będę korzystać tylko z parametru C. Aby w ten sposób ustawić ramię serwomechanizmu 1 w pozycji skrajnej minimum należy wywołać następujący kod:
pwm.setPWM(1,0,SERVOMIN) albo pwm.setPWM(1,0,150)
Natomiast dla skrajnej maksymalnej pozycji następujący kod:
pwm.setPWM(1,0,SERVOMAX) lub pwm.setPWM(1,0,550)
Płynne poruszanie między tymi dwoma skrajnymi położeniami zrealizowano za pomocą pętli For, która odlicza kolejne wartości od ustawienia minimalnego (SERVOMIN) do wartości maksymalnej (SERVOMAX).
W pętli głównej programu – loop(), zaimplementowano różne wariacje sterowania. Najpierw serwa osiągają skrajne położenia, po kolei (od 1 do 4 serwa). Następnie wszystkie serwa kolejno osiągają jedno skrajne położenie, a następnie drugie skrajne położenie. W ostatnim wariancie wszystkie serwa wykonują ten sam ruch jednocześnie.
Kod programu do poruszania serwami po kolei z jednej pozycji skrajnej w drugą wygląda następująco:
// Uruchmianie kolejnych serw po kolei for (int ktore_serwo = 0; ktore_serwo <=4 ; ktore_serwo++) { for (int Licznik = SERVOMIN; Licznik < SERVOMAX; Licznik++) { pwm.setPWM(ktore_serwo, 0, Licznik); } delay(500); for (int Licznik = SERVOMAX; Licznik > SERVOMIN; Licznik--) { pwm.setPWM(ktore_serwo, 0, Licznik); } delay(500); } delay(1000);
Następnie w pętli głównej programu umieszczony jest kod, który porusza po kolei serwa jedno po drugim:
// Uruchomienie serw jedno po drugim for (int ktore_serwo=0; ktore_serwo<=4;ktore_serwo++) { for (int Licznik = SERVOMIN; Licznik < SERVOMAX; Licznik++) { pwm.setPWM(ktore_serwo, 0, Licznik); } } delay(500); for (int ktore_serwo=0;ktore_serwo<=4;ktore_serwo++) { for (int Licznik = SERVOMAX; Licznik > SERVOMIN; Licznik--) { pwm.setPWM(ktore_serwo, 0, Licznik); } } delay(1000);
I na końcu kod do poruszania wszystkimi serwami jednocześnie:
// Uruchomienie wszystkich serw jednocześnie for (int licznik = SERVOMIN; licznik < SERVOMAX; licznik++) { pwm.setPWM(0, 0, licznik); pwm.setPWM(1, 0, licznik); pwm.setPWM(2, 0, licznik); pwm.setPWM(3, 0, licznik); } delay(1000); for (int licznik = SERVOMAX; licznik > SERVOMIN; licznik--) { pwm.setPWM(0, 0, licznik); pwm.setPWM(1, 0, licznik); pwm.setPWM(2, 0, licznik); pwm.setPWM(3, 0, licznik); } delay(1000);
Działanie powyższego programu zaprezentowano na poniższym filmie: