03 jaanuar 2013

Raspberry Pi ja UVC veebikaamera

Acer Crystal Eye
Ühe Aceri läpaka taaselustamise käigus jäi üle veebikaamera. Tuli mõte püüda seda kuidagi kasulikult ära kasutada. Jootsin olemasoleva ühenduspesa küljest ära, uurisin natukene radu skeemil. Üsna lihtsalt oli ära tuntav, milline neist oli maaklemm ja analoogia põhjal sai tuletatud juba ka teised. Tavaliselt on nad sellises järjekorras: GND(must), Data+ (roheline), Data- (valge), 5V (punane). Sulgudes on siis juhtmete värvid, millistega need kokku sobivad.

Jootetöö tehtud, pistsin kaamera prooviks lauaarvuti külge. Vaadates dmesg logisid, tunti kaamera kiirelt ära ja proovides Cheese-i, ta töötab ka kenasti. Aeg kaamera Pi külge ühendada.

Nii ladusalt see Rasperry-ga ei läinud. Kaamerad tunti küll ära aga drivereid neile ei leitud. Väljavõte dmesg-ist:
[    3.779541] usb 1-1.3: new high-speed USB device number 5 using dwc_otg
[    4.188997] usb 1-1.3: New USB device found, idVendor=5986, idProduct=0102
[    4.203743] usb 1-1.3: New USB device strings: Mfr=0, Product=1, SerialNumber=0
[    4.218632] usb 1-1.3: Product: Acer Crystal Eye webcam
Üritasin nii kuis üritasin, alati lõpetasin tupikteel. Lõpuks sattusin ühele Raspberry Pi foorumi USB veebikaamerate teemale, kus mainiti, et USB veebikaamerate tugi on GitHubi järgi Raspberry Pi kernelisse lisatud. Samas oli ka viide oma ChromeOS ja nüüd ka Raspberry Pi häkkide poolest tuntuks saanud Hexxeh-i kodulehele. Ta on hakkama saanud ühe toreda utiliidiga, millega kernelit imelihtne uuendada on. Juhised selle paigaldamiseks ja kasutamiseks on rpi-update-i GitHubi lehel olemas. Järgisin juhiseid, uuendasin kerneli ja tegin peale seda restardi.

Peale taaskäivitust vaatasin kohe lsmod väljundit ja sinna oligi tekkinud uvcvideo moodul. Ka dmesg näitas midagi uut. Veebikaamera oli omale seadmenime saanud.

Raspberry Pi koos Acer Crystal Eye kaameraga
Nüüd siis striimimist seadistama!
Alustuseks installime mõned vajalikud pakid:
pi@raspberrypi:~$ sudo apt-get install subversion libv4l-dev libjpeg8-dev imagemagick fswebcam
Sõltuvusi on neil päris palju, võib rahulikult viieteistkümneks minutiks eemale minna. Kui see tehtud, siis järgmisena kontrollime, kas veebikaamera toetab MJPEG striimi:
pi@raspberrypi:~$ sudo fswebcam --verbose
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
src_v4l2_get_capability,86: /dev/video0 information:
src_v4l2_get_capability,87: cap.driver: "uvcvideo"
src_v4l2_get_capability,88: cap.card: "Acer Crystal Eye webcam "
src_v4l2_get_capability,89: cap.bus_info: "usb-bcm2708_usb-1.3"
src_v4l2_get_capability,90: cap.capabilities=0x04000001
src_v4l2_get_capability,91: - VIDEO_CAPTURE
src_v4l2_get_capability,102: - STREAMING
No input was specified, using the first.
src_v4l2_set_input,180: /dev/video0: Input 0 information:
src_v4l2_set_input,181: name = "Camera 1"
src_v4l2_set_input,182: type = 00000002
src_v4l2_set_input,184: - CAMERA
src_v4l2_set_input,185: audioset = 00000000
src_v4l2_set_input,186: tuner = 00000000
src_v4l2_set_input,187: status = 00000000
src_v4l2_set_pix_format,540: Device offers the following V4L2 pixel formats:
src_v4l2_set_pix_format,553: 0: [0x47504A4D] 'MJPG' (MJPEG)
src_v4l2_set_pix_format,553: 1: [0x56595559] 'YUYV' (YUV 4:2:2 (YUYV))
Using palette MJPEG
Adjusting resolution from 384x288 to 352x288.
src_v4l2_set_mmap,692: mmap information:
src_v4l2_set_mmap,693: frames=4
src_v4l2_set_mmap,740: 0 length=2621440
src_v4l2_set_mmap,740: 1 length=2621440
src_v4l2_set_mmap,740: 2 length=2621440
src_v4l2_set_mmap,740: 3 length=2621440
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
There are unsaved changes to the image.
Tundub, et on. Vastasel juhul tuleks siinkohal veel pisut jändamist, et striim ümber konverditud saaks. Antud juhul teeb seda veebikaamera ise ja Raspberry ise selleks vaeva nägema ei pea.

Järgmiseks installime mjpg_streamer-i. Selleks tõmbame lähtekoodi SVN-ist:
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer
Liigume kataloogisügavustesse sisse:
cd mjpg-streamer/mjpg-streamer
Valmistame failid ette:
make USE_LIBV4L2=true clean all
Installime:
sudo make DESTDIR=/usr install
Liigume välja ja kustutame lähtefailid:
cd ../.. ; rm -rf mjpg-streamer

Testime:
mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0" -o "/usr/lib/output_http.so -p 80 -w /usr/www -n"
Liikudes nüüd brauseriga Raspberry Pi IP-aadressile, avaneb tutvustav leht, mis esitleb tarkvara erinevaid võimalusi:
MJPG-Streameri avaleht
Lisades aadressi lõppu /?action=stream, saab näha otsestriimi näiteks VLC või CCTV seadmele striimimiseks.

Järgnevalt teeme viisi striimimise mugavamaks käivitamiseks.
Kõigepealt loome faili:
sudo touch /etc/init.d/mjpg_streamer.sh
Seejärel anname talle käivitamisõigused:
sudo chmod +x /etc/init.d/mjpg_streamer.sh
Avame faili:
sudo nano /etc/init.d/mjpg_streamer.sh
Käivitsuskript on algselt pärit phillips321 blogist väikese parandusega minu poolt:
#!/bin/sh
# /etc/init.d/mjpg_streamer.sh
# v0.2 phillips321.co.uk updated by raidok.blogspot.com
### BEGIN INIT INFO
# Provides:          mjpg_streamer.sh
# Required-Start:    $network
# Required-Stop:     $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: mjpg_streamer for webcam
# Description:       Streams /dev/video0 to http://IP/?action=stream
### END INIT INFO
f_message(){
        echo "[+] $1"
}
# Carry out specific functions when asked to by the system
case "$1" in
        start)
                f_message "Starting mjpg_streamer"
                mjpg_streamer -b -i "/usr/lib/input_uvc.so -d /dev/video0" -o "/usr/lib/output_http.so -p 80 -w /usr/www -n"
                sleep 2
                f_message "mjpg_streamer started"
                ;;
        stop)
                f_message "Stopping mjpg_streamer…"
                killall mjpg_streamer
                f_message "mjpg_streamer stopped"
                ;;
        restart)
                f_message "Restarting daemon: mjpg_streamer"
                killall mjpg_streamer
                mjpg_streamer -b -i "/usr/lib/input_uvc.so -d /dev/video0" -o "/usr/lib/output_http.so -p 80 -w /usr/www -n"
                sleep 2
                f_message "Restarted daemon: mjpg_streamer"
                ;;
        status)
                pid=`ps -A | grep mjpg_streamer | grep -v "grep" | grep -v mjpg_streamer. | awk '{print $1}' | head -n 1`
                if [ -n "$pid" ];
                then
                        f_message "mjpg_streamer is running with pid ${pid}"
                        f_message "mjpg_streamer was started with the following command line"
                        cat /proc/${pid}/cmdline ; echo ""
                else
                        f_message "Could not find mjpg_streamer running"
                fi
                ;;
        *)
                f_message "Usage: $0 {start|stop|status|restart}"
                exit 1
                ;;
esac
exit 0
Teeme ka nii, et skript bootimisel käivituks:
sudo update-rc.d /etc/init.d/mjpg_streamer.sh defaults
Nüüd võib proovida ka restarti teha, peaks automaatselt käivituma.

Kommentaare ei ole:

Postita kommentaar