CQ Publishing


CQ Publishing is a Japanese media company that publishes books and magazines of electronics and computer related technologies.

MARMEX_VB library

MARMEX-VB(MARY-VB)ライブラリ

Information

This page is written in Japanese only. For English information, please refer to "component page".
このページは日本語のみで記述されています.

このライブラリについて

トランジスタ技術2014年7月号で紹介されたカメラ・モジュール:MARMEX-VB (MARY-VB)のライブラリを公開しています.
/media/uploads/nxpfan/dsc_0497s.png

Import libraryMARMEX_VB

MARMEX-VB : "Mary Camera module" library


このライブラリは,基本的なカメラの設定とデータの読み出しを行うルーチンが用意されています.
カメラとmbedは7本の信号線で接続されます.4本のSPI信号(MOSI,MISO,SCLK,CS),リセット信号.2本のI2C信号(I2C_SDA,I2C_CLK)となっており,リセット信号はモジュールの初期化の際に,I2C信号はモジュールのカメラ部分の初期化/設定更新の際に使われます.
このライブラリのデフォルト設定ではカメラをQCIF解像度(174x144ピクセル)で使うようになっており,この他VGA(640x480ピクセル),QVGA(320x240ピクセル),QQVGA(160x120ピクセル)の解像度をAPIを通して選択できるようにしてあります.
APIの詳細についてはライブラリのAPI解説ページを御覧ください.

サンプルプログラム

サンプルプログラムの動作するハードウェアについて

このMARMEX-VBライブラリには2種類のサンプルプログラム:「Helloプログラム」と「(ライブラリの)テスト・プログラム」が用意されています. これらのサンプルプログラムはmbedとカメラモジュール(MARMEX-VB),OLEDモジュール(MARMEX_OB)ベース基板MAPLE mini type-B (MARM03-BASE)に搭載した状態のハードウェア向けに設定されています.

これらのプログラムはMARMEX-VBライブラリの他にMARMEX-OBライブラリを使用します.

Helloプログラム

"Hello world"プログラム:「MARMEX_VB_Hello」はmbedがカメラからデータを読み出し,それをOLED画面に表示する最も単純な例です.
QCIFサイズで撮影された画像の中央部の128x128ピクセルだけを読み出し,OLEDに転送,表示します.
実際の転送はライン毎に行われます.
この「MARMEX_VB_Hello」はmbed-LPC1768mbed-LPC11U24TG-LPC11U35-501で動作を確認しました.

Import programMARMEX_VB_Hello

A "Hello" program for MARMEX_VB library. This application may work 40pin type mbed platforms ;) This application expects to have the MARMEX_VB module on a "MAPLE mini type-B (MARM03-BASE)" baseboard (slot2) with a MARMEX_OB module (on slot1)

テスト・プログラム

もうひとつのプログラムはライブラリのテスト用のプログラムです.
テスト以外にデモ用の機能も用意されています.
このプログラムが動作する基本環境は上記と同じですが,mbedにはmbed-LPC1768だけが使えます.

Import programMARMEX_VB_test

MARMEX_VB test application program. This application works on "mbed NXP LPC1768" only. This application expects to have the MARMEX_VB module on a "MAPLE mini type-B (MARM03-BASE)" baseboard (slot2) with MARMEX_OB module (on slot1)


このプログラムの基本機能は上記と変わりませんが,以下の点で違います.

  • 画像の左右反転(鏡像)表示.
  • mbedストレージ内に「alpha.bmp」という名前のbmpファイル(1ピクセル24bitのRGB888フォーマット)が存在すれば,それをOLED転送前に50%でアルファ・ブレンディングし表示画像に重ねます.(デモで使用したbmpのサンプルファイルはこちら)
  • mbedのUSBシリアル入出力をターミナルに接続してオプション機能を使うことができます.
    • "c"キーを押すことでカメラの画像をBMPファイルとして保存することができます.mbedストレージ内に「RGB.bmp」としてカメラに設定した解像度の画像を保存します.
    • "f"キーを押すと現在の画面更新レート(フレームレート)を表示します.更新を「インターレース」に設定している場合はフィールド更新レートを表示します.
    • "i"キーを押すと,インターレース/ノンインターレース表示を切り替えます.
    • "1"〜"4"の数字キーを押すとカメラの解像度を切り替えます.カメラの画像撮影サイズが切り替わったあと,OLEDにはその中心部の128x128ピクセルだけが表示されます.
    • "o"キーはカメラからのデータ読み出し順を変更します.これはまだ解決されていない「擬似輪郭」の問題が発生した場合に有効です.

Information

SPI速度最適化オプション が用意されました (20-June-2014)

MARMEX-VBライブラリとMARMEX_OB_oled.hに高速データ転送オプションが追加されました.
このオプションはSPIインターフェースのFIFOを使うことでデータの連続リードライトを高速化します.
このFIFOを使ったコードを実行すると約2倍の転送速度が得られます.これによりフレームレート/フィールドレートが大幅に改善されます.

FIFOオプションはmbed-SDKとの互換性を考慮して,デフォルト状態では有効化されていません.
この最適化は特定のハードウェアと設定に限定した,「場当たり的」なチューニングです.これを使う場合には充分に注意してください.

デフォルト設定は「LOOP_UNROLL」が選択された状態です.
LOOP_UNROLL はmbed-SDKをベースにした中くらいの最適化が行われています.この設定であればどのmbed環境でも何も気にせず動かすことができます.

MARMEX_VB.cpp

//#define   LINE_READ_OPT   NO_OPTIMIZATION
#define     LINE_READ_OPT   LOOP_UNROLL
//#define   LINE_READ_OPT   USING_SSP_FIFO

MARMEX_OB_oled.h

//#define   LINE_WRITE_OPT  NO_OPTIMIZATION
#define     LINE_WRITE_OPT  LOOP_UNROLL
//#define   LINE_WRITE_OPT  USING_SSP_FIFO

上のコード・サンプルは両ファイル内でデフォルト設定となっている状態の部分です

「NO_OPTIMIZATION」と「LOOP_UNROLL」はmbed-SDKと互換です.このためSPIをサポートするMCU/基板であればどの上でも動作します.

「USING_SSP_FIFO」はFIFOを使うオプションです.これはLPC1768,LPC11U24,LPC11U35の上で動作します.

MARMEX_VB.cpp

//#define   LINE_READ_OPT   NO_OPTIMIZATION
//#define   LINE_READ_OPT   LOOP_UNROLL
#define     LINE_READ_OPT   USING_SSP_FIFO

MARMEX_OB_oled.h

//#define   LINE_WRITE_OPT  NO_OPTIMIZATION
//#define   LINE_WRITE_OPT  LOOP_UNROLL
#define     LINE_WRITE_OPT  USING_SSP_FIFO

上のコード・サンプルは両ファイル内でFIFOを使用する設定とした状態です

この「USING_SSP_FIFO」が有効になったコードは(mbed-SDKを飛び越えて)ペリフェラル・レジスタに直接アクセスします.
このコードは(LPC1768,LPC11U24,LPC11U35をベースとしたmbed基板の)p5, p6, p7をSPIとして使うことを前提としています.
もし違うポートを使う場合には「MARMEX_VB.cpp」と「MARMEX_OB_oled.h」を変更する必要があります.コード例を下に示します.

MARMEX_VB.cpp

#define     SSP_AUTO_SELECTION  //  for demo setup on "MAPLE mini type-B (MARM03-BASE)" baseboard (slot2) with a MARMEX_OB module (on slot1)
//#define   SSP_USE_SSP0
//#define   SSP_USE_SSP1

ペリフェラル・ブロック選択.SPIにp5, p6, p7ピンを使う場合には変更は必要ありません

「SSP_AUTO_SELECTION」設定はこのコード自身で適切なSSPブロック(SSP0またはSSP1)を選択します.p5, p6, p7をSPIに使うのであればこのままで構いません.
「SSP_USE_SSP0」と「SSP_USE_SSP1」は,これらを手動選択するために設けられています.

サンプルプログラムでFIFOを使えるようにするには以下の手順に従ってください

  1. MARMEX_VB.cpp を編集
    「#define LINE_READ_OPT LOOP_UNROLL」をコメントアウトし,「#define LINE_READ_OPT USING_SSP_FIFO」のコメントアウトを解除して有効化
  2. MARMEX_OB_oled.h を編集
    「#define LINE_WRITE_OPT LOOP_UNROLL」をコメントアウトし,「#define LINE_WRITE_OPT USING_SSP_FIFO」のコメントアウトを解除して有効化.
  3. 両方のファイル内にある「#define SSP_AUTO_SELECTIONは変更する必要はありません.
    もしSSPブロックを手動で選択するなら,それぞれのファイル内の「SSP_USE_SSP0」か「SSP_USE_SSP1」を選択
  4. あとはコードをコンパイルして動作さてみます

各最適化オプションによるフレームレート/フィールドレートの差は以下の通り.

プラットフォームインターレース時ノン・インターレース時
mbed LPC1768 (FIFO option)15 field/s10 frame/s
mbed LPC1768 (default option)10 field/s7.5 frame/s
mbed LPC1768 (no optimization)7.5 field/s5.0 frame/s
mbed LPC11Uxx (FIFO option)10 field/s7.5 frames/s
mbed LPC11Uxx (default option)6.0 field/s3.75 frames/s
mbed LPC11Uxx (no optimization)5.0 field/s3.0 frames/s

Information

謝辞と参考文献

このMARMEX-VBモジュールは白阪さんによって設計されました.
この素晴らしいモジュールと関連する全ての設計情報を提供いただき,ありがとうございました.
より詳しい情報は「トランジスタ技術2014年7月号」を参照してください.

これら全てのmbed用ライブラリとサンプルプログラムは,白阪さんが書かれたサンプルコード(TG-LPC11U35-501向け.LPCXpresso環境でビルド可能)をベースにしています.
このサンプルコードは次のURLからダウンロード可能です.
http://toragi.cqpub.co.jp/Portals/0/download/2014/TR1407C.zip (1.3MB)