micro:bitでサーモグラフィーを作ってみた。

久しぶりにニコニコ技術部として動画をアップロードしてみた。

覚えているうちに工作の内容をまとめておく。

makecode.microbit.org

ハードウェア

www.switch-science.com

www.switch-science.com

www.switch-science.com

  • 動画で使ったものは数年前に購入したNeoPixel互換の別物

また、たまたま手元にあったGROVE関連のパーツで配線を省略化した。
www.switch-science.com
www.switch-science.com
www.switch-science.com

AMG8833はGROVEのプロとシールドにハンダ付けして利用したが、これならGROVEシールドと直結できる。
www.switch-science.com

ソフトウェア

「最初だけ」

スイッチサイエンスのArduino用ライブラリに習い、AMG8833の「移動平均出力モード」を有効にしたが、LED表示にはさほど影響がないと感じた。

他は、NeoPixel・変数の初期化など。

「ずっと」

I2Cで数値128(0x80)を書き出し、ループで連続してI2Cの数値読み取りを行う。
各画素からは12bitの2バイトデータ(先頭1bitが符号の2の補数形式)を読む取る必要がある。
1バイトずつ読む場合は、下位8bit、上位4bitのリトルエンディアンになるので、とりあえず符号なしの2バイト整数としてUInt16LEで読み取り、剰余計算で12bitを越える部分を無視する。
読み取った値は、「0~4095」の値になるが、先頭1bitは符号なので、「2048」以上の値はマイナスの値として処理し、0.25倍した数値が温度となる。
micro:bit本体のLEDで表示するための温度の最大・最小値も都度チェックする。

センサー計測値 :
2進数     : 符号なし10進数 : 符号あり10進数 : 温度
0111 1111 1111 : 2047 : 2047 : 511.75
0011 1111 1111 : 1023 : 1023 : 255.75
0001 1111 1111 : 511 : 511 : 127.75
0000 1111 1111 : 255 : 255 : 63.75
0000 0111 1111 : 127 : 127 : 31.75
0000 0011 1111 : 63 : 63 : 15.75
0000 0001 1111 : 31 : 31 : 7.75
0000 0000 1111 : 15 : 15 : 3.75
0000 0000 0111 : 7 : 7 : 1.75
0000 0000 0011 : 3 : 3 : 0.75
0000 0000 0001 : 1 : 1 : 0.25
0000 0000 0000 : 0 : 0 : 0
1111 1111 1111 : 4095 : -1 : -0.25
1111 1111 1110 : 4094 : -2 : -0.5
1111 1111 1100 : 4092 : -4 : -1
1111 1111 1000 : 4088 : -8 : -2
1111 1111 0000 : 4080 : -16 : -4
1111 1110 0000 : 4064 : -32 : -8
1111 1100 0000 : 4032 : -64 : -16
1111 1000 0000 : 3968 : -128 : -32
1111 0000 0000 : 3840 : -256 : -64
1110 0000 0000 : 3584 : -512 : -128
1100 0000 0000 : 3072 : -1024 : -256
1000 0000 0000 : 2048 : -2048 : -512


読み取った温度を色に変換するために、micro:bitのNeoPixelで利用可能なHSL色空間を利用する。
HSL色空間では、色味を0~360度の範囲の角度で表すことができ、0度は赤となる。
室内でデモする場合を想定し、30℃以上は赤、20℃以下は青となるよう、micro:bitの計算にある「数値のマップ」と「範囲の制限」を組み合わせて利用して温度を色相に変換する。

0 赤
30 橙
60 黄
90 黄緑
120 緑
150 水色
180 水色
210 水色
240 青
270 青紫
300 紫
330 赤紫


2重ループで各画素を順番に読み、温度を計算するが、画素の並び順とLEDの接続順が異なるので、そこは計算で工夫する。
センサを裏向きに付けた場合のミラー表示(左右反転)も同時に処理する。

(センサ) 行ごとに順番は同じ。センサに向かって見たときにこの順番
7 6 5 4 3 2 1 0
13 12 11 10 9 8

(LED) 配線を短くするよう接続したために、行ごとに順番は折り返す。
0 1 2 3 4 5 6 7
13 12 11 10 9 8

「ボタンAが押されたとき」

ミラー表示(左右反転)用の設定値を入れ替え。
また、micro:bit本体のLED表示を更新。

「ボタンB」

変数に保存した、計測温度の最大値、最小値をmicro:bit本体のLEDで表示。
本体LEDの表示は遅いので、押されたタイミングで表示するテキストを作成する。




(以上)