Bogusław Kempny

Serwomechanizm SG90

Autor adres
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 ....











W najprostszym przypadku interesujący nas przebieg prostokątny wygenerować możemy programowo, jak to jest robione w programie serv.c (skrypt do kompilacji cs).

Generuje on sygnał prostokątny programowo odmierzając czas trwania jedynki logicznej i czas trwania przerwy:

for(time=500;time<2500;time=time+STEP)
   {
    printf("%d ms\n", time);fflush(0);
    for(i=0;i<10;i++)
     {
      digitalWrite(1,HIGH);
      Delay(time);
      digitalWrite(1,LOW);
      Delay(PERIOD-time);
     }
    Delay(PAUSE);
   } 
Tworzy sygnał prostokątny o czasie trwania jedynki od 0,5 ms do 2,5 ms zwiększając ten czas co 0,3 s o 0,02 ms.

Jeśli uruchomisz ten program, wał serwomechanizmu będzie się obracał malutkimi skokami, trochę podobnie, jak to robi wskazówka sekundowa w zegarku.

Zaletą takiego programowego rozwiązania jest po pierwsze jego prostota, po drugie jednym Raspberry można sterować nawet 28 serwomechanizmami (tyle jest, jeśli dobrze policzyłem, pinów na łączówce GPIO które możemy ustawić na output).

Niestety sposób ten ma też wadę, która może być istotna jeśli chcemy precyzyjnie i niezawodnie sterować naszym serwomechanizmem.

Czas trwania jedynki logicznej i okres sygnału wyliczane są z rozdzielczością nanosekundową, jednak nasz program działa pod systemem wielozadaniowym.

Nie ma pewności, że w czasie kiedy upłynął precyzyjnie odliczany okres czasu nasz proces akurat jest aktywny. Z dużym prawdopodobieństwem będzie akurat czekał grzecznie w kolejce, aż jądro wylosuje go spośród kilkuset innych, również czekających.

W efekcie zamiast spodziewanego impulsu np. 1,25 ms pojawi się 1,31. Serwomechanizm oczywiście zacznie posłusznie przestawiać wałek do położenia odpowiadającego impulsowi 1,31 ms.

Jeśli uruchomisz program serv.c, z pewnością zaobserwujesz, że wał serwomechanizmu czasami zachowuje się jakby napadła go czkawka.