Kręć, się kręć czyli serwo HXT900 z continuous rotation

Serwomechanizmy takie jak mały HXT 900 są sterowane szerokością impulsu PWM. Czyli podłączamy zasilanie, masę i wyjście cyfrowe PWM do serwa i jeżeli skorzystamy z biblioteki Servo wchodzącej w skład Arduino IDE wystarczy napisać do serwa wartość od 0 do 180 określającą jak daleko ma się wychylić.

Serwomechanizm HXT900
Serwomechanizm HXT900

Dzięki niewielkiej przeróbce HXT900 można zmienić w silniczek którego prędkość obrotową można regulować w prosty sposób przez bibliotekę Servo, bez konieczności korzystania z układów elektronicznych do zasilania i sterowania silnikiem. Nazywane to jest continuous rotation.

Zacznijmy od demontażu serwa, przy okazji zobaczymy jak serwo działa. Najpierw – co będzie potrzebne do tej operacji?

Narzędzia potrzebne do operacji
Narzędzia potrzebne do operacji

Czyli – mały śrubokręt, gwóźdź do poszerzenia na gorąco otworu na ośkę (może być śrubka o odpowiedniej średnicy), pilnik do metalu (podejrzewam, że papier ścierny w zupełności też wystarczy), szczypce boczne, lutownica i topnik.

Bierzemy serwo i odkręcamy śrubki na dole obudowy:

Odkręcamy śrubki...
Odkręcamy śrubki...


Następnie zdejmujemy górną i dolną część obudowy:

Obudowa otwarta
Obudowa otwarta

W dolnej części widać silnik oraz elektronikę sterującą całością, w górnej oś potencjometru, na której wraz z pomocniczą ośką osadzone są cztery kółka zębate:

Mechanizm przekładni serwa
Mechanizm przekładni serwa

Jak właściwie działa serwo?

Teraz można łatwo zrozumieć jak działa taki serwomechanizm. Ośka w złotym kolorze (ta z prawej na zdjęciu) jest jednocześnie osią potencjometru. Koło najwyżej na tej osi jest osadzone bez luzów i gdy obraca się razem z nim kręci się oś potencjometru. Zmieniające się napięcie na potencjometrze odczytuje sterownik na dole serwa. Porównując odczyt z zadaną wartością (poprzez szerokość impulsu PWM) steruje obrotami i kierunkiem pracy silnika, tak aby potencjometr przyjął odpowiednią pozycję.

Ostatnie koło zębate (to przymocowane na sztywno do ośki potencjometru) jednocześnie wystaje na zewnątrz obudowy i mocuje się do niego orczyki, które są w zestawie. Dzięki temu serwo 'wie’ jak daleko jest wychylone i jak ma się zachować w zależności od sygnału sterującego.

Jeżeli teraz ogłupimy serwo, tak, że będzie myślało, że potencjometr jest w pozycji połowa wychylenia a zmiana położenia orczyku nie będzie dawała informacji do sterownika to przy zmieniającym się sygnale sterującym silnik serwa będzie kręcić się w jedną lub drugą stronę z prędkością tym większą im większa będzie odległość zadanego wychylenia od odczytu (nieruchomego) potencjometru.

Zaczynamy od demontażu całego mechanizmu. Uwaga – zaznacz, zapamiętaj które koło zębate jest w którym miejscu, bo potem musisz całość złożyć! Ponadto wewnątrz mechanizmu znajduje się smar, więc trzeba to robić na jakiejś podkładce aby nie pobrudzić podłoża.

Metalowa, pomocnicza ośka jest wsadzona luźno w otwór w obudowie, więc nie ma problemu z jej wyjęciem, potencjometr wyjmujemy na siłę, ciągnąc za najwyższe koło – uwaga – nie szarpnij zbyt mocno bo możesz urwać kable przylutowane do potencjometru.

Wyjmujemy potencjometr
Wyjmujemy potencjometr

W tym celu musimy pozwolić kręcić się swobodnie ostatniemu kołu zębatemu (temu osadzonemu na sztywno na osi potencjometru). I tutaj pojawia się pierwsza rzecz którą musimy zmienić:

Pierwsza przeszkoda aby koło mogło się obracać
Pierwsza przeszkoda aby koło mogło się obracać

Jak widać koło ma blokadę mechaniczną, zapobiegającą zbyt dalekiemu wychyleniu – trzeba szczypcami bocznymi obciąć wystającą część plastiku – prosta sprawa.

Po demontażu kół potrzebujemy znaleźć pozycję 90. W tym celu podłączamy do Arduino serwomechanizm – czerwona żyłka do zasilania (5V), żółta do wyjścia cyfrowego 9 a brązowa do masy. W Arduino wpisujemy następujący szkic:

#include <Servo.h>

Servo s;

void setup(){
  s.attach(9);
}

void loop() {
  s.write(90);
};


Ma on za zadanie ustawić serwomechanizm w pozycję środkową. Jednak nie ma sprzężenia zwrotnego z potencjometru, więc silnik będzie pracował ze stałą prędkością. Jak teraz pokręcicie potencjometrem, zobaczycie jak w okolicy zadanej przez szkic pozycji prędkość silnika zmniejszy się aż wreszcie stanie. Szukamy właśnie tej pozycji – gdy silnik nie pracuje (i nie rusza się przez dłuższą chwilę, bo przy wartościach brzegowych może lekko zacząć się ruszać) unieruchamiamy ośkę potencjometru. Można użyć kleju, ja jednak preferuję cynę (kleje typu Kropelka mogą być naprawdę niebezpieczne, zwłaszcza jak masz w domu małe dzieci) i zalutować oś, tak aby nie mogła się kręcić:

Oś potencjometru od strony gdzie trzeba ją unieruchomić
Oś potencjometru od strony gdzie trzeba ją unieruchomić
Przylutowana oś
Przylutowana oś

Widać wyraźnie co się dzieje, gdy za mocno szarpniemy potencjometrem ;)

Teraz ostatnie sprawa – ostatnie koło zębate jest osadzone bardzo ciasno na osi potencjometru – tak aby nie było poślizgu i potencjometr się obracał razem z orczykiem serwa. Musimy teraz pozwolić się kołu obracać swobodnie.

W tym celu najpierw cienkim śrubokrętem oraz nożem hobby poszerzyłem lekko otwór w kole zębatym, następnie nad kuchenką gazową rozgrzałem mały gwóźdź o średnicy zbliżonej do osi potencjometru i poszerzyłem dalej otwór. Jeżeli zrezygnujesz z mechanicznego poszerzania na rzecz tylko rozgrzanego gwoździa – to trzeba uważać, aby nie skrzywić osi otworu. Jeżeli to zrobisz wówczas koło nie będzie się obracało równomiernie i całość może się po prostu zaciąć.

Poszerzamy otwór - mało wyraźnie widać, ale...
Poszerzamy otwór - mało wyraźnie widać, ale...

Aby zapewnić swobodny obrót koła trzeba też lekko zeszlifować oś (chyba że gwóźdź był wyraźnie szerszy od osi potencjometru). Użyłem pilnika do metalu, choć oś jest wykonana z miękkiego metalu, więc podejrzewam, że nie będzie problemu jeśli użyje się papieru ściernego:

Zmniejszenie obwodu osi
Zmniejszenie obwodu osi

Teraz pozostaje złożyć całość:

Już prawie złożone
Już prawie złożone

Co dalej?

Trzeba sprawdzić czy dobrze ustawiliśmy potencjometr i czy działa zgodnie z naszym oczekiwaniem. Wgrywamy prosty szkic, ja użyłem Nettigo Keypada, ale można zrobić prostą klawiaturę z dwóch przycisków. Po naciśnięciu przycisku zmienia się wychylenie serwa, czyli prędkość i kierunek obrotów.

Szkic na starcie ustawia serwo w pozycji 90. Jeżeli nasz potencjometr był dobrze ustawiony podczas lutowania, wówczas serwo nie powinno pracować. Przyciski góra/dół zmieniają ustawienie serwa o jedną pozycję. W pętli sprawdzamy czy jest wciśnięty klawisz, jeżeli tak to zmieniamy wartość na jaką serwo zostanie ustawione.

Jak to wygląda w rzeczywistości? A na przykład tak:

Jak widać serwo ma tylko kilka stopni prędkości, ale do prostych zastosowań się nadaje.

Jeżeli nie przeprowadzimy pozycjonowania potencjometru a tylko ustawimy go „na oko„, wówczas może się okazać, że pozycja stop wypada np nie przy 90 a przy 70. Na dodatek może się okazać, że pozycji zero nie ma :) i że jeżeli miało być to 90 to okaże się że silnik minimalnie kręci się w jedną stronę przy 89 a w drugą przy 90 (zero wypada gdzieś pomiędzy 89 a 90).

Jeżeli możesz sprawdzić serwo i sobie to ustawić pozycję zero we własnym szkicu – nie ma problemu, można zrezygnować z pozycjonowania potencjometru.

Jeszcze sam szkic użyty w tym przykładzie do odnalezienia pozycji stop:

#include <NettigoKeypad.h>
#include <Servo.h>

Servo s;
NG_Keypad k;
int deg = 90;

void setup(){
  s.attach(9);
  Serial.begin(9600);
  k.register_handler(NG_Keypad::UP, up);
  k.register_handler(NG_Keypad::DOWN, down);
};

void up(){
      deg += 1;
    if (deg >180) { deg = 180; }
    Serial.println(deg);
};
void down(){
      deg -= 1;
    if (deg <0) { deg =0; }
    Serial.println(deg);
};
void loop() {
  k.check_handlers(analogRead(0));
  s.write(deg);
  
  delay(100);
}

Używana tutaj jest biblioteka NettigoKeypad. Jej stan na chwilę obecną (IV 2011) to używalna beta.

Funkcja register_handlers przypisuje funkcję która zostanie wywołana do klawiszy. W check_handlers sprawdzany jest stan wejścia analogowego i jeżeli jest wciśnięty klawisz to wywoływana jest odpowiednia funkcja up() lub down(). Biblioteka musi się dorobić jeszcze debouncingu i kontrolowania powtarzania klawiszy. Poza tym można już jej z powodzeniem używać.

Co można z takim serwem zrobić? To już opiszę innym razem.