2013年11月29日金曜日

Raspberry PiにWebカメラを繋げて動画撮影してみたが


すっかり秋も深まり、毎日寒くなってきました。Raspberry Piにカメラを繋げていろいろ面白いことしたくなる季節です。

Raspberry Piのカメラといえば、Camera Boardが定番です。 OmniVisionの5MP裏面照射型CMOSセンサを積んでいて、FullHD 30fpsの動画撮影にも対応、MIPIインタフェースでRPiと接続するモジュールです。ボード上の専用コネクタにフレキで繋ぐようになっています。

それから最近、赤外線イメージセンサ搭載のPiNoirというカメラモジュールも発売されたみたいですね。夜目の利くRPiも楽しそう。

でも今のところ私はRPi用のカメラモジュールを持っていません。そこで、家に転がっていたUSB接続のWebカメラを繋いでちょっと遊んでみます。

使用したのは、バッファローさんのBSW32KM01H。UVC対応なのでLinuxでもばっちりです。早速繋いでみる。dmesgとlsusbはこんな感じ。
自動的にuvcvideoドライバがロードされ、/dev/video0が追加されているはずです。では、ビデオ録画を試してみます。まずffmpegをインストールします。
ffmpegコマンドを使ってカメラ録画しファイルに書き出します。 なんとなく、flvだとうまくいったのでとりあえず。

それで、録画したファイルをWinSCPとかでWindowsに持ってきてプレーヤーで再生してみるわけですが。。数秒は撮影したはずなのに、一瞬で再生が終わってしまう!
何故?もう一度撮り直してみると、、、
1fpsしか出てない!

うーん、何だろう。。エンコードが重い?topでCPU使用率見ても、だいたい10~30%くらいなんだけどなぁ。
まぁ気が向いたら追い追い見てみますか。

カメラ繋いだついでに静止画撮影もしてみましょう。まずuvccaptureをインストール。
で、とりあえず撮影。
これでカレントディレクトリにsnap.jpgができます。見てみるとちょっとホワイトバランスがおかしいんですが、その辺は調整できるようです。一応、撮影はできました。


カメラモジュール買うかなぁ。


参考情報
How to stream from the linux (ubuntu :) command line to UStream - KnowledgeVoid
How to capture a webcam input - FFmpeg
uvccaptureで画像取得 - ともの技術メモ

2013年11月22日金曜日

UDOOボード 開封の儀

Freescale i.MX6 SoCとArduino Due互換プロセッサを一体化したハイブリッド校正のボード、UDOO(ユードゥー)が届きました!WandboardArduino Dueを一枚のボードに載っけてシリアル接続したような感じの楽しげなボードです。さっそくunboxingしたいと思います。

デリバリーはUPS。貨物状況を詳細に見られるトラッキングは魅力ですね。調べてみたら、イタリアから発送され、ドイツ、インド、中国を経由していました。長旅おつかれさま。UPSの難点は、日本では休日の再配達に対応していないことでしょうか。事業が拡大すれば休日配達のサービスを始めることもあるかもしれませんが、今回はヤマト便への転送にて週末に再配達してもらいました。


UPSバッグの中にはエアキャップ封筒。

その中にボード本体のパッケージとACアダプタの箱が入っています。

本体箱の両サイドには「MAKE」と「LEARN」の文字。小洒落たデザインがにくい。


ACアダプタは世界対応、DCサプライは12V/2A。

外ふたを開くと、getting startedページへの誘導に始まるインストラクションに加え、「WELCOME ON BOARD」の粋なメッセージ。

内ふたを開いてスポンジクッションを除けると、静電防止袋に包まれた本尊が。

いよいよご対面です。大き目のヒートシンクよりも少し背伸びしたピンソケットが個性的。サイズはだいたい109x86mmくらい。ちょうどRaspberry Piを横に2枚並べたくらいの大きさです。

さっそく起動してみましょう。公式のDownladsページにあるLinaro Ubuntu 11.10のイメージをダウンロードし、Win32 Disk Imagerで8GB以上のmicroSDに書き込みます。microSDをヒートシンクの下のスロットに挿入し、HDMIでモニタを接続。ACアダプタを繋ぐと電源が入ります。

デスクトップが起動したところ。

USB接続でキーボードとマウスが使えます。デスクトップ上部のパネルのApplicationsからターミナルを起動してみます。

デスクトップにはArduino IDEのアイコンも見えますね。夢が広がりますが、とりあえず今回はそんなところで。

参考情報

UDOO Getting started - eLinux.org

Raspberry Piをワイヤレス化してみた


Raspberry Piをワイヤレス化して遠隔データロガーにしようと誰でも考えると思いますが、ワイヤレスコネクティビティが搭載されていないので後付けしてあげる必要があります。たとえばWi-Fiが使える環境なら、USBの無線LANアダプタを使うことでワイヤレス化できます。

今日日、ラップトップやタブレットはWi-Fi標準装備のものばかりでしょうから、後付けのUSB無線LANアダプタの需要は少ないように思いますが、結構流通はあるようで、案外安く手に入ります。中でもBUFFALOのWLI-UC-GNMは、Amazonでわずか600円(しかも通常配送料無料)で手に入るという手軽さ。ポチらずにはいられませんね。Web上の記事によっては、WLI-UC-GNMはLinuxでは使えない(動作実績がない)、というも記載も見られますが、まぁチップベンダ(MediaTek)でドライバ配布してるっぽいしなんとかなるだろ、という根拠のない自信のもと、今回Raspberry Piに接続してみたらあっさり動いてしまったので、とりあえずその辺の手順をメモっておきます。

とりあえず繋いでみる

何は無くともUSBコネクタに挿してみて、いろいろ情報を覗いてみましょう。ということで繋いでみたんですが、それまでEthernetでSSH接続していたターミナルのウィンドウが突如クローズしてしまいました。どうやらRPiのネットワーク接続が一時的に途切れてしまったようです。ハングでもしたのかとあせりましたが、すぐにSSH接続を再開できたので、あくまで一時的な現象のようです。

さて、再開したターミナルからまずはdmesg。
接続されてますね。ベンダIDとプロダクトIDはWindowsに接続してデバイスマネージャを見てみると一致を確認できます。チップベンダはRalinkですが同社はMediaTekに買収された模様。

lsusbは
こんな感じ。いらっしゃいますねバッファローさん。

無線LANインタフェースの状態を調べるというiwconfigを見てみると
とりあえずwlan0デバイスができていることがわかります。ためしに外した状態と比べてみるといいでしょう。

ドライバは
ということで、これも接続前と比べてみれば、rt2800usbというのがロードされいることがわかります。
このドライバが問題なく動いてくれれば、意外と面倒な手順なしに夢のワイヤレス化が実現できそうです。

接続設定する

ここからは実際に無線LANを使えるようにするための設定をします。暗号化方式によって手順が違う場合があるようです。以下は我が家の環境、WPA2(AES)での実施例です。

IEEE 802.11i通信を無線LANクライアントに提供する、というツール、wpa_supplicantの設定を行います。このツールはRaspbianでは/sbin/wpa_supplicantにプリインストールされていると思いますが、無い場合でもsudo apt-get install wpasupplicantでインストールできそうです。
んで、設定ファイルをいじるんですが、root読み書きのみのパーミッションになっているので、otherにも権限を付与してから書き込みします。セキュリティが気になる場合は、あとで戻すといいでしょう。
それからESSIDと事前共有キーが必要です。あらかじめWi-Fiルータの設定を確認するなどして調べておきます。
エディタで開いて、少し付け加えます。
次にバックグラウンドで動いているwpa_supplicantを一旦止めてから再起動します。
コマンド行の末尾に" &" を加えてバックグラウンドプロセスとして起動します。

再起動したらiwconfigを見てみます。
さっきと違ってESSIDとアクセスポイントの情報が入りました。いい感じっぽいですね。

ためしにDHCPでIPアドレスを取得してみます。
IPアドレスが割り当てられたら、もうLANケーブルを外してWi-FiでSSH接続できるはずです。

最後に、起動時に有効になるよう設定を加えておきます。
これでおk。もはやRPiを縛るものは電源用のアンビリカルマイクロUSBケーブルのみとなりました。次はワイヤレス給電化を・・・やりませんよ^^。バッテリー化はすると思います。


参考情報

RPi Ralink WLAN devices - eLinux.org
Linuxで無線LANを使おう(Fedora) - LinuxMania

2013年11月19日火曜日

DisplayLinkモニタでRaspberry Piデスクトップを使用する

これまで、DisplayLinkモニタ用のフレームバッファドライバudlfbをカーネルコンフィギュレーションで有効化し、フレームバッファデバイスをXで扱うためのグラフィックドライバxf86-video-fbdevをインストールしました。

今回はDisplayLinkモニタでデスクトップを立ち上げるようにしたメモです。

1. xorg.confを設定

エディタでxorg.confの設定をします。
内容は以下。
これを保存すれば、usb_modeswitchでモニタをストレージからDisplayLinkデバイスへ切り替えるだけで、デスクトップを表示させることができるはずです。コマンドは前々回に書いたので割愛します。

2. udevルールでストレージ認識を回避

起動後、自動的にDisplayLinkモニタにデスクトップを立ち上げるようにするための設定です。Raspbianの起動中にudevdがDisplayLinkモニタを見つけたとき、ストレージではなくDisplaLinkデバイスとして認識するようにします。
エディタで下記のルールファイルを作成します。
中身には下記の行を記述。
こうすることでドライバとしてcdromではなくudlfbがロードされます。

3. X起動設定

RPiが起動したら自動的にstartxするよう、次のファイルに記述を加えます。
exit 0の直前に一文追加するだけでOKです。
4. 再起動

ここまでで、起動後にDisplayLinkモニタでデスクトップが表示されるようになったはずです。ためしに再起動してみます。
再起動後、下の画像のように(デフォルトのままなら)LXDEのデスクトップが表示されます。

5. タッチパネルのキャリブレーション

さて、とりあえずLXDEが起動し、キーボードとマウスを繋げばデスクトップPCとして使えるようになりました。しかし、今回使用しているDisplayLinkモニタLCD-USB10XB-Tはタッチパネル搭載です。マウスで使うなんて野暮。触って操作しましょう。
幸運にもRaspbianにはタッチパネルコントローラeGalaxに対応するドライバが標準でインストールされていまです(万が一無かったとしてもカーネルコンフィギュレーションで有効化するだけですけどね)。したがって、既にタッチ操作はできるはずです。
ただし初期状態ではタッチ位置とデスクトップ上の座標にズレがあったり、ドライバ等ソフトウェアの仕様によって反転していたりすることがあります。タッチ点を画面の座標上に正しく対応させるため、キャリブレーション(校正)を行う必要があります。
キャリブレーションには、xinput_calibratorというツールを使います。freedesktop.orgからソースをダウンロードしてきてインストールします。
インストールしたら、X上のターミナルから起動します。そのターミナルを起動するためにデスクトップのアイコンをダブルクリックするのは、キャリブレーションしていないタッチスクリーンではちょっと苦労します(笑)。キーボードやマウスで操作したほうが早いと思います。
コマンドを実行すると画像のようなフルスクリーンのUIが表れます。4つの十字マークが順次表示されるので、交点をなるべく正確に押していきます。中心の円グラフは操作の残り時間を示しています。残り時間がなくなるとプログラムは終了しますが、上記コマンドで何度でもやり直しできます。

4点の入力が終わるとプログラムが終了しますが、これで完了ではありません。コマンドラインにコンフィギュレーションスクリプトが生成されるので、これをコピーして下記ファイルに書き込みます。
以上で終了です。

参考情報

DisplayLink - wiki.archlinux.org
RPi Debian Auto Login - elinux.org
xinput calibrator - freedesktop.org
How to get eGalax TouchScreen film (0eef:0001) working in Linux for Raspberry Pi - Black God

2013年11月9日土曜日

Raspberry Piにxf86-video-fbdevをインストール

前回、DisplayLinkモニタのためのudlfbドライバをRaspberry Piにインストールしました。今回はフレームバッファデバイスのためのX11グラフィックドライバ、xf86-video-fbdevをインストールしたので、メモ。

まずはここからソースをダウンロードし、解凍。
で、いつものconfigureとmakeではなく、シェルスクリプトautogen.shを走らせます。 何やらエラーが。autoreconfのソースをダウンロードしてビルドしてみる。 おや。
sanitize.shってのは、acscriptsっていうのに入ってるらしい。 ではもう一度autoreconfのビルドを。 おやおや。m4のインストールが必要。 おk。ではもう一度。 ではxf86-video-fbdevのインストールに戻りまして。 うーん、今度はautoconf? これでいいかな。もう一度。 xorg-macrosとやらが必要とな。ぐぐってみるとxutils-devを入れればOKとのこと。 今一度。 にゃー。libtoolが欲しいって。 んでもう一度。 ここはシンボリックリンクで対応。 もう一度。 RANDRとな。ぐぐってxorg-devをインストール。 もーいっかい。 これでautoconf.shは通った。Makefileが生成されるので、あとはいつものやつです。

2013年11月4日月曜日

Raspberry Pi でDisplayLinkのudlfbドライバを使う

前回、RPiに接続したDisplayLinkコントローラ搭載のUSBモニタにlibdloライブラリを使って描画するテストをしてみました。今回はフレームバッファデバイスとして汎用的に使えるようにするため、udlfbドライバをインストールし、ロードできることを確認します。操作は下記のとおり。

1. udlfbドライバのインストール(カーネル再構築)


DisplayLinkをフレームバッファデバイスとして使うためのドライバとしてudlfbが必要です。ぐぐってみると、udlfbはPlugableのサイトでソース配布されていて、これをビルドすればOK、という記述もちらほら見つかるんですが、実はカーネルソースツリーのdrivers/gpu/drm/udlに(バージョン2.6.31以降?)入っていて、コンフィギュレーションしてビルドすればカーネルモジュールが生成されるようになっています。そこで今回は、udlfbのビルドを有効にしたうえでカーネルを再構築しインストールしてみます。
本当はeLinux.orgの記事にあるとおり、PCのlinuxマシンで作業したほうがビルドが早く済むんですが、今回はRPi上で作業しちゃってます。

まずはGitHubのレポジトリからカーネル取得。
使用中のカーネルのコンフィギュレーションをコピーしてきて、適用する。 次に、udlfbのドライバを有効にする。 下記のように進んで、Displaylink USB Framebuffer supportをモジュール選択します。依存するEnable Video Mode Handling Helpersも自動的に有効になります。 menuconfigの画面上では、下の画像の項目です。

SaveしてExitします。で、さっそくビルド。 RPi上でビルドしたせいもあり、たぶん10時間くらいかかったかな。
ビルドが終わったら、モジュールとカーネルをインストールして再起動します。

2.usb_modeswitchのインストール


今回使用しているLCD-USB10XB-Tは(もしかしたら他のDisplayLinkモニタも同様かもしれませんが)、コンピュータにUSB接続すると、初めにストレージデバイスとして認識されます。ストレージ内にはautorun.infが入っていて、Windows PCなどの場合、同梱のドライバインストーラを起動する仕組みになっています。ドライバがインストールされた後はストレージではなく、DisplayLinkモニタとして認識されるようになります。この仕組みはUSB接続のモデムなどでも見られることがあります。こうすることで、デバイスメーカーはドライバのCDを製品に添付せずに済むわけです。
Linuxマシンに接続した場合も、この仕組みのせいでストレージデバイスとして認識され、本来のDisplayLinkデバイスとしての使用を妨げてしまいます。 そこで、どのデバイスとして認識するかの切り替えができるusb_modeswitchを導入します。デスクトップのUbuntuではパッケージレポジトリに登録されているようですが、Raspbianではapt-getでインストールできなかったので、ソースからビルドします。#追記:Raspbianでも、ちゃんとapt-get updageすればレポジトリからインストールできるようです。ただしバージョンが古く(Version 1.2.3)今回の用途では正しく動作しないため、新しいVersion 2.0.1をソースビルドしてインストールする必要があります。
ここからusb_modeswitchのソースをダウンロードして、makeします。
バイナリのインストール。


3.udlfbドライバのロード


modprobeコマンドで、モジュールをロードします。 lsmodコマンドを打つと、モジュールがロードされていることを確認できます。 udlfb本体と同時に、依存するモジュールもロードされています。
最後に、インストールしたusb_modeswitchコマンドで切り替えを行います。あらかじめlsusbコマンドやdmesg等でDisplayLinkモニタのベンダIDとプロダクトIDを調べておく必要があります。 DisplayLinkというデバイスの17e9:0156がベンダIDとデバイスIDの対です。これをusb_modeswitchコマンドの-vパラメータと-pパラメータに指定して実行します。 成功すれば、DisplayLinkモニタの画面がクリーン一色になります。
udlfbはフレームバッファドライバなので、デバイスファイルfb1が増えていることも確認できます。


参考情報

DisplayLink - ArchWiki
RPi Kernel Compilation - eLinux.org
Raspberry Pi でカーネルにaufsを組み込む - よもやま雑記帳
LCD-USB10XB-TをUbuntuで使う - PPE : Petit Panda Extreme
UbuntuでEmobileのD21LCを利用する - Blog.37to.net