Uživatelské nástroje

Nástroje pro tento web


GPIO (vstupně-výstupní porty pro všeobecné účely)

GPIO jsou porty, které může ovládat uživatelský program. Jejich umístění a očíslování na desce je možné nalézt pro Turris Omnia zde a pro Turris 1.x zde.

Maximální elektrické vlastnosti GPIO portů jsou:

Turris 1.x Turris Omnia
Napětí 3,3 V 3,3 V
Proud ±1 mA ±5 mA

Při překročení elektrických parametrů není zaručena správná funkčnost portů a může dojít k trvalému poškození routeru!

Shell

GPIO porty mohou být exportovány do souborového systému a řídit je tak může i jednoduchý shell skript.

Prvním krokem je exportování GPIO portu, se kterým budeme pracovat. To lze učinit zapsáním čísla portu do souboru /sys/class/gpio/export. Například pro GPIO18 takto:

echo 18 > /sys/class/gpio/export

Po exportu vybraného portu se automaticky vytvoří složka /sys/class/gpio/gpio**, kde namísto hvězdiček je číslo GPIO portu. Pro port 18 je to tak /sys/class/gpio/gpio18. V této složce naleznete především soubory direction a value. První ze souborů určuje, jestli je port nastavený jako vstupní, nebo jako výstupní. Odpovídající hodnoty v souboru jsou in a out. Funkce druhého ze souborů, value, závisí na nastavení v souboru direction. Pokud je port nastavený jako vstupní, soubor value obsahuje aktuální stav portu (0 pro nízkou a 1 pro vysokou napěťovou úroveň) a není do něho možné zapisovat. Pokud je port nastavený jako výstup, do souboru value je možné zapsat nulovou hodnotu pro nízkou napěťovou úroveň a nenulovou pro vysokou, také je možné nastavenou hodnotu přečíst zpět stejně, jako když je port nastavený jako vstup.

Nastavení portu jako vstupu a přečtení stavu je tak možné tímto způsobem:

echo in > direction
cat value

Nastavení portu jako výstupu a nastavení vysoké napěťové úrovně je tak možné tímto způsobem:

echo out > direction
echo 1 > value

Python2

V případě jednodušších operací je dostatečný shell, ale pro složitější programy je lepší použít plnohodnotný programovací jazyk jako například Python. Na Turris byla přeportována GPIO Python knihovna, originálně vytvořená pro Raspberry Pi. Pro její použití nejprve musíte nainstalovat balíček python-turris-gpio.

Tento návod pokrývá pouze základní použití knihovny. Nepopisuje všechny vlastnosti, které knihovna poskytuje. Další a podrobnější informace můžete nalézt v dokumentaci k originální verzi knihovny.

Inicializace

Prvním krokem k použití této knihovny je její naimportování a inicializace. Knihovnu inicializujeme v módu BCM, kde čísla portů odpovídají tomu, jak jsou označeny na čipu, tedy stejně jako na obrázku pinoutu.

import turris_gpio as gpio
gpio.setmode(gpio.BCM)

Dále nastavíme porty, které budeme řídit.

gpio.setup(18, gpio.OUT)
gpio.setup(33, gpio.IN)

Prvním argumentem funkce setup je číslo portu a druhým argumentem je buďto OUT pro výstupní port, nebo IN pro vstupní port.

Výstup

Porty, které jsou nastavené jako výstupní, je následně možné ovládat pomocí funkce output. Tato funkce přijímá jako první argument číslo portu a jako druhý argument napěťovou úroveň. To může být True pro vysokou nebo False pro nízkou úroveň (alternativně také 0 nebo gpio.LOW, respektive 1 nebo gpio.HIGH).

Příkladem může být tento kód, který nastaví port GPIO18 do vysoké napěťové úrovně po dobu deseti sekund:

gpio.output(18, True)
time.sleep(10)
gpio.output(18, False)

Vstup

Napěťovou úroveň portu nastaveného jako vstup je možné číst pomocí funkce input. Ta očekává jediný argument, a to číslo portu. Její návratová hodnota je True pro vysokou napěťovou hodnotu a False pro nízkou.

Pro příklad kód, který přečte a vypíše stav portu GPIO33:

if gpio.input(33):
	print("Port 33 je HIGH")
else:
	print("Port 33 je LOW")

Programově nastavitelné pull up/down rezistory nejsou podporovány a doporučuje se namísto nich použití hardwarových.

Vyčkávání na změnu signálu

V případě, že váš program pouze čeká na změnu vstupu, je výhodnější místo opakovaného kontrolování vstupu (tzv. busy loop) přenechat tuto kontrolu operačnímu systému a program uspat. Toto je možné s touto knihovnou voláním jediné funkce, a to wait_for_edge. Tato funkce očekává minimálně dva argumenty. Prvním je číslo portu a druhým je buďto RISING, nebo FALLING, nebo BOTH. Funkce pozastaví běh programu, dokud nedojde ke změně signálu z nízké napěťové úrovně do vysoké v případě RISING, nebo ke změně z vysoké napěťové úrovně na nízkou v případě FALLING, případně k oběma změnám v případě BOTH. Návratová hodnota funkce je číslo portu, na kterém se změna projevila.

Pro vyčkání na náběznou hranu na GPIO18 je tak možné použít následující kód:

port = gpio.wait_for_edge(18, gpio.RISING)
if port == 18:
	print("Náběžná hrana na portu 18")
else:
	print("Tohle by se nikdy nemělo stát, nemáme timeout a čekáme pouze na port 18")

Je také možné uvést volitelně jako argument funkce wait_for_edge maximální dobu čekání na změnu (tzv. timeout). Jedná se o čas v milisekundách. Pokud zvolený čas uplyne a změna na portu nebyla zaznamenána, funkce vrátí None namísto čísla portu. Příklad pro port GPIO18 by byl:

port = gpio.wait_for_edge(18, gpio.FALLING)
if port:
	print("Sestupná hrana na portu " + str(port))
else:
	print("Došel čas")

Úklid

Před ukončením programu, nebo pokud již nadále nebude s portem pracováno, je nutné stav portu resetovat, a nechat tak knihovnu po sobě uklidit. To je možné zajistit funkcí cleanup. Ta volitelně přijímá jako argument číslo portu, se kterým ukončujete práci. Pokud není funkci argument předán, tak dojde k uklizení všech portů, které program nastavil.

Pro uklizení všech portů (GPIO18 a GPIO33) nastavených na začátku toho návodu tak použijeme jedno z následujících volání:

gpio.cleanup([18, 33])
gpio.cleanup()