【IoT】”AtomS3”でM5StickC Thermal Camera Hat(MLX90640)を動かす
初IoTの記事です。主に<Arduino系でESP32チップのM5マイコン>と<様々なセンサー>を組合せて楽しんでいます。AtomS3を買ったのですが、公式ライブラリの準備がまだまだなので手つかずでした。。こちらも一歩踏み出そう!という話です。
【AtomS3で何か作ろう!】
サーモグラフィーってカッコイイですよね!
赤外線センサーの値を熱画像で表示。なんてSFチック!それを手作りできる時代に感謝。
さて、どうやって作る?
みなさまのAtomS3活用を参考にする
Inoue_Minoruさんの記事を見て「AtomS3の低解像度(128x128)ディスプレイと低解像度のサーマルカメラって、ピッタリだなー」と感じ、ふと思い出したのが「眠っているM5StickC用のサーマルカメラ(32x24)」。これをAtomS3と組合せて使いたい!また、たなかまさゆきさん曰く「公式AtomS3ライブラリの代わりにM5Unifiedを使うのがオススメ」らしい。こちらにも初挑戦。
ソフトウェア
M5公式ページのサーマルカメラプログラムを参考にする
M5StickC用プログラムの実行例。これをAtomS3用に作り替えてみます。
ハードウェア
HAT変換コネクタで、M5StickC HATを接続できるようにする
M5StickC用のカメラは直接AtomS3に接続できないのでHAT変換コネクタを仲介して接続します。
持ち運べるようにAtom用バッテリーをつける
こんなのできました!
ハード部分の接続はブロック組合せのようにパチパチとはめるだけです。ソフト部分は「1. 公式ライブラリからM5Unifiedへ、およびSprite部分をM5Canvasへ」変更。「2. ディスプレイがM5StickC Plus(135x240)よりAtomS3(128x128)と狭いので、表示位置を変更」しました。
プログラム変更部分(THERMAL_MLX90640.inoのみ)
基本的に必要最低限で、変更点は以下のとおりです。
公式のM5StickC Plus用プログラム
変更箇所(/* modify:xxx*/部分です)
・M5StickCPlusライブラリを「M5Unified」へ切替えて「M5.begin」を変更
・AtomS3ハードに合わせて「M5.Axp」「M5.BtnB」をコメント
/* modify: M5StickCPlus -> M5Unified for AtomS3 */
// #include <M5StickCPlus.h>
#include <M5Unified.h>
~中略~
void setup() {
/* modify: M5.begin for M5Unified */
// M5.begin();
auto cfg = M5.config();
M5.begin(cfg);
~中略~
void loop() {
~中略~
/* modify: Comment */
// if (M5.Axp.GetBtnPress() == 0x02) {
// esp_restart();
// }
~中略~
/* modify: Comment */
// if (M5.BtnB.wasPressed()) {
// maxtemp = maxtemp + 1;
// }
・「TFT_eSprite」を「M5Canvas」へ切替えて、スプライトの大きさおよび位置を調整
/* modify: TFT_eSprite -> M5Canvas */
// TFT_eSprite img = TFT_eSprite(&M5.Lcd);
// TFT_eSprite msg = TFT_eSprite(&M5.Lcd);
M5Canvas img(&M5.Lcd);
M5Canvas msg(&M5.Lcd);
~中略~
void drawpixels(float *p, uint8_t rows, uint8_t cols) {
~中略~
/* modify: move message from right to bottom */
msg.setCursor(0, 3);
msg.print("min/max");
msg.setCursor(50, 3);
msg.printf("%.1f", min_v);
msg.setCursor(80, 3);
msg.printf("/ %.1fC", max_v);
msg.pushSprite(0, 95);
~中略~
void setup() {
~中略~
/* modify: change Sprite size */
// msg.createSprite(240 - COLS_4, ROWS_4 - 10);
msg.createSprite(120, 20);
msg.setTextWrap(false); // No text return
・I2C pin設定を変更(複数結合しているのでAtom Lite-> Atom HAT-> AtomS3)の順で確認
void setup() {
~中略~
// Increase I2C clock speed to 450kHz
/* modify: I2C pin M5 Stick C plus -> AtomS3 + Atom HAT */
// Wire.begin(0, 26, 400000UL);
Wire.begin(6, 5, 400000UL);
使ってみた感想
いやー、AtomS3の画面にピッタリはまって楽しいです!!子供と一緒に熱源探知ゲーム?を家の中、外で楽しんでます。例えば「コップ本体は熱いけど取っ手は熱くない」とか「オーブンは温まっているいるか?」など、日常の色々な場面で遊べそうです。
その他参考ページ
Discussion