読者です 読者をやめる 読者になる 読者になる

やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SenseHATを使ってみた

ラズパイにとりつけたセンサー、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もある。

やってみる

早速、ライブラリページにあるとおり準備からはじめる。

起動

  1. ラズパイを起動する

ラズパイを起動するとSenseHATのLEDが七色に光る。

1

install

  1. ターミナル(コンソール)を起動する
  2. 以下のコマンドを打ってSenseHATライブラリをインストールする

    sudo apt-get update sudo apt-get install sense-hat sudo reboot

私が試した時点では、Raspbian(4.4 2016-09-23)にはすでに最新のライブラリがインストールされていたようだ。

Python起動

  1. デスクトップ→メニュー→プログラミング→Python3(IDLE)
    1

set_pixcel

指定のLEDを点灯させる。

2
3
4
5
適当なファイル名を入力する。
6
7
1. (0,0)の位置にあるLEDが(0,0,255)の色で点灯した
8

ソースコード

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()

1

動画がきれいにとれない…。日本語は無理なんだろうな…。

humidity

湿度センサー。get_humidity。

湿度42%と出た。家の湿度計とほぼ一致。

1
2

どうでもいいが、関数名のキーワードをググれば翻訳が出るので、どの関数が何をしてくれるか予想できる。英語ができなくても楽チン。

temperature

温度センサー。

get_temperature

25度と出た。家の温度計は20度だった。おそらくCPUからの発熱が影響しているのだろう。

1
2

get_temperature_from_humidity

湿度計からも温度が取得できるらしい。仕組みは知らん。

同じく25度と出た。

1
2

get_temperature_from_pressure

気圧計からも温度が取得できるらしい。仕組みは知らん。

0度と出た。正しく動作してないのか何なのか、よくわからん。

1
2

pressure

気圧計で気圧を測る。get_pressure。

1006と出た。天気予報でよく見る気圧の値。関係あるのかないのかもわからん。知って何が嬉しいのかもわからん。

1
2

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軸を基点とした回転角度

ということでいいのだろうか?

1
2

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非対応なのか。しかもプレーヤがFlashiPhoneなどApple製品では見れないのでは?持ってないから知らんけど。HTML5でお願いします。