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).
Čidlo DS18B20 jsem připojoval podle tohohle návodu http://monirulpathan.com/afterhours/raspberry-pi-temperature-sensors/ a funguje perfektně.
Kdyby se někomu hodily výsledky měření různých čidel, tak dávám k dispozici svůj graf. Mám vedle sebe zapojeny DHT22, BMP085 a DS18B20.
Hodnoty jsem vynesl do tohoto grafu: http://2i.cz/fe945872a1
Super článek, díky za něj.
Připojuji se k chvále, jen tak dál. :)
Jinak cidla dalas lze s timto patchem ( http://www.raspberrypi.org/phpBB3/viewtopic.php?t=6649 ) naprimo ( s doporucenym odporem dle vyrobce) pripojit k pinu 4 (plus napajeni) a vse jede jak ma. Viz muj dlouhodobejsi test s merenim a zaznamem teploty ( http://95.82.181.205/ ) doba nacitani je dana zpracovanim poctu dat v grafu, k dnesnimu dni pres 1300 zaznamu a take tim ze RPI ma i jine veci napraci :-) . Jinak DS18B20 stoji cca 50kc ! a predpokladam, ze se daji zapojovat do sbernice (nemam zatim vyzkouseno na RPI – u mikrokontroleru problem nebyl) . Za celou dobu zaznamu byly dva chybne udaje (-0,06° – smazal jsem je )
Oprava – dlouho sem ty dalasy nekupoval takze udaj o cene byl zastarali, takze daji se poridit i pod 30kc :-)
muj predesli prispevek je oprava k prispevku , ktery byl o tom jak jednoduse lze zprovoznit dallas cisla , ale z nejakeho duvovu byl SMAZAN. Takze oprava na NEEXISTUJICI pripevek nema smysl, takze i tu je vhodne smazat. Pote nebude mit ani tento komentar smysl takze si ho smazte taky a ja tim koncim s komentari na tomto webu.
Přijmi mou omluvu, vysvětlení je následující: komentáře s více jak dvěma odkazy musí projít schválením, bráním se tak komentářovému spamu. :-) Doufám, že kvůli tomu na raspi.cz nezanevřeš;-)
Jak píšu v článku, Dallasovská čidla znám. Ale z dobrých důvodů je lépe je připojovat přes bus driver – tj. buď přes hotové řešení na USB, nebo např přes I2C čip DS2482S.
(Přesněji – v tomto případě by to bylo jedno, délka drátů bude max 20 cm, takže by to šlo. Ale jakmile je vedení k čidlu delší, tahat to přímo nožičkou procesoru je z důvodu indukce cizích napětí rychlá cesta ke zkáze.)
Navíc buzení 1-wire přes bus driver umožňuje více než jen měření teploty – 1-wire nabízí spoustu zajímavých čipů, například autonomní logger teploty s vlastní baterií, který stačí třeba jednou za rok vyčíst přes 1-wire bus.
Predpokladam ze plati jen pri zapojeni kde se bere napajeni z datove sbernice,tzn data + napejeni jeden vodic a GND. Ale ja mluvil o zapojeni VCC,DATA,GND. Tam jsem nikde nenarazil v datasheetu na omezeni v delce kabelu, ale zkousel jsem jen cca 2m kabel a problem nebyl. takztez nevim proc by to melo vadit pinu RPI ? Mas konkretni zkusenosti? indukce cizych napeti to by muselo byt elektomagneticky pole, neni spis problem, ze by pin z raspi nestihal napajet cidlo (cidla) pri dlouhem kabelu (odpor vedeni + odber vice cidel).Ja ziju v predstave, ze pri zapojeni VCC+Data+GND se muze na pin dat libovolny pocet cidel bez omezeni. Jake mas konkretni omezujici zkusenosti ?
Př připojení přes linkový budič je maximální délka busu (ať v dvojvodičovém či třívodičovém provedení) v řádu desítek metrů a může na něm být opravdu hodně čidel.
Když totéž připojíš přímo na pin procesoru, nejspíš to bude fungovat. Nějakou dobu. Pak stačí, aby v blízkosti sepnula pračka, bojler, … a máš požato.
Dokonce se někomu podařilo sprovoznit i detekci pohybu
http://www.slblabs.com/2012/09/26/rpi-webcam-stream/
Bohužel nemám teď čas si s tím hrát, ale jen by mě zajímalo, zda to už někdo zkoušel.
Pak ještě druhá věc, zda se někomu podařilo pomocí fswebcam udělat klasickej výstup jako html stránku pomocí web serveru.
„pomocí fswebcam udělat klasickej výstup jako html stránku pomocí web serveru.“ – pokud by ti ten webserver běžel na RPi, tak stačí nechat fswebcam běžet s tím, že má obrázek obnovovat jednou za N sekund.
Jinak existují tooly, které streamují výstup jako mjpeg stream – např. ten sampl pro v4l4j dále.
Díky za skvělý návod.
Jen jsem musel před parametry u programu fswebcam, které mají víc než jedno písmeno dat — misto -.
Myslím, že je to vlastnost Linuxových distribuci, ze u parametrů s jedním písmenem -h, a slovním parametrem –help
Vyzkoušeno se starší kamerou MSI StarCam Racer, 1,3MPix
Omlouvám se, spatně vidím, maš tam dvě -, když tam mi to v příspěvku smaž.
Super článek, jen co mi trochu poleví zkouškový, začnu si hrát :) K tomu měření teploty v boxu… Existuje příkaz vcgencmd measure_temp. Otázka je jak moc přesné údaje dáva. Moc dokumentace k němu není :) http://www.elinux.org/RPI_vcgencmd_usage
Mam dotaz k tomu petivoltovemu cidlu. Je nejaky problem pripojit ho v RPi na 5 Voltu? Chyba mereni dva stupne mi uz docela vadi.
Jinak co se tyka mereni teploty RPi, tak ja mam BananaPi a tam se da v nejakym /sys souboru vycist teplota procesoru/desky (nevim co to je, ale je to obvykle 45 stupnu Celsia).
1) Připojit čidlo k 5 V znamená, že na I2C sběrnici bude 5 V … a to by RPi nemuselo udělat dobře. Ale když koupíš třívoltovou verzi čidla (viz můj text), tak ta měří přesně.
2) I u RPi je k dispozici teplota procesoru, ale to není teplota okolí, ale skutečně teplota křemíku.
restart neni potreba. udelejte:
rmmod spi-bcm2708
rmmod i2c-bcm2708
insmod i2c-dev
linux není windows málo co restart skutečně vyžaduje.