Aktualizacja firmware MicroPythona na pyboard
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.

Możemy teraz wgrać nowy obraz poleceniem:
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ę.

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.
Comment article