Hatで機能を追加

 M5StickC単体では何かやろうと思った時に機能がないことがあります。シンプルなところでは音を出す機能がありません。そのような場合に便利なのがHatと呼ばれる追加モジュール(ハードウェア)です。音を出すためのスピーカーHatなどが用意されています。Hatは一度に1つしか装着できません。

・M5StickC Speaker Hat(PAM8303搭載)
https://www.switch-science.com/catalog/5754/

 なお、M5StickC Plusはスピーカーを搭載しており本体だけで音を出すことができます。M5StickC PlusはM5StickCのHatをそのまま使用できます。

・M5StickC Plus
https://www.switch-science.com/catalog/6470/

 M5StickC用のHatは他に温度などを計測できるENV Hatと人感センサーのPIR Hat、LED(NeoFlash) HatやJoy Stick Hatなどがあります。すでに入手が難しくなっているものもあります。探せば他にもユーザーが作成したHatなどもあります。

・M5StickC ENV Hat
https://www.switch-science.com/catalog/5755/
https://www.marutsu.co.jp/pc/i/1556454/

・M5StickC PIR Hat
https://www.switch-science.com/catalog/5756/
https://www.marutsu.co.jp/pc/i/1556455/

・M5StickC NeoFlash Hat
https://www.marutsu.co.jp/pc/i/1632619/
https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5KPT
https://eleshop.jp/shop/g/gK3J315/

・M5StickC用「SD HAT」
https://kitto-yakudatsu.booth.pm/items/2385035

 今回はSpeaker Hat、ENV hat、PIR Hatを使ってみます。

Speaker Hatを使う

 最初にSpeaker Hatを使ってみます。Speaker Hatは図のように接続します。

 次にUIFlowでは使用するHatを追加します。使用するHatを追加するには図2で示すHatの文字をクリックしてから[+]ボタンをクリックします。

 クリックするとM5StickCで使用できるHatの一覧が表示されます。

 Speaker Hatのアイコン(SPKと書かれています)の右上にある□をクリックしてチェックを入れます。チェックを入れたらOKボタンをクリックします。

 クリックするとSpeaker Hatのアイコンが追加されます。追加したSpeaker Hatを削除するには削除したいHatのアイコンを押したままにすると少し右上にゴミ箱のアイコンが表示されます。そのゴミ箱アイコンまで削除するHatのアイコンをドラッグしてから離すと削除されます。

 Speaker Hatが追加されるとHATのカテゴリ内にSpeakerの項目が追加されます。

 それではM5StickCのボタンAが押されたら3秒間だけ音を鳴らしてみましょう。音を鳴らすには「[hat_spk0] Speaker.beep freq: [1800] duration: [300] ms」ブロックを使います。図のようにブロックを作成します。durationの右側にある数値が音を鳴らすミリ秒になります。3秒間鳴らすには3000を措定します。

 プログラムをPythonコードに変換すると以下のようになります。

from m5stack import *
from m5ui import *
from uiflow import *
import hat
import hat

setScreenColor(0x111111)

hat_spk0 = hat.get(hat.SPEAKER)

def buttonA_wasPressed():
  # global params
  hat_spk0.tone(1800, 3000)
  pass
btnA.wasPressed(buttonA_wasPressed)

 作成したプログラムを転送して実行します。ボタンAを押すと3秒間音が鳴ります。

 それでは次にM5StickCに搭載されているジャイロを利用して音を出してみましょう。M5StickCを傾けることで鳴らす周波数を変えるようにします。周波数は以下の計算式で求めます。360と10の値を変えると鳴らす音の範囲を変えることができます。
(ロール角(傾き)+360)×10

 これを「[hat_spk0] Speaker.beep freq: [1800] duration: [300] ms」ブロックのfreqの右側にある値に入れます。周波数は整数のため「整数に変換する」ブロックの後に計算式のブロックをつなぎます。  図のようにブロックを組み立てます。なお、durationの後に指定するミリ秒を小さくしすぎると音が鳴りませんので注意してください。

 プログラムをPythonコードに変換すると以下のようになります。

from m5stack import *
from m5ui import *
from uiflow import *
import hat
import imu
import hat

setScreenColor(0x111111)

hat_spk0 = hat.get(hat.SPEAKER)

imu0 = imu.IMU()

while True:
  hat_spk0.tone(int((((imu0.ypr[2]) + 360) * 10)), 160)
  wait_ms(2)

 作成したプログラムを転送して実行します。M5StickCを傾けると音が鳴ります。

PIR (Passive Infra Red) Hatを使う

 次にPIR (Passive Infra Red) Hatを使ってみましょう。PIR Hatは人や物体を感知します。ここではシンプルに人が近づいたら画面の色を赤色にするサンプルを作成します。RTCとHTTPを利用して人が近づいた時の日時をサーバーに送信することもできます。(HTTPは高度なブロックのカテゴリ内にあります)  先ほどのSpeaker Hatと同様にPIR Hatを追加します。人感センサーはPIRと書かれたアイコンになります。

 PIR Hatを追加するとHATのカテゴリにPIRの項目が追加されます。PIR Hatにはブロックが1つしかありません。このブロックは人が近づくと1に、近くに人がいない場合は0になります。

 人を感知したら画面の色を変える場合は図のようにブロックを組み立てます。

 プログラムをPythonコードに変換すると以下のようになります。

from m5stack import *
from m5ui import *
from uiflow import *
import hat
import hat

setScreenColor(0x111111)

hat_pir0 = hat.get(hat.PIR)

while True:
  if hat_pir0.state:
    setScreenColor(0x33ff33)
  else:
    setScreenColor(0x000000)
  wait_ms(2)

 作成したプログラムを転送して実行します。M5StickCに人が近づくと画面の色が変わります。

環境センサーを使う

 最後に環境センサーを使ってみましょう。環境センサーのENV Hatは「気温、湿度、気圧」の値を計測してくれます。ここでは、この3つの値をリアルタイムに画面に表示してみます。  これまでのHatと同様にENV Hatを追加します。

 ENV Hatを追加するとHATのカテゴリに環境の項目が追加されます。

 気温、湿度、気圧の3つを表示するので、以下の図のようにラベルを配置、設定します。

 人を感知したら画面の色を変える場合は図のようにブロックを組み立てます。

 プログラムをPythonコードに変換すると以下のようになります。

from m5stack import *
from m5ui import *
from uiflow import *
import hat
import hat

setScreenColor(0x111111)

hat_env0 = hat.get(hat.ENV)

label0 = M5TextBox(5, 5, "Temperature", lcd.FONT_DefaultSmall,0xFFFFFF, rotate=0)
label1 = M5TextBox(5, 20, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label2 = M5TextBox(5, 50, "Humidity", lcd.FONT_DefaultSmall,0xFFFFFF, rotate=0)
label3 = M5TextBox(5, 64, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label4 = M5TextBox(4, 95, "Pressure", lcd.FONT_DefaultSmall,0xFFFFFF, rotate=0)
label5 = M5TextBox(5, 110, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)

while True:
  label1.setText(str(hat_env0.temperature))
  label3.setText(str(hat_env0.humidity))
  label5.setText(str(hat_env0.pressure))
  wait_ms(2)

 作成したプログラムを転送して実行します。現在の気温、湿度、気圧がM5StickCの画面にリアルタイムに表示されます。

 現在の時刻を設定してあればRTCの日時ブロックを使って手軽に現在の時間を表示することもできます。

 プログラムをPythonコードに変換すると以下のようになります。

from m5stack import *
from m5ui import *
from uiflow import *
import hat
import hat

setScreenColor(0x111111)

hat_env0 = hat.get(hat.ENV)

label0 = M5TextBox(5, 5, "Temperature", lcd.FONT_DefaultSmall,0xFFFFFF, rotate=0)
label1 = M5TextBox(5, 20, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label2 = M5TextBox(5, 50, "Humidity", lcd.FONT_DefaultSmall,0xFFFFFF, rotate=0)
label3 = M5TextBox(5, 64, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label4 = M5TextBox(4, 95, "Pressure", lcd.FONT_DefaultSmall,0xFFFFFF, rotate=0)
label5 = M5TextBox(5, 110, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label6 = M5TextBox(5, 135, "Text", lcd.FONT_DefaultSmall,0xFFFFFF, rotate=0)

while True:
  label1.setText(str(hat_env0.temperature))
  label3.setText(str(hat_env0.humidity))
  label5.setText(str(hat_env0.pressure))
  label6.setText(str(rtc.now()))
  wait_ms(2)

 作成したプログラムを転送して実行します。現在の気温、湿度、気圧に加えて現在の日時がM5StickCの画面にリアルタイムに表示されます。

 環境センサーを使って気圧、湿度から不快指数などを求めて表示したり、熱中症になりそうな場合は画面を赤色にするようにしてもよいでしょう。他にもいろいろなHatが出ているので面白そうなものがあれば購入して試してみてください。

著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。最近は30年前に移植したゲーム(mz-700版 SPACE HARRIER)の話などを書いたりしています。
著者サイト:http://www.openspc2.org/