Sense HAT Emulatorであそぶ

このページの内容は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) # 実際には何か複雑な処理をする


[Raspberry Piはじめましたへ|Raspberry Piへ]
Copyright(c) 2020 Koh-ichi Ito, All rights reserved
Last update: $Date:: 2020-09-26 12:06:36 +0900 #$