Tag Archives: hardware-dev

I2C potřetí: rozsvěcíme LED diodu složitěji a dráže

Prvotně publikováno na raspi.cz 19.11.2012. 

 

Ve svém druhém příspěvku jsem ukazoval,  jak rozsvítit LED připojenou na GPIO. Je to snadné, že? Tak teď to bude znovu, ale složitěji.


Přímé připojení vstupů a výstupů na GPIO porty RPi je hezké (a na výuku/předvádění je to super), ale má to dva háčky:

  • Není zcela zjevné, kolik proudu je možno z jednotlivých GPIO krátkodobě a dlouhodobě odebírat – a když to přeženete, nedopadne to dobře.
  • Většina „bastlířského“ světa funguje na pětivoltové logice – a pokud přivedete 5 V na vstup, můžete RPi říct jen „pápá“.

Oba tyto problémy lze vyřešit například použitím I2C GPIO expandéru. Pod označením MCP23009-E/P najdete 8-bitový I2C port expander s otevřeným kolektorem – tj. čip, který má na straně RPi jeden I2C port a směrem ven nabízí 8 I/O portů. Každý z portů si můžete nastavit jako vstupní nebo výstupní.

Port nakonfigurovaný jako vstup je tolerantní k pětivoltové logice, tj. korektně přežije spolupráci s TTL zařízením.

Port nakonfigurovaný jako výstup má tyto parametry:

  • Je tolerantní k 5 V signálům.
  • Má maximální proud 25 mA (a součet přes celý čip nesmí přesáhnout 200 mA).
  • Má otevřený kolektor – tj. když je na něm logická 0, je sepnutý na zem; když je na něm logická 1není připojený nikam. Tj. logickou jedničku dosáhnete tím, že výstup přes odpor připojíte k napájení. Kouzlo tohoto řešení je v tom, že při připojení odporu k 3.3V můžete komunikovat se zařízeními s třívoltovou logikou; při připojení odporu k 5 V můžete komunikovat s běžnými TTL (5 V) zařízeními.

Datasheet k obvodu.

Takže to zapojíme:

  • Napájení obvodu na +3.3V a na GND.
  • I2C SDA a SCL na odpovídající výstupy na expanzním konektoru.
  • Dále zde máme /RESET – aby se obvod nahodil, musí tam být logická 1 = přes odpor na +3.3V.
  • Kouzelný vstup ADDR určuje, jakou adresu na I2C sběrnici čip obsadí. Je analogový (!!!) a umožňuje tak jedním drátem určit jednu z osmi adres (=až osm těchto expandérů na jedné I2C sběrnici). Pro zjednodušení si s tím nebudeme hrát a připojíme ADDR na GND = základní adresa 0x20.
  • GP0 až GP7 jsou jednotlivé GPIO vstupy/výstupy.
  • Ostatní nožičky necháme volné.

Mezi +5 V a pin GP0 zapojíme odpor 330 ohm a LEDku. Tj. LED bude svítit, pokud na GP0 bude „0“ = připojeno na zem. Opačně by to nefungovalo – otevřený kolektor, viz výše.

Jako vedlejší efekt tohoto cvičení jsem si chtěl vyzkoušet nějaký nástroj na kreslení schémátek. Zde tedy je výstup z aplikace Fritzing. Vypadá jako vhodná na podobná malování – má hotové moduly i např. pro RPi, nepájivé kontaktní pole má logiku a automaticky propojuje součástky. Kreslí se v tom rychle a pohodlně.

Mcp230009-1_bb1

 

Zapojeno máme, co teď s tím?

Po bootu se RPi zeptáme, zda je tam něco nového na I2C sběrnici.

pi@raspberrypi ~ $ i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: 20 — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — 48 — — — — 4d — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —

Na adrese 0x20 vidíme nové zařízení. 0x48 a 0x4d jsou teplotní čidla z minulého dílu.

Nastavíme registr IODIRA (0), který určuje, zda jsou piny vstupní nebo výstupní. 1 = vstup, 0 = výstup. Pro komunikac použijeme i2cset, kterému předáme parametry:

  • -y = neptej se na nic
  • 0 = sběrnice 0
  • 0x20 = adresa čipu na sběrnici
  • 0 = adresa registru v čipu
  • 0xfe = hodnota, co nastavujeme (1111 1110)
  • b = zapisujeme 1 byte

pi@raspberrypi ~ $ i2cset -y 0 0x20 0 0xfe b

LED se rozvítila! Defaultní hodnota výstupního pinu je totiž „0“.

No a teď můžeme blikat LEDkou. Piny se ovládají v registru OLATA (0x0a).

pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x01 b

(1 = zhasnuto)

pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x00 b

(0 = svítí)

pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x01 b

(1 = zhasnuto)

Kdybych chtěl číst stav vstupních pinů, je to k nalezení v registru GPIOA (0x09).

Takže děláme stejnou práci, jako na začátku. Blikáme LEDkou. Ale daleko sofistikovaněji než předtím.

Tipy a triky:

  • Od stejného výrobce se dá pořídit MCP23017, což je 16-bitová verze téhož. Více nožiček a více pinů, stejná logika ovládání.
  • Chci-li nastavit jen jeden bit nějakého I2C registru, příkaz i2cset na to má volbu „mask“ – maskou řeknete, které bity chcete nastavit; i2cset si hodnotu ostatních bitů načte z čipu a pak je doplní do zapisovaného bajtu.

Dsc_34731

1 = I2C čidla teploty z minulého článku
2 = MCP23009-E/P
3 = LEDka. Bliká na rozkaz.
4+5 = 1-wire bus adaptér a čidlo DS18B20 – bude v dalším článku, stay tuned

 

Reklamy

Napsat komentář

Filed under Počítače, vývoj HW a SW

Použití I2C podruhé: měření teploty … a taky webkamera

Prvotně publikováno na raspi.cz 16.11.2012.

 

Léto skončilo a je načase si zase po večerech hrát.

Takže v dnešním zápisku se koukneme, jak přes I2C odhadovat okolní teplotu a jak používat webkameru.

 

 

Intermezzo na začátek: upgrade OS a nastavení I2C

V mezičase od mých minulých zápisků se stala důležitá věc – jako hlavní platforma se objevil Raspbian Wheezy. Přináší hejno nových věcí, ale hlavně změnu architektury – využití hardwaru pro matematické výpočty. Vše je rychlejší. Pokud jste ještě neupgradovali, udělejte to. Vedlejším efektem je to, že podpora I2C je v systému od přírody a není potřeba jej patchovat.

Pro aktivaci I2C proveďte následující kroky:

1) v souboru /etc/modprobe.d/raspi-blacklist.conf zakomentujte (přidejte před ně znak #) řádky:

blacklist spi-bcm2708
blacklist i2c-bcm2708

2) do /etc/modules přidejte řádek

i2c-dev

3) rebootujte a koukněte, zda máte I2C:

pi@raspberrypi ~ $ ls -l /dev/i2c*
crw-rw—T 1 root i2c 89, 0 Nov 15 20:22 /dev/i2c-0
crw-rw—T 1 root i2c 89, 1 Nov 15 20:22 /dev/i2c-1

4) nainstalujte si podpůrné tooly pro I2C

sudo apt-get install i2c-tools

5) přidejte se (svého uživatele) do skupiny i2c – pak při dalších příkazech pracujících s i2c nebudete muset psát „sudo“

sudo usermod -aG i2c VašeUživatelskéJméno

6) po provedení bodu 5 je třeba se odhlásit a zase přihlásit, aby se změna projevila

Měření teploty

Jako ultimativní cestu pro měření teploty je samozřejmě možné použít nějaký opravdový modul pro meteostanice. Ale jednak se mi zrovna nechtělo čekat na dodávku z číny (teď před vánoci to bude trvat dlouho) a navíc jsem chtěl něco levného.

Lepší cesta by bylo použít Dallasovská čidla na 1-wire sběrnici (DS18B22). Jsou docela přesná a jsou levná. Jenže adaptér I2C/1-wire vhodný pro RPi se vyrábí jen v SO-8 pouzdru … a pokus o jeho ruční pájení nedopadl dobře. Další kolo bude následovat.

Tak jsem si na svém oblíbeném e-shopu našel základní čidlo teploty přímo pro I2C. Za 27 Kč se dá koupit TC74 v pohodlně pájitelném pouzdru. (Mimochodem: TME e-shop doporučuju. Nejkratší čas dodávky domů byl 1 den a 10 minut; nejdelší dva dny a dvě hodiny. Dokáže tohle váš dodavatel?).

TC74 (datasheet zde) měří teploty v rozsahu -65 až +130 stupňů, s udávanou přesností kolem +-2 stupně. Na meteostanici to není – ale já potřebuju měřit teplotu v boxu, ve kterém bude RPi, abych věděl, zda ho nepřehřívám, a na to to bohatě stačí. A navíc meteostanici už mám.

TC74 se vyrábí ve verzi pro 3.3V (v názvu je -3.3V) a pro 5V (-5.0V).   „Pětivoltovou“ verzi můžete také napájet 3.3V a připojit přímo k RPi – jen se sníží přesnost o cca 1-2 stupně.

Pokud chcete k jednomu RPi připojit snímačů více, musí mít různé I2C adresy, aby nekolidovaly. To zajistíte volbou jiného čísla za písmenem „A“.

Tak jsem si koupil:

  • TC74A0-3.3VAT – tedy adresa 0x48 a verze pro 3.3V
  • TC74A5-5.0VAT – adresa 0x4d a verze pro 5V, protože v TME neměli 3.3V-verzi s odlišnou adresou než A0

Zapojení je extra jednoduché – všechny snímače připojíte přímo na expanzní konektor (na 3.3V, GND, SDA a SCL). Toť vše. Nabootujeme RPi a můžeme zkoušet.

pi@raspberrypi ~ $ i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — 48 — — — — 4d — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —

Obě čidla jsou tam vidět.

TC74 má kromě pohodlného zapojování též jednoduché použití. Není třeba nic nastavovat, nic složitě číst. Stačí se jen zeptat, jaká je teplota. V každém čipu je to v registru 0 a je to jeden bajt. A vrací přímo stupně celsia. Hurá do toho:

pi@raspberrypi ~ $ i2cget -y 0 0x48 0 b
0x14
pi@raspberrypi ~ $ i2cget -y 0 0x4d 0 b
0x18

Je vidět, že první čidlo (3.3V) vrátilo teplotu 14 (hexadecimálně) = 20 stupňů celsia(Kdo neví, jak se převádí z šestnáctkové na desítkovou soustavu, použije kalkulačku ve Windows ve „vědeckém“ režimu.)

Druhé čidlo (pětivoltové) vrátilo 18 (hexadecimálně) = 24 stupňů celsia.

Ve skutečnosti je tu asi 21 C, takže je vidět, že pětivoltové čidlo je při napájení z 3.3V skutečně méně přesné. Ale pro mé potřeby to stačí.

No a to je k rámcovému měření teploty vše, ne?

Webkamera

Jen rychle pár slov k webkameře. V rámci mého „projektu“ chci fotit. Tedy mít připojenou webkameru. Tak jsem vybral Canyon CNR-WCAM820 – za cca 550 Kč dvoumegapixelová kamerka.

V Raspbianu aktuální verze (2012-10-28) je přímo podporovaná.

Jak kameru v Raspbianu používat?

Zapojíme kameru do USB a koukneme se, zda je vůbec vidět:

pi@raspberrypi ~ $ ls -l /dev/video*
crw-rw—T 1 root video 81, 0 Jan 1 1970 /dev/video0

OK, takže kamera tam je.

Jak dostat z kamery statický obrázek? Jak udělat videostreaming?

Spousta toolů, které jsem zkoušel, mi nefungovala tak, jak by se mi líbilo. Ukazuje se, že zejména pro vyšší rozlišení je výkon procesoru a USB hardware RPi nedostatečný, pokud se nezvolí správná komprese atd. Některé aplikace tak místo grabování obrázků vypisovaly spousty timeoutů a chyb…

Po delším testování jsem našel dva balíky, které mi vyhovují.

fswebcam

fswebcam je jednoduchý tool, který umí brát z webkamery statické obrázky a uložit je do souboru. Je přímo podporován v balíčcích pro Raspbian. Instalace je tedy jednoduchá:

sudo apt-get install fswebcam

Použití je triviální:

fswebcam -r 1280×1024 -S 1 –jpeg 95 –shadow –title „titulek“ –subtitle „podtitulek“ –info „dalsi text“ –save img.jpg 

(pozn: všechny uvozovky mají být nahoře!) Tento příkaz vynechá jeden snímek (-S 1), aby byla jistota, a pak z kamery vezme snímek 1280×1024. Dolepí do něj titulky do informačního proužku dole a uloží ho jako JPG do home.jpg.

Pokud na konec příkazu přidáte

-q -l 60

tak zůstane běžet a každou minutu soubor img.jpg přepíše novou verzí.

S mojí kamerou rozlišení 1600×1200 občas selže. 1280×1024 projde vždy.

v4l4j

Pod kryptickým názvem se skrývá „video4linux for Java„.  Jedná se tedy o knihovny, které aplikacím v Javě umožňují přístup k zařízením video4linux, tedy i k webkamerám. Kromě vlastních knihoven je zde i sada ukázkových aplikací, které běhají velmi dobře – vypisují konfigurace zařízení a třeba dělají streaming obrázků z kamery. A v4l4j má přímou podporu RPi.

Instalace je na rozdíl od fswebcam netriviální. Musíte si vše zkompilovat podle popisu. Jsou tam některé špeky, např. chybějící konce řádků v popisu. Ale nakonec se vám to jistě podaří.

No a pokud nechcete programovat, můžete využít hotových aplikací. Příkaz

java -cp /usr/share/java/v4l4j.jar -Djava.library.path=/usr/lib/jni au.edu.jcu.v4l4j.examples.DumpInfo

vypíše konfiguraci videozařízení. Výstupem je pěkný textový popis, co vaše kamera vlastně umí. Příkaz

java -cp /usr/share/java/v4l4j.jar -Dtest.width=640 -Dtest.height=480 -Djava.library.path=/usr/lib/jni au.edu.jcu.v4l4j.examples.server.CamServer

spustí webserver streamující obrázky z kamery. Z okolních počítačů se na něj dostanete z browseru zadáním http://192.168.33.105:8080/stream (kde 192.168.33.105 je IP adresa RPi). Když jsem si nastavil rozlišení 1600×1200, dostával jsem na druhý počítač data s pěknou frekvencí 0.6 fps (tj. zhruba 3 snímky za 2 sec).

Dsc_34721


Napsat komentář

Filed under Počítače, vývoj HW a SW

Použití I2C sběrnice (detailní postup) + hodiny reálného času pro RPi

Prvotně publikováno na raspi.cz 7.7.2012. Článek již není zcela aktuální – dnešní distribuce Raspbian má již podporu I2C  zabudovanou, je to popsáno v dalším článku.

 

 

RPi nemá hodiny reálného času. Bez připojení na internet tedy neví, kolik je hodin. Pokud používáte Debian squeeze, po startu budete mít nastaveny hodiny na čas posledního shutdownu; ve Fedoře jsem viděl i 1.1.1970.

To je docela neštěstí, pokud chcete RPi použít jako datalogger, tj. zařízení, které někde bez připojení autonomně získává údaje a ty se pak dávkově předají například na výměnném médiu (nebo sice konektivitu má, ale jen občas).

Co s tím můžeme udělat? Připojit RTC – hodiny reálného času.

Hardware

Na svém oblíbeném e-shopu jsem našel tento levný modul RTC. Za méně než 6 USD, s dopravou zdarma, obsahuje standardní čip PCF8563, potřebnou bižuterii (krystal atd), držák na baterii a zálohovací baterku. A je kompatibilní s 3.3V rozhraním RPi.

Jeho připojení je jednoduché – má rozhraní I2C. Takže připojit na I2C data a hodiny (SDA, SCL), GND na zem a VCC na napájení 3.3V.

Dsc_2050-580x426

SPI, I2C – co to je?

Aha, teď jsem použil nějaká sprostá slova. Na expanzní konektor RPi jsou vyvedeny dvě sériové sběrnice – SPI a I2C.

SPI je relativně hloupá sběrnice. Má hodiny (RPi udává takt), data směrem ven, data směrem dovnitř. A pak pro každé připojené zařízení musíte mít jeden volný GPIO pin, kterým mu řeknete „teď si povídám s tebou“. Není stanoven přesný protokol, co po sběrnici běhá – je to vždy specifické podle zařízení. Více info: wikiroot.

I2C je výrazně chytřejší. Používá jen dva dráty: hodiny SCL (RPi udává takt) a obousměrná data SDA, na kterých se všechny připojené zařízení střídají. Ke sběrnici může být připojeno až 127 zařízení. Je přesně definovaný protokol, kterým RPi řekne např. „teď chci zapsat hodnotu 27 do registru 66 na zařízení 34“ nebo „zařízení 52, řekni mi stav svého registru 22“. Více info: wikiroot.

Kouzlo I2C je v tom, že jí linux zná. Tedy můžeme ušetřit spoustu času a nemusíme programovat posílání jedniček a nul přes jednotlivé dráty.

Software

Debian squeeze ve verzi 2012-04-19 nemá (ani po posledních updatech v červnu 2012) podporu pro I2C. Ale tenhle borec jí tam dodělal.

Postup pro rozchození I2C:

1) Nainstalujte si a spusťte rpi-update, abyste měli nejnovější firmware a kernel (u mne 3.2.18). Nastavte memory split na 192 MB.

2) Stáhněte si opatchované jádro (linux-image-3.2.18-rpi1+_5_armel.deb) z odkazu.

POZOR! Vždy kontrolujte verzi svého kernelu a na home stránce si najděte odpovídající patchovaný kernel! Pokud pomícháte kernel s nevhodnou verzí firmware, nebude to fungovat.

3) Stažený soubor rozbalte:

dpkg -i linux-image-3.2.18-rpi1+_5_armel.deb

což vytvoří /boot/vmlinuz-3.2.18-rpi1+

4) Překopírujte /boot/vmlinuz-3.2.18-rpi1+ do /boot/kernel.img a restartujte systém.

Po nabootování se nic špatného nestalo, je tedy načase začít zkoušet I2C:

5) Otevřeme si terminál a přepneme se pod roota, protože většina dalších akcí chce root privilegia:

sudo bash

6) Vyzkoušíme načíst ovladač pro I2C:

modprobe i2c-dev

Pokud je vše v pořádku, vzniknou dvě nová zařízení:   /dev/i2c-0  /dev/i2c-1 . Bus 0 je vyveden na expanzní konektor, bus 1 končí na konektoru pro kamery, tedy je pro nás zatím nedostupný.

7) Pro práci s I2C si nainstalujeme patřičné nástroje:

apt-get install i2c-tools

8) A vyzkoušíme, jestli se něco děje:

i2cdetect 0

WARNING! This program can confuse your I2C bus, cause data loss and worse!

I will probe file /dev/i2c-0.

I will probe address range 0x03-0x77.

Continue? [Y/n] 

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          — — — — — — — — — — — — —

10: — — — — — — — — — — — — — — — —

20: — — — — — — — — — — — — — — — —

30: — — — — — — — — — — — — — — — —

40: — — — — — — — — — — — — — — — —

50: — 51 — — — — — — — — — — — — — —

60: — — — — — — — — — — — — — — — —

70: — — — — — — — —

pi@raspberrypi:~$

Hele, je tam! Na adrese 51 si s námi něco povídá! Takže I2C sběrnice funguje.

Takže teď stačí vzít datasheet k PCF8563, naprogramovat komunikaci a nastavit podle něj hodiny, ne? Ehm … neudělal to už někdo? Kouknu do Googlu … a zjistím, že hotovo je dokonce víc, než jsem si myslel – linux má přímou podporu pro tento RTC čip na I2C busu.

9) Vysvětlíme kernelu, že máme na I2C busu 0 zařízení 51 a to zařízení je PCF8563:

echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-0/new_device

a to je všechno. Odteď je to standardní RTC zdroj, který linux umí!

10) Zkusíme z něj načíst uložený čas:

hwclock -r

Wed 06 Jun 2012 18:08:46 BST  -0.057931 seconds

Hotovo.

Dsc_2051-580x388

 

Test řešení

Někdy kolem 18:07 reálného času jsem zařízení zapnul.

pi@raspberrypi:~$ sudo bash

root@raspberrypi:/home/pi# date

Wed Jun  6 17:52:28 BST 2012

Čas není dobře – je to čas posledního shutdownu, předpokládám.

root@raspberrypi:/home/pi# modprobe i2c-dev

root@raspberrypi:/home/pi# echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-0/new_device

root@raspberrypi:/home/pi# hwclock -r

Wed 06 Jun 2012 18:08:46 BST  -0.057931 seconds

Čas v RTC je správně.

root@raspberrypi:/home/pi# date

Wed Jun  6 17:53:33 BST 2012

Ale čas systému je stále špatně. Tak mu řekneme, ať se nastaví podle RTC:

root@raspberrypi:/home/pi# hwclock -s

root@raspberrypi:/home/pi# date

Wed Jun  6 18:09:24 BST 2012

A vše je OK.

 

Napsat komentář

Filed under Počítače, vývoj HW a SW

První experimenty s GPIO – svítíme LED diodou a detekujeme pohyb

Prvotně publikováno na raspi.cz 29.6.2012.

Takže máme Raspberry Pi… co s ním? Přece ho nebudeme používat jako běžný počítač. Je to hračka pro bastlíře, pojďme k němu něco připojit.

Trocha teorie na úvod

Vedle držáku pro SD kartu je vyveden „expanzní konektor“ – 2x 13 pinů ve standardní rozteči desetiny palce. Konektor je dobře popsán na wiki projektu.

Dsc_20451

Na konektoru jsou vyvedeny sériové sběrnice SPI a I2C, těm se budeme věnovat příště. Dále je zde vyvedeno napájení 5V a 3.3V (obojí ovšem s poměrně malým povoleným odběrem) a pak je tu to nejdůležitější: 8 „general purpose“ portů, které mohou sloužit jako vstupní nebo výstupní.

POZOR! Všechny porty na expanzním konektoru (tj. nejen GPIO, ale i I2C a SPI sběrnice) jsou provozovány na napětí 3.3 V a nejsou tolerantní ke „standardním“ 5 V, které se vyskytují v bastlířské elektronice nejčastěji. Pokud na některý pin přivedete více než 3.3 V, můžete svému RPi udělat bebí, které se mu nezahojí.

Stejné varování se týká i povoleného maximálního odběru z jednotlivých pinů. Taháte přímo za nožičky procesoru – nečekejte, že tím budete přímo řídit velkou LED diodu či relátko. Určitě to krátkodobě něco vydrží, ale více než 1 mA z každého pinu  bych raději dlouhodobě neodebíral.

Všechny GPIO piny jsou dostupné jako speciální soubory v /sys filesystému. Ale pro používání těchto souborů musíte mít superuživatelská (root) práva, a to je špatně. Kdo s linuxem již někdy dělal, ví proč; kdo přichází ze světa Windows – prosím, berte to jako axiom. Lépe je psát aplikace, které nemusí běžet jako root.

Tady je řešení problému – aplikace, která GPIO zpřístupňuje normálním uživatelům. Nainstalujte podle návodu. Pak už je to snadné. Na začátku je potřeba GPIO port otevřít – říct, že ho budeme používat:

gpio-admin export 22

Port je následně dostupný jako soubor – třeba /sys/devices/virtual/gpio/gpio22/value . Tedy zobrazit jeho stav můžeme přímo v shellu:

cat /sys/devices/virtual/gpio/gpio22/value

(vypíše nulu nebo jedničku). Stejně tak do něj můžeme zapisovat. Nejprve mu otočíme směr na výstupní a pak můžeme začít řídit, zda z portu teče logická jednička (3.3 V) nebo nula:

echo out > /sys/devices/virtual/gpio/gpio22/direction
echo 1 > /sys/devices/virtual/gpio/gpio22/value

Jak se k portu fyzicky připojit?

Nejjednodušší mi přijde varianta koupit si kousek plochého kabelu (FBK26H v GM Electronics) a nacvakávací konektor (PFL26 v GM Electronics). Kabel (bez odizolovávání!) vložíme do konektoru na zoubky, které tam na něj čekají, a kleštěmi nebo svěrákem přimáčkneme horní část, dokud nezacvaknou zámky. Tím získáme kabel, který bezpečně (bez možnosti omylu, přepojení na špatné piny atd) nasadíme na Raspberry Pi a na druhém konci máme naše zařízení.

Svítíme si LED diodou

Abych RPi zbytečně nezatěžoval, koupil jsem LED diodu, které stačí proud 2 mA. Přes odpor 680 ohm jsem jí připojil mezi GPIO port 24 a zem. A pak stačilo:

gpio-admin export 24
echo out > /sys/devices/virtual/gpio/gpio24/direction
echo 1 > /sys/devices/virtual/gpio/gpio24/value

a LED se rozsvítila.

Detekce pohybu pomocí PIR čidla

Pro některé své projekty (např. krmítko pro ptáky s fotopastí) potřebuji detekovat, zda se v cílovém prostoru někdo pohybuje. To jde samozřejmě dělat přes webkameru a detekci změn v obraze, ale to je jednak náročné na výkon, a druhak to vůbec není elegantní. Navíc to nefunguje v noci.

Ale tenhle problém vyřešili výrobci zabezpečovací techniky už před lety. Řešení se jmenuje pohybové pasivní infračervené (PIR) čidlo. Takže jsem ze svého oblíbeného čínského e-shopu koupil hotový modul PIR čidla, akceptující 5V napájení a kompatibilní s 3.3V signalizací. Za méně než 6 dolarů, dodávka do evropy je zdarma. Cesta z číny mu trvala necelých deset dní – spousta českých e-shopů této rychlosti nedosahuje.

Zapojení je triviální – napájení na 5V port konektoru, zem na zem, a výstup na GPIO 21.

Pak jsem si sednul a napsal krátký program v shellu (jo, to se mi na linuxu líbí):

– otevři port 21 pro vstup a 24 pro výstup

– čekej na 0 na portu 21 (na začátku počkáme na stav „klid“)

– donekonečna opakuj:

    • čekej na 1 na portu 21 (PIR čidlo někoho vidí)
    • vypiš informaci na terminál
    • rozsviť LED diodu (1 na port 24)
    • čekej na 0 na portu 21 (už je zase klid)
    • vypiš informaci na terminál
    • zhasni LED diodu (0 na port 24)

Spustil jsem to … a fungovalo to.


Příště: kterak zařídit, aby RPi vědělo i bez internetu, kolik je hodin

Napsat komentář

Filed under Počítače, vývoj HW a SW

Raspberry Pi (3) – I2C interface + cheap batery backed real time clock (RTC) module – step-by-step how-to

Raspberry Pi has no RTC (real time clock) module. If you start it without internet connection, time is incorrect.

(This is not exact – there is a smart hack in Debian squeeze image. If you boot without internet connection, time is set to the time of last shutdown. So time is always bigger than any time reported before – not rolling backward to 1970/1/1.)

No RTC means that RPi is not usable as autonomous „data logger“ where data will be transferred offline (or connectivity will be available only time-to-time).

How to solve it? Get some RTC module, of course.

 

Hardware

I’ve found extra cheap batery backed RTC module in chinese e-shop – for less than 6 USD, with free shipping to Europe.

RTC module is based on PCF8563 chip (datasheet) with crystal and backup battery. Interface is I2C and chip is 3.3V-compatible – so no voltage level conversion is need for connecting to RPi!

So you have to connect it simple – VCC to 3.3V pin on RPi, and GND, SDA and SCL to their equivalents on RPi. That’s all.

Dsc_2050

Software

Standard RPi debian squeeze kernel has no support for I2C (at 2012/06/06 – may change in future).

But this man did some work for us.

I did the following steps:

1) I ran rpi-update to get the newest firmware and kernel (3.2.18), with memory split 192 MB.

2) Downloaded patched kernel (linux-image-3.2.18-rpi1+_5_armel.deb) from link there. (Always check home page for versions equal to your kernel/firmware version!)

3) Ran

dpkg -i linux-image-3.2.18-rpi1+_5_armel.deb 

which created /boot/vmlinuz-3.2.18-rpi1+

4) Copied /boot/vmlinuz-3.2.18-rpi1+ to /boot/kernel.img and restarted.

Nothing bad happens after RPi restart – the system is running as good as before.

So it’s a time for I2C experiments.

5) I think that almost all commands needs root privileges. So:

sudo bash

and all the following commands will be ran in privileged mode.

6) We need to load I2C drivers first:

modprobe i2c-dev

And then    /dev/i2c-0  and /dev/i2c-1 appears magically. I2C bus 0 is connected to GPIO connector, bus 1 is in camera connector (so unusable for me atd this time).

7) I2C is present. We need some tools for manipulating it.

apt-get install i2c-tools

8) Let’s try it:

i2cdetect 0

WARNING! This program can confuse your I2C bus, cause data loss and worse!

I will probe file /dev/i2c-0.

I will probe address range 0x03-0x77.

Continue? [Y/n] 

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          — — — — — — — — — — — — —

10: — — — — — — — — — — — — — — — —

20: — — — — — — — — — — — — — — — —

30: — — — — — — — — — — — — — — — —

40: — — — — — — — — — — — — — — — —

50: — 51 — — — — — — — — — — — — — —

60: — — — — — — — — — — — — — — — —

70: — — — — — — — —

pi@raspberrypi:~$

Yes! There is device shown on the I2C bus! I’m so happy!

OK. I’ve got RTC module connected to working I2C bus, and I’ve got datasheet for chip. So it’s time to start coding some application for reading/writing the time from/to RTC module, right?

Oh … wait … somebody did it before, didn’t it? Let’s use the f* Google… wow! It is there! And it is much better than I think.

9) We have to tell the linux kernel, that the device on address 0x51 on I2C bus 0 is RTC chip PCF8563:

echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-0/new_device

10) And then … magic happens:

hwclock -r

Wed 06 Jun 2012 18:08:46 BST  -0.057931 seconds

It works! With no coding at all!

 

Real world test

So I tried the whole trick with freshly booted RPi with no internet conectivity. Current (real) time was 18:07.

 

pi@raspberrypi:~$ sudo bash

root@raspberrypi:/home/pi# date

Wed Jun  6 17:52:28 BST 2012

There we see that the system clock is incorrect – it is the time of the last shutdown. Smart trick from debian squeeze (much better than Fedora, which always starts at 1970/1/1), but we need better time!

root@raspberrypi:/home/pi# modprobe i2c-dev

root@raspberrypi:/home/pi# echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-0/new_device

root@raspberrypi:/home/pi# hwclock -r

Wed 06 Jun 2012 18:08:46 BST  -0.057931 seconds

Time in RTC is correct. Battery backup is working.

root@raspberrypi:/home/pi# date

Wed Jun  6 17:53:33 BST 2012

But system time is still bad…

root@raspberrypi:/home/pi# hwclock -s

… so let set it from the RTC

root@raspberrypi:/home/pi# date

Wed Jun  6 18:09:24 BST 2012

System time is right!

Dsc_2051

 

 

 

 

1 komentář

Filed under Počítače, vývoj HW a SW

Raspberry Pi (2) – Experiments with GPIO

RPi is working, so what to do now? Some hardware hacking! I want my RPi to detect when somebody came into room and to do something (for example fire an flame-thrower on the intruder). So let’s try it.

Dsc_2045

Some theory

Raspberry Pi is equipped with expansion connector – 2×13 pins with standard 1/10″ spacing. Connector is described on RPi wiki.

There is one I2C and one SPI bus on connector – it will be tested later. 5V, 3.3V and GND connection. And an 8 GPIO ports.

It is lower nuber of GPIO than on any Arduino, I know. There is no analog input/output, also. But I don’t like writing code in low-level languages like on Arduino, and I want to use user-friendly and powerfull platform. RPi is much better for me.

GPIO ports on RPi are 3.3 volts and are not 5 volt compatible. If you connect them to 5V signal, your RPi will be dead instantly. So be carefull.

All GPIO ports are available as files under /sys filesystem. But you have to be root for using them – and this is bad. I don’t want running my code under root account, it is a bad behaviour.

There is a solution. People from quick2wire.com released some software solving this trouble. You can „open“ GPIO pin by using

gpio-admin export 22

then you can read from port

cat /sys/devices/virtual/gpio/gpio22/value

or even write to the port

echo out > /sys/devices/virtual/gpio/gpio22/direction
echo 1 > /sys/devices/virtual/gpio/gpio22/value

directly from the shell.

 

Driving a LED from RPi

It’s easy. I’ve bought a LED with 2 mA driving current – so low so I can connect it directly to RPi. Connected it with a 680 ohm resistor (i fact two serial connected 330 ohm resistor) between GPIO port 24 and a GND. Then I tried:

gpio-admin export 24
echo out > /sys/devices/virtual/gpio/gpio24/direction
echo 1 > /sys/devices/virtual/gpio/gpio24/value

and LED starts shining.

 

Using a PIR detector with RPi

PIR stands for „passive infrared“. It’s a basic security/surveillance device – it can detect movement in indoor area by detecting changes in infrared radiation

For a less than 6 USD you can buy a cheap PIR detector from china e-shop with free shipping to EU. Delivery time was about 10 days – better than some czech e-shops…

It is powered by 5 V (available on RPi expansion connector). Output signal is 0 V when nothing happens, and 3.3 V when movement is detected – so it is compatible with RPi GPIO pin with no conversion need.

So I connected it to 5 V, GND and GPIO 21. And wrote some shell script, which:

  • waits for a „0“ signal on GPIO 21 – at start, we will wait for „iddle“ status, no movement detected
  • executes an infinite loop:
    • waits for a „1“ signal on GPIO 21
    • display time and a message on console – „VETRELEC“ (means „intruder“ in czech lng)
    • sends „1“ to GPIO 24 – so LED is switched ON and shining
    • waits for end of a alarm – a „0“ signal on GPIO 21
    • display time and a message on console – „Konec poplachu“ (means „end of alarm“)
    • sends „0“ to GPIO 24 – so LED is switched off

Started the script and … wait for it … it works. When somebody entered the room, message is printed and LED is switched ON. No movement in room -> LED is black. I’m so happy!

 

Dsc_2046

 

Next time to try: Connect to the Lego Mindstorms NXT (robotics set from Lego) with Raspberry Pi.

 

Links:

Napsat komentář

Filed under Počítače, vývoj HW a SW

Projekt Sun SPOT – Java pro elektrobastlíře a robotiky

Úspěch Lego Mindstorms NXT a snaha podporovat Javu dovedla Sun k tomu, že připravil projekt Sun SPOT (Small Programmable Object Technology). Není to jen Javová verze NXT, je to trochu jiný koncept. Je lepší či horší? Jak na co.

Lego Mindstorms asi každý zná. Jde o rozšíření klasického lega o možnost stavby a programování robotů. NXT se skládá z centrální „krabičky“ s procesorem, displejem, tlačítky a konektory, a z připojitelných periférií – ve standardní dodávce jsou tři servomotorky, ultrazvukový dálkoměr, detektor světla, dotykový senzor a zvukový senzor. Lego Mindstorms je hitovka, pro roboty z Lega se pořádají olympiády a vůbec jde o „mainstream“ produkt.

Lego Mindstorm se programuje buď v grafickém „tahátku“, které ale mnoho nefunguje, nebo v C#. A to je ta správná cesta. Komunikace mezi počítačem a Lego NXT je pomocí USB kabelu nebo Bluetooth.

Periférie jsou drahé a připojují se speciálním kabelem. Celé je to taková školní hračka – pokud ti stačí dodané součástky, užiješ si, ale reálný vývoj s tím neuděláš.

SUN se k problému postavil z druhé strany. Dodávka Sun SPOT se skládá z jednoho řídícího modulu a dvou senzorových.

Každý senzorový modul má

  • tříosý akcelerometr s rozsahem 2G nebo 6G (nastavitelné)
  • teploměr
  • světelný senzor
  • osm tříbarevných LED diod
  • šest analogových vstupů 0-3 V (v některých verzích firmware jsou dostupné jen čtyři)
  • dva DIP přepínače
  • pět logických I/O
  • čtyři vysokovýkonné (čti „100 mA“) výstupy

Každý modul je vybaven rychlým procesorem a velkou pamětí (180 MHz 32 bit ARM920T core, 512K RAM, 4M Flash), rádiovým modulem standardu IEEE 802.15.4 (2.4 GHz; s integrovanou anténou dosah cca 80-100 metrů), nabíjitelnou LiIon baterií a USB portem.

Kde je tedy ten rozdíl?

Sun SPOT nemá v základní výbavě žádná serva ani efektní čidla. Ale je možné na něj připojit COKOLI – standardní servo s PWM řízením, jakýkoli snímač s rozumným analogovým nebo digitálním výstupem, jakékoli výstupní zařízení ovladatelné čtyřmi 100 mA porty. V dodávce máte ne jeden, ale dva autonomní moduly, které si mezi sebou a se základnovou stanicí mohou povídat pomocí bezdrátového linku s rozumným dosahem. Modul sice nemá hezký rastrový displej … ale je něco špatného na LED diodách?

Pro bastlíře je SUN SPOT daleko zajímavější. Umožňuje mu strašně rychle postavit „chytré“ zařízení bez složitého rogramování jednočipových procesorů v assembleru. V Sun SPOTu bije rychlý ARM procesor a standardní Java ME runtime, takže programování jde rychle od ruky a výpočetní výkon je překvapivý.

Sun SPOT má z mého pohledu jedinou chybu – stojí dvakrát tolik než Lego NXT.

Porovnání základních rysů:

V dodávce
Lego NXT: 1 CPU modul
Sun SPOT: 1 CPu modul připojitelný k PC a 2 autonomní CPU moduly se senzorovou deskou

Senzory, zařízení, vstupy a výstupy
Lego NXT: 3 serva se zpětnou vazbou (hlášení polohy), zvukový senzor s rozpoznáváním příkazů a zvuků,
ultrazvukový dálkoměr do 250 cm, dotykový senzor, světelné čidlo, černobílý displej 
100×64 bodů
Sun SPOT: tříosý akcelerometr s rozsahem 2G nebo 6G, teploměr, světelný senzor, osm tříbarevných LED diod,
šest analogových vstupů 0-3 V, dva DIP přepínače, pět logických I/O, čtyři vysokovýkonné (čti „100 mA“) výstupy

Komunikace s PC
Lego NXT: USB, Bluetooth
Sun SPOT: USB

Bezdrátová komunikace
Lego NXT: Bluetooth, dosah jednotky metrů
Sun SPOT: IEEE 802.15.4; dosah až 100 metrů; spojení nejen mezi PC a CPU ale i mezi jednotlivými CPU navzájem; podpora MESH sítí

Hardware
Lego NXT: 32-bit AT91SAM7S256 main microprocessor (256 KB flash memory, 64 KB RAM), rychlost neudána + 8-bit ATmega48 microcontroller @ 4 MHz (4 KB flash memory, 512 Bytes RAM) 
Sun SPOT: 180 MHz 32 bit ARM920T core – 512K RAM – 4M Flash

Programování:
Lego NXT: GUI tahátko krabiček, C#, díky tomuto projektu http://lejos.sourceforge.net/p_technologies/nxt/nxj/nxj.php i Java
Sun SPOT: Standardní Java ME

U mne tedy Sun SPOT vyhrává.

Ale uznávám že jako „hračka“ pro malého (myšleno tím věkem) programátora je lepší Lego NXT – zasunout do sebe legovské kostky je jednodušší a tím, že v dodávce NXT jsou i „legovská“ serva, dá se out-of-the-box postavit spoustu zajímavých věcí.

Odkazy

http://www.sunspotworld.com/ – homepage projektu + obchod
https://spots.dev.java.net/ – development stránka u SUNu
https://spots.dev.java.net/FAQ.html – velmi pěkné FAQ, popis HW
http://parleys.com/display/PARLEYS/Sun+SPOTs+In+Action?showComments=true – prezentace, popis jak připojit různý zajímavý HW

 

Napsat komentář

Filed under Počítače, vývoj HW a SW