M5Stack Thermal - eiichiromomma/CVMLAB GitHub Wiki

(M5Stack) Thermal

32x24のサーマルイメージャユニットをCore2+CircuitPythonでローテク可視化。

制約と対策

  • M5StackのImageの画素単位の制御が不明(画像ファイルを読んで表示は可能)
    • 無理矢理UIのパーツをMatrix状にする
  • Core2だと図形描画ができない?(UIFlowでCore2のプロジェクトにすると線しか引けなくなった)
    • 矩形も書けないのでラベルを使って「■」をUnicodeフォント(FONT_UNICODE_24)で768個並べて文字の色を変更させる
  • Blocklyのサンプルが現UIFlowと違う
    • Thonnyからインタプリタを叩いたらやり方がわかった
  • 画像として表示してるデモはArduinoで書いたものだけ?

Thermalの使い方

thermal_0 = unit.get(unit.THERMAL, unit.PORTA)

で取得してループの中でthermal_0.update_temperature()をするのだが,このupdate_temperature()は返り値を持たないブロックでPython翻訳後もそのように書かれるところから内部バッファの更新だと思ったら768個(32x24画素)の温度のリストを返してくる仕様らしい。インタプリタで受け取る変数を指定せずにupdate_temperature()を実行すると高確率でThonnyが死ぬ。

拾ったListをPCのnumpyでreshape((24,32))して表示すると

となるので温度は測れている。

ソース

from m5stack import *
from m5stack_ui import *
from uiflow import *
import unit

screen = M5Screen()
screen.clean_screen()
screen.set_screen_bg_color(0xFFFFFF)
thermal_0 = unit.get(unit.THERMAL, unit.PORTA)
pLabel = []
for y in range(24):
  for x in range(32):
    pLabel.append(M5Label('■', x=x*10 - 2, y=y*10 - 8, color=0x000, font=FONT_UNICODE_24, parent=None))
while True:
  tempList = thermal_0.update_temperature()
  for y in range(24):
    for x in range(32):
      ptmp = tempList[x+32*y]
      ptmp = 255.*(ptmp-20)/(40-20.)
      ptmp = int(ptmp)
      pLabel[x+32*y].set_text_color((ptmp << 16) | (ptmp << 8) | ptmp)

以上。動作はとにかく遅いが表示できた。 解説も不要なレベルだが

for y in range(24):
  for x in range(32):
    pLabel.append(M5Label('■', x=x*10 - 2, y=y*10 - 8, color=0x000, font=FONT_UNICODE_24, parent=None))

で10pixelごとに「■」をフォント指定しつつラベルで配置して(数十秒かかる), pLabelに格納していく。

while True:
  tempList = thermal_0.update_temperature()
  for y in range(24):
    for x in range(32):
      ptmp = tempList[x+32*y]
      ptmp = 255.*(ptmp-20)/(40-20.)
      ptmp = int(ptmp)
      pLabel[x+32*y].set_text_color((ptmp << 16) | (ptmp << 8) | ptmp)

tempListが行ごとに温度が並んだ768個のListなのでわかるように入れ子のループを回している(for i in range(768)でも動く)。温度は20℃から40℃を濃度値0-255にマップして色指定の際にビットシフトしてRed, Green, Blueの値をset_text_colorに渡している(BlocklyがRGBで色を拾うとこう書く)。一回の描画で十数秒かかるので実用的ではない。