2013年8月17日土曜日

MIPI CPI カメラモジュール

PandaBoardTexas Instruments OMAP4430Raspberry PiBroadcom BCM2835MarsBoardAllwinner A10WandboardFreescale i.MX6、、、これらはスマートフォンやタブレットなど、いわゆるスマートデバイスに搭載されることを前提として設計されたSoCです。スマートデバイスに必要とされる機能は、
  • オーディオやビデオの再生を担うマルチメディア処理
  • Wi-FiやBluetooth、3G、LTEなどのワイヤレス通信
  • LCDや外部HDMIディスプレイへの表示
  • ボタンやタッチパネルからの入力
  • 電源の管理
  • SDカードなどのストレージ
と、実に多様であり、SoCにはCPUの他にそれらを実現するためのさまざまなデバイスコントローラがペリフェラルとしてワンチップに収められています。

カメラ機能もその一つ。

したがって、スマートデバイス向けのSoCにはイメージセンサモジュールと接続するためのインタフェースが必然的に用意されることになります。

今日、それらのSoCを作っているメーカーとイメージセンサモジュールを作っているメーカーは別々であり、それぞれの市場に複数の企業がひしめいています。したがって、SoCを使ってカメラ搭載のスマートデバイスを作るメーカー(OEM)は、両のデバイスを選択のうえ調達して接続しなければならず、故にSoCとカメラの間には共通化されたインタフェースの存在が望まれることになります。

このような背景はカメラに限ったことではありません。SoCのさまざまな周辺機能にとって、 ハードウェアからソフトウェアまで含むインタフェースの共通化は主要な要求です。これに応じてMIPI Allianceという非営利団体でモバイルプラットフォームにおける内部インタフェースの共通化が行われています。モバイルデバイス関連産業から多くの企業をメンバーに集めるこの団体では、カメラモジュール用の共通インタフェース仕様も提供しています。

それが、MIPI CSI (Camera Serial Interface) と呼ばれるもの。

CSI-1、CSI-2、CSI-3の3種類があり、CSI-2とCSI-3が現行で活用(Active)の状態に指定されています。

仕様に準拠したSoCには、この共通化されたカメラインタフェースが存在します。そのSoCをベースにして作られたボードにも、カメラインタフェースが用意されることになるわけです。



たとえばRaspberry Piには、S5コネクタにCSI-2のインタフェースが用意されています(上画像)。このコネクタにフレキで接続し最大500万画素の静止画と1080pの動画が撮影できるカメラモジュールが、ModMyPi(£23.95)adafruit($29.95)日本のRSコンポーネンツ(2,400円)などで購入できます。モジュールそのものはOmniVision製OV5647です。

またWandBoardであれば、ユーザーガイド(SOLO/DUAL REV A1[pdf]QUAD REV B1[pdf])の5ページ、8ページに記載されているように、CPUが搭載されたEDMボードの端にある白いCAMERA1コネクタにCSI-2インタフェースが用意されています。WandBoardと同じi.MX6ベースのSABRE Liteボードなら、E-conのOV5640搭載カメラモジュールe-CAM50IMX6が適合するとLinuxGizmos.comの記事で紹介されています。WandBoardのコネクタとコンパチブルかどうかは記事や製品ページからはわかりませんが、OV5640をWandBoardに接続するためのアダプタを自作しちゃった猛者もいるらしいので、回路図を眺めながらチャレンジしてみるのもいいかもしれません。

2013年8月14日水曜日

Octaveでゆらぎ

とあるグラフィックプログラミングフレームワークで星のきらめきというか、瞬きというようなものを表現したいなぁ、と考えていて、その星の瞬きをもたらす「大気の揺らぎ」をどうやったら表現できるか考えていました。

揺らぎというのはいろいろな物理現象に見られる、物理量の平均値からの変動(分散)のことだそうです。いわゆる1/fゆらぎと呼ばれる、周波数に反比例するスペクトルを示す揺らぎが、自然現象で多く観測されるというのが有名です。

離散的に表現できる数式さえわかってしまえば、あとはプログラムに組み込むのはやっつけ仕事です。ただ、描画ループに組み込んで毎フレーム計算することは、場合によってはパフォーマンス低下につながります。そのためプログラム起動時にあらかじめ計算したテーブル(配列)を用意しておき、描画ループでは時刻をインデックスにしてそれを読み出すに留めます。

そこで、あらかじめどんなテーブルを作るか、グラフにプロットして確認したいと思います。

Octave、という数値解析ソフトがあります。同様のソフトではMATLABが有名ですが、OctaveはGNUプロジェクトによりフリーソフトウェアとして提供されています。WindowsやMac向けには、ここからインストーラがダウンロードできます。

昔、大学の信号処理の講義で触って以来使うことがなかったので、今回は数年ぶりの復習となりました。なので、下記は操作学習メモまで。

なおOctaveの操作方法はこちらのページでわかりやすく説明されています。 今回ヘビーローテで拝見させていただきました。

Octaveのコンソールを起動したら、まずは関数定義します。関数はこちらのページの記述を参考にしました。


nは元ページの数式で言うところの10、Σによる総和の回数です。 
一行ごとに改行を打ち込みます。一つ目のendでforループが閉じ、二つ目のendで関数が閉じたところで、次のコマンドのプロンプトになります。

次にx軸の入力値のベクトルを作ります。


piは円周率のπです。上記はマイナスπからプラスのπまでの間を0.02ずつとるベクトルになります。こうして一度定義された変数は、コマンドラインを終了するか、clearコマンドを入力するまで有効です。このxxを先に定義したfluc関数に入力して、計算結果のベクトルを得ます。


これでyyに計算結果が入りました。では、二次元グラフにプロットしてみます。



でけたー。gnuplotによるグラフが得られました。

こんな感じで実際の揺らぎ感が確認できます。

もう少しパラメータをいじりながら、いい感じの揺らぎ感を見つけたいですな (`・ω・´)