[PROJEKT] Pololu 24v23 – sterownik silników DC i KAmduino UNO
Pololu 24v23 to wielofunkcyjny profesjonalny sterownik silników prądu stałego z powodzeniem wykorzystywany w wielu konstrukcjach robotycznych. Sprzedawany jest w wielu wersjach, które różnią się napięciem zasilania i maksymalną wydajnością prądową dla szczotkowych silników prądu stałego. Prezentowany moduł opatrzony numerem 24v23 pozwala na zasilanie silników napięciem o wartości do 40 V i prądem ciągłym do 25 A. Zatem jest to sterownik przeznaczony do sterowania napędem cięższych konstrukcji mobilnych.
Sterowniki tej serii są bardzo wygodne w użyciu. Dzięki zastosowanemu mikrokontrolerowi STM32F103T9U6 producent zaimplementował wiele możliwości sterowania działaniem silnika, oraz bardzo łatwą konfigurację samego modułu. Ze strony internetowej producenta można pobrać aplikację na komputer umożliwiającą wcześniej wspomnianą konfigurację. Moduł sterownika został wyposażony w złącze mini USB typu B, za pośrednictwem którego podłączamy go do komputera.
Dzięki aplikacji mamy możliwość podglądu parametrów pracy sterownika podczas jego działania w robocie. Jeżeli zajdzie taka potrzeba istnieje również możliwość sterowania silnikiem z poziomu aplikacji konfiguracyjnej.
Sterowanie silnikiem DC z wykorzystaniem sterownika Pololu 24v23 może odbywać się na jeden z trzech dostępnych sposobów:
- sterowanie poprzez interfejs szeregowy USB lub UART,
- sterowanie z wykorzystaniem sygnału analogowego (poprzez użycie potencjometru),
- sterowanie za pomocą aparatury RC (modelarskim sygnałem PWM).
Aplikacja konfiguracyjna została wyposażona w moduł „uczący” sterownik zakresu sterowania sygnałem PWM. Moduł uczący składa się z prostego kreatora prowadzącego użytkownika krok po kroku przez proces kalibracji sterownika na wejściowy sygnał PWM.
Prezentowany przykład użycia opiera się o sterowanie modelarskim sygnałem PWM. W prezentowanym przykładzie użycia została wykorzystana płytka zgodna z Arduino Uno o nazwie KAmduino UNO. Modelarski sygnał PWM, stosowany w aparaturach RC charakteryzuje się stałą częstotliwością wynoszącą 50 Hz oraz zakresem sterowania wypełnieniem z przedziału 5…10%. W praktyce okres sygnału wynosi 20 ms i wypełnienie wynosi od 1 do 2 ms.
Dzięki temu sterowanie odbywa się w dokładnie taki sam sposób, jak standardowym serwomechanizmem. Z tego względu do przykładu została wykorzystana biblioteka Arduino do sterowania serwomechanizmem.
Pierwszym etapem budowy obwodu jest instalacja oprogramowania konfiguracyjnego od firmy Pololu. Domyślnie sterownik skonfigurowany jest na komunikację z urządzeniem nadrzędnym poprzez port szeregowy USB lub UART. W celu zmiany konfiguracji należy podłączyć poprzez port USB sterownik do komputera oraz połączyć się z modułem. Z menu w górnej części ekranu należy wybrać wykryty układ sterownika, następnie połączenie zostanie nawiązane automatycznie.
Następnie należy przejść do zakładki „Input Settings” i w sekcji „Input Mode” zmienić zaznaczony parametr z „Serial/USB” na RC. Aby zastosować zmianę ustawień należy użyć przycisku „Apply Settings” na dole okna programu.
Kolejnym krokiem jest polutowanie sterownika, jeżeli nie zrobiliśmy tego wcześniej. Sterownik sprzedawany jest w postaci płytki sterownika oraz złączy i kondensatora wyjścia sterującego silnikiem DC. Umożliwia to swobodne dostosowanie układu do projektowanego projektu robota. Można skorzystać z dostarczonych złączy typu ARC i goldpin lub w miejsce ich montażu użyć bezpośrednio przewodów łączących komponenty robota. Podczas montażu kondensatora należy zwrócić szczególną uwagę na jego polaryzację, gdyż jego odwrotne podłączenie skutkuje jego całkowitym zniszczeniem poprzez rozerwanie. W tym przykładzie zdecydowano się zastosować dostarczone złącza razem ze sterownikiem. Podłączenie z płytką KAmduino ogranicza się do połączenia wyjścia 9 płytki z wejściem sygnału RC1 oznaczonym jako „S” na module sterownika oraz połączenia masy płytek. Do złączy ARC sterownika należy podłączyć zewnętrzne źródło zasilania wraz z silnikiem (wyjścia: OUT1 i OUT2). Należy pamiętać o zachowaniu polaryzacji przy podłączaniu zasilania, VIN jako „+” ,oraz GND jako „-„ zasilania. Wejścia zasilania oraz wyjścia silnika DC są oznaczone na spodniej stronie płytki PCB sterownika.
Program sterujący pracą silnika ma za zadanie modyfikować wartość sygnału PWM, tak aby sterować prędkością obrotową silnika zwiększając ją raz w jedną, a raz w drugą stronę. Wartość wypełnienia sygnału PWM 5% oznacza że silnik kręci się z maksymalną prędkością w jedną stronę, 7,5% silnik jest zatrzymany, 10% silnik kręci się z maksymalną prędkością w przeciwną stronę. W programie zostało to uwzględnione poprzez ustawienie wartości początkowej na 90 co oznacza połowę zakresu regulacji. Zapobiega to uruchomieniu silnika z maksymalną prędkością po wgraniu programu do mikrokontrolera płytki KAmduino UNO.
Działanie programu zostało przedstawione na filmie oraz potwierdza to oscylogram przedstawiający sygnał PWM.
#include <Servo.h> //Biblioteka odpowiedzialna za sterowanie serwomechanizmem (generowanie sygnału PWM 50Hz) Servo sterownik; //Tworzymy obiekt, dzięki któremu możemy odwołać się do sterownika int predkosc = 90; //Biblioteka odnosi się do sterownia serwomechanizmem co oznacza że wartość //może być zmieniana w zakresie od 0 do 180 stopni. Odpowiada to zmianom wypełnienia //między 5, a 10 %, gdzie 0 to 5% (1ms), a 180 to 10% (2ms). int kierunek = 0; //Zmienna flagowa informuje o zmianie sposobu zmiany wypełnienia sygnału PWM. void setup() { sterownik.attach(9); //Sterownik podłączony do pinu 9 płytki Arduino } void loop() { if(kierunek == 0) //Jeżeli kierunek == 0 to inkrementujemy zmienną prędkość. { if(predkosc < 180) //Pilnujemy aby zmienna prędkość nie przekroczyła wartości 180. { predkosc++; } else { kierunek = 1; //Jeżeli wartość zmiennej osiągnie 180 zmieniamy kierunek i wartość będzie dekrementowana. } } else { if(predkosc > 1) // Postępujemy analogicznie do pierwszej części algorytmu przy czym wartość zmiennej prędkość zmniejszamy. { predkosc--; } else { kierunek = 0; } } sterownik.write(predkosc); //Aktualizujemy wypełnienie sygnału PWM. delay(100); //Wprowadzamy opóźnienie dla wolniejszej zmiany prędkości obrotowej silnika. }