Registrovat se

Přihlásit se

Zapomenuté heslo

Zadejte svoji e-mailovou adresu, zašleme Vám odkaz pro obnovu hesla.

Zeptat se

Začínáme s Rainbow HAT

Překlad článku Getting Started with Rainbow HAT by Sandy Macdonald

Tento tutorial Vám ukáže, jak se instaluje Rainbow HAT Python knihovna a provede Vás jejími funkcemi.

Instalace software

Vždy doporučujeme začít s nejnovější verzí Raspbianu, jelikož na tu vždy vyvíjíme software a testujeme s ní naše desky. Není to nezbytně nutné, ale často pomáhá začít s úplně čistou instalací systému.

Jako u většiny našich desek, i zde jsme vytvořili rychlý a jednoduchý instalátor pro kompletní nastavení Rainbow HAT. Doporučujeme držet se této metody instalace Rainbow HAT softwaru.

Otevřete nový terminál a napište následující, odpovídejte ‚y‘ nebo ‚n‘:

curl https://get.pimoroni.com/rainbowhat | bash

Po skončení instalace je dobrý nápad Pi restartovat, aby se promítly všechny změny.

Použití software

Otevřete terminál a napište sudo python pro otevření Python terminálu.

Pro importování Rainbow HAT knihovny napište do Python terminálu:

import rainbowhat as rh

Všimněte si, že jsme použili as rh. To nás ušetří od psaní rainbowhat při každém použití knihovny.

Rainbow

Rainbow (bez dovětku HAT) je pruh sedmi APA102 RGB LED pixelů na Rainbow HAT, které mohou být řízeny individuálně z python knihovny Rainbow HAT. Jak je v Pythonu konvencí, sedm pixelů je číslováno od 0 do 6 a seřazeno z prava do leva (pixel 0 je úplně napravo, pixel 6 je úplně nalevo).

Existují dvě metody řízení pixelů – set_pixel a set_all – ta první umožňuje ovládání barvy jednotlivých pixelů a ta druhá je pro nastavení jedné barvy všech pixelů najednou.

Začneme rozsvícením prvního pixelu na červeno. Funkce set_pixel potřebuje čtyři informace – číslo pixelu a hodnotu červeného, zeleného a modrého odstínu (od 0 do 255). Po nastavení všech hodnot musíte zavolat funkci show, která aktualizuje pixely na nově nastavené barvy.

Napište následující:

rh.rainbow.set_pixel(0, 255, 0, 0)
rh.rainbow.show()

Pixel úplně napravo by měl nyní svítit červeně. Všimněte si, že jsme napsali rh.rainbow.set_pixel(0, 255, 0, 0). Všechny funkce příbuzné s Rainbow jsou uložené společně v modulu jménem rainbow, proto jsme museli napsat rh.rainbow před jménem funkce, kterou jsme chtěli použít.

Pojďme teď vytvořit něco trochu pokročilejšího a zkusme rozpohybovat náš červený pixel ze strany na stranu. Použijeme smyčky while a for.

Napište následující, pro ukončení stiskněte control-c:

import time
 
    while True:
        for pixel in range(7):
            rh.rainbow.clear()
            rh.rainbow.set_pixel(pixel, 255, 0, 0)
            rh.rainbow.show()
            time.sleep(0.1)

Červený pixel by měl nyní běhat z prava do leva.

Představili jsme zde několik nových funkcí – time.sleep(0.1) a rh.rainbow.clear(). Funkce time.sleep(0.1) vyvolá krátkou 0,1s pauzu mezi posunem přeskočením na další pixel, čímž určuje rychlost animace (snižte číslo pro zrychlení, zvyšte číslo pro zpomalení). Funkce rh.rainbow.clear() zhasne každý rozsvícený pixel a voláme ji na začátku každé smyčky for, aby byl rozsvícen vždy jen jeden pixel.

Teď použijeme funkci set_all pro obarvení všech pixelů najednou a necháme je přecházet mezi všemi barvami duhy. Protože tato funkce ovládá všechny pixely najednou, nemusíme zadávat číslo pixelu, stačí hodnota RGB.

Pro přecházení mezi barvami duhy využijeme HSV zápis barvy, který převedeme do RGB. HSV zápis je šikovný, protože H představuje odstín a pozici na barevném kole. To znamená, že jednoduchým otáčením HSV kola budeme přecházet všemi barvami.

Napište následující, pro ukončení stiskněte control-c:

import colorsys
import time
 
rh.rainbow.clear()
 
while True:
    for i in range(101):
        h = i / 100.0
        r, g, b = [int(c * 255) for c in colorsys.hsv_to_rgb(h, 1.0, 1.0)]
        rh.rainbow.set_all(r, g, b)
        rh.rainbow.show()
        time.sleep(0.02)

Tohle je docela složité, takže si to projděme pěkně krok po kroku. Nejprve zde máme import knihovny colorsys kvůli její funkci hsv_to_rgb, která konvertuje HSV barvu na RGB.

Znovu používáme smyčku while True, která běží stále dokola a vnitřní smyčku for, kde probíhá změna barev. 0 a 1 je na HSV kole jedna a tatáž souřadnice souřadnice, takže stačí jeden průchod od 0 k 1. Používáme číslený rozsah od 0 do 100, který dělíme 100 (h = i / 100.0), abychom získali zlomky jedné.

Řádka r, g, b = [int(c 255) for c in colorsys.hsv_to_rgb(h, 1.0, 1.0)] převádí naše HSV barvy na RGB. Protože funkce hsv_to_rgb akceptuje RGB hodnoty, každé převedené desetinné číslo násobíme 255 a převádíme zpět na integer (int(c 255)). List comprehension ([function(x) for x in y]) provádí stejnou operaci nad několika objekty zároveň a vrací list. Navíc používáme unpacking (r, g, b =), abychom přiřadili výsledky z listu našim třem proměnným r, g a b.

Nakonec používáme funkci set_all pro nastavení RGB barvy na všech pixelech a funkci show pro zobrazení změny s malým zpožděním 0,02 s, takže celá duha proběhne jednou za 2 vteřiny (protože máme 100 barev duhy).

14-segmentový displej

Díky tomu, že jsme na Rainbow HAT použili 14-segmentové displeje namísto běžných 7-segmentových, můžeme zobrazovat jak čísla, tak i velká písmena. Jsou zde i 4 desetinné tečky, které přijdou vhod při zobrazování desetinných čísel.

Všechny funkce displeje jsou společně uloženy v modulu display, který je dostupný pod rh.display. Dvě funkce, na které se zde podíváme jsou print_str a print_float, které vypisují textové řetězce a čísla s desetinnou čárkou, jak jste už mohli uhádnout!

Budeme vypísovat řetězec AHOY. Podobně jako rainbow pixely, i displej má metodu show, která zobrazí nově zadané hodnoty.

Napište následující:

rh.display.print_str('AHOY')
rh.display.show()

Mimo zobrazení textu a čísel je podporována většina běžně používaných speciálních znaků jako @ apod.

Nyní použijeme funkci print_float pro zobrazení desetinného čísla uvnitř smyčky while, která bude přičítat 0.01, což vytvoří dojem stopek.

Napište následující, pro ukončení stiskněte control-c:

i = 0.0
 
while i < 999.9:
    rh.display.clear()
    rh.display.print_float(i)
    rh.display.show()
    i += 0.01

Začneme s i = 0.0, vyčistíme displej (rh.display.clear()), funkcí print_float a metodou show zobrazíme aktuální hodnotu i, a nakonec zvýšíme i o 0.01 (i += 0.01).

Ovládat můžete i desetinné tečky, což se hodí obzvlášť chcete-li vytvořit hodiny. Funkce set_decimal přijímá dva argumenty – pozici desetinné tečky, kterou chcete řídit, a True nebo False podle toho, zda ji chcete zapnout nebo vypnout. Desetinné tečky jsou číslované od 0 do 3 z leva do prava.

Napište následující pro spuštění první desetinné tečky:

rh.display.clear()
rh.display.set_decimal(0, True)
rh.display.show()

Dotyková tlačítka a LED

Rainbow HAT má tři kapacitní dotyková tlačítka označená A, B a C, každé s barevnou LED nad sebou. K událostem stisk a/nebo uvolnění tlačítka lze přiřadit funkce pomocí Python decoratoru. Ten se přidává přímo před definici funkce, které může i předat nějaká data, a znamená, že tato funkce bude volána automaticky při spuštění události definované v decoratoru.

LED spojené s tlačítky mohou být ovládány nezávisle. Zde spojíme LED nad tlačítkem A s dotykovým tlačítkem A, aby se po jeho stisku rozsvítila.

Napište následující:

@rh.touch.A.press()
def touch_a(channel):
    print('Button A pressed')
    rh.lights.rgb(1, 0, 0)
 
@rh.touch.A.release()
def release_a(channel):
    print('Button A released')
    rh.lights.rgb(0, 0, 0)

Můžete vidět, že na tlačítka A, B a C odkazuje decorator řádkou
@rh.touch.A, @rh.touch.B a @rh.touch.C , a že mají metody press() a release(). Naše dvě funkce touch_a a release_a josu spuštěny po stisknutí nebo uvolnění tlačítka a my rozsvítíme LED řádkou rh.lights.rgb(1, 0, 0).

Pro ovládání LED nad kapacitními tlačítky zadáte buď 1 (pro zapnutí) nebo 0 (pro vypnutí) jako argumenty funkce (rh.lights.rgb). Trojice argumentů odpovídá každé ze tří LED, takže jich můžete spustit nebo vypnout několik současně.

Napište následující pro zapnutí všech tří LED:

rh.lights.rgb(1, 1, 1)

A napište následující pro jejich vypnutí:

rh.lights.rgb(0, 0, 0)

Teplota a tlak

Senzor BMP280 na Rainbow HAT měří jak teplotu, tak i tlak. Přečíst aktuální teplotu a tlak je opravdu jednoduché. Obě hodnoty jsou v modulu h.weather, takže teplota se přečte příkazem rh.weather.temperature() a tlak příkazem rh.weather.pressure()

Napište následující, pro ukončení stiskněte control-c:

while True:
    t = rh.weather.temperature()
    p = rh.weather.pressure()
    print(t, p)
    time.sleep(0.5)

Toto by mělo vypsat aktuální teplotu ve stupních Celsia a tlak v Paskalech (vydělte 100 pro převod na známější hPa) každou půlvteřinu.

Kód můžete jednoduše upravit použitím metody print_float pro zobrazování teploty na 14-segmentových displejích:

while True:
    t = rh.weather.temperature()
    rh.display.clear()
    rh.display.print_float(t)
    rh.display.show()
    time.sleep(0.5)

Piezo bzučák

Piezo bzučák Vám umožní přehrávat tóny o specifických frekvencích, nebo midi čísla. Začneme přehráním jedné frekvence, středního C, které má frekvenci 261 Hz. Metody bzučáku jsou pod modulem butter, rh.buzzer, a metoda note přijímá frekvenci (v Hz) a délku (ve vteřiných) tónu.

Napište následující:

rh.buzzer.note(261, 1)

To by mělo hrát 1 vteřinu střední C. Dále uděláme to samé, ale použijeme funkci midi_note, která umožňuje použití midi čísel tónů. Střední C má v midi číslo 60, takže si ho teď znovu přehrajeme.

Napište následující:

rh.buzzer.midi_note(60, 1)

Když umíme přehrát tón, můžeme si vytvořit list tónů a přehrát je s krátkými pauzami ve smyčce.

Napište následující:

song = [68, 68, 68, 69, 70, 70, 69, 70, 71, 72]
 
for note in song:
    rh.buzzer.midi_note(note, 0.5)
    time.sleep(1)

Stojí za to poznamenat, že chcete-li půlvteřinový tón a půlvteřinovou pauzu, přidáte délku svého tónu k délce své pauzy, např. 0.5 + 0.5 = 1 z příkladu výše.

Tóny které jsme použili mají všechny stejnou délku, což by chtělo ideálně změnit, aby melodie zněla správně.

Uhádnete, co je to za melodii?

Odpovědět