miercuri, 29 ianuarie 2014

BeagleBoard si Ubuntu - setarea unui webcam

English: in the previous steps a BeagleBoard Rev C4 was setup to be accessible over internet via SSH and using DDNS (link here), in the following post it is described how to setup a USB memory stick and a USB webcam HD  (like Canyon CNR-FWC120FH). In the end of the setup, fswebcam will start automatically at the boot time, it will take pictures every 20 seconds and it will save them on the USB memory stick with a name like "2013_12_22_13_20_12.jpg" (year_month_day_hour_minute_second.jpg).

These 3 episodes regarding Ubuntu setup on a single board computer can be easy adapted to RaspberyPi or BeagleBone.

Here are 2 time lapse demos from the setup fswebcam / Ubuntu / BeagleBoard / webcam Canyon CNR-FWC120FH:
-film 01
-film 02


For more details please use Google Translate (Romanian to English) and also use the coment area below! 

******************************
Avem o placa BeagleBoard Rev C4 (un single board computer (SBC)), aceasta placa este accesibila de oriunde din internet, are pe ea Linux (Ubuntu), realizarea acestor pasi fiind prezentata in episoadele precendete - aici setup-ul initial si aici partea cu acesibilitatea.

Acum dorim ca placa sa aibe un scop, asadar vom conecta un webcam HD pe USB (am ales Canyon CNR-FWC120FH - este ieftin, este HD si poti modifica manual focalizarea imaginii) si vom seta webcam-ul sa faca la fiecare 20 de secunde o poza si sa o salveze pe un USB memory stick ( care poate fi formatat FAT16 spre exemplu, nu e neaparat necesar sa fie formatat ext3, ext4 sau NTFS).

Si pt ca scopul este unul nobil, vrem sa avem acest dispozitiv plasat in exterior, sa simta stihiile naturii dezlantuite si totusi sa trimita poze :) Pt asa ceva am pus camera Canyon CNR-FWC120FH intr-o cutie de plastic in care suntem siguri ca apa nu va intra (ma refer la ploaie, camera nu este submersibila) si prin care camera sa vad ceva afara. De asemenea in interiorul cutiei e bine sa fie un plic de desicant / silica gel care sa absoarba umiditatea si sa nu lase sa se formeze condens pe sticla de 3cm x 3cm.

Webcam-ul Canyon CNR-FWC120FH l-am fixat in cutie 
pe o bucata de tabla de aluminiu
 
Detaliu din cutie, decupajul pt cablul camerei a fost umplut 
ulterior cu o bucata de guma de sters

Bucata de sticla de 3mm grosime si de 3cm x 3cm


  
Practic am facut un decupaj mare circular in capac, 
apoi am lipit cu silicon un patrat de sticla de 3cm x 3cm.


  
 Am adaugat o piulita pe cutie pt a prinde camera pe un cap de trepied foto uzual 
(capul de trepied foto are un surub cu filet 1/4-20, adica diametrul este de 1/4 inch 
si sunt 20 de pasi de filet per inch, nu e surub metric)




Cap de trepied foto cu ventuza, se poate aplica pe un geam 
(solutie provizorie pt teste, in final va fi ceva fix si mai solid) 

Pasii ce urmeaza (aplicatia) poate fi usor realizata si cu placile RaspberryPi sau BeagleBone de exemplu.

Ok, urmeaza setarea propriu zisa. conectam webcam-ul Canyon CNR-FWC120FH la unul din porturile libere de USB.

Utilizam comanda lsusb care ne arata toate dispozitivele conectate la USB-ul placii BeagleBoard Rev C4

lsusb

Si rezultatul este ceva in genul:
Bus 001 Device 002: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 005: ID 0bda:58b0 Realtek Semiconductor Corp.
Bus 001 Device 006: ID 0b95:772a ASIX Electronics Corp. AX88772A Fast Ethernet
Bus 001 Device 007: ID 0718:061a Imation Corp.
Bus 001 Device 009: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem

**Setarea memory stick-ului USB**
Desi memory stick-ul USB este vizibil in sistem, nu putem scrie pe el, nu putem salva fisiere pt ca nu este "montat in sistem" (traducerea lui mount), placa BB doar stie ca il are acolo, dar nu stie ce sa faca cu el.

Fiecare stick USB are un ID unic (UUID) pe care il putem vedea cu comanda

sudo blkid

apare ceva de genul (ultima linie e pt stick-ul USB):

/dev/mmcblk0p1: SEC_TYPE="msdos" LABEL="BOOT" UUID="E80B-B520" TYPE="vfat"
/dev/mmcblk0p2: LABEL="rootfs" UUID="44430f21-f93a-4ce1-8eb0-f1ec0c679654" TYPE="ext4"
/dev/sr0: LABEL="Mobile Partner" TYPE="iso9660"
/dev/sda1: LABEL="storage" UUID="27d1a919-0870-44b4-a4ae-455b1d09111b" TYPE="ext4"


Daca directorul /media/ nu exista pe placa BeagleBoard, il creeam pt ca altfel nu avem unde monta stick-ul USB:
-verificam existenta lui (vrem sa intram in director):

cd /media/

-daca nu exista, il creeam, apoi intram in el:

mkdir /media/


In acest director vom monta memory stick-ul (care in cazul nostru este formatat ca si ext4, pt asta folositi gparted in Linux). Linux are un mod diferit de a accesa resursele, in cazul de fata vom seta ca userul "ubuntu" sa fie stapinul (owner) stick-ului montat in directoul usb_32G:

sudo chown -R ubuntu /media/usb_32G

Pt ca memory stick-ul USB sa fie montat la repornirea sitemului (nu il vom deconecta in timpul functionarii sau nu il vom conecta in timpul functionarii), editez fisierul  /etc/fstab, linia unde este scris UUID=....  (astfel ii spunem placii BeagleBoard ca in /media/usb_32G vrem sa fie montat memory stick-ul USB cu IDul 27d1a919-....).
Pt ca fstab e un fisier important, e bine ca inainte de modificare sa ii facem o copie de siguranta, apoi il editam cu nano: 

sudo cp /etc/fstab /etc/fstab.bak 

sudo nano /etc/fstab

*****
# /etc/fstab: static file system information.
/dev/mmcblk0p2  /            ext4  noatime,errors=remount-ro  0  1
/dev/mmcblk0p1  /boot/uboot  auto  defaults                   0  0
UUID=27d1a919-0870-44b4-a4ae-455b1d09111b       /media/usb_32G  ext4    rw,user 0       0
debugfs         /sys/kernel/debug  debugfs  defaults          0  0

(Ctrl + o, enter (pt salvarea modificarilor) si ctrl + x (parasim nano))

Acum repornim placa BeagleBoard:

sudo reboot

si ar trebui sa avem access la memory stick-ul montat in /media/usb_32G - schimbam directorul curent (comanda cd) si apoi listam continutul directorului curent, directoul media in cazul nostru ( comanda ls):

cd /media/
ls

Si raspunsul:

usb_32G


**Setarea webcam-ului**
Conectam webcam-ul Canyon CNR-FWC120FH la placa Beagleboard, el ar trebui sa fie vazut automat (montat) in sistem daca este din clasa UVC, video0:

ls -l /dev/video*

Si raspunsul:
crw-rw---- 1 root video 81, 0 Dec 14 18:01 /dev/video0
(detalii aici http://www.netinstructions.com/tag/fswebcam/)


Trebuie sa verificam rezolutiile la care poate lucra webcam-ul (parametrul 001:005 (IDul) il luam din ce scoate comanda lsusb de mai sus (pt linia a 6-a, Realtek Semiconductor Corp.)):

lsusb -s 001:005 -v | egrep "Width|Height"

 Ok, acum pe partea de hardware pt webcam-ul Canyon CNR-FWC120FH suntem in regula, avem nevoie de o aplicatie care sa faca pozele, vom lucra cu fswebcam; fswebcam e o aplicatie simpla dar extrem de populara avind multe posibilitati, pt detalii consultati manualul sau revedeti aplicatiile facute de altii:

sudo apt-get install fswebcam

Verificam ca fswebcam functioneaza corect:

fswebcam --device /dev/video0 output.jpeg --verbose

Si raspunsul:
....rc_v4l2_set_pix_format,554: 1: [0x56595559] 'YUYV' (YUV 4:2:2 (YUYV))
Using palette MJPEG
Adjusting resolution from 384x288 to 352x288.
src_v4l2_set_mmap,693: mmap information:
src_v4l2_set_mmap,694: frames=4
src_v4l2_set_mmap,741: 0 length=202752
src_v4l2_set_mmap,741: 1 length=202752
src_v4l2_set_mmap,741: 2 length=202752
src_v4l2_set_mmap,741: 3 length=202752
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Unable to load font 'sans': Could not find/open font
Disabling the the banner.
Writing JPEG image to 'output.jpeg'.


Dupa cum se vede fswebcam raporteaza ca nu poate incarca fonturile, este normal, aceste fonturi nu exista, nu sunt instalate; fswebcam foloseste fonturile pt a putea scrie pe imagine, deci le instalam si pe ele:

sudo apt-get install ttf-mscorefonts-installer

Folosesc fonturile Arial TTF instalate in directorul:
/usr/share/fonts/truetype/msttcorefonts/arial.ttf

Cum am mai spus, ca si webcam HD pe USB am folosit un Canyon CNR-FWC120FH caci are un pret bun si se poate ajusta manual focalizarea, majoritatea webcam-urilor sunt focalizate fix pt distanta de 50-60 de cm (caci folosesti un webcam ca sa te vada pe tine interlocutorul, nu pt a arata peisaje). Desi Canyon CNR-FWC120FH are specificatii de full HD, eu personal nu am reusit sa il folosesc la full HD, conectat la placa BeagleBoard Rev C4 am setat maxim rezolutia de 1280 x 960. Webcam-ul necesita sa fie dezasamblat din carcasa lui si trebuie ajustat putin pt a mari intervalul de focalizare (sa poti roti lentila la maxim).

Ca sa verificam cum functioneaza fswebcam la rezolutia 1280 x 960, lansam fswebcam cu urmatorii parametri (detalii sunt in man page-ul lui fswebcam - http://man.cx/fswebcam%281%29 ):

fswebcam -d /dev/video0 -i 0 -l 20 -S 4 -F 7 --no-banner -r 1280x960 --jpeg 90 --save /media/usb_32G/output.jpg -p YUYV --verbose

Pt cei interesati de Canyon si de modul 1280 x 960 pixeli:
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
src_v4l2_get_capability,87: /dev/video0 information:
src_v4l2_get_capability,88: cap.driver: "uvcvideo"
src_v4l2_get_capability,89: cap.card: "FULL HD 1080P Webcam"
src_v4l2_get_capability,90: cap.bus_info: "usb-ehci-omap.0-2.3"
src_v4l2_get_capability,91: cap.capabilities=0x04000001
src_v4l2_get_capability,92: - VIDEO_CAPTURE
src_v4l2_get_capability,103: - STREAMING
src_v4l2_set_input,181: /dev/video0: Input 0 information:
src_v4l2_set_input,182: name = "Camera 1"
src_v4l2_set_input,183: type = 00000002
src_v4l2_set_input,185: - CAMERA
src_v4l2_set_input,186: audioset = 00000000
src_v4l2_set_input,187: tuner = 00000000
src_v4l2_set_input,188: status = 00000000
src_v4l2_set_pix_format,541: Device offers the following V4L2 pixel formats:
src_v4l2_set_pix_format,554: 0: [0x47504A4D] 'MJPG' (MJPEG)
src_v4l2_set_pix_format,554: 1: [0x56595559] 'YUYV' (YUV 4:2:2 (YUYV))
Using palette YUYV
src_v4l2_set_mmap,693: mmap information:
src_v4l2_set_mmap,694: frames=4
src_v4l2_set_mmap,741: 0 length=2457600
src_v4l2_set_mmap,741: 1 length=2457600
src_v4l2_set_mmap,741: 2 length=2457600
src_v4l2_set_mmap,741: 3 length=2457600

Pt ca este incomod sa lansam fswebcam din linia de comanda cu atat de multi parametri, putem folosi un fisier de configurare pt fswebcam pe care il editam cu nano si il salvam in directorul /etc/init.d cu numele fswebcam.conf:

cd /etc/init.d
sudo nano fswebcam.conf

Continutul acestui fisier poate fi ca mai jos (practic sunt continuti toti parametri din linia de comanda):

****************************
device /dev/video0

input 0

skip 3
frames 3

loop 20

background

bottom-banner

banner-colour #FF000000

font /usr/share/fonts/truetype/msttcorefonts/arial.ttf:22

line-colour #40263A93

title "acest mesaj apare cu font de marime mare"

subtitle "sub titlu"

info "alt mesaj"

timestamp "%Y %b %d %H:%M:%S (%Z)"

resolution 1280x960

jpeg 90

save /media/usb_32G/output.jpg

palette YUYV

exec "cp /media/usb_32G/output.jpg   /media/usb_32G/%Y_%m_%d-%H_%M_%S.jpeg"
****************************

Acest fisier de configurare foloseste camera web Canyon CNR-FWC120FH in urmatorul mod (prin intermediul fswebcam):
-la fiecare 20 de secunde face o poza
-poza o salveaza pe memory stick USB cu numele output.jpg (calea este /media/usb_32G/output.jpg)
-poza tocmai salvata o copiaza si redenumeste cu data si timpul curent (de exemplu 2013_09_21_13_23_20.jpeg), in acest fel se va forma o colectie de imagini toate facute la interval de 20 de secunde.

Atentie la sintaxa pt numele fisierului (parametri %Y, %m samd), daca nu sunt acceptati de sistem, comanda nu se executa corect! Pt a verifica modul in care sistemul intelege formatarea datei si a orei, se poate incerca comanda:

date +"%Y-%m-%d %H:%M:%S"
 
Si raspunsul va fi:
2013-12-25 13:22:17

Daca da o eroare, parametrii trebuie ajustati, aici sunt detalii despre formatarea datei si a orei:
http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/

Pt a rula fswebcam cu fisier de configurare, trebuie sa utilizam comanda:

fswebcam -c /etc/init.d/fswebcam.conf

Pt ca in fisier avem un parametru "background", pe ecran nu apare nimic, insa putem vedea ca fswebcam ruleaza in background cu comanda:

ps -A | grep fswebcam

Si raspunsul va fi:
2031 ?        00:00:10 fswebcam

Daca dorim sa oprim fswebcam, utilizam comanda ("omorim" procesul):

pkill fswebcam


Pt ca fswebcam sa inceapa sa ruleze automat la repornirea sistemului, putem folosi un mecanism de incarcare a aplicatiilor la pornirea placii BeagleBoard Rev C4, va trebui sa adaugam linia in portocaliu in fisierul /etc/rc.local linia cu care sa porneasca fswebcam la reboot:

sudo nano /etc/rc.local

**************
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

fswebcam -c /etc/init.d/fswebcam.conf

exit 0
*******************************

Asadar acum avem un webcam care la fiecare 20 de secunde face o poza care este salvata pe un memory stick USB, placa BeagleBoard poate fi accesata din internet, deci ne putem uita la imagini de oriunde dorim noi.

Poate unii sunt interesati sa aibe un flux video in loc de o imagine, recomand pt acest scop sa fie utilizat MJPG-streamer (http://sourceforge.net/projects/mjpg-streamer/), o aplicatie excelenta care iti face posibila vizionarea live a camerei video. De asemenea aplicatia motion ajuta ca inregistrarea sa se faca doar cand se schimba ceva in imagine.

Asa cum am spus si mai sus, din punctul meu de vedere, aceasta aplicatie se poate face si cu RaspberryPi, cu BeagleBone samd.

Aici sunt 2 exemple de time lapse optinute cu fswebcam si setupul BeagleBoard / Ubuntu / camera web Canyon CNR-FWC120FH:
-film 01
-film 02

******************************************
English: in the previous steps a BeagleBoard Rev C4 was setup to be accessible over internet via SSH and using DDNS (link here), in the following post it is described how to setup a USB memory stick and a USB webcam HD  (like Canyon CNR-FWC120FH). In the end, fswebcam will start automatically at the boot time, it will take pictures every 20 seconds and it will save them on the USB memory stick with the name like "2013_12_22_13_20_12.jpg" (year_month_day_hour_minute_second.jpg).

These 3 episodes regarding Ubuntu setup on a single board computer can be easy adapted to RaspberyPi or BeagleBone.

Here are 2 time lapse demos from the setup fswebcam / Ubuntu / BeagleBoard / webcam Canyon CNR-FWC120FH:
-film 01
-film 02

For more details please use Google Translate (Romanian to English) and also use the coment area below!

Niciun comentariu:

Trimiteți un comentariu