W tym artykule zostanie przetestowana płytka ADEAS, sterująca wieloma serwami, zostanie przedstawione połączenie oraz wszystko co potrzebne do sterowania. Jest to bardzo przydatne rozwiązanie, ponieważ przy pomocy komunikacji z I2C, można sterować aż 16 serwami.
Spis treści
- Krótki opis
- Specyfikacja
- Wykorzystane komponenty
- Podłączenie
- Wgranie potrzebnej biblioteki
- Wykorzystanie przykładu
- Przedstawienie działania
- Pliki do pobrania
Krótki opis
16-kanałowy sterownik serw to zaawansowane urządzenie, które zapewnia możliwość precyzyjnego sterowania wieloma serwomechanizmami jednocześnie. Jest to niezwykle przydatne w różnych dziedzinach, od robotyki po modelarstwo, zapewniając zaawansowane możliwości kontroli i automatyzacji ruchów.
Specyfikacja
- Napięcie części logicznej: od 3,3 V do 5 V.
- Napięcie zasilania: 3-5 V
- Maksymalne napięcie silników: 6 do 28V
- Liczba kanałów: 16
- Rozdzielczość każdego kanału: 12 bit
- Interfejs: I2C
- Częstotliwość pracy kanałów: 40÷1000 Hz
- Rozmiar modułu: 67 mm x 43 mm x 10 mm
- Wszystkie wyprowadzenia są opisane na płytce.
- Wbudowany rezonator taktujący, dzięki któremu do układu nie trzeba stale wysyłać sygnału z mikrokontrolera.
- Możliwość wyboru adresu magistrali I2C (0x60-0x80) za pośrednictwem zworek, co daje możliwość podpięcia 62 urządzeń.
- Układ wyposażony w zworkę pozwalająca na zasilanie całego układu 5V
- Układ wyposażony w aktywacje wyjścia może być sterowane z procesora lub aktywowane zworką
- Układ wyposażony w zlutowane złączą śrubowe odpowiedzialne za komunikacje i zasilanie
Wykorzystane komponenty
- PCA9685 – sterownik serw 16-kanałowy, 12-bitowy PWM I2C – ADEAS
- MEGA 2560 R3 ATMega2560 16MHz – CH340 + Kabel USB
- Przewody połączeniowe
- 2 x zworka
Podłączenie
Na początku zwieramy dwiema zworkami wystające pary pinów na płytce, 5V_VIN odpowiada za zasilanie z sekcji power płytki jak i serw. W przypadku kiedy chcemy osobno zasilić serva i układ płytki, możemy pominąć zwieranie i wtedy zasilanie podłączamy do sekcji power jak i I2C. Druga zworka służy do uruchomienia sygnału wyjściowego, można też to zrobić z poziomu arduino jeżeli taka opcja nas interesuje.
Użyję zasilacza do zasilenia układu jak i serv, do sekcji power podpinam plus do 5V i minus do GND. W sekcji I2C, podłączam SCL i SDA do odpowiadających im pinów w arduino. Podłączam dodatkowo GND do arduino, również z sekcji I2C. Tak podłączony układ jest gotowy do dalszej pracy.
Serwa wpinamy tam gdzie jest oznaczenie na płytce BROWN, RED, ORANGE, wskazuje to na kolor przewodów od serwa, jeżeli wasze serwo ma inny kolor przewodu, proszę postępować zgodnie z tym schematem BROWN – GND, RED – VCC, ORANGE – Sygnał.
Wgranie potrzebnej biblioteki
Użyję biblioteki od Adafruit, a dokładniej PWM Servo Driver Library, która doskonale sprawdza się w obsłudze naszego układu, bibliotekę można pobrać na dole artykułu lub na stronie biblioteki, gdzie można znaleźć również informacje o niej, wystarczy kliknąć tutaj. Kiedy pobierzemy, to implementujemy ją do arduino.
Wykorzystanie przykładu
Włączamy przykład servo, plik -> przykłady -> Adafruit PWM servo driver library -> servo . Zalecam też zmienić w przykładzie stałą SERVO_FRQ z 50 na 60. Możemy wgrać przykład do arduino i zaraz po wgraniu nasze serwa powinny zacząć się ruszać.
Na podstawie przykładu napisałem program, który przedstawi jedno z zastosowań biblioteki. Ruszamy serwami za pomocą + i – lub wystarczy przytrzymać enter, wtedy mamy szybkie odejmowanie co za tym idzie szybszy ruch. Oczywiście zachęcam do edycji kodu i dodania większej ilości serw oraz zapoznania się z innymi funkcjami biblioteki.
#define SERVOMIN 150 // This is the 'minimum' pulse length count (out of 4096) #define SERVOMAX 600 // This is the 'maximum' pulse length count (out of 4096) #define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150 #define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600 #define SERVO_FREQ 60 // Analog servos run at ~50 Hz updates // our servo # counter uint8_t servonum = 0; void setup() { Serial.begin(9600); pwm.begin(); pwm.setOscillatorFrequency(27000000); pwm.setPWMFreq(SERVO_FREQ); //powrót serw na miejsce max pwm.setPWM(1, 0, SERVOMAX); delay(100); pwm.setPWM(0, 0, SERVOMAX); delay(10); } String command = ""; int position = SERVOMAX; int positionCount = 25; void loop() { if(Serial.available() > 0) { command = Serial.readStringUntil('\n'); if(command == "+") { if(position <= SERVOMAX) { position+=positionCount; pwm.setPWM(1, 0, position); // delay(100); pwm.setPWM(0, 0, position); } else { position = SERVOMAX; } } else { if(position >= SERVOMIN) { position-=positionCount; pwm.setPWM(1, 0, position); // delay(100); pwm.setPWM(0, 0, position); } else { position = SERVOMIN; } } } }