基板の温度分布測定用にArduinoでサーモグラフィカメラを作る - 動作確認編
基板上の部品温度を測りたくて、どうせなら熱電対とテスターで測るより温度分布を可視化してみたいと思い立ち、手持ちの Arduino UNO R4 でサーモグラフィカメラを作ってみる事にしました。そこで赤外線アレイセンサとカメラモジュールのピックアップから始めました。
赤外線センサとカメラモジュールの選定
AMG88xx
Panasonic 製 赤外線アレイセンサ Grid-EYE シリーズのうち、8×8 画素(88)、3.3V(3)、ハイゲインタイプ(3)の AMG8833 が良さそうです。測定温度範囲は 0℃ ~ 80℃ で、FOV が 60°、最大検知距離は 7m と、家電や設備での人検知が想定用途のようですね。
Arduino IDE のライブラリマネージャで「AMG88」を検索すれば Adafruit、SparkFun のライブラリがインストールできるので、開発もし易そうです。秋月電子の AMG8833使用 赤外線アレイセンサー(Grid-EYE)モジュール(¥3,980)なら、ロジックレベル変換やプルアップ抵抗も載っているので、UNO R4 の I2C ピンに直接接続できるのも良いと思います。
MLX90640
ベルギーの半導体メーカー Melexis の MLX90640(32×24 画素、測定範囲 -40℃ ~ 300℃)を搭載した Adafruit 製や SparkFun 製のカメラモジュールが DigiKey や スイッチサイエンス で購入出来ます。しかし価格が1万数千円もするので、同程度の性能と思われる出来合いのカメラを買った方が安く済みますネ。一方価格が半値程度の中国製 GY-MCU90640 が AliExpress から購入可能です。
それにしても SparkFun のデモ画像に写っている人は、少なくとも上半身が裸じゃないでしょうか? 服と肌の温度差がないなんて… SparkFun の サンプルプログラム では表示の温度域が動的に変わり、前景(人)と背景(環境温度)を分ける程度の色使いになることが分かりました。
Lepton
フリアーシステムズ社 の Lepton というシリーズ。Amazon で flir lepton を検索 すると、ハンディタイプやスマホに繋げるタイプなど、カメラとしてのラインナップが豊富です。
組み込み用のセンサとして、画素数が 80×60 の Lepton 2.x と 160×120 の Lepton 3.x があり、カメラモジュールは マルツオンライン や スイッチサイエンス で販売されています。解像度が高いのが魅力ですが、センサとブレイクアウトボードを合わせて5万円前後〜とかなりお高いです。
センシング原理のお勉強
AMG88xx や MLX90640 は、複数の 熱電対 を組み合わせた サーモパイル でセンサアレイを構成したもので、ココ に詳しい解説を見つけました。また紹介した2つ以外にも、各社から サーモパイル赤外線センサ が製品化されています。
サーモパイルは身近なところで言えば、数秒で測れる「耳で測る体温計」に使われていて、比較的低コストかつサーミスタなどに比べ応答が早いことが特徴です。
一方の Lepton は、マイクロボロメータ をセンシング原理としています。高解像度化が可能な一方、パッケージ化による断熱構造 が必要なことから、サーモパイルアレイより高価となっています。
スマートフォン用やハンディタイプのフリアー製品なら AliExpress や Amazon で購入可能ですが、米国輸出規制 に該当する Lepton の高性能なモジュールは、趣味での個人購入は NG と思います。
ご参考
選定結果
今回の用途では近距離で広い範囲を観測する事とコスパを重視し、MLX90640 の 110°タイプを調達する事にしました。
問題は価格を取るか品質をとるかですが、結局は中国のコストカット・エンジニアリングの凄さを感じる GY-MCU90640 に決めました。
ESP32 の方はLチカ程度の動作確認ができましたが、LCD は 自治体の小型家電リサイクルボックス行きが濃厚です グラフィック表示とタッチスクリーンは動作しましたが、SD カードで Could not find FAT16/FAT32 partition.
のエラーが出て、苦戦中です
ハードウェア
あらためて、試作したサーモグラフィカメラを構成する部品の仕様を確認します。
CPU ボード
温度画像用フレームバッファの関連だと思いますが、20Kバイト以上の RAM 容量が要求されるため、Raspberry Pi や ESP32 系、Teency 系の実装例が多く見られます。ただし Nano や R4 以前の Uno でも動作するドライバ作っちゃった人 がいるので、少ないメモリの CPU でチャレンジするのもアリかもしれません。
RAM が 32Kバイトの UNO R4 で動作するかどうか心配でしたが、無事に動きました。
MLX90640
MLX90640 データシート の 11 ページ「10.2. Communication protocol」には、以下の記述があります。
赤外線センサの他に MCU が内蔵されていて、Fast Mode Plus(最大 1MHz のクロック周波数)の I2C プロトコルを使用サポートしています。また SDA ポートと SCL ポートは 5V トレラントで、センサーは 5V 系の I2C ネットワークに直接接続できます。
回路図を見ると、I2C は 1KΩ でプルアップされており、外付けのプルアップは不要です。 必要でした!! 囲み記事を参照願います。
また I2C クロックは 400KHz が標準で、最大 1MHz、スレーブアドレスは 0x33 がデフォルト(変更可能)です。
測定対象の最大温度は 300℃ ですが、内蔵されたチップの周囲温度を測定する温度センサと VDD を制御する電流センサで動作温度が 85℃ までの素子を保護している(あるいはアプリケーションでの保護が必要)と思われます。また EEPROM を内蔵しているので、スレーブアドレスや 放射率 など各種設定値の保存が可能です。
プルアップ抵抗について
回路図上の “MCU” は GY-MCU90640 に載っている ARM チップのことだと早とちりをしてしまいました。
ソフトウエア編 で、プルアップ抵抗の有無が SCL
の波形に与える影響をオシロスコープで観測してるので、詳しくはそちらをご覧ください。
GY-MCU90640
近接撮像用の視野角が 110°× 75°の MLX90640BAA を搭載したカメラモジュールです。各端子の定義を下の表に示します。
GY-MCU90640 ユーザマニュアル によれば、シリアル通信用の RX/TX 端子を CH340 や FT232 とつなげば、PC との USB 接続が可能とのことですが、確認はしていません。
一方 I2C は「PS
を GND
に落とす」か「SET I2C
の短絡」で使用可能になります。秋月電子で コネクター付コード 4P 黒赤青黄 や SHコネクターDIP化キット を購入すれば UNO R4 WiFi の Qwiic 端子 が使えると思います(順次、確認していく予定です)。
端子 | 定義 |
---|---|
VCC | 電源 (+3V〜+5V) |
GND | グランド |
RX | シリアル通信用データ受信 |
TX | シリアル通信用データ送信 |
SCL | MLX90640 用シリアルクロック |
SDA | MLX90640 用シリアルデータ |
PS | モジュール機能設定用スイッチ |
ロジックレベル変換
MLX90640 が 5V トレラントで、GY-MCU90640 の動作電圧も 3V 〜 5V なので、直接 UNO R4 の I2C(D18、D19 ピン)に接続できそうですが、安い部品ではないし、UNO R4 WiFi の Qwiic に挿せるというメリットもあり、5V ⇄ 3V のロジックレベル変換をかませる事にしました。
現在、秋月電子の 4ビット双方向ロジックレベル変換モジュール BSS138使用 の2ビット分を使って動作しています。
ソフトウェア
-
Melexis 版(ドライバ)
Melexis が melexis/mlx90640-library に公開している MLX90640 用ドライバです。ただし 不足ファイルがある ため、実際には SparkFun 版か Adafruit 版を使うことになります。 -
SparkFun 版(サンプルプログラム)
Melexis 版をベースに sparkfun/SparkFun_MLX90640_Arduino_Example に3つの例題が公開されています。-
Example1_BasicReadings
EEPROM に保存されたデータを読み出し、幾つかの画素の温度を表示するサンプルです。 -
Example2_OutputToProcessing
Example1 に加え、全画素の温度をシリアル経由で PC に転送し Processing で可視化するサンプルです。 -
Example3_MaxRefreshRate
リフレッシュレートや I2C シリアルクロックを変えて試すコードが追加されている以外は Example2 と同じです。
-
-
Adafruit 版(ライブラリ)
adafruit/Adafruit_MLX90640 に Melexis 版ドライバを簡単に扱うための 独自 API を含んだライブラリパッケージが 公開されています。
Arduino IDE へのインストール時には Adafruit Arcada 1 への依存から、多数の(余計な) 関連するライブラリのインストールが促されますが、「依存関係なしにインストール」で OK です。
ワイヤリング
UNO R4 ⇄ GY-MCU90640 (I2C)、および UNO R4 ⇄ LCD(SPI)の電圧レベルを合わせるため、それぞれロジックレベル変換回路と分圧抵抗を噛ませています。その関係でワイヤリングは ご覧の通り です。動作確認が終わったら、何とかしなくちゃです。
動作確認
1ステップずつ、確実に進めます。信頼性の低いハードウェアを含む場合は特にですね。動作確認した最終的なスケッチは GitHub に上げてあります。
MLX90640 との I2C 接続を確認する
I2cScanner のスケッチをコンパイル&アップロードし、シリアルモニターで以下の出力が確認できれば OK です。
MLX90640 の出力を確認する
ライブラリ adafruit/Adafruit_MLX90640 をインストールしたら、Arduino IDE メニューの「ファイル → スケッチ例 → Adafruit MLX90640」から MLX90640_simpletest を開き、そのままコンパイルします。
キッチリ 20Kバイトが使われてますが、まだ少し余裕がありますね。続いてアップロードすると、setup()
がシリアルモニタに以下を出力します。
さらに loop()
からは、32×24 の各画素値を2℃毎に刻んだアスキー文字が 0.5 秒毎に出力されるので、カメラに手をかざすなどして文字が変われば動作 OK です。
フレームレートの調整
MLX90640 のリフレッシュレート(上げすぎると露光時間が短くなりノイズが増える)と I2C のシリアルクロック周波数を調整すると、UNO R4 では 5FPS 強まで行きますが、4FPS 程度が安定するようです。
実際には市松模様に露光した2枚の画像を合成して1枚の温度画像にしているので、表示上のフレームレートは 2FPS です。
合成するまでのフレーム間の時間差により、動きの早い対象の撮像はブレも大きくなりますが、今回の目的からすれば、さほど問題にはならないと考えています。
サーモグラフィを確認する
MLX90640 の出力をカラー化するには、スケッチ例「MLX90640_arcadaCam」をベースに、Adafruit Arcada のグラフィック用コードを使用する LCD 用に置き換えるのが簡単です。
僕の場合、「マルチタスク風プログラミングで作るArduinoのブロック崩し」で使った 240×240 の LCD をそのまんま流用しました。
昨今の地球温暖化で気温が体温より高いと人体は判別できませんが、28℃ の室内でカメラから 60cm 程度離れて手を上げ たり、20cm 程度の距離で した程度なら、目視で判別ぐらいは出来そうです。
このあとは…
今のバラックのままでは “カメラ” とは言い難いので何とかしたいですし、ギザギザの画像を滑らかにしたり補間して擬似的に解像度を上げたりしていきたいと思います
参考情報
-
Far infrared thermal sensor array (32x24 RES)
MLX90640 の製品紹介ページです。 -
MLX90640 データシート
赤外線センサアレイ MLX90640 の Melexis 公式データシートです。 -
GY-MCU90640 ユーザマニュアル
GY-MCU90640 の製造元が特定できず、公式のドキュメントも見つかりませんでした。私的なものかもしれませんが、唯一見つけたマニュアルです。 -
sparkfun/SparkFun_MLX90640_Arduino_Example
SparkFun によるサンプルコードで、Melexis 公式の MLX90640 ドライバとドキュメント一式を含んでいます。 -
adafruit/Adafruit_MLX90640
Adafruit による MLX90640 用ライブラリです。こちらも Melexis 公式の MLX90640 ドライバとドキュメント一式を含んでいます。
-
PyGamer や PyBadge といった Adafruit 製ゲーム開発基板向けにハードウェアを抽象化したライブラリ。 ↩