Raspberry Pi 17) GPIO expander
Pokud máte málo GPIO portů, není problém si nějaké
přidat. Tento obvod rozšíří počet vstupně výstupních portů Raspíčka o 16. A protože komunikuje po sběrnici I2C, nebude potřeba ani žádný další GPIO port přímo na RasPi. Navíc díky nastavitelnému tříbitovému adresování by neměl být problém pospojovat k sobě až 8 takovýchto obvodů (to je dohromady 128 ovládacích vstupně / výstupních vodičů) Stránky, ze kterých jsem vycházel, jsou zde: http://nathan.chantrell.net/20120519/raspberry-pi-and-the-mcp23017-i2c-io-expander Expander je sice schopný pracovat s napájecím napětím
3,3V, ale kvůli zvýšení proudu, který je schopný expander ovládat,
je lepší ho napájet 5V. Místo FETů je možné použít integrované obvody, které jsou pro tuto funkci přímo určené - například PCA9306
Ve schématu jsou použity tranzistory N-FET s
diodou. Já jsem použil typ BS107, ale na přesném typu asi moc nezáleží.
V případě, že budete napájet expander z 5V, je možné
spínat
i o trochu větší zátěž, než ze samotných GPIO pinů na RasPi.
Zastavím se ještě u toho adresování. Pomocí různých kombinací logických stavů na adresovacích pinech expanderu (piny 15,16,17) je možné měnit adresu tohoto obvodu. Není dobré nechávat piny nezapojené. Pokud z nějakého důvodu potřebujete změnit adresu, připojte pin, který má být v "1" na +5V (napájecí napětí). Hardware Mojí původní "bastl" desku jsem musel kompletně předělat. Už se mi na ní nevešly všechny potřebné součástky. "Áčkovou" stranu expanderu (GPA0 až GPA7) jsem nastavil jako výstupní. Připojil jsem k ní 7 LEDek a jeden pípák (BMT1206UX). Sice v popisu udávají jeho proud až 30mA, ale když jsem měřil ten proud, který přes ten pípák skutečně teče při 5V, bylo to asi 11mA, takže ho expander bez problému s rezervou utáhne (má povolených 25mA). A protože to pískání je dost nepříjemné, přidal jsem tam ještě propojku, pomocí které je možné ten pípák odpojit. "Béčkovou" stranu jsem nastavil jako vstupní.
Připojil jsem na ní 6 tlačítek ze staré klávesnice. 2 piny jsem
nechal volné (místo tlačítek jsem na ně dal jen propojky). Pořadí
tlačítek zatím není důležité. Já jsem to připojil tak, jak to jde
popořadě:
Software: Nejdříve je třeba povolit komunikaci I2C. Pokud jste to ještě neudělali při připojování modulu hodin reálného času, tak postupujte takto:
V editoru, který se tímto příkazem otevře, se musí zakomentovat dvě řádky (připsat před ně "dvojkřížek" # ), jak je vidět na následujícím obrázku:
Pak se musí nainstalovat tento nástroj
Po instalaci je třeba zavést ovladač:
Pak bude expander přístupný okamžitě po startu. Pak je možné se pomocí nástroje i2cdetect podívat, na které adrese se expandér hlásí. Za příkazem i2cdetect se zadává číslo I2C kanálu. Starší varianta RaspberyPi (s 256MB pamětí) má na GPIO konektoru vyvedený kanál číslo 0. Pokud používáte novější verzi RasPi (varianta s 512MB pamětí), změňte si číslo kanálu na 1. Pokud budete mít všechny adresovací piny v "0", bude se hlásit na adrese 0x20. Jestli některý z pinů nastavíte na "1", objeví se expandér někde jinde: (všechny adresní piny v "0" => adresa je
0x20) (adresní pin A0 v "1" => adresa je 0x21) Pomocí nástroje i2c-tools je pak možné s expandérem komunikovat. Například nastavení celého portu GPA pro výstup se provede takto:
0 = číslo kanálu I2C sběrnice /dev/i2c-0 (novější varianta RaspberryPi (512MB) bude mít číslo sběrnice 1) 0x20 = adresa obvodu 0x00 = adresa registru, který nastavuje směr GPA 0x00 = všech 8 bitů v GPA bude výstupních - Každý bit v GPA může být 0(výstup), nebo 1(vstup) Konkrétní nastavení jednotlivých pinů na "1", nebo "0" se provede potom takto:
0x12 je adresa registru "A" a poslední číslo
udává, které bity budou v "1" a které v "0".
Pokusný skript pro testování výstupního portu GPA by
mohl vypadat třeba takto:
A tohle je výsledek po spuštění skriptu (pokud nemáte zapnutý zvuk, tak prozradím, že na začátku a na konci skriptu je slyšet pípnutí od pípáka): Nastavení portu GPB pro vstup se provede podobně:
0x01 = adresa registru, který nastavuje směr GPB 0xFF = všech 8 bitů v GPB bude vstupních - I tady může být každý bit výstupní (0), nebo vstupní (1). Aktuální hodnota toho portu GPB se čte takto:
Výsledkem volání příkazu je hexadecimální kód, který po převedení na binární kód udává stav jednotlivých pinů.
Testovací skript pro tlačítka jsem napsal takhle:
Výstup tohoto skriptu vypadá pak nějak takto (je možné stisknout i několik tlačítek najednou a skript to pozná):
A tady je schéma celého obvodu a jeho připojení k
RasPi
Doplnění 16.9.2012 Když jsem si přečetl celý katalogový list k expanderu, zjistil jsem, že Pull-Up odpory (ty, které jsou připojeny jednou stranou na vstupní piny expanderu a druhou stranou na +5V) vůbec nejsou potřeba. Expander totiž obsahuje tyto odpory uvnitř, akorát je potřeba aby se správným příkazem připojily. Pro výše uvedený příklad s portem "B" nastaveným všemi piny na vstup, se vnitřní Pull-Up odpory připojí takto:
Doplnění 22.11.2012 Doplněno schéma připojení expanderu ke sběrnici I2C pomocí dvou FETů, které zajišťuje bezpečné rozdělení sběrnice na třívoltovou a pětivoltovou část. Doplnění 5.2.2013 Doplnění upozornění na změnu označení I2C kanálu v novější verzi RasPi (512MB).
|
úvodní strana webu AstroMiK.org |
|
poslední úprava stránky 20.2.2013 |