Programujeme Raspberry Pi Pico v jazyku MicroPython

základy práce s doskou Raspberry Pi Pico v jazyku MicroPython

Motivácia

Goals

  • naučiť sa základy programovania v jazyku MicroPython na doske Raspberry Pi Pico

Content

Predtým, ako začneme

Ešte predtým, ako začneme, si nainštalujte editor Thonny a do mikrokontroléra Raspberry Pi Pico nahrajte firmvér s jazykom MicroPython.

Ako nahrať firmvér na RPi Pico

Niekoľko tipov pri práci:

  • Pico na doske neobsahuje tlačidlo RESET. Reštartovať ho je však jednoduché odpojením a opätovným pripojením USB kábla. Vyhnite sa však jeho odpájaniu a pripájaniu na strane mikrokontroléra! Vyhnete sa tak možnosti odtrhnutia tohto konektoru a tým pádom aj jeho celkovému poškodeniu. Miesto toho odpájajte USB kábel na strane počítača.

  • V prípade, že chcete mikrokontrolér reštartovať softvérovo, môžete tak urobiť príkazom:

    from machine import reset; reset()
  • Softvérový reset zariadenia sa dá vykonať ešte jednoduchšie - stlačením klávesovej skratky CTRL+D

Blikáme LED-kou

Podobne, ako je v prípade programovania prvým programom Hello world!, tak v prípade hardvéru sa jedná o zapojenie s názvom Blink. Doska RPi Pico na sebe obsahuje LED diódu, ktorú sa pokúsime rozblikať. A tým predstaviť aj základy práce s touto doskou.

Task

Vypíšte do terminálu text Hello world!

V mikrokontroléri sa nachádza nahratý interpretér jazyka Python, s ktorým komunikujeme pomocou sériovej linky. Takže akýkoľvek príkaz, ktorý napíšeme, sa vykoná priamo týmto interpretérom.

>>> print('Hello world!')

Ak chceme vedieť, čo máme k dispozícii, tak môžeme napísať príkaz help('modules). Výsledkom bude zoznam zabudovaných modulov jazyka MicroPython:

>>> help('modules')
__main__          gc                uasyncio/lock     upip
_boot             lwip              uasyncio/stream   upip_utarfile
_boot_fat         math              ubinascii         urandom
_onewire          micropython       ucollections      ure
_rp2              neopixel          ucryptolib        urequests
_thread           network           uctypes           uselect
_uasyncio         onewire           uerrno            usocket
_webrepl          rp2               uhashlib          ussl
builtins          uarray            uheapq            ustruct
cmath             uasyncio/__init__ uio               usys
dht               uasyncio/core     ujson             utime
ds18x20           uasyncio/event    umachine          uwebsocket
framebuf          uasyncio/funcs    uos               uzlib
Plus any modules on the filesystem

Task

Rozsvieťte LED diódu pomocou interaktívneho interpretra jazyka Python.

from machine import Pin

led = Pin('LED', Pin.OUT)
led.on()
led.off()
led.value(1)
led.value(0)
led.value()
led.toggle()

Task

V module blink.py vytvorte jednoduchú verziu programu blink, ktorý rozsvieti zabudovanú LED diódu na 2s potom ju na 1s zhasne.

from time import sleep
from machine import Pin

led = Pin('LED', Pin.OUT)

while True:
    led.on()
    sleep(2)
    led.off()
    sleep(1)

Pripojenie do siete WiFi

Task

Do súboru boot.py umiestnite funkciu do_connect() podľa vzoru nachádzajúceho sa v dokumentácii jazyka MicroPython.

Funkciu môžeme upraviť nasledovne:

def do_connect(ssid, password):
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(ssid, password)
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())

Task

Otestujte vytvorenú funkciu pripojením sa do WiFi siete.

To môžeme zabezpečiť priamo z príkazového riadku napísaním:

>>> do_connect('wifi_siet', 'heslo')
Network config: ('10.42.0.67', '255.255.255.0', '10.42.0.1', '10.42.0.1')

Ovládanie LED diódy pomocou protokolu MQTT

Task

Nainštalujte si modul pre prácu s protokolom MQTT.

Firmvér na doske Raspberry Pi Pico neobsahuje potrebný modul pre prácu s protokolom MQTT. Preto si ho potrebujete buď stiahnuť a prekopírovať ručne do priečinku lib/ v mikrokontroléri alebo ho nainštalovať pomocou balíčkovacieho systému pip nasledovne:

>>> import upip
>>> upip.install('umqtt.simple')
>>> upip.install('umqtt.robust')

Task

Vytvorte MQTT klienta.

from umqtt.robust import MQTTClient

mqtt = MQTTClient('unique-client-id', 'broker.hivemq.com')
mqtt.connect()

Task

Overte

To môžeme jednoducho tak, že pošleme správu.

>>> mqtt.publish('kpi/iot/messages', 'hello world')

Task

Vytvorte callback funkciu, ktorá sa zavolá vždy, keď mikrokontrolér dostane správu.

def on_message(topic, message):
    topic = topic.decode('utf-8')
    message = message.decode('utf-8')

    print(f'{topic} {message}')

Task

Overte vytvorenú funkciu

mqtt.subscribe('iot/messages/lights/mirek')

print('Waiting for message...')
mqtt.wait_msg()

poznámky: * metoda .subscribe() sa musi volať až po pripojení k MQTT brokeru * metóda .wait_msg() je blokujúca

Task

Upravte callback funkciu on_message() tak, že v prípade, že dostanete správu on, rozsvieťte LED diódu a v prípade, že dostanete metódu off, LED diódu zhasnite.

from machine import Pin

led = Pin('LED', Pin.OUT)

def on_message(topic, message):
    topic = topic.decode('utf-8')
    message = message.decode('utf-8')

    if message == 'on':
        print('turning led on')
        led.on()
    elif message == 'off':
        print('turning led off')
        led.off()

Publikovanie teploty pomocou protokolu MQTT

Mikrokontrolér RP2040, ktorý je srdcom dosky RPi Pico obsahuje zabudovaný senzor pracovnej teploty. Ten je pripojený na analógovo-digitálny prevodník na GPIO pin 4. Vytvoríme si modul s pomocnými funkciami a v ňom funkciu na odčítanie jeho hodnoty.

Task

V module helpers.py vytvorte funkciu get_temperature(), ktorá vráti hodnotu internej pracovnej teploty mikrokontroléra RP2040 v stupňoch celzia.

from machine import ADC


def get_temperature():
    # read the temperature
    sensor = ADC(4)
    conversion_factor = 3.3 / (65535)

    reading = sensor.read_u16() * conversion_factor
    temperature = 27 - (reading - 0.706)/0.001721

    return temperature

Task

Overte správnosť vytvorenej funkcie.

Na overenie stačí funkciu zavolať priamo z príkazového riadku interpretéra jazyka Python na mikrokontroléri:

>>> from helpers import get_temperature
>>> get_temperature()
28.91698

Task

Zabezpečte, aby sa údaje o teplote publikovali pomocou protokolu MQTT v pravidelných 1 minútových intervaloch.