Webová kamera a Raspberry PI

Odešla mi IP kamera z Dealextremu. Mám ji namontovanou na podbití střechy ve výšce 6,6 metrů nad zemí, ze střechy garáže je to o trochu míň, ale stejně je jakýkoliv servis kamery krajně otravná záležitost. Sice se nakonec ukázalo, že jenom vypadla konfigurace, ale stejně jsem uvažoval o něčem lepším, a to z následujících důvodů:

  • rozlišení – kamera z DX měla pouze VGA
  • falešné barvy – kamera je myšlena spíše jako bezpečnostní, okolo objektivu má řadu IR LEDek, které ale z té výšky stejně dolů nedosvítí, jenže díky citlivosti v IR sice poskytuje slušné barvy ve světle zářivek (které v IR moc nezáří), ale na denním světle je například vegetace dočervena a tak.
  • lepší přístup – ke všemu kromě kamery samotné (zdroj, ethernet) mám lepší přístup z půdy, než ze žebříku. Krimpovat ethernetový konektor na žebříku opravdu není žádná lahůdka.
  • cena – IP kamera s VGA rozlišením se pořídí tak od 70 dolarů dál.

A tím se dostáváme k tématu Raspberry PI. Při cenách webcamů a Raspberry PI jsem se rozhodl, že půjdu touto cestou, a budu mít lepší rozlišení za menší cenu. A někdy do budoucna třeba i více než jednu kameru, čímž nahradím natáčení. A v neposlední řadě se něco naučím. V následujícím textu popíšu, co se mi podařilo a taky s jakými problémy jsem se setkal.

Hardware

O Raspberry PI není třeba hovořit, pořídil jsem několik SD karet Kingston, k těm se ještě vrátím, a po průzkumu webu jsem došel k volbě kamery Logitech C270. Je levná, má slušně vysoké rozlišení a je dobře kompatibilní (podporuje standard USB Video Device Class). USB port Raspberry ji neutáhne, ale pomocí napájeného USB hubu se elegantně vyřeší jak napájení kamery, tak i samotného Raspberry PI.

Software

Vyzkoušel jsem několik linuxových softwarů, konkrétně motion, mjpeg-streamer a fswebcam. Mjpeg-streamer není v repository, musí se kompilovat ze zdrojáků, a i když se mi to podařilo, s výsledkem jsem nebyl spokojen. Možná se k tomuto softwaru ještě vrátím a víc si s ním pohraji, prozatím ale šel k ledu. Motion se mi také podařilo rozchodit, ale došel jsem k tomu samému, co jiní lidé na webu, na jejichž články jsem narazil a podle jejichž návodů jsem postupoval: Není boha rozchodit snímání ve větším rozlišení než 352×288. Díky požadavku na lepší rozlišení než VGA tudy tedy cesta taktéž nevedla. Nakonec jsem zakotvil u fswebcam, jehož instalaci popíšu. Podotýkám, že nejsem linuxový specialista, proto berte tento článek jako námět k diskusi.

Instalace je legrace, po standardním apt-get update/apt-get upgrade/rpi-update (návodů spousty jinde) nainstalujete

sudo apt-get fswebcam

a zbývá vám vytvořit konfigurační soubor a spustit program.

Do souboru /etc/fswebcam.conf dáte něco jako

resolution 800x600
#800x600, 864x480, 960x544, 960x720, 1024x576, 752x416, 1184x656
#verbose
skip 1
jpeg 85
loop 15
font /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
timestamp "%Y-%m-%d %H:%M:%S (%Z)"
title "Logitech C270 - Smrzice (test)"
#subtitle "Logitech C270 - Smrzice"
#info "powered by Raspberry PI 256MB and fswebcam software"
flip h,v
save /run/img.jpg
exec "/home/pi/upload.sh %F_%H-%M-%S"

Položky konfiguračního souboru jsou popsané, vypíchnu jenom pár zajímavostí:

  • příkaz flip h,v převrátí oprázek horizontálně i vertikálně, protože kamera je samozřejmě namontovaná vzhůru nohama. A pozor na jednu zákeřnost, záleží na pořadí příkazů. Takže příkaz save je až po flip h,v, dokonce může být použit opakovaně.
  • všimněte si, kam ukládám obrázek: Do adresáře /run/. Linuxový purista mi možná nadá, ale místa je tam dost, obrázky z kamery mívají tak maximálně 100KB. Adresář /run/ je totiž v ramdisku. Nebudu ničit SD kartu opakovaným přepisováním. Příkaz exec vyvolá libovolný linuxový příkaz, navíc v řetězci je možno používat formátovací znaky podle konvence strftime. Dávka upload.sh je zde:
curl -T /run/img.jpg -u username:password ftp://muj.server.com
curl -T /run/img.jpg -u username:password ftp://muj.server.com/img$1.jpg

(mimochodem curl je docela schopná utilitka, umí nahrávat nebo stahovat všemi možnými i nemožnými protokoly). První řádek nahraje img.jpg na ftp server vždy pod stejným jménem, abych měl pod jedním URL vždy aktuální obrázek. Druhý řádek ten samý obrázek nahraje na ftp server s datovým kódem ($1 = první parametr), se kterým exec zavolal tu dávku, jméno souboru pak vypadá pro lepší ilustraci takto:

img2013-04-19_15-28-30.jpg

čili 19. dubna 2013 v 15:28:30.

  • položky title a timestamp jsou vidět v modrém proužku dole v příkladu, pokud zrušíte komentář u subtitle a info, dostanete v modrém proužku ještě druhý řádek o fous menším fontem.

Program spustíte příkazem

sudo fswebcam -c /etc/fswebcam.conf

Problémy

Bohužel se vyskytují problémy s dlouhodobou stabilitou toho řešení. Příčinou je patrně chyba USB ovladačů u Raspberry PI, a čím víc dat se přenáší, tím spíš je otázka času, než se chyba projeví. Tady se tahají značná data z kamery, a Ethernetové rozhraní je u Rapsberry taktéž interně připojeno na USB. Většinou dojde k vytuhnutí tak 1x za 24-48 hodin, rekord mám 4 dny provozu. Ve fórech okolo Pi se píše, že nový firmware problém vyřešil, evidentně tomu tak ale není, aktualizace linuxu i firmware provádím velmi pravidelně. Navíc jakmile dojde k vypadení sítě, začne Linux logovat chyby, a tady se dostávám ke druhému problému, 4GB karty Kingston jdou do kytek. Syndromy jsou takové, že Raspberry z nich nebootne, přeformátování a nahrání nového image z PC proběhne v pořádku, ale Raspberry během bootu hlásí chyby čtení a nedobootuje do přihlášení. Měl jsem dvě tyto karty, s jednou úspěšnou reklamací tři, a u všech je chování stejné.

8GB Kingston Class 10 drží, i když taková kapacita samozřejmě není potřeba, ledaže bych chtěl fotky ukládat na kartu.

Syndromy vytuhlého USB se projeví spustou hlášek

May  2 17:25:29 raspberrypi kernel: [62709.609600] smsc95xx 1-1.1:1.0: eth0: Failed to write register index 0x00000014
May  2 17:25:29 raspberrypi kernel: [62709.609631] smsc95xx 1-1.1:1.0: eth0: Failed to write HW_CFG_LRST_ bit in HW_CFG

v souboru /var/log/messages (to byla asi příčina úmrtí 4GB SD karet). V článku

https://github.com/raspberrypi/linux/issues/151 se popisuje skript, kterým se dá síťovce „domluvit“, já jsem ovšem problém provizorně vyřešil poněkud humpolácky pomocí rebootu v crontab o každé půlnoci. Tím mám aspoň ozkoušeno, že opravdu vytuhne jen ethernetová komunikace, nikoliv Raspberry jako takové.

Závěr

Spusta věcí by šla vyřešit určitě elegantněji a přivítám diskusi. Třeba vytvoření adresáře s příslušnými právy v /run/, aby se fsebcam nemusel spuštět přes sudo. Nebo automatické spuštění fswebcam po startu počítače. Ale i tak doufám, že článek pomůže někomu, kdo si chce rozchodit kameru, a pokud se setká s problémy jako já, minimálně nebude muset strávit hodiny bádáním, ale smíří se s tím, že problémy tu zatím zkrátka jsou. Osobně mně to velmi mrzí, protože díky přetrvávající nestabilitě  zatím Raspberry PI není vhodné k tomu, na co jsem se těšil nejvíc: Levné zařízení s vysokou inteligencí se spotřebou, která nezatíží peněženku, vhodné jako „mozek“ pro automatizaci, logování, eventuálně mailování všeho možného, třeba pomocí Arduin coby hardwarových „prstů“.

img2013-04-19_15-28-30

20 komentáře k “Webová kamera a Raspberry PI

  1. S tím přenosem dat se mi to nějak nezdá, sice se mi nepovedlo vyčíst jaká je frekvence získávání dat z kamery a upload na web, ale zas tak moc vysokej traffic to bejt nemůže. Moje raspberry (první revize) mi tu teď běží jako NAS už 40. den v kuse a bylo přes něj přenesenejch asi 50 GB a není to výjimka že běží několik týdnů bez problémů, pak většinou následuje restart kvůli novýmu jádru.

    • Parametr loop 15 říká, že se opakuje akce každých 15 vteřin, čili 4x za minutu se děje načtení z kamery, a 2x upload (dva řádky curl). Údajně ty problémy trochu umocňuje, když je připojení přes USB hub, ale to jsou všechno věci, vyčtené na fórech, které nemám jak ověřit. Často to taky bývá sváděno na zdroj, ale mám 2A zdroj pro USB hub Belkin, ještě jsem zkoušel úplně jiný USB hub, chování stejné. Umře ethernet, viz chyba v článku, ale OS jinak žije.

  2. Ja mam take zkusenosti s umiranim datoveho spojeni, ale pres wifi. Takze sem si udelal skript, ktery kazdych 10min pingne router a pokud se nepodari, tak reinicializace wifi a info s casem zapise do log souboru. Vzhledem k tomu ze uz nevyuzivam RPI pro velke toky dat (v usb je jen wifi a tiskarna) tak dle tohoto zaznamu jsou posledni dva vypadky od sebe cca 1 mesic.

    Pouziti Raspi jako NAS pres wifi (dostatecne silny USB HUB co napejel Y-USB raspi + wifi a USB disk s vlastnim zdrojem) se diky vypadkum ukazalo byt jako nepouzitelne.

    • Mohu vas požádat o ten skript? Snazim se o to same, i když s tim rozdílem, ze když to spojeni (=internetove, nikoliv GW) umre, tak se pripojuji na jinou open sit v dosahu ( tj. vyhledat sit, zjisti IP adresu pres DHCP ). Zatím to funguje tak z 90% – stále to ladim.

      #!/bin/sh

      #DEBUG=YES
      GOOGLE=8.8.8.8

      connection_test (){
      echo „`date +%d-%m-%y\ %H:%M:%S` TEST ping $1“
      SUCC=`ping $GOOGLE -c 4 -q | awk ‚{if($1==4){print $4}}’`
      if [ „$SUCC“ != „4“ ]; then
      # Neni pristup na Google
      echo „`date +%d-%m-%y\ %H:%M:%S` NO INTERNET ACCESS“
      RV=1
      else
      echo „`date +%d-%m-%y\ %H:%M:%S` OK … INTERNET ACCESS“
      RV=0
      fi
      return $RV
      }

      echo „`date +%d-%m-%y\ %H:%M:%S` START“
      connection_test $GOOGLE && exit 0

      cd ~/net

      WLAN=`/sbin/ifconfig -a | grep wlan0 | awk ‚{ print $1 }’`
      if [ „$WLAN“ = „“ ]; then
      # neexistuje wlan0 – nejspise v USB neni zastrceny
      echo „`date +%d-%m-%y\ %H:%M:%S` NO WLAN ADAPTER FOUND“
      exit 1
      else
      # vystup vsech dostupnych nezabezpecenych ESSID
      ESSIDS=`sudo /sbin/iwlist wlan0 scanning | awk -F ‚[ :=()“]+‘ ‚/(ESS)/{ printf $3″ “ } /Encryp/{ print $4 }‘ | grep off | awk ‚{print $1;}’`

      if [ „$DEBUG“ = „YES“ ]; then
      ESSIDS=“linksys“
      echo „`date +%d-%m-%y\ %H:%M:%S` DEBUG MODE … ESSIDS set to $ESSIDS“
      fi
      echo „`date +%d-%m-%y\ %H:%M:%S` OK … WLAN adapter found ( ESSID – $ESSIDS )“
      fi

      for ESSID in $ESSIDS; do
      sudo ip link set wlan0 down

      PID_WPA=`ps -ef | grep wpa_supplicant | grep wlan0 | awk ‚{print $2;}’`
      if [ „$PID_WPA“ != „“ ]; then
      echo „`date +%d-%m-%y\ %H:%M:%S` KILL wpa_supplicant process ($PID_WPA)“
      sudo kill -9 $PID_WPA
      fi

      PID_DHCLIENT=`ps -ef | grep dhclient | grep wlan0 | awk ‚{print $2;}’`
      if [ „$PID_DHCLIENT“ != „“ ]; then
      echo „`date +%d-%m-%y\ %H:%M:%S` KILL dhclient process ($PID_DHCLIENT)“
      sudo kill -9 $PID_DHCLIENT
      fi

      echo „`date +%d-%m-%y\ %H:%M:%S` RECONNECTING to $ESSID“
      # nejdrive zjistim, zda mam sit ve wpa_supplicant.conf, pokud ne, tak to tam pridam
      WPA_SUPPLICANT=`sudo cat /etc/wpa_supplicant/wpa_supplicant.conf | grep ssid | grep $ESSID | wc -l`
      if [ „$WPA_SUPPLICANT“ = 0 ]; then
      echo „`date +%d-%m-%y\ %H:%M:%S` ADD ESSID TO /etc/wpa_supplicant/wpa_supplicant.conf“
      echo „ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev“ > /etc/wpa_supplicant/wpa_supplicant.conf
      echo „update_config=1″ >> /etc/wpa_supplicant/wpa_supplicant.conf
      echo “ “ >> /etc/wpa_supplicant/wpa_supplicant.conf
      echo „network={“ >> /etc/wpa_supplicant/wpa_supplicant.conf
      echo “ ssid=\“$ESSID\““ >> /etc/wpa_supplicant/wpa_supplicant.conf
      echo “ key_mgmt=NONE“ >> /etc/wpa_supplicant/wpa_supplicant.conf
      echo „}“ >> /etc/wpa_supplicant/wpa_supplicant.conf
      else
      echo „`date +%d-%m-%y\ %H:%M:%S` ESSID FOUND IN /etc/wpa_supplicant/wpa_supplicant.conf“
      fi
      sleep 2
      sudo wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0 -d -B > ./wpa_supplicant.$ESSID
      sleep 30

      echo „`date +%d-%m-%y\ %H:%M:%S` wpa_supplicant for $ESSID STARTED, iwconfig `/sbin/iwconfig wlan0 | grep ESSID | awk -F ‚[ :=()“]+‘ ‚/(ESS)/{ printf $5″ “ }’` configured“
      sleep 2
      sudo dhclient -v -pf /run/dhclient.wlan0.pid -lf /var/lib/dhcp/dhclient.wlan0.leases wlan0 -nw > ./dhclient.wlan0.$ESSID
      echo „`date +%d-%m-%y\ %H:%M:%S` dhclient STARTED“
      sleep 10
      echo „`date +%d-%m-%y\ %H:%M:%S` WLAN IP: `/sbin/ifconfig wlan0 | grep „inet addr“ | awk ‚{printf $2}‘ | awk -F ‚:‘ ‚{printf $2}’`“

      # Nyni se podivam, zda to nahodou nepomohlo a uz nejsme na internetu
      connection_test $GOOGLE && exit 0
      done

      echo „`date +%d-%m-%y\ %H:%M:%S` DONE“

      exit 0

  3. Hmm divné mám kameru založenou na podobném principu, akorát tahám fotky z kamery jednou za minutu a jednou za minutu je tahám z raspi na web a běželo mě to takhle tak 14 dní, než sem se na webku vykašlal a použil pi na něco smysluplnějšího araspi to sem fotil do HD, tak nevím.,,,

  4. Výrobce kamery zjistíš přes lsusb, a pokud jde o podporované režimy, dají se zjistit pomocí příkazu v4l2-ctl –list-formats-ext|less
    ovšem musíš si napřed nainstalovat balíček
    sudo apt-get install v4l-utils

  5. Dobrý návod. Vyzkoušel jsem a funguje. Díky!

    Jen tam chybí poznámka, že je potřeba nastavit oprávnění pro upload.sh

    sudo chmod +x /home/pi/upload.sh

  6. Ještě bych se chtěl podělit o dobrou zprávu:
    Motion záhadně začalo fungovat s vyšším rozlišením než 352×288. Osobně jsem s verzí 3.2.12 vyzkoušel rozlišení 640×480 a dokonce 1280×1024 ale to už se mi zdálo, že při 3 FPS už RPi nestíhá.
    Každopádně jsem rád, že už je motion konečně použitelné pro detekci pohybu.

  7. Chci se zeptat Ládínka jak to dopadlo se stabilitou RPi + C270. Chtěl bych si nainstalovat tuhle kombinace vně domu. Případně nějaké jiné cam řešení s RPi?

    • Dlouhodobá stabilita se ukázala špatná. Sice jsem každou noc CRONem rebootoval PI, což výpadky síťové komunikace většinou napravilo, ale po nějaké době PI vždycky vytuhlo. Musel jsem ho vždycky demontovat z půdy a snést dolů, protože HDMI monitor na půdu jaksi nechci obětovat (teď jsem objednal na DX převodník HDMI na VGA, tak to bude s monitorem lepší), a vždycky byl rozbořený filesystem. Přeimagovavání operačního systému to zase na nějakou dobu vyřešilo, a tak pořád dokola. Bavím se o úplně první verzi PI s 256MB paměti. Ještě mám novější 512ku, tak zkusím tu, jestli je to kusové. A taky mám koupenou „oficiální“ kameru, zkusím to vestavět do pouzdra falešné kamery, co se běžně prodávají za pár stovek. Ale ještě jsem si s tím nehrál.

      • Vracím se k tématu. Od doby, co jsem psal článek, jsem udělal dvě věci. Zaprvé jsem koupil originální kameru PI, a nejprve ji testoval cronem/raspistill. Ukázalo se to absolutně stabilní. Teď nedávno jsem rozchodil na PI motion. A zadruhé, na půdu k Logitechu jsem dal HP T5530 (tenký klient, původně s WinCE – dal jsem do něj 8GB flash a nainstaloval Debian), rozchodil FSWEBCAM a považte, výtuhy se objevovaly stejně jako u Pi. Tak jsem pro velký úspěch rozchodil i motion, a měl jsem obrázky až 1280×960. Plánuju o tom napsat další článek, mám docela dost dalších poznatků.

  8. Kameru zatím nemám ale budu mít k robotovi. Co jsem četl několik řešení od sledování zvěře, snímkování krmítka ptáků, vývoj kytky a podobně pak vždy si uživatel stěžoval že mu po čase celé RPi zatuhlo. Svorně všichni. prostě na tyhle věci to není. Nechápu lidi co si na tuhle hračku napojí barák. Jako by neexistovaly stabilní odzkoušené věci. Například fotopasti. Nebo kamery s velmi pomalým natáčením. Prostě věci které už byly vymýšleny s tím účelem ke kterému slouží. RPi bylo vymýšleno jako výukový nástroj pro děcka a ne proto ab tomu někdo svěřil svůj život třeba tím, že vyhodí z auta jeho počítač a napojí tam RPI jak jsem už viděl na nějakém videu. A nebo řízení celého baráku včetně jeho bezpečnosti, zámků ve dveřích a akvária a tisíci litry vody.

  9. Tohle se mi dělo taky, ale pak jsem rozchodil fswebcam na x86 tenkém klientovi a tuhlo to stejně, naopak po rozchození motion (viz můj jiný příspěvek na tomto webu) mi jedou dvě RasPI s kamerami, jedna USB webka Logitech a druhá original RasPI, desítky dnů bez záseku. Vývojáři na Debianu za tu dobu, co je Pi venku, odvedli neskutečný kus práce, ale souhlasím s tím, že život bych tomu nesvěřil (to ostatně ani jiným platformám :-)).

  10. Chcel by som si taktiez spravit z Raspi bezpecnostnu kameru, ale neviem sa rozhodnut ktory kamerovy modul do CSI kupit. Ci klasicku, alebo NOIR.
    Co som pozeral tak s tym NOIR aj tak v noci vela neziskam, kedze vzdialenejsie objekty to aj tak nevidi. Nemate niekto s obomi skusenosti? Hlavne v noci?

    Pripadne ako vyriesit viditelnost v noci.

Napsat komentář

Vaše emailová adresa nebude zveřejněna.