今回は昨年から試行錯誤しながら取り組んでいるプロジェクト(USBカメラ変換基板プロジェクト)について紹介します。組込系でカメラ機能を利用する場合、昨今ではOpenMVやM5Camera、ESP32-Cam等を利用することが多いと思います。マイコンとカメラを接続する場合、一般的に下記の接続方法があります。
接続方法 | メリット | デメリット | 製品例 |
SPI | 伝送が高速 ローエンドマイコン対応 | 機種によってコマンド互換なし 低解像度 | Arducam等 |
UART | 省配線 コマンド互換少し有 ローエンドマイコン対応 | 伝送が低速 低解像度 | シリアルカメラ等 |
NTSC+SPI | 伝送が高速 汎用NTSCカメラ対応 | NTSCカメラ自体の入手性 バッファメモリ必須 解像度固定 | TVP5150等でSPI変換 |
パラレル | 伝送が高速 高解像度 | 配線が多い ハイエンドマイコンのみ対応 | カメラモジュール等 |
MIPI | 伝送が超高速 高解像度 | 専用IF必須 ハイエンドマイコンのみ対応 | |
HDMI | 伝送が超高速 高解像度 | 変換IC必須 ハイエンドマイコンのみ対応 | TFP401等で変換 |
カメラユニット | 低コスト 筐体ケース付きがある | 別途ファーム書き込み必要 | OpenMV M5Camera ESP32-Cam HuskyLens |
USBカメラ | USB汎用接続 ケーブル延長容易 入手性が良い | UVCホストの実装が複雑 USB1.1では動作しないカメラ有 解像度の制約が多い | Logicool C270、C920等 |
SPI接続やUART接続の場合、予めバッファがカメラ側に内蔵されていることが多いため、マイコン側に大容量メモリがなくても最低限の処理が可能です。一方、パラレル接続やMIPI接続の場合はイメージセンサからほぼそのまま出力されるため、それに対応した高速なインタフェースと読み出しデータを保持するための大容量メモリが必須となります。ユニットとして販売されているものは公開されているファームを書き込むだけで簡単に動作確認や実装できるために便利ですが、生産終了やロットによる機能差等が生じる場合が多々あります。多くのカメラモジュールで使用されるイメージセンサは主にスマートフォン向けのため、カメラモジュールの生産終了や型式変更等が頻繁で継続した安定入手に難があります。
上記の方法の中でUSBカメラやNTSCカメラを使用する場合、汎用的なIFで継続して安定入手が可能です。ただ、そのままでは容易に使うことが難しいのが課題です。そのため、単体や小規模のマイコンでも簡単に処理できるUSBカメラ変換基板を開発することにしました。
コンセプトは下記の通りです。
・汎用的なUSBカメラから画像取得(jpeg、bmp対応)
・単体でSDカード等に画像ファイルを保存
・簡易的なタイムラプス撮影ができる
・UARTやSPIを介した低解像度の画像取得
実際に開発したUSBカメラ変換基板です。
もともとはSTM32マイコンで実装予定でしたが、HALライブラリではIsochronous転送に失敗してうまく転送できない、昨今の半導体不足で入手困難であるため、断念。FTDIのVinculumではRTOSのオーバーヘッドが無視できず、SPIの転送速度が遅すぎて断念しました。最終的にPIC32MZマイコンを用いて実装しました。PIC32MZはUSB2.0 High Speedに対応しているため、多くのUSBカメラに対応できます。
SPIを介してLCDを接続してBMPデータを描画させてみました。
カメラや設定によって異なりますが、1秒間に10フレーム弱程度で比較的スムーズにLCDに表示させることができました。
また、10秒間隔でのタイムラプス撮影をして後からコマ送りで動画に編集してみました。今後はサンプルコードや利便性の向上、対応カメラの追加、機能追加等を検討したいと思います。随時こちらに更新情報を追加したいと思います。