久しぶりにニコニコ技術部として動画をアップロードしてみた。
覚えているうちに工作の内容をまとめておく。
makecode.microbit.orgハードウェア
- 動画で使ったものは数年前に購入したNeoPixel互換の別物
また、たまたま手元にあったGROVE関連のパーツで配線を省略化した。
www.switch-science.com
www.switch-science.com
www.switch-science.com
AMG8833はGROVEのプロとシールドにハンダ付けして利用したが、これならGROVEシールドと直結できる。
www.switch-science.com
ソフトウェア
「最初だけ」
スイッチサイエンスのArduino用ライブラリに習い、AMG8833の「移動平均出力モード」を有効にしたが、LED表示にはさほど影響がないと感じた。
- AMG8833データシート 26ページ 2回移動平均出力モード。I2C送信はすべてこのモード設定用。
- 32-3. 移動平均 | 統計学の時間 | 統計WEB
他は、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
- AMG8833データシート 28ページ
- 2の補数 - Wikipedia
- エンディアン - Wikipedia
読み取った温度を色に変換するために、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表示を更新。