戻る

サーモカメラモジュール SSV32x32を使う    2024/01/13


関連ファイル(回路図、プログラム)のダウンロード


SSV32x32は秋月電子で購入できる、SSC社の32×32ピクセルのサーモカメラモジュールです。

秋月電子商品ページへのリンク

SSC社製品ページへのリンク


カメラモジュールの特徴

このモジュールからデータを読みだして、パソコンで読めるようにしてみます。

ハードウェアの構成

マイコンボードとして、Seeeduino XIAO(ARM Cortex M0+版)を使いました。
ピン数は少ないですが、下記のような特徴があります。

回路

単純に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パソコンが手元にないので動作確認ができません)