基板上の部品温度を測りたくて、どうせなら熱電対とテスターで測るより温度分布を可視化してみたいと思い立ち、手持ちの Arduino UNO R4 でサーモグラフィカメラを作ってみる事にしました。そこで赤外線アレイセンサとカメラモジュールのピックアップから始めました。

赤外線センサとカメラモジュールの選定

AMG88xx

Panasonic 赤外線アレイセンサ Grid-EYE
Panasonic の製品紹介ページから

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

SparkFun IR Array Breakout - 110 Degree FOV, MLX90640 (Qwiic) - SEN-14843 - SparkFun Electronics
SparkFun の製品紹介ページから

ベルギーの半導体メーカー MelexisMLX90640(32×24 画素、測定範囲 -40℃ ~ 300℃)を搭載した Adafruit 製や SparkFun 製のカメラモジュールが DigiKeyスイッチサイエンス で購入出来ます。しかし価格が1万数千円もするので、同程度の性能と思われる出来合いのカメラを買った方が安く済みますネ。一方価格が半値程度の中国製 GY-MCU90640 が AliExpress から購入可能です。

どの製品も FOV が 55°と 110°の2タイプがあり、用途に応じて選べるのが良さげです。

それにしても SparkFun のデモ画像に写っている人は、少なくとも上半身が裸じゃないでしょうか? 服と肌の温度差がないなんて…   SparkFun の サンプルプログラム では表示の温度域が動的に変わり、前景(人)と背景(環境温度)を分ける程度の色使いになることが分かりました。

Lepton

マイクロサイズのLWIRカメラモジュール Lepton
Lepton の製品紹介ページから

フリアーシステムズ社Lepton というシリーズ。Amazon で flir lepton を検索 すると、ハンディタイプやスマホに繋げるタイプなど、カメラとしてのラインナップが豊富です。

組み込み用のセンサとして、画素数が 80×60 の Lepton 2.x と 160×120 の Lepton 3.x があり、カメラモジュールは マルツオンラインスイッチサイエンス で販売されています。解像度が高いのが魅力ですが、センサとブレイクアウトボードを合わせて5万円前後〜とかなりお高いです。

センシング原理のお勉強

AMG88xx や MLX90640 は、複数の 熱電対 を組み合わせた サーモパイル でセンサアレイを構成したもので、ココ に詳しい解説を見つけました。また紹介した2つ以外にも、各社から サーモパイル赤外線センサ が製品化されています。

サーモパイルは身近なところで言えば、数秒で測れる「耳で測る体温計」に使われていて、比較的低コストかつサーミスタなどに比べ応答が早いことが特徴です。

出典:CORNES Technologies
出典:CORNES Technologies

一方の Lepton は、マイクロボロメータ をセンシング原理としています。高解像度化が可能な一方、パッケージ化による断熱構造 が必要なことから、サーモパイルアレイより高価となっています。

スマートフォン用やハンディタイプのフリアー製品なら AliExpress や Amazon で購入可能ですが、米国輸出規制 に該当する Lepton の高性能なモジュールは、趣味での個人購入は NG と思います。

ご参考

選定結果

AliExpressでのお買い物

今回の用途では近距離で広い範囲を観測する事とコスパを重視し、MLX90640 の 110°タイプを調達する事にしました。

問題は価格を取るか品質をとるかですが、結局は中国のコストカット・エンジニアリングの凄さを感じる GY-MCU90640 に決めました。

また UNO R4 で動作しなかった時のために ESP32 のクローンボード(¥659)と、ついでに「2.4 インチ、タッチスクリーン + SD カードスロット付きカラー LCD」(ナント ¥159 !!)を購入しちゃいました。

ESP32 の方はLチカ程度の動作確認ができましたが、LCD は 自治体の小型家電リサイクルボックス行きが濃厚です   グラフィック表示とタッチスクリーンは動作しましたが、SD カードで Could not find FAT16/FAT32 partition. のエラーが出て、苦戦中です :persevere:

ハードウェア

あらためて、試作したサーモグラフィカメラを構成する部品の仕様を確認します。

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 ネットワークに直接接続できます。

MLX90640 回路図
MLX90640 回路図

回路図を見ると、I2C は 1KΩ でプルアップされており、外付けのプルアップは不要です。 :point_right: 必要でした!! 囲み記事を参照願います。

また I2C クロックは 400KHz が標準で、最大 1MHz、スレーブアドレスは 0x33 がデフォルト(変更可能)です。

測定対象の最大温度は 300℃ ですが、内蔵されたチップの周囲温度を測定する温度センサと VDD を制御する電流センサで動作温度が 85℃ までの素子を保護している(あるいはアプリケーションでの保護が必要)と思われます。また EEPROM を内蔵しているので、スレーブアドレスや 放射率 など各種設定値の保存が可能です。

プルアップ抵抗について
GY-MCU90640 上の ARM チップ
GY-MCU90640 上の ARM チップ

回路図上の “MCU” は GY-MCU90640 に載っている ARM チップのことだと早とちりをしてしまいました。

ソフトウエア編 で、プルアップ抵抗の有無が SCL の波形に与える影響をオシロスコープで観測してるので、詳しくはそちらをご覧ください。

GY-MCU90640

GY-MCU90640 の端子
GY-MCU90640 の端子

近接撮像用の視野角が 110°× 75°の MLX90640BAA を搭載したカメラモジュールです。各端子の定義を下の表に示します。

GY-MCU90640 ユーザマニュアル によれば、シリアル通信用の RX/TX 端子を CH340 や FT232 とつなげば、PC との USB 接続が可能とのことですが、確認はしていません。

一方 I2C は「PSGND に落とす」か「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_MLX90640
ライブラリの依存関係

adafruit/Adafruit_MLX90640 に Melexis 版ドライバを簡単に扱うための 独自 API を含んだライブラリパッケージが 公開されています。

Arduino IDE へのインストール時には Adafruit Arcada 1 への依存から、多数の(余計な) 関連するライブラリのインストールが促されますが、「依存関係なしにインストール」で OK です。

ワイヤリング

UNO R4 ⇄ GY-MCU90640 (I2C)、および UNO R4 ⇄ LCD(SPI)の電圧レベルを合わせるため、それぞれロジックレベル変換回路と分圧抵抗を噛ませています。その関係でワイヤリングは ご覧の通り です。動作確認が終わったら、何とかしなくちゃです。

MLX90640 と 240x240 SPI LCD の結線
MLX90640 と 240x240 LCD
MLX90640 と 240x240 SPI LCD の実際
実際のワイヤリング

動作確認

1ステップずつ、確実に進めます。信頼性の低いハードウェアを含む場合は特にですね。動作確認した最終的なスケッチは GitHub に上げてあります。

MLX90640 との I2C 接続を確認する

I2cScanner のスケッチをコンパイル&アップロードし、シリアルモニターで以下の出力が確認できれば OK です。

I2C Scanner
Scanning...
I2C device found at address 0x33  !
done

MLX90640 の出力を確認する

ライブラリ adafruit/Adafruit_MLX90640 をインストールしたら、Arduino IDE メニューの「ファイルスケッチ例Adafruit MLX90640」から MLX90640_simpletest を開き、そのままコンパイルします。

最大262144バイトのフラッシュメモリのうち、スケッチが84316バイト(32%)を使っています。
最大32768バイトのRAMのうち、グローバル変数が20144バイト(61%)を使っていて、ローカル変数で12624バイト使うことができます。

キッチリ 20Kバイトが使われてますが、まだ少し余裕がありますね。続いてアップロードすると、setup() がシリアルモニタに以下を出力します。

Found Adafruit MLX90640
Serial number: 1B0FFBCE18B
Current mode: Chess
Current resolution: 18 bit
Current frame rate: 2 Hz

さらに loop() からは、32×24 の各画素値を2℃毎に刻んだアスキー文字が 0.5 秒毎に出力されるので、カメラに手をかざすなどして文字が変われば動作 OK です。

===================================
Ambient temperature = 37.56 degC


#############%%%#####%########%%
###X########%#%###%#############
################################
###X##########%#################
################################
##############%###############%#
###############################%
###X########################%#%#
#XXX#########################%#%
X###########################%#%%
##############################%%
############################%#%%
%####%#%###################%#%#%
%#%%%#%###################%#%###
%%%%%###########################
%%##############################
%%%%%%##########################
%%#%#%%#########################
#%#########%###%################
%%%%############%###########%###
%%%%%##%%%#%#%################%%
%%%%%#%###%%%%#%##############%%
%%%%%%%%#%#%#%###############%%%
%%%%%%%%%%%%%##%%%##########%%%x

フレームレートの調整

MLX90640 のリフレッシュレート(上げすぎると露光時間が短くなりノイズが増える)と I2C のシリアルクロック周波数を調整すると、UNO R4 では 5FPS 強まで行きますが、4FPS 程度が安定するようです。

  mlx.setRefreshRate(MLX90640_4_HZ);
  Wire.setClock(400000); // 400 KHz
市松模様の露光パターン
市松模様の露光パターン

実際には市松模様に露光した2枚の画像を合成して1枚の温度画像にしているので、表示上のフレームレートは 2FPS です。

合成するまでのフレーム間の時間差により、動きの早い対象の撮像はブレも大きくなりますが、今回の目的からすれば、さほど問題にはならないと考えています。

サーモグラフィを確認する

MLX90640 の出力をカラー化するには、スケッチ例「MLX90640_arcadaCam」をベースに、Adafruit Arcada のグラフィック用コードを使用する LCD 用に置き換えるのが簡単です。

僕の場合、「マルチタスク風プログラミングで作るArduinoのブロック崩し」で使った 240×240 の LCD をそのまんま流用しました。

昨今の地球温暖化で気温が体温より高いと人体は判別できませんが、28℃ の室内でカメラから 60cm 程度離れて手を上げ :raising_hand_man: たり、20cm 程度の距離で :fist: :v: :raised_hand_with_fingers_splayed: した程度なら、目視で判別ぐらいは出来そうです。

このあとは…

今のバラックのままでは “カメラ” とは言い難いので何とかしたいですし、ギザギザの画像を滑らかにしたり補間して擬似的に解像度を上げたりしていきたいと思います :camera:

参考情報


  1. PyGamer や PyBadge といった Adafruit 製ゲーム開発基板向けにハードウェアを抽象化したライブラリ。