M5StickCでUIFlow入門 その7 Hatを使う(ENV, SPK, PIPなど)

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

前回は無線通信を行いましたが、今回はM5StickC本体を拡張するHatを使ってみたいと思います。

Hatとは?

M5StickCに拡張する装置のことです。バッテリーを拡張するものから、スピーカー、キーボードなどいろいろな種類のものが発売されています。

上記の写真以外にもたくさん販売されていますが、それほど高くなく、使いやすいものを中心に紹介をしたいと思います。

Hatの追加の仕方

UIFlowの画面にある、Hatを選んでからプラスマークを押すことで、追加することができます。

上記のような追加画面が表示されますので、装着するHatを選んでください。Hatは構造上1つしか装着することができないので、追加も1つまでです。

Unitとは?

Hatは上部に装着する形のものですが、UnitとはGroveケーブルを利用して利用するものになります。HatはM5StickC専用ですが、Unitに関してはGrove端子があるM5Stackなどの他のボードでも利用することができます。

もともとはUnitしかなかったので、販売されている種類はUnitの方が多く、UnitとHatで同じような機能のものが販売されていることもあります。

HatかUnitは見た目や用途に合わせて、組み合わせてみてください。

スピーカーハット

最初に機能が単純でわかりやすい、スピーカーハットを紹介します。ただし、単音しかならすことができないので、音楽再生などはかなり難しいです。

利用可能になるブロックは3種類です。

ボリュームブロック

スピーカーのボリュームを設定します。0-99までの数値を設定し、初期値は2です。0と100以上の数値を設定すると音がでなくなりますが、ノイズがなります。

99までありますが、ボリュームを変更してもそれほど音の大きさは変わりません。基本的には2のままで設定しなくてもよいのかもしれません。

ビープブロック(周波数指定)

周波数と音の長さを指定してビープ音を鳴らすブロックです。アラート音であれば初期値の1800Hzの200ミリ秒で十分だと思います。

トーンブロック(音名指定)

音名を指定して音をならします。beatは1秒間にたいしての割合を指定します。1の場合には1秒間で、1/2の場合には0.5秒間に相当します。

CDEFGAB
Low131147165175196220247
Middle262294330349392448494
High523587659698784889988

音名と周波数の関係は上記になります。小数点以下の周波数を四捨五入してある標準的な音階でした。

CDEFGAB
LowC2D2E2F2G2A2B2
MiddleC3D3E3F3G3A3B3
HighC4D4E4F4G4A4B4

一般的な音階名だと、上記になります。

使い方

自由に使って問題ないのですが、曲を演奏させるのはかなり面倒です。何かアクションが発生したときにアラート的に使うほうが多いとは思います。

M5StickC本体にはマイクが内蔵されているので、機材的にはマイクで録音したものをスピーカーから再生することはできるのですが、UIFlowではサポートされていません。

ENVハット

気圧、温度、湿度を測ることができるハットです。磁界も本来は測ることができますが、UIFlowではサポートされていませんでした。

使い方

HatにENVを追加すると、HATの下に環境のブロックが増えます。現在の値を取得する処理しかできませんので、ラベルを作成して更新するような使い方になると思います。

実際問題ENVハットはUIFlowには動きがないので、向いていません。定期的にデータを取得して、無線通信を利用してサーバーにアップするような用途か、温度や気圧が指定範囲からはずれたらアラートを出すなどの用途になると思います。

PIRハット

人感センサーになります。赤外線を発生させるものの距離に変化があったら反応をするセンサーです。

使い方

まずは、ラベルを画面に設置して、PIRセンサーの値を表示して確認してください。

センサーが反応した場合には1が、反応していない場合には0が返ってきます。気をつけないといけないのは、センサーは最低3秒間は1が連続しています。

センサーの反応は比較的早いですが、0に戻るのは3秒間遅延しているのがこのセンサーの特徴になります。

実際に使うときには、上記のように判定をしてLEDなどを光らせるとわかりやすいと思います。

タイマーを組み合わせると、人感センサーライトのようにもう少し長い時間光らせることができます。

ジョイスティックハット

斜めにも入力ができるジョイスティックが搭載されているハットです。ジョイスティックを押し込むことでボタンにもなります。

ただし、キャップがなく、金属の棒がむき出しなので操作はしにくいです。

追加されるブロックは5種類です。ラベルに表示して確かめてみましょう。

どうやらReverseがついている下2つはXとYの座標が逆になっているだけですので、実質X座標とY座標、そしてボタンの状態の3種類のデータが取得できます。

座標は操作しないときが(x=0, y=0)と両方とも0でした。X座標は一番左に移動すると-128で、一番右が127のはずですが、軸が壁にあたって思ったより数値が端まで移動しません。Y座標は上が127で、下が-128でした。

使い方

実際に使う場合のサンプルですが、上記のように画面中央にサークルの円を設置します。座標は初期化されるのでいくつでもいいのですが、大きさはとりあえず3にしました。

上記のような処理をすると、画面のサークルの円がジョイスティックで操作できます。座標の計算は中心座標に、ジョイスティックからの戻り値を3.2で割って、最大値が来ても画面端までの距離である40になるようにしています。(128÷40=3.2なので、128÷3.2=40)

もしの条件判定をつかって、ジョイスティックを押し込んだ場合にはサークルの円を赤色に変更しています。

ここまでの動作であれば、非常に便利に使えるのですが、実際にジョイスティックで操作を作ろうとすると非常に難しいのと、すぐに指が痛くなります。

なかなか実用化が難しいハットな気がします。

キーボードハット

キーボードがついていて、いっけん便利そうですがかなりのじゃじゃ馬で使うのが難しいです。

ブロックは3種類追加されました。

Get pressed

ボタンが押されたかを知らせるフラグ。Trueの場合ボタンが押されており、Get keyで値が返ってくる状況。Get keyが呼び出されるとFlaseにリセットされます。

Get key

押されたキーコードが返ってきます。Get pressedがFlaseのときに取得すると0が返却されます。

Get string

これまで入力された文字列が入っています。escキーが押されると文字列がクリアされます。Delキーで入力済み文字列も消えるなど便利ではありますが、Enterキーで確定したときにプログラムから文字列をクリアするなどができません。

使い方

Get stringの文字列をクリアする方法があればよいのですが、現状のところ泥臭い処理をしないとキーボード入力が制御できません。

まとめ

スピーカーハットと、PIRハットはおすすめです。それ以外のハットはちょっと使いにくいところがあるので、気をつけてください。

紹介した以外のハットもたくさんありますが、癖が強いのが多いです。ハット以外にもユニットでもいろいろあるので、いろいろ探してみると楽しいと思います。

ハットもユニットも比較的安いので、手を出しやすいと思います。ただし送料がかかるので、まとめて買ったりして結構高くなったりもします。。。

続編

コメント