Seeed K.K.の中井です。
今年の5月に発売されたWio Terminalはサーマルカメラみたいなものと相性がよさそうかなと思いながら数カ月が過ぎてしまいました。最近になってようやくGrove - AMG8833 8x8 Infrared Thermal Temperature Sensor Arrayを入手したので検証記事を書いてみます。
Wio Terminalは320x240pixelのTFT液晶と無線LANを搭載しており、環境センサなどと組み合わせることで目に見えない環境情報を直接・簡単に・その場で確認することができ、且つ、IoT/DXシステム向けのデータとしてサーバにポストすることもできる小型な端末です。もちろんPCやスマートフォンなどでも同様のことはできますが、小型で安価にというところがポイントです。
この記事で利用しているデバイスのリンクはコチラになります。
Grove - AMG8833 8x8 Infrared Thermal Temperature Sensor Array
パナソニックの赤外線アレイセンサ「AMG8833」を搭載するGroveモジュールです。AMG8833は縦8列、横8列のマトリクスに配置されたサーモパイルアレイとなっていて、非接触で周囲の温度を計測することができます。得られる温度データは0~80℃で分解能は0.25℃となっています。主な用途は人検知を想定した自動制御や人数カウント、稼働部品の異常発熱を検知することで故障予防などに利用が想定されているようです。また、同社のサイトでは、非接触の端末操作(ジェスチャーによる操作)なんかに応用が期待されるとあります。
類似のGroveモジュール
- Grove - Thermal Imaging Camera - MLX90641 BCA 16x12 IR Array with 110° FOV
- Grove - Thermal Imaging Camera / IR Array MLX90640 110 degree
- Grove - Thermal Imaging Camera / IR Array MLX90640 55 degree
- Grove - Single-Point Infrared Thermometer - MLX90614 DCI with 5° FOV
- Grove - Thermal Imaging Camera - MLX90621 BAA 16x4 IR Array with 25° FOV
- Grove - Single-Point Infrared Thermometer - MLX90614 DCC with 35° FOV
温度データの可視化
Grove - Infrared Temperature Sensor Array(AMG8833)から温度データを取得するには、Wikiにも記載のあるSeeed_AMG8833ライブラリを利用してみます。ライブラリのソースコードを見ると、read_pixel_temperature関数で温度データを取得でき、0.25℃刻みのfloat型のデータとして読み出せるようです。
次に取得した温度データをどのように可視化するかですが、Wikiのサンプルでは「30℃から31℃は黄色」といったように色を決めているようですが、これだと大雑把すぎるので、下記を参考にサーモグラフィのような配色ができるようにしてみます。
作成したコードはこちらです。
#include "TFT_eSPI.h" TFT_eSPI tft; #include "Seeed_AMG8833_driver.h" AMG8833 sensor; #define MIN_TEMPERATURE (20.0) #define MAX_TEMPERATURE (40.0) int ColorScaleBCGYR(double in_value) { int ret; int r, g, b; double value = in_value; double tmp_val = cos(5 * M_PI * value); int col_val = (int)((-tmp_val / 2 + 0.5) * 255); if (value >= (5.0 / 5.0)) { r = 255; g = 255; b = 255; } // WHITE else if (value >= (4.0 / 5.0)) { r = 255; g = col_val; b = col_val; } // RED-WHITE else if (value >= (3.0 / 5.0)) { r = 255; g = col_val; b = 0; } // YELLOW-RED else if (value >= (2.0 / 5.0)) { r = col_val; g = 255; b = 0; } // GREEN-YELLOW else if (value >= (1.0 / 5.0)) { r = 0; g = 255; b = col_val; } // AQUA-GREEN else if (value >= (0.0 / 5.0)) { r = 0; g = col_val; b = 255; } // BLUE-AQUA else { r = 0; g = 0; b = 255; } // BLUE ret = (r & 0x000000f8) << 8 | (g & 0x000000fc) << 3 | (b & 0x000000f8) >> 3; return ret; } void setup() { sensor.init(); tft.begin(); tft.setRotation(3); tft.fillScreen(TFT_BLACK); for (int i = 0; i < 240; i++) { double value = (double)(i) / 240.0; tft.drawFastHLine(300, i, 20, ColorScaleBCGYR(value)); } tft.drawString("20", 288, 4); tft.drawString("25", 288, 60); tft.drawString("30", 288, 116); tft.drawString("35", 288, 172); tft.drawString("40", 288, 228); } void loop() { float pixels_temp[PIXEL_NUM]; sensor.read_pixel_temperature(pixels_temp); double min = MIN_TEMPERATURE; double max = MAX_TEMPERATURE; for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) { double value = (double)pixels_temp[63 - (y * 8 + x)]; tft.fillRect(x * 28 + 8, y * 28 + 8, 28, 28, ColorScaleBCGYR((value - min) / (max - min))); } } }
上記のプログラムで熱々コーヒーが入ったマグカップを映してみるとこんな感じになりました。
なんとも言えない感じです。。そこで、8x8の粗さが問題なのかと思い、画素を補間してみることに。 補間にはArduino-Interpolationライブラリを使ってみました。 8x8で取得したデータを32x32にアップコンバートできるようにソースコードを修正、ついでにボタンで補間なし(8x8)と補間あり(32x32)を切り替えれるようにしてみました。 修正後のプログラムを使った場合の動画はコチラです。前半は補間なし、後半は補間ありです。
背景の温度と被写体の温度の差が大きければそれなりに見えることがわかりました。温度差がさほどない場合はどうか、グー・チョキ・パーしているところを確認。
温度差があまりない場合は、はっきりとはわかりづらいですね。補間してもあまり効果はありませんでした。
(なんとなくコンロを映してみました)
余談
プログラムを作った後に気づきましたが、同様の機能を持ったサンプルプログラムがWikiにありました。センサーまわりの部分を少し変更することでAMG8833でも使えました。
Wio Terminalと組み合わせると
Wio Terminalの強みの1つはディスプレイ表示、AMG8833と組み合わせることで周囲温度を表示できるようになるので、パッと見で雰囲気温度がわかるようになるのは利用用途がありそうです。ただ、サーマルカメラと同じなのであえて作る意味はあるのかどうか。 Wio Terminalのもう1つの強みはコネクティビティ(無線LAN)、温度異常を検出した場合に通知ができるのです。比較的安価に作ることができるので身近なところでも用途はありそうです。
昨今のコロナ禍でも利用用途はありそうです。すぐに思いつくのは非接触の体温測定ですね。ただ、自分自身を映して体温を測ってみても32℃くらいになってしまうので、オフセットを足せばよいのか、他に補正方法があるのかわかりませんが、実用するには何らかのノウハウが必要なようです。
他にも直接触っての操作も敬遠されがちになっているので、掌をかざしてのジェスチャー操作なんかにも使える可能性があります。是非色々な作品にチャレンジしてみてください。
変更履歴
日付 | 変更者 | 変更内容 |
---|---|---|
2020/10/8 | mnakai | 作成 |