Intel EdisonでUSBカメラを使う

この記事を読むと、Intel EdisonにUSBカメラを接続し、WebサーバにしたりボタンやCircular LEDと組み合わせたりした例が作れるようになります。

20160707_114121583_iOS
f3js.orgで作成したUSBカメラを利用するアプリケーションの例

1. USBカメラを接続する

Intel Edison Kit for ArduinoのUSBポートにUSBカメラを接続する。接続直後に dmesguvcvideo に関するメッセージが見つかり、 lsusb でデバイスの名前が表示されれば、USBカメラを認識できていることが分かる。

root@edison:~# dmesg -c | grep video
[ 2090.154850] uvcvideo: Found UVC 1.00 device  (046d:0821)
root@edison:~# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:0821 Logitech, Inc. HD Webcam C910
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

なお、挿すだけでは使えないUSBカメラの場合、新しいデバイスドライバをカーネルに入れる必要があって面倒なので、ここでは触れない。がんばって認識されるカメラを探そう!サポートされているカメラの一覧は uvcvideo の公式サイト上にある。単純なものや、高価でも中身がしっかりしているものはサポートされていることが多い。例えばLogicool HD Webcam C910は使えた。同じLogicoolでもQcam Pro for Notebooksは使えない。

2. /etc/opkg/base-feeds.conf のエントリを増やす

/etc/opkg/base-feeds.conf に以下の内容を追記する。(参考: Intel Edisonに時刻やSSH接続を設定

src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

3. fswebcam をインストールする

opkg install fswebcam でコマンドラインツール fswebcam をインストールする。(参考: Intel EdisonでUSBカメラを使ってみる

root@edison:~# opkg install fswebcam
Installing fswebcam (20140113-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/fswebcam_20140113-r0_core2-32.ipk.
Installing libgd3 (2.1.0-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/libgd3_2.1.0-r0_core2-32.ipk.
Installing libvpx (1.3.0-r0) on root.
Downloading http://repo.opkg.net/edison/repo/core2-32/libvpx_1.3.0-r0_core2-32.ipk.
Installing libtiff5 (4.0.3-r0) on root.
Downloading http://iotdk.intel.com/repos/3.5/iotdk/edison/core2-32/libtiff5_4.0.3-r0_core2-32.ipk.
Configuring libvpx.
Configuring libtiff5.
Configuring libgd3.
Configuring fswebcam.

これでWebカメラの画像をコマンドラインから保存できるようになる。

root@edison:~# fswebcam --no-banner -r 1920x1080 ./test.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Disabling banner.
Writing JPEG image to './test.jpg'.

4. Node.jsから fswebcam を使う

次のように child_process を使えばよい。この内容を index.js などに保存して node index.js のように実行すると /home/root/test.jpg が保存される。

function execute(cmd, args, onEnd) {
  var spawn = require('child_process').spawn
    , child = spawn(cmd, args)
    , me = this;
  me.stdout = '';
  me.stderr = '';
  child.stdout.on('data', function (data) { me.stdout += data.toString(); });
  child.stderr.on('data', function (data) { me.stderr += data.toString(); });
  child.stdout.on('end', function () { onEnd(me) });
}
new execute(
    'fswebcam'
  , ['--no-banner', '-r', '1920x1080', '/home/root/test.jpg']
  , function (me) {
    console.log('--- stdout ---');
    console.log(me.stdout);
    console.error('--- stderr ---');
    console.error(me.stderr);
  });

さらにWebサーバにしたりボタンやCircular LEDと組み合わせたりした例はもう少し複雑だが、基本的にこれと同じことをしている。