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:

sudo nano /etc/modules
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)


Odkaz na YouTube

 

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"


Odkaz na YouTube

 

 


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)


Odkaz na YouTube

  

 

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


Odkaz na YouTube

 

 


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:

gpio-admin unexport 21

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

 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 4.8.2013