Linux E X P R E S

Facebook

Raspberry Pi – vstup/výstup GPIO

Raspberry Pi

Přemýšleli jste o tom, jaké by bylo naprogramovat si vlastní elektroniku, ale přišlo vám to velmi obtížné? Tento článek má dokázat, že programování vstupů a výstupů u Raspberry Pi je velice snadné. V příkladech jsou pro přehlednost použity pouze dva piny. 


Obsah skriptu

Každý skript pro ovládání pinu musí obsahovat knihovnu, která umožňuje ovládání GPIO pinů. Já jsem zvolil knihovnu RPi.GPIO. V případě použití této knihovny je nutné zvolit způsob číslování pinů. Dále je do skriptu potřeba přidat ostatní knihovny, které bude skript využívat. Jako poslední se ve skriptu definují vstupní a výstupní piny. U vstupních pinů je zde zapotřebí zvolit, zda bude použit pull-up rezistor, nebo pull-down rezistor.

V případě použití externího pull-up/down rezistoru se vstup nastavuje následovně: GPIO.setup(11, GPIO.IN)

Takto vypadá prostředí Python IDLE, které je součástí Raspbianu Takto vypadá prostředí Python IDLE, které je součástí Raspbianu

Velmi důležité je zvolené číslování GPIO pinů. Lze je číslovat dle rozložení pinů na desce Rapsberry [GPIO.setmode(GPIO.BOARD)], nebo podle výstupu pinů z procesoru [GPIO.setmode(GPIO.BCM)]. V případě, že chcete použít skript, který jste dostali již hotový (například je vyhledatelný na internetu), nezapomeňte si ověřit, které číslování pinů bylo autorem skriptu zvoleno, aby nedošlo k poškození vašeho Raspberry Pi.

Blikání LED diody

Začneme klasickým příkladem, kterým je rozblikání LED diody. Pro blikání musíme do skriptu přidat knihovnu time, která skript „pozastavuje“. Spusťte libovolný editor umožňující editaci jazyka Python. Vytvořte nový soubor a pojmenujte jej například led.py. Do vytvořeného souboru vepište následující:

import RPi.GPIO as GPIO #přidání knihovny pro ovládání pinů
import time #přidání knihovny time, která umožní pozastavit skript
GPIO.setmode(GPIO.BOARD) #zvolené číslování
GPIO.setup(7, GPIO.OUT) #nastavení pinu 7 jako výstupní pin
while True: #tvytvoření nekonečné smyčky
  GPIO.output(7, True) #logická 1 na pinu 7
  time.sleep(0.5) #pozastavení skriptu na 0.5 sekundy
  GPIO.output(7, False) #logická 0 na pinu 7
  time.sleep(0.5)

LED dioda je zapojena společně s odporem mezi pin 7 a některý z pinů GND. Důležité je, aby nebyl překročen maximální proud Raspberry (tedy 16 mA na pin a celkový proud při použití více pinů by neměl překročit 50 mA), ale ani maximální proud diody (mohlo by dojít k poškození Raspberry, popřípadě LED). Místo LED lze samozřejmě použít například relé, jen je potřeba dávat pozor, aby bylo relé stavěno na ovládání pomocí 3,3 V (případně použít měnič napětí) a nepřesahovalo povolený proud.

Čtení stavu pinu

Pokud chcete zjistit, zda je na pinu logická 1 nebo logická 0, je potřeba použít pro určení hodnoty tzv. pull-up, případně pull-down rezistor. Raspberry Pi 2 a 3 má tyto rezistory integrované a stačí je pouze softwarově připojit. Nejprve zvolte pin, který chcete použít jako vstupní, poté pull-up rezistor nebo pull-down rezistor. Při zvolení pinu 11 a použití pull-up rezistoru bude zápis do skriptu vypadat takto: GPIO.setup(11, GPIO.IN, GPIO.PUD_UP).

Připojení tlačítka s integrovaným pull-down rezistorem (vlevo) a pull-up rezistorem (vpravo) Připojení tlačítka s integrovaným pull-up rezistorem (vlevo) a pull-down rezistorem (vpravo)

Zapojení tlačítka

Připojení tlačítka k Raspberry je malinko složitější než připojení výstupu. Tlačítko se zapojuje podle zvolení rezistoru (pull-up nebo pull-down rezistor). Pokud zvolíte pull-down rezistor, zapojte tlačítko mezi pin se stabilizovaným napětím 3,3 V (například pin 1) a pin, který jste zvolili pro čtení hodnoty (v našem případě 11).

V případě použití pull-up rezistoru se tlačítko zapojí mezi pin GND (například pin 6) a pin zvolený pro čtení hodnoty (11). Rozdíl je zároveň také v logické hodnotě při načtení. Pokud použijete pull-down rezistor, po stisknutí tlačítka se načte logická 1. V opačném případě (při použití pull-up rezistoru) se při stisknutí tlačítka načte logická 0. Namísto rezistorů integrovaných v Raspberry Pi je možné použít následující zapojení s použitím vlastních rezistorů.

Schéma zapojení pull-down rezistoru (vlevo) a pull-up rezistoru (vpravo) Schéma zapojení pull-up rezistoru (vlevo) a pull-down rezistoru (vpravo)

Příklad načtení hodnoty

Uveďme opět příklad. Při stisknutí tlačítka se do konzole vypíše Zapnuto a rozsvítí se LED dioda. Pro načtení hodnoty jsem zvolil pull-down rezistor a pin číslo 11. Pro výstup jsem zvolil pin 7.

import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
GPIO.setup(11, GPIO.IN, GPIO.PUD_DOWN)
while True: vstup = GPIO.input(11) # pojmenování vstupního pinu, pro vytvoření podmínky
  if vstup == True: #podmínka (pokud je tlačítko sepnuto)
    print("Zapnuto") #vypsat do konzole Zapnuto
    GPIO.output(7, True)
  else: #pokud nebyla podmínka splněna, bude program pokračovat zde
    print("Vypnuto") #vypsat do konzole Vypnuto
    GPIO.output(7, False) #nastavení logické 0 na pinu 7

Přepínač

Při použití předchozího skriptu může být pro někoho problém, že výstup nezůstane po rozepnutí tlačítka aktivní. Pro případ, že chcete tlačítko použít pro přepínání hodnot na výstupu, použijte tento kód:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.IN, GPIO.PUD_DOWN)
GPIO.setup(7, GPIO.OUT)
while True:
  GPIO.wait_for_edge(11, GPIO.RISING) # čekání na stisknutí tlačítka a změna stavu
  print("Zapnuto")
  GPIO.output(7, True)
  time.sleep(0.5)
  GPIO.wait_for_edge(11, GPIO.FALLING) # čekání na opětovné stisknutí tlačítka a změna stavu
  print("Vypnuto")
  GPIO.output(7, False)

Po prvním stisknutí se LED dioda připojená na pin 7 rozsvítí, při druhém stisknutí tlačítka se LED dioda vypne. Řádka time.sleep(0.5) je potřeba k určení, zda bylo tlačítko stisknuto jednou či opakovaně.

Jak tyto skripty spustit?

Není-li skript úplně hotový a hodláte na něm stále pracovat, lze jej v Python IDLE spustit pomocí klávesy F5. Pro vyzkoušení skriptu je zapotřebí jej uložit.

Jestliže jste již svůj skript odladili a uložili, spusťte terminál a přejděte do složky, ve které se nachází váš skript (například je-li skript v adresáři /home/pi/python, použijte pro přesun do adresáře příkaz cd /home/pi/python). Spuštění skriptu provedete příkazem

python3 nazev_skriptu.py

Je-li je potřeba, aby se skript spustil po spuštění Raspbianu, stačí upravit soubor rc.local umístěný v /etc. To lze udělat například pomocí textového editoru nano, který je součástí Raspbianu. Pro editaci použijte příkaz:

sudo nano /etc/rc.local

Do souboru poté připište řádek před „exit 0“:

python3 /home/pi/python/nazev_skriptu.py &

Pro spuštění skriptu je potřeba zadat přesné umístění aplikace. V našem případě se aplikace nachází v /home/pi/python.

nano_rclocal.png Editace souboru rc.local pomocí nano

Úprava souboru rc.local Úprava souboru rc.local

Diskuze (0) Nahoru