ラズパイにとりつけたセンサー、SenseHATをざっと使ってみた。
対象環境
- Raspberry Pi 3 Model B
- Sense HAT
- Raspbian Jessie 2016-09-23
SenseHATとは
ラズベリーパイに取付け可能なセンサー。半田付け不要。ラズパイにはめるだけで使える。以下のようなセンサー一式が揃っている。
- 8x8 LED
- 加速度、ジャイロ、磁力センサ
- 気圧センサ
- 温度センサ
- 湿度センサ
- ジョイスティック(上,下,左,右,押し込み)
Sense HAT Emurator
ラズベリーPI3のOS、Raspbian(4.4 2016-09-23)には、Sense HAT Emurator
なるアプリがインストールされていた。
Sense HAT Emurator
にソースコードを入力し、実行すればSenseHATの実機を再現できるのだろう。実機も制御できた。
ライブラリ
SenseHATにはPythonのライブラリが用意されている。
API Referenceもある。
やってみる
早速、ライブラリページにあるとおり準備からはじめる。
起動
- ラズパイを起動する
ラズパイを起動するとSenseHATのLEDが七色に光る。
install
- ターミナル(コンソール)を起動する
以下のコマンドを打ってSenseHATライブラリをインストールする
sudo apt-get update sudo apt-get install sense-hat sudo reboot
私が試した時点では、Raspbian(4.4 2016-09-23)にはすでに最新のライブラリがインストールされていたようだ。
Python起動
- デスクトップ→メニュー→プログラミング→Python3(IDLE)
set_pixcel
指定のLEDを点灯させる。
適当なファイル名を入力する。
1. (0,0)の位置にあるLEDが(0,0,255)の色で点灯した
from sense_hat import SenseHat
sense = SenseHat()
x = 0
y = 0
r = 0
g = 0
b = 255
sense.set_pixcel(x, y, r, g, b)
#sense.clear()
なお、このままだと点灯しつづける。
同様の手順でsense.clear()
コードを実行すると消灯する。
show_message
SenseHATでHello World。
from sense_hat import SenseHat
sense = SenseHat()
text_string = "Hello World!!"
scroll_speed = 0.1
text_colour = [255, 0, 0]
back_colour = [0, 0, 0]
sense.show_message(text_string,
scroll_speed=scroll_speed,
text_colour=text_colour,
back_colour=back_colour)
#sense.clear()
動画がきれいにとれない…。日本語は無理なんだろうな…。
humidity
湿度センサー。get_humidity。
湿度42%と出た。家の湿度計とほぼ一致。
どうでもいいが、関数名のキーワードをググれば翻訳が出るので、どの関数が何をしてくれるか予想できる。英語ができなくても楽チン。
temperature
温度センサー。
get_temperature
25度と出た。家の温度計は20度だった。おそらくCPUからの発熱が影響しているのだろう。
get_temperature_from_humidity
湿度計からも温度が取得できるらしい。仕組みは知らん。
同じく25度と出た。
get_temperature_from_pressure
気圧計からも温度が取得できるらしい。仕組みは知らん。
0度と出た。正しく動作してないのか何なのか、よくわからん。
pressure
気圧計で気圧を測る。get_pressure。
1006と出た。天気予報でよく見る気圧の値。関係あるのかないのかもわからん。知って何が嬉しいのかもわからん。
IMU Sensor
IMU (inertial measurement unit) sensor。慣性計測装置。
英名 | 和名 | 説明 | 使用例 |
---|---|---|---|
Gyroscope | ジャイロスコープ | 物体の角度(姿勢)、角速度、角加速度を検出する | カメラの手ぶれ補正、自動車の横転防止 |
Accelerometer | 加速度計 | 物体の加速度を計測する | 歩数計、Wiiリモコン、ロボットの姿勢制御、携帯電話の画面の上下方向を決めるなど |
Magnetometer (compass) | 磁力計 | 磁場(磁界)の大きさ・方向を計測する | 方位計、地下鉱脈の捜索 |
物理の教科書に出てくるような単語。わけわかめ。頭痛が痛い。ジャイロや加速度はスマホにもあると思う。ゲームのコントローラとして使われたりもしている。
ジャイロと加速度の違いがよくわからない。ググってみると、ジャイロは回転の速さ、加速度は向きを検出するらしい。磁気センサは方位磁石?やっぱりわからん。
物理や数学どころか、算数すら苦手な私には厳しい。でもこれで3D空間の方向を入力できたら楽しそう。
set_imu_config
from sense_hat import SenseHat
sense = SenseHat()
sense.set_imu_config(False, True, False) # gyroscope only
磁気、ジャイロ、加速度、のセンサを有効/無効にする設定らしい。べつに設定しなくても以降の動作が確認できた。節電用とか?
get_orientation_radians
orientation=方位をあわせること radian=角度の単位。1ラジアン(rad)=(180/π)度≒57.3°
from sense_hat import SenseHat
sense = SenseHat()
orientation_rad = sense.get_orientation_radians()
print("p: {pitch}, r: {roll}, y: {yaw}".format(**orientation_rad))
print(sense.orientation_radians)
set_imu_config
してないけど動作した。
ググってみると、以下のような意味らしい。
要素 | 意味 |
---|---|
roll | X軸を基点とした回転角度 |
yaw | Y軸を基点とした回転角度 |
pitch | Z軸を基点とした回転角度 |
ということでいいのだろうか?
get_orientation_degrees
degreeは360度方式の表現。こっちのほうがなじみがありそう。
from sense_hat import SenseHat
sense = SenseHat()
orientation = sense.get_orientation_degrees()
print("pitch: {pitch}, roll: {roll}, yaw: {yaw}".format(**orientation))
以下のように出力した。
pitch: 354.93408156288694, roll: 356.75055436439595, yaw: 173.47548046468
ほぼ360度と180度。
get_orientation
get_orientation_degreesと同じだったので省略。360度方式で表示された。
get_compass、get_gyroscope、get_accelerometer
面倒になってきたからまとめて実行。
360度 | 0.0~1.0 |
---|---|
get_compass | get_compass_raw |
get_gyroscope | get_gyroscope_raw |
get_accelerometer | get_accelerometer_raw |
raw
のつく関数は0~1の値で出力する。
from sense_hat import SenseHat
sense = SenseHat()
print("get_compass()")
compass = sense.get_compass()
print("compass: %s" % compass)
print(sense.compass)
#compass: 172.49294409219533
#172.49294409219533
print("get_compass_raw()")
print(sense.compass_raw)
print("get_gryoscope()")
print(sense.gyro)
print(sense.gyroscope)
print("get_gryoscope_raw()")
print(sense.gyro_raw)
print(sense.gyroscope_raw)
print("get_accelerometer()")
print(sense.accel)
print(sense.accelerometer)
print("get_accelerometer_raw()")
print(sense.accel_raw)
print(sense.accelerometer_raw)
以下のように出力した。
get_compass()
compass: 172.58416809875
172.58416809875
get_compass_raw()
{'x': -25.766185760498047, 'z': 9.509910583496094, 'y': -3.395291328430176}
get_gryoscope()
{'pitch': 359.99287483370273, 'yaw': 172.60310138312929, 'roll': 0.10758974011563588}
{'pitch': 359.9935232189249, 'yaw': 172.61523179909523, 'roll': 0.18145180600655045}
get_gryoscope_raw()
{'x': 0.048824042081832886, 'z': 0.005714877508580685, 'y': -0.008554648607969284}
{'x': 0.057913340628147125, 'z': 0.0074206250719726086, 'y': -0.008110573515295982}
get_accelerometer()
{'pitch': 359.8589087956553, 'yaw': 172.64363172566414, 'roll': 0.36212910591381847}
{'pitch': 359.7659730129605, 'yaw': 172.6404078763759, 'roll': 0.2808434781687463}
get_accelerometer_raw()
{'x': 0.0819467157125473, 'z': 0.9509051442146301, 'y': -0.0564468577504158}
{'x': 0.0800071507692337, 'z': 0.9506614208221436, 'y': -0.06006524711847305}
get_compass()は172.4929...と出た。yawとほぼ同値。Y軸を基点とした角度はまさに方位磁石。北が0度ということでいいのだろうか?すると180度は南?
Joystick
ジョイスティックに触るためケースをはずそうとしたら、SenseHATまで一緒にとれてしまった。 再起動が必要になった。壊しそうで怖いので確認はやめた。
ものすごく小さいのでジョイスティックを押すのが難しそう。基本、ラズパイは小さいので、壊しそうで怖い。microSDカードとかも小さすぎて失くしそう。
所感
ざっと動作確認してみた。 いつかSenseHATのセンサーを使ってアプリをつくってみたい。
案 | 説明 | 課題 |
---|---|---|
環境ロガー | 気温、湿度、気圧を定期的にログ出力する。できればグラフ化する | どこにどうやって出力するか |
空調連動 | 加湿器、除湿機、クーラー、エアコン、暖房と連動して適温を保つ | 連動できる家電がない |
方位磁石 | ラズパイで方位磁石。LEDで知らせる | リアル方位磁石のほうが高性能 |
3D空間入力コントローラ | ラズパイをぐるぐる回して3D空間の角度を入力する | 3D, GUI, Pythonの知識ゼロ |
はてなフォトライフはmp4非対応なのか。しかもプレーヤがFlash。iPhoneなどApple製品では見れないのでは?持ってないから知らんけど。HTML5でお願いします。