M5Stackでサーモグラフィを作りkintoneにデータを蓄積し可視化する（前編）

## 概要
[M5Stack](https://m5stack.com/)は[ESP32](https://ja.wikipedia.org/wiki/ESP32)（Wi-FiとBluetoothを内蔵する低コスト、低消費電力なSoCのマイクロコントローラ）に、SDカードスロット、ボタン、USBやGroveのコネクタを5cm四方の基板に搭載し、ディスプレイや電源までを樹脂のケースに詰め込んだモジュールです。

このM5StackにはMLX90640 サーモパイルセンサを搭載したミニサーマルカメラユニットがあり、スイッチサイエンスなどで1万円程度で販売されています。このユニットを使うと以下のような安価なサーモグラフィーが作れます。（写真はRaspberry piの通信基板をサーモグラフィーで表示した様子）

![M5StackのサーモグラフィーでRaspberry Piの通信基板温度を計測](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/9facf113-d436-5607-eef0-8fd82adf0016.jpeg)

先ず前編ではM5Stackでサーモグラフィーを作成するまでを解説し、後編ではM5Stackのサーモグラフィーのデータをkintoneに蓄積し可視化するまでを解説します。

## 利用機器
今回はM5Stack本体は[M5Stack FIRE](https://docs.m5stack.com/#/en/core/fire)を用います。M5Stack FIREは背面がLEGOと互換性があり、LEGOでミニサーマルカメラを背面に配置できる使いやすい筐体です。
![IMG_6475.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/4773c0af-139b-39f3-33e6-56edfd54e367.jpeg)

サーモグラフィー用の計測センサは、M5Stack用のミニサーマルカメラユニットを用います。ミニサーマルカメラユニットはMLX90640 サーモパイルセンサを搭載し、GROVEのI2Cポートで値を取得します。

__ミニサーマルカメラユニットスペック__
・動作電圧: 3V ～ 3.6V
・消費電流: 23mA
・視野角: 55度×35度
・測定可能範囲: -40℃÷300℃（±1.5℃）
・解像度: 32x24 pixels
・動作温度: -40℃～85℃

M5Stack FIREとミニサーマルカメラユニットは、SWICHISIENCEで合計16,665円（執筆時点）で入手できます。

M5Stack FIRE（SWICHISIENCE）
https://www.switch-science.com/catalog/3953/

M5Stack用ミニサーマルカメラユニット（SWICHISIENCE）
https://www.switch-science.com/catalog/4056/

## 開発環境
Arduino IDEで開発を行います。
開発環境の説明は省略しますが、知りたい方は以下の情報などを参考にすると良いでしょう。

Windows ではじめるM5Stack
https://qiita.com/xzr_tw/items/3363a500b4503e424d8b

初心者向けM5Stackの始め方（ArduinoIDE編）
https://raspberrypi.mongonta.com/howto-start-m5stack-arduinoide/

## 開発手順
### サンプルプログラムを入手する
M5Stack Docsの[Unit THERMAL](https://docs.m5stack.com/#/en/unit/thermal)の解説ページのExampleで紹介しているGitHubのリンク先を参照し、MLX90640のフォルダを展開し、サンプルプログラムの「MLX90640.ino」をArduino IDEで開きます。

m5stack/M5-ProductExampleCodes
https://github.com/m5stack/M5-ProductExampleCodes/tree/master/Unit/THERMAL/Arduino

また、Arduino IDEの「ファイル」、「スケッチ例」、「M5Stack」、「Unit」、「MLX90640」でもサンプルプログラムを開くことができます。

### Arduino IDEの設定
M5Stack-FIRE をUSBケーブルでPCと接続します。
Arduino IDEの「ツール」、「ボード」で __M5Stack-FIRE__ を選択します。
Arduino IDEの「ツール」、「シリアルポート」で、該当するシリアルポートを選択します。（シリアルポートの候補が表示されるはずです）

### サンプルプログラムの不具合を修正
但し、サンプルプログラムにはバグがあり、そのままでは動きません。以下の情報を参考にソースコードを修正します。

M5Stackにサーマルカメラをつなぐ
https://ambidata.io/samples/m5stack/thermalcamera/

__MLX90640_I2C_Driver.cpp__ ソースコード内を __”Wire.endTransmission”__ で検索し、以下のように修正します。 
但し、GitHubから最新版を入手した場合は、すでにソースコードが修正されていますので対応する必要はありません。
※以降のソースコードファイルの拡張子は .cpp や .ino ですが、コードの紹介をC言語用のカラーで見やすくするため .c に変更しました。

``` MLX90640_I2C_Driver.c
// 修正前
if (Wire.endTransmission(false) != 7) //Do not release bus

// 修正後
if (Wire.endTransmission(false) != 0) //Do not release bus
```

__MLX90640.ino__ ソースコードの127行目をコメントアウトします。
これはバグとは言い切れませんが、シリアルからのTrueの応答が得られず永久ループする場合があります。ここでシリアルからの応答を確認しなくても問題なく利用できますので、余計なロジックを残すよりコメントアウトすることをお勧めします。

``` MLX90640.c
// 修正前
while (!Serial); //Wait for user to open terminal

// 修正後
//while (!Serial); //Wait for user to open terminal
```

「MLX90640.ino」ソースコードの372行目を以下のように修正します。

``` MLX90640.c
// 修正前
spot_v = pixels[768/2];

// 修正後
pot_v = pixels[768/2-16];
```

__MLX90640.ino__ ソースコードの416行目以降を以下のように修正します。

``` MLX90640.c
// 修正前
//M5.Lcd.drawCircle(160, 100, 6, TFT_WHITE);     // update center spot icon
//M5.Lcd.drawLine(160, 90, 160, 110, TFT_WHITE); // vertical line
//M5.Lcd.drawLine(150, 100, 170, 100, TFT_WHITE); // horizontal line
M5.Lcd.drawCircle(160, 120, 6, TFT_WHITE);     // update center spot icon
M5.Lcd.drawLine(160, 110, 160, 130, TFT_WHITE); // vertical line
M5.Lcd.drawLine(150, 120, 170, 120, TFT_WHITE); // horizontal line

// 修正後
M5.Lcd.drawCircle(160, 100, 6, TFT_WHITE);     // update center spot icon
M5.Lcd.drawLine(160, 90, 160, 110, TFT_WHITE); // vertical line
M5.Lcd.drawLine(150, 100, 170, 100, TFT_WHITE); // horizontal line
//M5.Lcd.drawCircle(160, 120, 6, TFT_WHITE);     // update center spot icon
//M5.Lcd.drawLine(160, 110, 160, 130, TFT_WHITE); // vertical line
//M5.Lcd.drawLine(150, 120, 170, 120, TFT_WHITE); // horizontal line
```

以上を反映しM5Stack FIREに書き込むと、サーモグラフィーが表示されるはずです。
最新のサンプルコードでは行数が変更になっているかもしれませんので、ご注意ください。

__MLX90640.ino__ ソースコード内は、デバッグ用ロジックをコメントアウトしているなど、サンプルとして正直コードが汚いので、余計なコメントなどは消しておくと良いでしょう。

## 結果
32x24 pixelsですので画像は荒めですが、以下のような実験結果から、簡易なサーモグラフィーとしては十分実用レベルですね！
これだけコストが安いと、施設園芸などで葉面温度分布を面で計測などでも利用できそうです。

PCのCPU部分の過熱をサーモグラフィーでチェック
![IMG_6458.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/5b888817-acd8-d4e0-d305-72aa8b7c62c8.jpeg)

蛍光灯をサーモグラフィーでチェック
![IMG_6470.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/2dcd409b-3171-e6ff-480f-68b2f439f887.jpeg)

寒い日の顔の温度をサーモグラフィーでチェック
![IMG_6472.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/479abc89-be9e-e3b6-d5d7-97b2ae093ae9.jpeg)

とはいえ、現状のままではサーモグラフィーのデータを残すことができません。
後編では、サーモグラフィーのデータをkintoneに保管し、kintone側でもサーモグラフィーの表示を再現します。