Aktualizacja firmware MicroPythona na pyboard

Aktualizujemy pyboard by efektywniej sterować silnikami DC, czy obsługiwać analogowe joysticki

Firmware na pyboard zawiera całe środowisko z MicroPythonem. Żeby wgrać najnowszą wersję ze wszystkimi poprawkami i nowymi funkcjonalnościami potrzebować będziemy Linuksa oraz paru minut na przeprowadzenie całego procesu.

Po aktualizacji będziemy mogli bez problemu obsługiwać analogowe joysticki, czy efektywniej sterować silnikami DC poprzez PWM.

Proces aktualizacji firmware

Ze strony micropython.org pobieramy obraz dfu dla pyboard. Następnie na Linuksie instalujemy dfu-util, które powinno być w repozytoriach.

Odłączamy wszystko od pyboard i łączymy pin DFU z pinem 3.3V znajdującym się obok. Tak przygotowaną płytkę podłączamy do komputera.

Pin DFU połączony z pinem 3.3V wprowadzający płytkę w tryb aktualizacji firmware

Możemy teraz wgrać nowy obraz poleceniem:

sudo dfu-util --alt 0 -D POBRANY_PLIK.dfu

Gdy zobaczymy done parsing DfuSe file możemy odłączyć pyboard od komputera, rozłączyć piny i gotowe. PyBoard powinna śmigać z najnowszym firmware.

W porównaniu do pierwszych wersji dostępnych na płytkach z kickstartera poprawiono m.ni. obsługę wielu wejść analogowych, czy dodano klasę Timer z obsługą PWM (np. do sterowania silnikami DC poprzez ich własne mikrokontrolery).

Joystick analogowy

Poprawki w micropythonie pozwalają dobrać się do analogowych joysticków złożonych z dwóch potencjometrów (oś X i Y) oraz przycisku. Wartości analogowe potencjometrów odczytamy poprzez piny ADC, a przycisk poprzez cyfrowe GPIO. Dla ułatwienia stworzyłem prostą klasę:

import pyb


class Joystick:
    def __init__(self, x_axis_pin, y_axis_pin, button_pin):
        self.x_axis = pyb.ADC(x_axis_pin)
        self.y_axis = pyb.ADC(y_axis_pin)
        self.button = pyb.Pin(button_pin, pyb.Pin.IN, pull=pyb.Pin.PULL_UP)

    def get_state(self):
        return {
            'x': self.x_axis.read(),
            'y': self.y_axis.read(),
            'button': self.button.value()
        }

Podłączyłem joystick do pinów X1,2,3 a następnie w konsoli (REPL) pyboard użyłem klasy w taki oto sposób:

from joystick import *
j = Joystick('X3', 'X2', 'X1')
j.get_state()
#{'x': 2913, 'button': 1, 'y': 2867}
while True:
    pyb.delay(150)
    print(j.get_state())

Jak widzimy osie X i Y używają klasy ADC i odczytują wartość za pomocą metody read. Przycisk obsługiwany jest przez standardową klasę Pin ale dodatkowo ma skonfigurowane rezystory pull-up (bez tego nie zawsze odczytywany był poprawny stan w przypadku testowanego przeze mnie joysticka). Wciśnięcie przycisku w takim układzie powoduje odczytanie stanu niskiego na pinie. W zależności od modelu, czy nawet sztuki zakresy wartości zwracane przez potencjometry mogą się nieco różnić i niekoniecznie dawać środkowe wartości, gdy joystick jest w stanie spoczynkowym. Trzeba zmapować zwracane wartości na własną skalę.

Joystick analogowy podłączony do PyBoard

Sterowanie silnikami DC za pomocą klasy Timer

Zamiast używać klasy Servo, tak jak zaprezentowałem to w poprzednim artykule można użyć klasy Timer, która pozwala na pełną kontrolę nad PWM. Zakładając że używamy pinu X1 start wyglądałby tak:

timer = pyb.Timer(2, freq=1000)
ch1 = timer.channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.X1, pulse_width=20000)

Tworzymy licznik (podając numer ID oraz częstotliwość), następnie tworzymy kanał PWM, w którym konfigurujemy typ na PWM, wskazujemy pin oraz określamy początkową długość impulsu. Możemy ją później zmieniać za pomocą metody pulse_width. Im większa wartość tym szybciej obracać się powinien sterowany silnik. Wartości od-do dla najlepszego sterowania należy ustalić eksperymentalnie.

blog comments powered by Disqus

Kategorie

Strony