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).