このページの内容はRaspbian stretchで試した結果です。
Raspbianのデスクトップのメニューを物色していると、「プログラミング」の中にSense HAT Emulatorというアプリケーションがあるのを見つけました。「扇子ハット?」という文字列を頭の中でチラつかせつつ調べたところ、Sense HATというのはセンサー全部入りのような拡張基板で、Sense HAT Emulatorというのは、Sense HATを使うアプリケーションを開発するためのソフトウェアエミュレータであること、sense_emuというPythonモジュールが提供されていて、エミュレータを使った開発中は、これをimportしておき、開発が済んで実機を接続するときはimportするモジュールをsense_emuからsense_hatに書き換えればいい、ということがわかりました。APIについてはsense_emuのページよりsense_hatのページの方が詳しく書かれています。
せっかく見つけたので、早速toyコードを書いてみました。
最初はInitialという文字列が1文字ずつ8x8のLEDマトリクスに表示され、ジョイスティックを左に倒す…エミュレータなので実際には画面上のボタンを押すんですが…と、メッセージがHeLloに、右に倒すとAlohaに変わります。この動作は、それぞれのイベントが起こったときのコールバック関数の中で変数を書き換えて実現しています。
また、実機では実現できずエミュレータならではの使い方なんですが
の3つのセンサーから読み出されたことにする値を設定するためのスライダーをRGBの3色の強度に割り当てて、表示する文字の色を変化させます。文字を表示するのは子スレッドを自走させておき、RGBの設定をメインスレッドでやっています。
#!/usr/bin/env python3
from sense_emu import SenseHat, ACTION_PRESSED
import threading
import time
# 各スライダーの下端、上端の値
T_LO = -30.0
T_HI = 105.0
P_LO = 260.0
P_HI = 1260.0
H_LO = 0.0
H_HI = 100.0
# ジョイスティックを左右に倒したときコールバックされる
def js_left(event):
global Mesg
if event.action == ACTION_PRESSED:
Mesg = 'HeLlo'
def js_right(event):
global Mesg
if event.action == ACTION_PRESSED:
Mesg = 'Aloha'
# LED に文字を表示する
def say():
global Sense
global Mesg
global Rgb
while True:
#
# show_message()の方が横スクロールして見栄えがいいが
# スライダーの操作がメッセージの切れ目でしか反映されないので
# 反応が悪い
#
for ltr in Mesg:
try:
Sense.show_letter(ltr, Rgb)
except Exception as e:
print(str(e) + ' RGB = ' + str(Rgb) )
time.sleep(0.5)
# スライダーから読み出した値を0〜255に正規化する
def canon(v, l, h):
return int((v - l) / (h - l) * 255)
Sense = SenseHat()
Sense.stick.direction_left = js_left
Sense.stick.direction_right = js_right
Rgb = [255, 255, 255]
Mesg = 'Initial'
# LED に文字を表示するスレッドは自走させておき
say_th = threading.Thread(target = say)
say_th.start()
# メインスレッドではスライダーから値を読み込む
while True:
Rgb = [
canon(Sense.get_temperature(), T_LO, T_HI),
canon(Sense.get_pressure(), P_LO, P_HI),
canon(Sense.get_humidity(), H_LO, H_HI)
]
time.sleep(0.5) # 実際には何か複雑な処理をする