Sterowanie serwomechanizmem za pomocą Raspberry Pi Pico W i PWM

Serwo jest jednym z najbardziej podstawowych sposobów nauki korzystania z modulacji szerokości impulsu (PWM) z Raspberry Pi. W tym artykule pokażę, jak to zrobić za pomocą Raspberry Pi Pico W.

Cele samouczka PWM

Serwomechanizm z Pico W i PWM
  • Dowiedz się, jak wykorzystać PWM do sterowania kątem ustawienia serwa
  • Konfiguracja serwera z Pico W
  • Serwer dostarcza stronę internetową z suwakiem do sterowania serwo

Potrzebne części

  • Raspberry Pi Pico W z nagłówkami
  • Zwornik
  • Serwomechanizm (my używamy mikro serwomechanizmu Tower Pro SG90)

Co to jest modulacja szerokości impulsów?

Dla dzieci zabawne jest wielokrotne włączanie i wyłączanie światła.

Dla nich to po prostu zabawne widzieć, jak światła migoczą i gasną, gdy przełączają przełącznik światła. Rodzice mogą nie uznać tego za zabawne, ale jest to moment nauki dla nas wszystkich.

Jeśli ty lub twoje dzieci to zrobiliście, to doświadczyliście prymitywnej formy modulacji szerokości impulsów.

Z Raspberry Pi, można łatwo zrobić to w sposób zautomatyzowany. W istocie, powiedziałbyś Raspberry Pi, ile razy chcesz, aby rzeczy były "ON" w określonym czasie.

Dzięki temu można ściemniać diody LED:

picockpit gpio pwm pilot zdalnego sterowania
Przełączanie jasności diod LED za pomocą funkcji PWM w PiCockpit

Jak również pozwala to na kontrolę kąta nachylenia ramienia serwa.

Ważna koncepcja PWM: cykl pracy

Cykl pracy to w zasadzie czas, w którym obwód pozostaje w stanie "wysokim", co oznacza, że jest włączony.

Tak więc, załóżmy, że twój obwód jest włączony przez połowę czasu. Możemy zatem powiedzieć, że cykl pracy jest na poziomie 50%.

Jeśli masz go cały czas włączonego, jego cykl pracy będzie wynosił 100%, i odwrotnie, wyłączony cały czas oznacza 0

Ilustracja cyklu pracy od Sparkfun (CC BY-SA 4.0)

Wracając do przykładu dziecka włączającego i wyłączającego światło w regularnym tempie, powodem, dla którego światła nie świecą się w pełni lub nie przygasają w pełni, jest fakt, że dostarczamy napięcie wyjściowe tylko przez określony czas.

W przypadku diody LED oznacza to, że dioda świeci się przez pewien czas, następnie pobierane jest zasilanie, potem znowu dostarczane jest zasilanie i powtarzane.

Tak więc dioda nigdy nie rozjaśnia się na tyle, by osiągnąć pełną jasność, nie ma też czasu na całkowite zaciemnienie.

SG90 serwosterowanie z PWM

Musimy być tu ostrożni, gdyż nie wszystkie serwomechanizmy działają tak samo. Ten poradnik dotyczy mikro serwa Tower Pro SG90.

SG90 ma 180 stopni obrotu, ale niektóre serwomechanizmy mają 120 stopni. Serwomechanizmy hobbystyczne do sterowania radiem są najprawdopodobniej serwomechanizmami 120-stopniowymi, więc upewnij się, że sprawdzisz arkusz danych serwomechanizmu, którym chciałbyś manipulować, ponieważ możliwe jest uszkodzenie serwomechanizmu, jeśli podasz mu sygnał spoza zakresu.

To jest arkusz danych dla SG90, z Luxor Parts:

Karta katalogowa mówi o dwóch ważnych rzeczach: który kolor odpowiada plusowi, masie i sygnałowi oraz o częstotliwości impulsów/cyklu pracy.

  • Brązowy = negatywny
  • Czerwony = pozytywny
  • Pomarańczowy = sygnał

A dla częstotliwości impulsów/cyklu pracy

  • Będziesz musiał mieć cykl pracy 20ms lub 50Hz.
  • Sygnał o długości 1ms = zero stopni
  • Sygnał o długości 2ms = 180 stopni obrotu
Przy sygnale 1ms, serwo obraca się o zero stopni.

Oznacza to, że co ms serwo będzie szukało aktualizacji. Jeśli nadal będziesz wysyłał mu sygnał 2ms, to pozostanie na pełnym obrocie (180 stopni). Jeśli zmienisz go na 1,5ms, obróci się o 90 stopni, a przy 1ms obróci się o zero stopni.

Przy sygnale o długości 2ms serwo obraca się o 180 stopni.

Podłączenie serwomechanizmu do Pico W

Aby skorzystać z naszego kodu, należy podłączyć przewód sygnałowy do GPIO 0. Przewód sygnałowy to pomarańczowy przewód na SG90.

Następnie podłącz czerwony przewód do VBUS (co daje 5V). Jak widać z datasheet, napięcie robocze dla SG50 to 4,8V do 6V, więc pin 3,3V na Pico W nie zadziała.

Kodowanie serwosterowania Pico W

Możesz znajdź kod tutaj na naszym GitHubie.

Prześledźmy ten kod.

Na stronie main.py, czyli konwencja nazewnicza dla pliku, który chcemy uruchomić przy starcie, tworzymy klasę dla serwitora i instancjonujemy ją:


class Servo:
    def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
        self.pwm = machine.PWM(machine.Pin(pin))
        self.pwm.freq(freq)
        self.MIN_DUTY = MIN_DUTY
        self.MAX_DUTY = MAX_DUTY
        
    def rotateDeg(self, deg):
        if deg < 0:
            deg = 0
        elif deg > 180:
            deg = 180
        duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
        self.pwm.duty_ns(duty_ns)

servo = Servo()

Klasa Servo wykorzystuje klasę machine.PWM dostępną w MicroPythonie. Zobacz dokumentację tutaj.

W tym przykładzie używamy Pico W jako punktu dostępu. Oto kod, który to umożliwi:

ssid = 'Servo-Control'
password = 'PicoW-Servo'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

Jak widać w pierwszych dwóch liniach, SSID, którego szukamy to. Servo-Control a hasło to. PicoW-Servo.

Po zalogowaniu się do sieci WiFi, możesz przejść do adresu IP Pico W, który domyślnie wynosi 192.168.4.1. Alternatywnie, możesz również sprawdzić log na Thonny, aby zobaczyć, jaki jest adres IP twojego Pico.

Jak strona internetowa komunikuje się z serwomechanizmem?

Regulacja suwaka serwo

Po zalogowaniu się na adres IP Pico W wysyłany jest plik index.html, który można znaleźć na repo Github.

W pliku index.html znajdują się te ważne linie:

 <form id="form">
            <input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
            <output></output>
        </form>

Jak widać, istnieje obiekt , który jest suwakiem.

Istnieje również , które wyświetla stopień obrotu.

Część JavaScript aktualizuje , a także aktualizuje adres URL, dzięki czemu Pico W może przechwytywać dane i obracać serwomechanizm.

Elementy i mają rodzica .

Oto skrypt na front-end,