Přejít k navigační liště

Zdroják » Různé » Raspberry Pi a GPIO – co funguje

Raspberry Pi a GPIO – co funguje

Články Různé

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.

Nálepky:

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.

Komentáře

Subscribe
Upozornit na
guest
11 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Já

Ahoj, řekl bych, že se systémem takový problém není, pokud do toho člověk nesahá tak to umí běžet stabilně opravdu hodně dlouho a s ethernetem/wifi funguje podle mojich zkušeností lépe než mikrokontrolery se sítí, kde se explicitně musí počítat s tím, že jednou za čas moduly vytuhnou a musí nastoupit watchdog. Navíc pokud je karta v RO tak ani ta neodejde tak rychle.

Máme jednu starší malinu na vrcholu vysílače, sbírá přes GPIO data z anemometru ( http://85.13.85.12/ ) a zásadní problém nastane když zakolísá elektřina nebo prostě spustím reboot. V mnoha případech naběhne, jenže v mnoha případech nikoliv. Důvod? SD driver – malina nemá bios a od nuly jede z karty – všude píší, že musíte používat ověřené asi posvěcené sd karty (mám dokonce origoš, zvláštní, že foťáky třeba problém nemají), zlé jazyky zase jak je ovladač sd karty nahouby – navíc není otevřený. Každopádně hodně naštve lézt v zimě na vysílač jen kvůli restartu maliny a taky bych už asi upustil od nějakých náročnějších použití…

Já

.

Ondřej Caletka

A zkoušel jste vestavěný watchdog? Proti kolísání napájení sice moc nepomáhá (přinejmenším nepomáhá proti modelu 2 a xenonovému blesku), ale proti zásekům během rebootu aspoň mně pomohl.

Já

Jojo, watchdogy jsou první co řeším. Ten vestavěný (jestli to správně chápu) funguje do prvního restartu, aby potom nepřerušoval delší start, takže pokud vyhnije po startu někde před čtením z karty jsem v prd… Potom by bylo asi lepší vzít beagle bone, kterej má nativních 4gb na desce, ale kdoví jestli s tím člověk nenarazí zase jinde…

Já

Yún by určitě byl také řešení, jenže když člověk vidí cenovku, potom je touha vytřískat co nejvíc z levnějších zařízení silnější. Farnell: yun – 1 845, beagle bone – 1 312, raspberry pi B – 859, raspberry pi A – 556. Všechny zařízení technicky mají co je potřeba, tedy GPIO. Ono když na to přijde tak by šel k malině dodělat externí watchdog, ale jestli ten z maliny udělá rock solid zařízení co jen tak něco nerozhodí a nebude se na něj muset roky sáhnout to fakt nevím, ale zkusit to zkusím :)

Já

Konkrétně tenhle je letitý kombinovaný profi senzor komplet hliník (MOC někde lehce pod 10kkč :( ) – uvnitř se protáčí dvě různá kola a prosvěcují se diodou a pak se sbírá intenzita na fototranzistoru – dává 36 pulzu na jednu otáčku naběraček z toho část je jich proudově silnějších resp. slabších. Podle počtu silnějších vs. slabších se spočítá směr. Popravdě moc nevím jak to uvnitř doopravdy funguje, nepřišel jsem na to jak ho rozebrat.

Potenciometr je z principu špatnej už z principu protože funguje mechanicky. Optický encoder nikdo z profi výrobců afaik nepoužívá, asi díky nárokům na místo?

Druhý anemometr co používám je založen na magnetickém switchi (reed switch), docela chytrej princip kdy se zase využívá rotace anemometru pro měření směru viz. http://www.peetbros.com/shop/category.aspx?catid=35 obrázek dole. Bohužel tohle se neobejde bez plastu takže po cca 4 letech je sonda rozlámaná i když je vyhřívaná.

Třetí mechanicky nejjednodušší, přesný a dneska velmi oblíbený řešení je do směrovky narvat magnet a měřit enkodérem pozici magnetu (koukni na AS5040), jen čip není až tak levný. Je to bezdotykový a nejspíš to vydrží věky. Vytisknul jsem si prototyp s tímhle čidlem, ale stejnak to pro vážnější použití bude chtít vysoustružit z hliníku. Na doma každopádně ideál.

Pak jsou ještě takový experimentální metody, kdy se měří termistorama ve směrech ochlazování a oteplování okolí nějaké hřející součástky. Poslední možnost je postavit si ultrazvukový anemometr. Ale to je silný kafe, sám ho stavím už dva roky…

Ondřej Caletka

Ve skutečnosti došlo k prohození sběrnic I2C-0 a I2C-1 už mezi první a druhou revizí původního modelu B. Ta druhá sběrnice je dostupná na konektoru pro připojení kamery a je používaná pro komunikaci s kamerou, pokud je připojena. Pro identifikací HATů na modelech + a 2 je třetí samostatná sběrnice, která pokud vím v linuxu dostupná není (ovládá ji jen firmware GPUčka).

pitrx

RPi má na GPIO pinech 5V

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.