TH /TannoHubYOSHINOBU TANNOEN ↗
組込み・画像センシング

RP2040で小型カメラを動かす:
センサ同定からQQVGA・PIO+DMA評価まで

海外サイトでGC0309搭載として購入した小型カメラモジュールを、RP2040で動作させるために行った実験・検証の記録です。通信確認、センサの同定、同期信号の測定、画像取得、PIO・DMAを用いたデータ取得まで、動作確認を進めた過程をまとめています。

← 技術ノート一覧

実機検証ログ:2026-09〜2026-10 · 記事の編集日:

Raspberry Pi Pico 2と小型カメラモジュールをブレッドボード上で接続して動作確認している基板検証の様子
基板検証時の構成。Raspberry Pi Pico 2と小型カメラモジュールをジャンパ線で接続し、SCCB通信、同期信号、画像データ取得を段階的に確認しました。
Raspberry Pi Pico 2と小型カメラモジュールを接続した検証環境の全体構成
検証環境の全体構成。Pico 2とカメラモジュールをブレッドボードとジャンパ線で接続した状態で、5円硬貨を大きさの目安として置いています。

動作確認は、MCLK、SCCB通信、VSYNC・HSYNC・PCLK、データバス、画像転送の順に進めました。画像が出ない状態でも、どの段階まで動作しているかを一つずつ切り分けるためです。

GC0309想定からOV7670系の同定へ

評価を始めたCM-013は、海外サイトでGC0309搭載として販売されていたため、その前提で動作確認を始めました。しかし、SCCB/I2Cでレジスタを読めるようになった段階で、実機のID値がその前提と一致しないことが分かりました。

7-bitアドレス0x21でACKを確認し、STOP→STARTを用いたReadで複数レジスタを読み出しました。今回の個体では、0x0A=0x76、0x0B=0x73、0x1C=0x7F、0x1D=0xA2を確認しました。これらの値から、評価個体はGC0309ではなくOV7670系として扱うのが妥当と判断しました。

この経験から、型番や販売ページだけでセンサを決め打ちせず、初期化の前にIDレジスタを実機で読むことが重要だと分かりました。モジュールの世代差や部品変更がある場合でも、通信層とセンサ固有設定を切り分けやすくなります。

RP2040との配線

今回の評価では、RP2040側を次のように割り当てました。

信号RP2040
SDAGP0
SCLGP1
D2〜D9GP2〜GP9
PCLKGP10
VSYNCGP11
HSYNCGP12
MCLK外部24 MHz

写真のようなブレッドボード上の試作配線で、まずは回路と信号の基板検証を行いました。最初にMCLKとSCCB通信を確認し、その後にVSYNC、HSYNC、PCLK、データバスへ進む順序にしています。画像が出ない場合でも、どの層まで動作しているかを切り分けやすくなります。

同期信号とQQVGAの実測

OV7670系として設定した後、センサ側でQQVGA 160×120、YUV422出力を設定しました。実測では、1フレームあたり120本のHSYNC、1ラインあたり320回のPCLKを確認し、フレーム周期は約30.012 fpsでした。

160画素のYUV422では1画素あたり平均2 byteが流れるため、1ライン320 PCLKという結果は設定と整合します。ここで重要なのは、センサ自体が約30 fpsで動いていても、マイコンからPCまで含めた実効fpsは別物だという点です。

PIO+DMAによるY成分取得

画像取得では、RP2040のPIOとDMAを用いてデータを受け、YUV422から輝度Yのみを扱う構成を評価しました。センサ側QQVGAを直接用いた場合、160×120のグレースケール画像は1フレーム19,200 byteです。

PC側には、受信したグレースケール画像とFPS、CRCエラー数、フレームドロップ数を確認できる表示アプリも用意しました。これにより、画像内容だけでなく、転送が継続しているかや実効フレームレートも同時に確認できます。

OV7670の160×120グレースケール画像を表示し、FPS、CRC、Dropを確認するPC側アプリ
PC側の表示アプリ。160×120のグレースケール画像を表示しながら、FPS、CRCエラー、フレームドロップを確認しました。この画面ではFPS 15.0、CRC 0、Drop 0を示しています。

PC側で表示・録画まで行った安定動作時の実効値は15.01 fpsでした。380フレームを連続取得した試験では、Good frames=380、CRC errors=0、header errors=0、payload errors=0、frame ID drops=0を確認しました。少なくともこの試験区間では、フレーム欠損や通信破損なしで画像を搬送できています。

解像度と実効fpsの比較

同じ系統で取得方法を変えたときの実効fpsを比較しました。

取得方法出力実効fps
320×240取得QVGA5.24 fps
Pico側で間引き160×12012.21 fps
センサ側でQQVGAへ縮小160×12015.01 fps

今回の条件では、QVGAを取得してからRP2040側で捨てるよりも、センサ側で最初からQQVGAを出力した方が高い実効fpsを得られました。低帯域・低資源環境では、「取得してから削る」より「センサから必要な量だけ出す」設計が有効だと考えられます。

一方で、センサのフレームレート約30 fpsに対してPCまでの実効値は約15 fpsです。したがって、今後は取得処理、USB/シリアル転送、PC側処理を分けて時間計測し、どこが支配的なボトルネックかを定量化する必要があります。

低帯域カメラ研究への展開

ここまでが実装・実測済みの内容です。次の段階では、高速動画用途ではなく、小型・低コスト・低帯域の視覚センサとして次の研究候補を検討しています。

これらは現時点では研究候補であり、性能を実証したものではありません。まずは実効fps、取得時間、転送時間、欠損率、長時間安定性を測定し、用途ごとの実現可能性を判断していきます。

関連する記事・取り組み

共同研究、技術検証に関するご相談はこちら。