サーモカメラモジュール SSV32x32を使う 2024/01/13
SSV32x32は秋月電子で購入できる、SSC社の32×32ピクセルのサーモカメラモジュールです。
カメラモジュールの特徴
このモジュールからデータを読みだして、パソコンで読めるようにしてみます。
ハードウェアの構成
マイコンボードとして、Seeeduino XIAO(ARM Cortex M0+版)を使いました。
ピン数は少ないですが、下記のような特徴があります。
- 値段が安い。
- 処理速度も速い。
- パソコンと高速に通信ができる。
- Arduino環境で開発できる。
回路
単純にI2Cを接続して終わりかと思っていたのですが、意外に面倒でした。
XIAOは3.3Vで動作しますが、カメラモジュールのSSV32x32が5Vです。
下はSSV32x32のデータシートからの抜粋です。
I2Cラインを外部でVDD(5V)でプルアップするようになっています。その上で、VIHmin が0.7VDD (VDDが5Vなら3.5V)ということですので、3.3VのI2Cには繋ぐことができません。
そのため、はじめは秋月電子で売っているレベルコンバータモジュールを使って、カメラモジュールの5VのI2Cとマイコンの3.3VのI2Cを変換したものを作りました。
でも、もっとシンプルにできないものかと考えて、カメラモジュールのI2Cまわりを探ってみることにしたのです。
※注 以下の解析は、私が手にしたモジュールのものです。内容が変わっている場合もあります。
また、この内容についてメーカーのSSCさんに問い合わせをすることは避けてください。
モジュール内でも5V系でプルアップされています。
マイコンは、ルネサスの R5F52318ADNE です。このマイコンのI2Cポートは、5Vトレラントなので、マイコンの電源電圧が3.3V(実測3.4V)でも問題はありません。
マイコンのデータシートによると、このポートのVIHminは 0.8VCC、VILmax は0.2VCCなので、3.3VのI2Cと直結しても、カメラモジュールの電圧レベルは問題はなさそうです。
XIAOのマイコンのI2Cは5Vトレラントではなく、絶対最大定格ではポートの入力電圧maxについて、VCC+0.6V とされています。
I2CのプルアップがSSV32x32内の10kΩだけだとさすがに抵抗値が高すぎなので、外部で、3.3V 2.2kΩでプルアップすることにします。
そうすると、合成のプルアップ電圧は3.55Vになります。ちょっと高めですが、VCC+0.6Vより下ではあるので、これでもいいことにしました。
プルアップ電圧が3.3Vより高いことが気になる場合は、カメラモジュールのR6、R8を除去してもいいでしょう。
全体の回路です
カメラモジュールは1.5mmピッチのコネクタですが、インターフェース回路はユニバーサル基板に組んだので、2.5mmピッチのXHコネクタを使いました。
XIAOには細ピンのヘッダーを付けたので、一般的な丸ピンICソケットで載せられます。
部品面
はんだ面
接続した様子
ファームウェア
Arduino IDE 1.8.19に、Seeed SAMDをインストールして開発しました。
スケッチ(プログラム)自体はコマンドをパソコンからUSB(仮想シリアル)で受けて、I2CでSSV32x32に送り、SSV32x32から読み出したデータをパソコンに返すだけのものです。
ところが、ひとつ問題が発覚しました。
下はSSV32x32のデータシートから、データ読み出しの部分を抜き出したものです。
SSV32x32からのイメージデータの読み出しは、2048バイトの一気読みです。
一方で、ArduinoのSAMD版のWireは、256バイトのバッファしかないようです。(通常のAVR版は32バイト)
実は、岡田はArduinoはライトユーザーでして、こんなときにどうするべきなのかをよくわかっていません。
諦めが早いので、ArduinoのSAMD版のWire.cppのソースに手を入れて、バッファのサイズを2400バイトにしました。
パソコン用ソフトウェア
Visual Studio 2022 Community C# で作った WinForms アプリです。
Windows 10/11 で動作確認をしています。
以前に調べたときに、LinuxのMono環境のSerialPortがイベント受信ができない様子だったので、シリアル通信は習慣的にポーリング受信になっています。
このプログラムも、一度はUbuntuでの動作を確認しています。(←少し古い情報です。今はLinuxパソコンが手元にないので動作確認ができません)