Raspberry Pi a GPIO – co funguje

I přes řadu omezení je Raspberry Pi stále populárnější v projektech, kde dříve dominovalo Arduino. V článku si projdeme výhody a nevýhody Raspberry Pi a jak GPIO používat. Pro ukázky budu používat Python.

Jak jsem zavrhl Raspberry Pi GPIO

Poprvé jsem se s Raspberry Pi GPIO potkal při projektu měření drncání a hlučnosti D1. Pro měření jsem použil externí hlukoměr propojený s mobilem (sběr vibrací a polohy) pomocí Bluetooth. Honza Cibulka, pro kterého jsem měření prováděl, si postavil podobné zařízení s využitím Raspberry Pi. Bohužel aplikace nenastartovala po zapnutí, jak měla, tak se nám to celé trochu zkomplikovalo a bylo nutné zasíťovat auto, abychom se mohli k Raspberry Pi připojit a zjistit, co je špatně. Naštěstí v autě běžně vozím router. Teď už vím, že to šlo i jinak. Bohužel mě tento nezdar od použití Raspberry Pi pro podobné projekty odradil.

10000000000004FE000002D00B02966D

10000000000004FE000002D05EB529F5

Časem mi to nedalo a zúčastnil jsem se workshopu, který organizovalo sdružení Europen, a to mě přivedlo k Raspberry Pi GPIO zpět. Pochopil jsem, že pro některé projekty a programátory je to velmi pěkné řešení.

Operační systém

Operační systém je největší výhodou, ale i slabinou tohoto zařízení. Díky komplexnosti operačního systému je vše daleko méně stabilní než jednoduché mikrokontroléry. Prostě tam běží moc věcí. Pro Raspberry Pi existuje celá řada distribucí Linuxu od komplexních s GUI po minimalistické, ale pořád je to komplexní operační systém. Při jedné aktualizaci mi například přestalo fungovat jedno zařízení na sběrnice I2C. V dokumentaci nebylo o změně chování I2C ani slovo. Experimentováním jsem zjistil, že došlo ke změně rychlosti komunikace I2C a jeden modul si s tím neuměl poradit. Poslední verze Raspbian přišla s podporou Device Tree, takže přestala po aktualizaci fungovat komunikace na některých sběrnicích, jako I2C a SPI, a je nutné změnit ručně konfiguraci. Dostáváte se tak do situace, kdy je potřeba testovat novou aktualizaci mimo produkční prostředí a zjistit, zda vám něco nerozbije.

Na druhou stranu můžete, díky operačnímu sytému a velkému výpočetnímu výkonu, dělat velmi složité projekty bez nutnosti detailní znalosti fyzického hardware. Použitý operační systém také velmi zjednodušuje komunikaci s internetem. Máte také na výběr z mnoha programovacích jazyků a knihoven. Velkou výhodou je také možnost vzdálené správy zařízení, pokud je zařízení připojeno do sítě.

Třeba pro projekt „Moje garáž, můj hrad“ mi Raspberry Pi A+, doplněné o wifi modul, přijde jako dobrý nápad.

Napájení a spotřeba

Logika Raspberry Pi GPIO je 3,3 V. 5 V do pinů GPIO pustíte jen jednou… Musíte proto vybírat vhodné periferie nebo použít převodník úrovní nebo něco podobného. Na to si musíte dát zejména pozor, pokud chcete použít periférie určené pro Arduino, které používají 5 V logiku.

Raspberry Pi je naprosto nevhodné pro napájení z baterie, resp. by na baterii nevydrželo nijak dlouho. Odběr se pohybuje ve stovkách mA. U původních verzích je odběr vyšší než u verzí +. Pro USB periférie je doporučeno použít napájený USB Hub.

Pro periférie připojené na GPIO je doporučeno také vlastní napájení. Napájecí pin 3,3 V je schopen dodat maximálně 50 mA. Z toho také plyne nutnost použít pro některé periférie s vyšším odběrem, například tranzistorový spínač.

A nezapomeňte, 3,3 V.

Komunikace s GPIO

General-purpose input/output (GPIO) jsou obecné vstupně/výstupní piny. Můžete na nich nastavit 0 V/3,3 V, tedy logickou 0/1. Pokud chcete použít GPIO, tak nemusíte na Raspberry Pi nic nastavovat a bude to fungovat.

Blikání LED – Hello world! pro hardware

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

led = 11
GPIO.setup(led, GPIO.OUT)

try:
 while True:
  GPIO.output(led, 0)
  time.sleep(1)
  GPIO.output(led, 1)
  time.sleep(1)  
except KeyboardInterrupt:
 GPIO.cleanup()

Metodou setmode nastavujete způsob odkazování na jednotlivé piny. Na piny se lze odkazovat různým jménem. Na pin 11 (BOARD) se můžete odkazovat také jako na 17 (BCM) nebo 0 (WiringPi). V článku budu používat číslování BOARD. Metoda cleanup uvolňuje zdroje.

Speciální funkce pinů

Některé piny, kromě obecné vstupně/výstupní, mají speciální funkci. Například pin 8 má speciální funkci Tx pro UART. Tyto speciální funkce je třeba zapnout, nejjednodušeji to lze udělat pomocí nástroje raspi-config. Poslední verze nejčastěji používané distribuce pro Raspberry Pi, Raspbian, používá kernel verze 3.18 a Device Tree. Na projektech používám často sběrnici I2C, kterou se mi s Device Tree nepodařilo rozchodit, takže jsem podporu Device Tree vypnul a použil „starý“ způsob zavedení příslušných modulů pro kernel.

10000201000002D2000001CEECD9C924

UART

UART je dostupné na pinech 8 (Tx) a 10 (Rx). Opět připomínám, že je třeba použít 3,3 V logiku. Na UART je standardně vyvedena textová konzole. K Raspberry Pi se tak můžete připojit jen přes sériový port, není potřeba klávesnice a monitor ani síť a SSH. Vědět to při měření D1, tak nám to ušetřilo dost práce. Textovou konzoly můžete od UART odpojit pomocí konfigurátoru raspi-config.

Zařízení využívající UART můžete také připojit pomocí USB-RS232 redukce. Takto měl Honza při měření D1 připojenou GPS.

I2C

Základní součástí systému jsou nástroje i2ctools. Pomocí těchto nástrojů můžete komunikovat se zařízeními na I2C sběrnici z příkazové řádky. Chcete-li například zjistit, jaké adresy mají připojená zařízení, stačí použít i2cdetect.

sudo i2cdetect -y 1

10000201000002D2000001CE937D35E4

Parametr 1 je číslo I2C sběrnice. Na starších deskách, se používala sběrnice 0, na nových (+) se používá sběrnice 1 a sběrnice 0 je vyhrazena pro identifikaci rozšiřujících modulů HAT.

Na výstupu je vidět, že adresy 1b a 3b jsou vyhrazeny pro systém a na adrese 70 je nějaké zařízení. Pokud chci u tohoto zařízení zapsat hodnotu 0x00 na adresu 0x80, tak použiji i2cset.

sudo i2cset -y 1 0x70 0x80 0x00

Podpora I2C pro Python je v knihovně smbus, kterou snadno nainstalujete pomocí apt-get.

sudo apt-get install python-smbus

Ukázka komunikace s I2C zařízením.

import smbus
import time

bus = smbus.SMBus(0)
address = 0x34

try:
 while True:
  try:
   light = bus.read_byte_data(address, 1)
   print light
  except:
   next

  time.sleep(1)

except KeyboardInterrupt:
 print 'Bye'

Skript čte hodnotu z adresy 0x01 na zařízení, které má adresu 0x34 a je připojeno na I2C sběrnici 0.

SPI

Pro podporu SPI v Python je třeba doinstalovat knihovnu spidev. Pro její instalaci bude třeba balíček python-dev.

sudo apt-get install python-dev
git clone git://github.com/doceme/py-spidev
cd py-spidev/
sudo python setup.py install

Se sběrnicí SPI nemám zkušenosti, takže experimentování nechám na vás.

A co dál?

Tím jsme se dostali na konec tohoto článku. Určitě vám chybí zmínka o podpoře PWM a ADC. U těchto dvou funkcí je situace o dost složitější, a proto se jí budu věnovat v samostatném článku.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 10

Přehled komentářů

Štěpán Bechynský Re:
Re:
Ondřej Caletka Re:
Re:
Štěpán Bechynský Re:
Re:
Ondřej Caletka I2C sběrnice
Štěpán Bechynský Re: I2C sběrnice
Zdroj: https://www.zdrojak.cz/?p=14451