2016/03/17

USBカメラをlxcインスタンスから使ってみる

最初 普通にカメラモジュールを買って遊んでみようと思ったが、調べているうちにチューブカメラ(スネークカメラ)の方が遊びがいがありそうだったので、買ってみた。

チューブカメラ(スネークカメラ)
kamura 7mm 6LED カメラ USB接続エンドスコープ(内視鏡) 防水 内視鏡スコープ
1300円は安いんじゃないかな。自分は2mを買ったけど何故か5mの方が100円安い設定・・・
レビューも詳しい商品説明もなかったけど、2~3千円台のやつと大差ないだろうとエイヤ!購入。

チューブカメラをUbuntuサーバーに付けて

認識してるかな?

$ lsusb
Bus 001 Device 006: ID 1908:2311 GEMBIRD

$ dmesg |grep CAMERA
[    2.535026] usb 1-1: Product: USB2.0 PC CAMERA
[   10.129511] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (1908:2311)
[   10.131662] input: USB2.0 PC CAMERA as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/input/input5
[ 8834.645489] usb 1-1: Product: USB2.0 PC CAMERA
[ 8834.646070] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (1908:2311)
[ 8834.646467] input: USB2.0 PC CAMERA as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/input/input11

$ ls -l /dev/video*
crw-rw---- 1 root video 81, 0  ~~~~ /dev/video0

どんなデバイスかな?

$ sudo apt-get install v4l-utils
video4linux2 utilitiesを入れて

$ v4l2-ctl -d /dev/video0 --info
Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : USB2.0 PC CAMERA
        Bus info      : usb-0000:00:14.0-1
        Driver version: 4.2.8
        Capabilities  : 0x84200001
                Video Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps   : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format

最大640x480 30fpsの標準的なUVC Camera。USBコネクタ側に先端のLED調光ダイヤルが付いていて4段階くらいの制御が出来ている。


lxcインスタンス側から使えるようにする

/var/lib/lxc/(instance)/config に
”lxc.cgroup.devices.allow = c 81:* rwm”

lxc.hook.autodevスクリプトに
”mknod -m 660 ${LXC_ROOTFS_MOUNT}/dev/video0 c 81 0”
"chgrp video ${LXC_ROOTFS_MOUNT}/dev/video0"

を加え、lxcインスタンスを起動。これでホストと同等にアクセスできるようになった。
後々めんどくさいので
”mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/video0 c 81 0”
だけにして、誰でもOKに。

キャプチャツールでテスト

Ubuntu Webcam で紹介されているものを幾つか試してみる

streamer
$ sudo apt-get install streamer
$ streamer -o test.jpeg -s 640x480

シンプルでコンパクトなコマンドツール。自分はこれで満足です。

cheese
$ sudo apt-get install cheese
$ cheese
** Message: cheese-application.vala:211: Error during camera setup: No device found

ほえ?自動的にデバイスを認識するって話ですが? "-d /dev/video0" してもだめでした。
lxcインスタンスからとか、tightvnc上での起動とかが絡んでるかもしれないけど、もういいっす。

VLC
$ sudo apt-get install vlc
$ vlc

難なくtightvnc上にGUI出てきました。/dev/video0を選んで 再生も問題なし。
$ vlc v4l2:///dev/video0 とすればすぐさま再生。

ただ、起動するとエラーではないけれど

pulse audio output error: PulseAudio server connection failure
Qt: XKEYBOARD extension not present on the X server.
Failed to open VDPAU backend libvdpau_nvidia.so

のメッセージが出るのが気になる。

$ cvlc v4l2:///dev/video0

でコマンドツールで起動するとXKEYBOARDのメッセージだけは消せる。
けど他は消せないなぁ。

iPadやAndroidとかではどうかな?
iPadにCamera Connector Kit経由で繋いでみたら消費電力が高すぎるから使えないと言われた。それじゃあと、外部電源付きのUSBハブをさらに経由したら、サポートしていないカメラだと言われた。。。
 AmazonFireHDXに繋いでみたが認識しなかった。外部USBカメラアプリをいくつか試してみたが、やっぱり認識しないようだ。USB変換ケーブルが原因の可能性もあるかな。今の所残念な状態。


2016/03/15

8x8LEDと超音波センサーとArduinoで遊ぶ

久々の投稿となります。昨年末に突然左目が斜視になってしまい、歩くのもおぼつかない自体となってしまいました。幸いにも現在はほぼ回復し、普通の日常が戻ってまいりました。

ということで、年末に書き残そうと思っていたことなど・・・


RaspberryPi2も楽しいけれど、もっとローコスト環境で遊んてみたくなって、ArduinoUNOとArduinoNanoを購入し、なにかまとまったものを作ってみようと思って作ったのが上の写真。

(見えないけど)電池パックの上にユニバーサル基板を載せて、8x8LEDモジュールと超音波距離センサーとArduinoUNOを載せて適当に繋いで、Sketchでプログラムして動かしています。
障害物との距離に応じてLEDに表示するものを変化させるというだけの単純なシステムです。

クリスマスには”Merry Xmas”と”サンタとトナカイ”と”Xmasツリー”の3パターンアニメーションをやったりして、子供が以外なくらい結構遊んでくれました。(目がおかしくなったのはその直後くらい)
正月には”A Happy New Year 2016”などで使いました。

今回技術的なことは殆ど無いんですが、あえて上げれば・・・

Nanoじゃ辛い
最初 ArduinoNano を基盤にさしてコンパクトに作ろうと思ったのですが、Nanoの5V端子から5Vが出ないのです。LEDとセンサーが5Vを要求しまして、Nanoでは駆動できませんでした。
別電源供給も考えましたが、UNOなら大丈夫だったので、UNOを無理やり載せた形になりました。

8x8LEDノイズが超音波センサーを狂わせる
LEDからのノイズがセンサーを誤動作させてしまうのです。自分の耳にも聞こえるくらい厳しい高周波を出します。コンパクトに収めて子供に遊ばせることが重要だったのでFFCで分離したくなかったし。
結局、LEDの発光レベルを1段下げるとギリギリですがセンサーが生きる状態になりました。
物理的なモードスイッチとかも付けて、アニメーションをセンサー連動と手動切替が出来るようにしたり、アセンブリ段階で意外と苦労しました。

3軸モーションセンサーも買ったけど
無理やり繋いでデータは取れるようになったけれど、簡単に応用できるポイントがなかったので外しました。

ArduinoIDE環境
特に難しいことはないんですが、Macに繋いでやりたかったけれど一発では認識せず。USBドライバがどうとかこうとかで認識させるまで面倒そうだったので、ShuttleサーバーマシンにArduino開発専用インスタンスを'lxc'で作って、そこにIDEを入れてVNCサーバー通して動かす方法を取りました。この方が断然安定していて不安なく作業ができます。


今度は原点に戻って、RaspberryPiとカメラモジュールで色々やってみたいと思っています。

2015/11/12

Waveshare 3.5 Spotpear TFTパネルをRPi2に付けて・・

cocopar™-3-5インチタッチパネル をRaspberry-Pi2/bに繋いでみてからのこと。

何も考えないでやると、そのページ情報から「英文の説明書、インストールファイルは、
https://www.dropbox.com/s/2s02o4jgvnexdov/3.5inch%20RPi%20LCD.7z?dl=0」と書かれているので、素直にダウンロードして(これはセットアップ済みのRasbianイメージ)SDに焼いて起動するんだそうな。

製造メーカのWaveshareのページ へ行くと、やはりRasbianイメージと若干のツールという形で説明されている。

とりあえず、どっちもやってみて、どっちもちゃんと動きましたが、カーネルが違ってたり、OSアップデートするとだめとか書かれてて・・使えねーっす。

ということで調べたら、ちゃんといいのがあるじゃないですかぁ
https://github.com/notro/fbtft/wiki
を読んで、ふむ。色んなLCDデバイスに対応しているらしいと。しかも現在はRaspberry Pi Foundation kernelに取り込まれているので、raspi-updateってやればモジュールが入る。

https://github.com/notro/fbtft/issues/215
ここがWaveshare 3.5 Spotpearについての記事。冒頭では、ああ・・Waveshareはうまくいかないのか?と不安になりつつ読み進めると汎用のflexfbを使ってやれば大丈夫と。
ホ。でも面倒なのね。

$ modprobe flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
$ modprobe fbtft_device rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24
ってやってモジュールを入れると、/dev/fb1 が出来上がる。
/usr/share/X11/xorg.conf.d/99-fbturbo.confの/dev/fb0を/dev/fb1にして
$ startx
するとLCDにデスクトップが出てくる。

うん。これでいいかと思ったら、記事の中に
https://github.com/swkim01/waveshare-dtoverlays
が紹介されている。素晴らしい!これなら簡単です。OSやカーネルを汚さないで済みます。

素のRasbianイメージからのスタートだとしても
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo raspi-configでSPIイネーブルにする
$ sudo rpi-update
$ sudo reboot

$ git clone https://github.com/swkim01/waveshare-dtoverlays.git

$ cd waveshare-dtoverlays
$ sudo cp waveshare-dtoverlays/waveshare35a-overlay.dtb /boot/overlays/
/boot/config.txt のdtparam=spi=onの次に
dtoverlay=waveshare35a
を追記してリブート。起動するとLCDが初期化されてバックライトが消えた状態に。

/usr/share/X11/xorg.conf.d/99-fbturbo.confの/dev/fb0を/dev/fb1に変更して
$ startx
すればLCD上でX11が立ち上がる。

https://github.com/notro/fbtft/wiki は最近更新された。fbtft_deviceを使うとDeviceTreeOverlay
を使うよりもっと簡単!っていう話だ。
が、残念ながら手持ちのwaveshare-35aはまだサポートされていないようだ。waveshare-32bならサポートされているらしい。

因みに、タッチスクリーンが付いているのだが、キャリブレーションはやってない。