クリエイター手抜きプロジェクト[581]IoT M5 Stack編 センサーからのデータ取得/古籏一浩

投稿:  著者:  読了時間:11分(本文:約5,000文字)



今回は、M5 Stack本体に内蔵されているセンサーを使ってみます(M5 Basicにはジャイロセンサーなど、搭載されていないらしいのですが未確認です。ここではM5GO IoT StarterKitベースなので、このまま進めます)。

M5 Stackには3軸加速度センサーMPU9250が内蔵されていて、3軸加速度、3軸ジャイロ、3軸コンパスの値を取得できます。
https://www.switch-science.com/catalog/2845/

今回は、センサーからの入力値に応じて本体側面にあるLEDも制御してみます。





まず、本体を横に傾けた時の値を画面に表示してみましょう。値はラベルに表示することにします。Labelのアイコンを開発画面のM5画面に、ドラッグ&ドロップして配置します。座標値や色などはそのままでもいいですし、好きな色にしても構いません。

次に「イベント」のカテゴリから[ くりかえし ]ブロックを[ Setup ]ブロックの下に配置します。[ くりかえし ]ブロックの中に[ ラベル [label0] に["Hello M5"] ]ブロックを入れます。このブロックは「UI」カテゴリをクリックすると出てくる「ラベル」のカテゴリ内にあります。

このブロックの["Hello M5"]に[ ロール角 ]のブロックを入れます。[ ロール角 ]のブロックは、「ハードウェア」のカテゴリにある「IMU」のカテゴリにあります。

ブロックの配置ができたら実行してみましょう。M5 Stackを左右に傾けると値が変わります。左に傾けるとマイナスの値になり、右に傾けるとプラスの値になります。

Pythonのコードだと以下のようになります。

----------------------------------------------------------------------
from m5stack import *
from m5ui import *
from mpu6050 import MPU6050
import i2c_bus
clear_bg(0x000000)
imu = MPU6050(i2c_bus.get(i2c_bus.M_BUS))
btnA = M5Button(name="ButtonA", text="ButtonA", visibility=False)
btnB = M5Button(name="ButtonB", text="ButtonB", visibility=False)
btnC = M5Button(name="ButtonC", text="ButtonC", visibility=False)
label0 = M5TextBox(0, 0, "Text", lcd.FONT_Default, 0xFFFFFF)
while True:
label0.setText(str(imu.ypr[2]))
wait(0.001)
----------------------------------------------------------------------

せっかく3軸ありますので、他の2軸の値も表示してみましょう。新たに2つラ
ベルを配置し、label1、label2と名前をつけます(特に指定しなければ、この
名前になるはずです)。

[ ピッチ角 ]はM5 Stackを手前に傾けると値が大きくなり、奥に傾けると値が
マイナス値になります。[ ヨー角 ]はM5 Stackを置いたまま回すと、時計回り
の場合は値が小さくなり、反時計回りに回すと値が大きくなります。
それぞれのラベルにこれらのブロックを入れます。

Pythonのコードだと以下のようになります。

----------------------------------------------------------------------
from m5stack import *
from m5ui import *
from mpu6050 import MPU6050
import i2c_bus
clear_bg(0x000000)
imu = MPU6050(i2c_bus.get(i2c_bus.M_BUS))
btnA = M5Button(name="ButtonA", text="ButtonA", visibility=False)
btnB = M5Button(name="ButtonB", text="ButtonB", visibility=False)
btnC = M5Button(name="ButtonC", text="ButtonC", visibility=False)
label0 = M5TextBox(0, 0, "Text", lcd.FONT_Default, 0xFFFFFF)
label1 = M5TextBox(0, 30, "Text", lcd.FONT_Default, 0xFFFFFF)
label2 = M5TextBox(0, 60, "Text", lcd.FONT_Default, 0xFFFFFF)
while True:
label0.setText(str(imu.ypr[2]))
label1.setText(str(imu.ypr[1]))
label2.setText(str(imu.ypr[0]))
wait(0.001)
----------------------------------------------------------------------

それでは次に、M5 Stack本体横にあるLEDを左右の傾きの値に応じて、色と明るさを変えてみましょう。先ほどのプログラムにブロックを追加します。[ もし do そうでなければ ]ブロックを配置します。

条件の部分には[ [ロール角] < [0]]のようにブロックを配置します。条件に関するブロックは「ロジック」のカテゴリにあります。

ロール角が0より小さい場合(左側に傾けた)は、側面のLEDの色を赤色にします。そうでない場合は緑色にします。

本体のLEDを制御するブロックは、「ハードウェア」の「RGBカラー」のカテゴリにあります。左側と右側で別々に制御できますが、今回は全体の色を変化させます。全体のLEDの色を設定するには「LEDバーの色は[ ]]ブロックを使います。このブロックを、先ほどの条件ブロック内に入れます。

これで色を変えることができます。次に明るさを変えますが、これはロール角の値の絶対値を求めます。絶対値は「数学」ブロックの[ 平方根 ]ブロックを配置します。

配置したらブロック内をクリックして、平方根から絶対値に変更します。ただし、ロール角は小数値なので、このままLEDの明るさに指定するとエラーになります。そこで、整数化するブロックである[ Convert to int ]ブロックを使います。[ Convert to int ]ブロックの後に[ 絶対値 ] [ロール角 ]の2つのブロックを連結します。

LEDの明るさを指定するブロックは、「ハードウェア」のカテゴリの「RGBカラー」のカテゴリにあります。明るさを示す値のところに[ Convert to int ] [ 絶対値 ] [ロール角 ]ブロックをはめこみます。

Pythonのコードだと以下のようになります。

----------------------------------------------------------------------
from m5stack import *
from m5ui import *
from mpu6050 import MPU6050
import i2c_bus
clear_bg(0x000000)
imu = MPU6050(i2c_bus.get(i2c_bus.M_BUS))
rgb = RGB_Bar()
btnA = M5Button(name="ButtonA", text="ButtonA", visibility=False)
btnB = M5Button(name="ButtonB", text="ButtonB", visibility=False)
btnC = M5Button(name="ButtonC", text="ButtonC", visibility=False)
label0 = M5TextBox(0, 0, "Text", lcd.FONT_Default, 0xFFFFFF)
label1 = M5TextBox(0, 30, "Text", lcd.FONT_Default, 0xFFFFFF)
label2 = M5TextBox(0, 60, "Text", lcd.FONT_Default, 0xFFFFFF)
import math
while True:
label0.setText(str(imu.ypr[2]))
label1.setText(str(imu.ypr[1]))
label2.setText(str(imu.ypr[0]))
if (imu.ypr[2]) < 0:
rgb.set_all(0xff0000)
else:
rgb.set_all(0x33ff33)
rgb.setBrightness(int(math.fabs(imu.ypr[2])))
wait(0.001)
----------------------------------------------------------------------

ブロックの配置ができたら実行してみましょう。M5 Stackを左右に傾けると、本体側面のLEDの色と明るさが変わります。

M5 Stack側面のLEDは左右別々に制御できるので、ロール角だけでなく、ピッチ角によっても色が変わるようにしてみると面白いでしょう。


【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/

今年も無事に田植えが終わりました。最近はまともな天候で一年を終えるということがないので、どんなトラブルでも対処できるようにしておきたいところ。

シド・ミード(22日「ユーレカの日々」参照)は、ソフトバンクから出版されていたコンピューター雑誌「Oh!mz」の表紙くらいしか思い浮かばない……。

NHKで「腐女子、うっかりゲイに告(コク)る。」というドラマをやってるので、とりあえず見てみたけど、なかなかつらい展開に……。ノイタミナの「さらざんまい」も、これまたなかなかつらそう……。

・腐女子、うっかりゲイに告(コク)る。
https://www.nhk.or.jp/drama/yoru/fujoshi/

・さらざんまい
http://sarazanmai.com/

・InDesign自動化サンプルプログラム逆引きリファレンス上/下
https://www.amazon.co.jp/dp/4844396846/
https://www.amazon.co.jp/dp/4844396854/

・創って学ぼうプログラミング
https://news.mynavi.jp/series/makeprogram

・みんなのIchigoLatte入門 JavaScriptで楽しむゲーム作りと電子工作
https://www.amazon.co.jp/dp/4865940936
[正誤表]
http://www.openspc2.org/book/error/ichigoLatte/

・After Effects自動化サンプルプログラム 上巻、下巻
https://www.amazon.co.jp/dp/4844397591
https://www.amazon.co.jp/dp/4844397605

・IchigoLatteでIoT体験
https://www.amazon.co.jp/dp/B06X3X1CHP
http://digiconcart.com/dccartstore/cart/info/2561/218591

・みんなのIchigoJam入門 BASICで楽しむゲーム作りと電子工作
http://www.amazon.co.jp/dp/4865940332/

・Photoshop自動化基本編
http://www.amazon.co.jp/dp/B00W952JQW/

・Illustrator自動化基本編
http://www.amazon.co.jp/dp/B00R5MZ1PA/

・4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/

・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/