Moje Rapsberry Pi - GPIO konektor

raspipidi

Článek GPIO konektor čerpán z webu autora Milana Krúpy: http://www.astromik.org/raspi/

Nejzajímavější věcí na RPi je konektor GPIO. Tento konektor obsahuje několik portů, které je možné propojit s okolím. Tyto porty mohou být vstupní, nebo výstupní - to znamená, že buď mohou snímat nějaký stav (např. kontakt), nebo mohou něco ovládat (LED diody atd.) Na GPIO konektor je možné také připojit různá zařízení, která komunikují přes I2C, SPI, nebo přes UART.

Popis pinů konektoru GPIO

GPIOs

 

Pohled na konektor GPIO na RPI

deskasgpio

 

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, RPI 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. Takové napětí bude ještě bezpečně vyhodnoceno jako logická "0".


4) Pokud připojujete k RPi 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 RPi 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 RPi 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 RPi schopno dodat, je 8mA. Je sice 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 RPI 5V, RPI 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 ).


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 RPi (s pamětí 512MB) došlo ještě k prohození několika signálů.
Takže například ve staré variantě RPi (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.

 

Odkaz na zdroj http://elinux.org/Rpi_Low-level_peripherals#General_Purpose_Input.2FOutput_.28GPIO.29, kde je vše podrobně popsáno

 

GPIO jako vstup

gpio-in

 

 

 

1) Stav portu lze neustále kontrolovat ve smyčce

#!/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

gpio-out

 

 

 

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