|
Raspberry Pi
7) Pokusy s GPIO konektorem - Nová verze stránky
(10.6.2013)
Nejzajímavější věcí na RasPi je pro mne konektor
GPIO. Tento konektor obsahuje několik portů (drátů), pomocí kterých
je možné komunikovat s okolím.
Tyto porty mohou být vstupní, nebo výstupní
- to znamená, že buď mohou snímat nějaký stav (třeba kontakt, nebo
fotobuňku), nebo mohou něco ovládat (rozsvěcovat LED diody, nebo přes
výkonové stupně třeba spínat relátka a přes ně další výkonové
spotřebiče).
Na GPIO konektor je možné
také připojit různá zařízení, která komunikují přes I2C,
SPI, nebo přes UART (RS232). Takže je možné připojit různé sériové
AD převodníky, displeje, čidla, která posílají zjištěnou
hodnotu přímo po sběrnici (teploměry), nebo je možné pomocí RasPi ovládat další zařízení, která se řídí pomocí těchto komunikačních
linek.
Aby bylo možné s GPIO konektorem pracovat, je třeba
nainstalovat ovladače. Pro začátek bude stačit komunikace I2C a doplňky pro
Python.
Instalace:
1) Nejdříve zakomentujte obě řádky v souboru /etc/modprobe.d/raspi-blacklist.conf
- to můžete udělat třeba přes terminál příkazem :
sudo nano /etc/modprobe.d/raspi-blacklist.conf |
V okně, které se objeví, pak přidejte dvojkřížky
podle obrázku
Nakonec upravený soubor uložte (klávesy Ctrl+X, Y, Enter)
2) Nainstalujte podporu SMBUS pro Python. V terminálu
zadejte postupně tyto příkazy:
sudo apt-get update
sudo apt-get install python-smbus |
Nechte modul i2c, aby se spouštěl automaticky
při startu RasPi.
V terminálu zadejte:
a do souboru, který se otevře vložte řádku:
i2c-dev
... a takto upravený soubor uložte : Ctrl+X , Y ,
Enter
3) Nainstalujte nejnovější ovladač pro GPIO.
K tomu si nejdřív musíte zjistit, jaká je poslední
verze ovladače na stránkách:
https://code.google.com/p/raspberry-gpio-python/downloads/list
Podle aktuální verze si upravte následující dva příkazy,
které postupně zadáte v terminálu:
wget https://raspberry-gpio-python.googlecode.com/files/python-rpi.gpio_0.5.3a-1_armhf.deb
sudo dpkg -i python-rpi.gpio_0.5.3a-1_armhf.deb |
První příkaz stáhne aktuální verzi instalačního
balíčku s ovladačem z internetu do adresáře /home/pi/
Druhý příkaz ten stažený balíček nainstaluje.
Pak můžete balíček z adresáře /home/pi/ smazat.
4) Restartujte RasPi
To je všechno. Teď můžete začít s GPIO konektorem
pracovat.
Pravidla bezpečného zacházení s GPIO
konektorem.
Při práci s GPIO si musíte dát pozor na několik věcí:
------
1) Maximální napětí, které se připojuje na GPIO pin, může být nejvýše 3,3V. Pokud
byste na vstup přivedli 5V, Raspi zničíte!
------
2) Nezapojený vstup má vysokou impedanci. Pokud je jen tak ve
vzduchu, není možné se spolehnout na to, jaký stav bude vyhodnocen.
Proto se na piny, které budou sloužit jako vstupy připojují tzv. Pull-Up
odpory. Tyto odpory se připojují mezi vstup a +3,3V a zajišťují, že
nezapojený vstup je vyhodnocován, jako logická "1". Pull-Up odpory
je možné připojit "zvenku". Novější GPIO ovladače však
umožňují softwérově připojit vnitřní odpory, které se nacházejí přímo
uvnitř procesoru, takže už nemusíte žádné další Pull-Upy přidávat.
------
3) Každý GPIO pin je možné pomocí příkazů nastavit jako
vstupní, nebo výstupní. Pokud byste například omylem nastavili pin na výstup
a poslali na něj logickou "1", ale zároveň byste na tento pin připojili
třeba tlačítko, které bude spínat pin proti zemi, došlo by ke zkratu a ke
zničení pinu.
Podle zveřejněných informací je každý pin schopný vydržet proud 16mA. Je
proto vhodné v sérii s tlačítkem přidávat odpor třeba 1k, který by v případě
zkratu omezil proud tekoucí přes pin na 3,3mA. Hodnota vnitřního Pull-Up
odporu by měla být 10k. Když se tedy v tomto zapojení GPIO vstup sepne přes
odpor 1k do země, zůstane na něm napětí 0,3V
U"0" = 3.3V * [1k / (1k + 10k)] = 0.3V
Takové napětí bude ještě bezpečně vyhodnoceno jako logická
"0".
(Obvykle platí, že u CMOS obvodů je logická "0"
vyhodnocena až do 0.3 * UCC. V případě RasPi je to tedy asi do
1V.)
------
4) Pokud připojujete k RasPi dlouhé dráty, měli byste nějakým
způsobem ochránit vstupy před rušením, nebo před napěťovými špičkami.
Je možné použít buď speciální obvody (ADuM54xx), nebo stačí použít nějaký
optočlen.
Když budete pro výstupy z RasPi jako oddělovač používat
optočlen, nezapomeňte se podívat do jeho katalogového listu, jaký je minimální
potřebný proud pro rozsvícení vnitřní LED diody.
Hodně optočlenů potřebuje pro rozsvícení LED proud 20mA. Tak velký proud
ale není schopno RasPi dodat.
V případě, že používáte krátké dráty, není ochrana nutná, ale dávejte si pozor
na statickou elektřinu.
------
5) Když budete používat GPIO piny jako výstupní, zase
pamatujte na to, že maximální proud, který je RasPi schopno dodat, je 8mA.
Sice je možné tento proud pomocí softwéru nastavit až na 16 mA, ale pořád
je to málo. Tímto proudem není možné spínat žádné relé. Maximálně tím
můžete rozsvítit nějakou LEDku. Když chcete spínat větší zátěže, musíte
tento proud zesílit (například pomocí tranzistorů).
------
6) Při použití I2C komunikace se může stát, že budete potřebovat
připojit ke komunikaci obvod, který komunikuje na 5V úrovních.
Tady platí to, co bylo psáno v bodě 1). Když připojená periférie pošle
do Rspíčka 5V, Raspi se zničí. V tom případě je třeba tyto napěťové
úrovně rozdělit. Opět existují speciální obvody (např. ADuM2250
nebo PCA9306 ), nebo můžete použít zapojení se
dvěma FET tranzistory, které uvádím v článku
č.17
------
7) Dejte si pozor na číslování vývodů. V označování
signálů na GPIO konektoru je trochu zmatek.
Zásadní problém je v tom, že hardwérové piny konektoru (1 až 26) neodpovídají
označení GPIO signálů v procesoru.
Takže například hardwérový pin č.26 se někdy může označovat jako
GPIO26, ale v jiných zdrojích může ten samý pin být označený jako GPIO7.
Proto se v každém programu musí určit, o jaký styl číslování se jedná.
V Pythonu se to provádí příkazem GPIO.setmode()
Když se bude používat číslování hardwérových pinů
konektoru (1 až 26), nastaví se příkaz na:
GPIO.setmode(GPIO.BOARD)
Pokud se bude používat označení signálů jako v procesoru,
nastaví se:
GPIO.setmode(GPIO.BCM)
A aby nebylo zmatků málo, tak při výrobě novější
varianty Raspberry Pi (s pamětí 512MB) došlo ještě k prohození několika
signálů.
Takže například ve staré variantě RasPi (s 256MB pamětí) byl na hardwérovém
pinu č.13 signál GPIO21. V nové verzi je ale na stejném pinu signál
GPIO27.
Podrobný popis všech pinů na GPIO konektoru s novým i starým označením
signálů je tady:
http://elinux.org/Rpi_Low-level_peripherals#General_Purpose_Input.2FOutput_.28GPIO.29
GPIO jako vstup:
Nejjednodušší zapojení vypadá takto:
V Pythonu je pak možné číst stav tohoto tlačítka několika
způsoby:
1) Ve smyčce neustále kontrolovat, jaký je stav portu.
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# nastaveni pinu GPIO8 (= hardwerovy pin24) na vstup a pripojeni vnitrniho Pull-Up odporu
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# nekonecna smycka pro cteni a zobrazovani aktualniho stavu portu
while True:
print GPIO.input(8)
time.sleep(0.5)
|
2) V případě, že se v programu pouze čeká na stisk
tlačítka, je lepší použít GPIO
polling:
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_UP)
print "cekam na stisk tlacitka"
GPIO.wait_for_edge(8, GPIO.FALLING)
print "tlacitko bylo stisknuto"
|
GPIO jako výstup:
Zapojení LEDky na GPIO výstup:
Velikost odporu se vypočte takto:
LED dioda má na svém přechodu úbytek napětí asi 1,8V (záleží na
barvě a typu diody).
Napětí na GPIO pinu je při logické "1" asi 3,3V. Když
se obě napětí od sebe odečtou dostaneme 1,5V.
Toto napětí se v obvodu objeví na odporu (viz. Kirchhoffovy
zákony o napětí v uzavřené smyčce).
Odpor musí mít takovou velikost, aby přes něj při napětí 1,5V tekl
proud 2mA (kvůli LEDce, která je na proud 2mA dimenzovaná).
Podle Ohmova zákona
se vypočte odpor R = U / I. Po dosazení R =1,5V / 0.002A = 750 Ohmů
=> nejbližší vyšší v řadě je 820R. (Klidně tam ale můžete dát
i 1k - jen se tím o trochu sníží jas LEDky)
Řízení GPIO pinu v Pythonu je možné dvěma zůsoby:
1) Přímé nastavení na logickou "1", nebo
"0":
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# nastaveni pinu GPIO8 (= hardwerovy pin24) na vystup
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(8, GPIO.OUT)
# rozsviceni LED (nastaveni pinu na logickou "1")
GPIO.output(8, True)
time.sleep(5)
# zhasnuti LED (nastaveni pinu na logickou "0")
GPIO.output(8, False)
|
2) Řízení výstupu pomocí PWM:
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
# priklad na rozkmitani pinu GPIO8 frekvenci 2Hz se stridou 30%
pin = 8 # GPIO8 (= hardwerovy pin24)
frekvence = 2 # frekvence signalu = 2 Hz
strida = 30 # signal bude 30% casu v logicke "1" a 70% casu v logicke "0"
GPIO.setup(pin, GPIO.OUT) # GPIO8 prepne na vystup
signal1 = GPIO.PWM(pin , frekvence) # nastaveni pinu do PWM vystupniho rezimu
signal1.start(strida) # spusteni signalu
# jiny priklad na vedlejsim GPIO pinu (frekvence 5Hz, strida 80%)
pin = 7 # GPIO8 (= hardwerovy pin26)
frekvence = 5 # frekvence signalu = 5 Hz
strida = 80 # signal bude 80% casu v logicke "1" a 20% casu v logicke "0"
GPIO.setup(pin, GPIO.OUT) # GPIO8 prepne na vystup
signal2 = GPIO.PWM(pin , frekvence) # nastaveni pinu do PWM vystupniho rezimu
signal2.start(strida) # spusteni signalu
time.sleep(5)
signal1.stop() # po 5 sekundach se prvni signal zastavi
time.sleep(2)
signal2.stop() # po dalsich dvou sekundach se zastavi i druhy signal
|
Připojení komunikace I2C
Nejčastější způsob připojení dalších zařízení,
který na těchto stránkách popisuji, je připojení přes I2C
komunikaci.
Využívají se k tomu piny SDA a SCL na GPIO konektoru.
Na tyto dva signály je možné připojit více zařízení zároveň (všechno
se spojuje paralelně). Je však nutné, aby každé z těch připojených
zařízení mělo svou vlastní a jedinečnou I2C adresu. Některé
obvody mají tu adresu napevno danou z výroby a není možné ji změnit.
Jiné obvody mají jeden nebo více takzvaných "adresních vstupů",
pomocí kterých je možné adresu částečně v určitém rozsahu
posunovat. Většinou nějakou kombinací jedniček a nul na těchto
vstupech. Existují ale i obvody, u kterých se adresa nastavuje velikostí
napětí na adresovacím vstupu.
K připojenému zařízení je třeba ještě zavést napájecí
napětí (piny GND a +3,3V).
Pokud je zařízení v blízkosti RasPi a má napájení
3,3V, je možné ho připojit přímo:
Když je ale to přídavné zařízení napájené z 5V,
je nutné použít převodník napěťových úrovní.
Zapojení konkrétních převodníků je popsané v jejich katalogových
listech. Jako příklad uvedu třeba převodník PCA9306,
který jsem použil v článku 32) pro oddělení
signálů mezi Raspíčkem a expanderem:
Softwérové řízení komunikace s konkrétními obvody
popisuji v dalších článcích, tak se tady o tom nebudu rozepisovat.
Níže je původní verze stránky.
Od doby, kdy
byla vystavena, se však ovládání GPIO zjednodušilo.
Nebudu tu starou stránku
mazat - je v ní popsáno, jak se instaluje ovladač pro BASH.
Ale už je to
zastaralé.
POZOR
Všechny návody a příklady
na této stránce
platí pro Raspberry Pi verze 1
(starší verze bez dvou montážních otvorů v desce)
Novější verze 2 má trochu jinak číslované
některé
vývody na GPIO konektoru.
Popis rozdílů obou variant je zde: http://elinux.org/....28GPIO.29 |
Nejzajímavější věcí na RasPi je pro mne konektor
GPIO. Tento konektor obsahuje několik portů (drátů), pomocí kterých
je možné komunikovat s okolím.
Tyto porty mohou být vstupní, nebo výstupní
- to znamená, že buď mohou snímat nějaký stav (třeba kontakt, nebo
fotobuňku), nebo mohou něco ovládat (rozsvěcovat LED diody, nebo přes
výkonové stupně třeba spínat relátka a přes ně další výkonové
spotřebiče).
Na GPIO konektor je možné
také připojit různá zařízení, která komunikují přes I2C,
SPI, nebo přes UART (RS232). Takže je možné připojit různé sériové
AD převodníky, displeje, čidla, která posílají zjištěnou
hodnotu přímo po sběrnici (teploměry), nebo je možné pomocí RasPi ovládat další zařízení, která se řídí pomocí těchto komunikačních
linek.
Pro začátek jsem si vyzkoušel jednoduché činnosti,
jako je rozsvěcení LED diod a snímání stavu tlačítka.
Skvělý článek s podrobným postupem instalace a ovládání je tady:
http://www.raspi.cz/2012/06/prvni-experimenty-gpio-svitime-led-diodou-detekujeme-pohyb/
Tak jenom v krátkosti shrnutí.
Instalace:
sudo apt-get install git-core |
Ve složce /home/pi/ vytvořit podsložku /git
Do ní zkopírovat (buď přes flash disk nebo přímo v RasPi stáhnout z
webu)
tenhle zazipovaný soubor : https://github.com/quick2wire/quick2wire-gpio-admin/zipball/master
a rozbalit ho do další podsložky /gpio/
Pak v terminálu zadat postupně:
cd git
cd gpio
make
sudo make install
sudo adduser $USER gpio |
... a restartovat RasPi.
Dál je třeba vyrobit "hardware". Já jsem si
zbastlil na kousku univerzálního plošňáku 4 LEDky a 4 kontaktní
vstupy (3 tlačítka a 1 posuvný spínač). Přidělal jsem k tomu kus
kabelu od staré disketové mechaniky (pár drátů jsem musel ustřihnout,
protože překážely).
K zajištění kabelu k plošňáku posloužilo tavné lepidlo.
Takhle to vypadá:
...a tady je schéma s označeným číslováním pinů
na konektoru a s významem signálů:
Po připojení testovací desky k RasPi je možné vyzkoušet
rozsvítit LEDky:
V terminálu zadat postupně:
gpio-admin export 4
echo out > /sys/devices/virtual/gpio/gpio4/direction
echo 1 > /sys/devices/virtual/gpio/gpio4/value |
... tím by se měla rozsvítit LEDka na GPIO4.
A tímhle by se měla zhasnout a dalším příkazem
uvolnit port:
echo 0 > /sys/devices/virtual/gpio/gpio4/value
gpio-admin unexport 4 |
Stejným způsobem se mohou otestovat další LEDky pouhým
nahrazením čísla 4 v předchozích řádkách čísly 18, 24 a 25 .
Další je testování tlačítek:
Nejdřív při uvolněném tlačítku zadejte v terminálu
následující příkazy:
gpio-admin export 21
cat /sys/devices/virtual/gpio/gpio21/value |
... v terminálu by se měla zobrazit 1.
Potom stisknout tlačítko na testovací destičce, které
je na portu 21 a znovu zadat
poslední řádek (stačí stisknout šipku nahoru a pak ENTER).
V terminálu se objeví 0. Takto je možné vždycky po stisknutí Enteru
zjišťovat stav tlačítka 21.
nakonec se musí uvolnit 21. port příkazem:
Stejným způsobem je možné vyzkoušet další tlačítka
na portech 22, 23 a 17.
Doplnění 16.8.2012
K tlačítkům byly do série vřazeny odpory 1k, aby nemohlo dojít ke
zkratu při náhodném nastavení tlačítkového portu na výstup, nastavení
tohoto portu na "1" a současném stisku tlačítka.
Bez těchto odporů by došlo
ke zkratu pinu, na kterém by v tu chvíli bylo 3,3V přímo na GND a tím by se
mohl port zničit.
Kdyby došlo po přidání odporů k výše zmíněnému náhodnému sepnutí
tlačítka na špatně nastaveném portu, tekl by do země proud pouze 3,3mA a
to už port přežije. Při běžném provozu se při stisku tlačítka sice
port nepřizemní úplně, ale bude na něm napětí asi 0,3V. To je však ještě
dostatečně nízká úroveň pro stav logické "0".
Doplnění 4.8.2013
Drobná úprava návodu na aktuální verzi ovladače pro GPIO.
Doplnění automatického spouštění i2c-dev
|
|
|