Pythonロボティクスコース レッスン 11
テーマ.3-2 モーションセンサーの使い方
Studuino:bitの加速度センサーとジャイロセンサーの使い方を学ぼう
チャプター1
このレッスンで学ぶこと
このレッスンでは、Studuino:bitに内蔵されている「加速度センサー」、「ジャイロセンサー」の2つのセンサーの使い方について学習します。
チャプター2
加速度センサーの使い方
加速度センサーは名前の通り、「加速度」を調べるセンサーです。例えば、車の速さを表すときは、m/s(m/秒:メート毎秒)やkm/h(km/時:キロメートル毎時)という単位を使いますね。これらの単位は、ある一定の時間(1秒や1時間)でどのくらいの距離を進むのかという尺度で速さを表しています。
m/sの「s」は英語で秒を表す「seconds」の頭文字を、km/hの「h」は英語で時を表す「hour」の頭文字をそれぞれ表しています。
そのため、速さは次の計算式で求めることができます。
速さ(m/s) = 距離(m) ÷ 時間(s)
【 速さの計算例 】300mを20秒で走る車の速さ
車の速さ = 300(m) / 20(s) = 15(m/s)
一方で、加速度は「 m/s2(メートル毎秒毎秒)」という単位で表します。
※x2の「2」は乗数といい、xを何回掛けているのかを表しています。例えば24と書いたときは、2を4回掛けていることになり、24=2×2×2×2=16と計算できます。
この単位は、1秒間にどのくらい速さ(m/s)が変化したのかを表していて、次の計算式で求めることができます。
加速度(m/s2) = 速さの変化(m/s) ÷ 変化にかかった時間(s)
【 加速度の計算例 】5秒間で10m/sから20m/sへ速さが変化した車の加速度
車の加速度 = ( 20(m/s) – 10(m/s) ) ÷ 5(s) = 2(m/s2)
計算式に使われている単位だけを見て、式を分解していくと次のようになります。
m/s ÷ s = m ÷ s ÷ s = m ÷ ( s × s ) = m/s2
このことからも、加速度の単位が「 m/s2 」であることが分かります。
2. 1 加速度センサーで加速度を計測する
新しいプログラムを作成し、加速度センサーを使って加速度を計測してみましょう。
■ プログラムの作成
加速度センサーを制御するクラスは「StuduinoBitAccelerometer」という名前で定義されています。このクラスが定義されているpystubit.sensor
からインポートしてインスタンスaccelerometer
を作成しましょう。
1. from pystubit.sensor import StuduinoBitAccelerometer
2.
3. accelerometer = StuduinoBitAccelerometer()
加速度センサーの情報はget_values()
メソッドを使って取得します。
StuduinoBitAccelerometer.get_values() ・・・加速度センサーの情報を取得する。
次のように1秒置きにget_values()メソッドを実行し、print()
関数でターミナルに表示するコードを追加しましょう。
【 サンプルコード 2-1-1 】
追加【2行目、5~8行目】
1. from pystubit.sensor import StuduinoBitAccelerometer
2. import time
3.
4. accelerometer = StuduinoBitAccelerometer()
5. while True:
6. values = accelerometer.get_values()
7. print(values)
8. time.sleep_ms(200)
■ 計測結果の確認
下の写真のように、Studuino:bitのカバーを外し、ディスプレイを上向きにして平らな所に置きます。【 サンプルコード2-1-1 】を実行し、計測結果を確認しましょう。
(ターミナルの表示例)
(-0.05, -0.22, -10.16) (-0.03, -0.36, -10.03) (-0.11, -0.33, -10.11) (-0.09, -0.38, -10.09) (-0.02, -0.31, -10.14) (-0.02, -0.24, -10.05) (-0.07, -0.33, -9.97)
get_values()
メソッドで取得した情報は次の3つの値からなるタプルになっています。
( X軸方向の加速度, Y軸方向の加速度, Z軸方向の加速度 )
加速度センサーにはZ、Y、Zの3つの軸があり、タプルの3つの値は各軸方向に対する加速度(単位:m/s2)を示しています。
【 加速度センサーの3つの軸 】
軸の正(+)の方向と反対の向き(-)に加速度を検出すると、負の値で加速度が示されます。
■ 加速度センサーの重力による影響
加速度は速さの変化を表していることを説明しましたが、机の上に置き、静止している状態でも、z軸方向は一定の加速度を示しています。これは地球の重力の影響を受けているためです。加速度センサーは構造上この重力による加速度を計測できません。
高い所から物を落とすと、だんだんと速くなりながら落ちていきます。このように物が高い所から落ちるのは地球の重力が働くためです。そして、この重力によってものが自然と垂直に落下するときの理想的な加速度が「重力加速度」です。地球上での重力加速度はおよそ9.8m/s2(1秒あたりに9.8m/sずつ速くなる)で、どんな物体でも働く重力加速度の大きさは同じです。
実際に、Studuino:bitを下の写真のように持ち上げてから手を放し、Z軸の+方向に落下させ、そのときの加速度センサーの値を確認しましょう。
(ターミナルの表示例)
(-2.28, -0.84, -9.95) (-2.01, -0.55, -11.02) (-2.38, -0.12, -10.23) (-4.06, -1.43, -0.61)
上の4行目が落下中の計測結果の例です。実際には重力加速度分(約9.8m/s2)だけZ軸の+方向に加速度が働いていますが、最初の表示が重力の影響で負の値(-10m/s2前後)になっているため、相殺されて計測結果は0に近い値を示しています。
この結果から、Studuino:bitに内蔵された加速度センサーでは、重力加速度が計測できていないことが分かります。この理由は加速度センサーの構造にありますが、少し説明が難しくなるため、この講座では説明しません。興味のある人はインターネットで「加速度センサー 仕組み」と検索すると、いくつか解説しているページがヒットしますので、ぜひ調べてみてください。
■ Studuino:bitを振ったときの加速度センサーの値を確認する
Studuino:bitを振ると、速さが大きく変化します。実際に各軸の方向に振ったときの加速度センサーの値を確認してみましょう。
- X軸の正(+)方向に振ったとき
(振り始めた直後の値)
(16.32, -0.36, -9.04)
- X軸の負(-)方向に振ったとき
(振り始めた直後の値)
(-13.35, -1.8, -7.09)
- Y軸の正(+)方向に振ったとき
(振り始めた直後の値)
(1.37, 15.97, -7.96)
- Y軸の負(-)方向に振ったとき
(振り始めた直後の値)
(-0.44, -16.88, -9.87)
- Z軸の正(+)方向に振ったとき
(振り始めた直後の値)
(-2.14, 0.7, 17.71)
- Z軸の負(-)方向に強く振ったとき
(振り始めた直後の値)
(19.61, -7.78, -19.61)
加速度センサーの初期設定では、-19.6m/s2から19.6m/s2の範囲で加速度を計測するようになっているため、その範囲を超えた場合でも-19.6や19.6と表示されます。
2. 2 傾きと加速度センサーの値との関係
加速度センサーは重力により発生する加速度は計測できませんが、重力の影響で静止している状態での値を利用すると、Studuino:bitの傾きを判断できます。Studuino:bitを手に持ち、次の向きに傾けて静止したときの各軸の値を確認しましょう。
- 左に傾けた静止したとき
(計測例)
(-7.43, -0.38, -6.3)
- 右に傾けて静止したとき
(計測例)
(6.35, -0.11, -7.04)
- 奥に傾けて静止したとき
(計測例)
(-0.59, -7.62, -6.78)
- 手前に傾けて静止したとき
(計測例)
(-2.24, 5.92, -8.11)
左や右に傾けたときはX軸の値が大きく変化し、奥や手前に傾けたときはY軸の値が大きく変化しています。この結果から、左右の傾きを見るときはX軸の値、奥や手前の傾きを見るときはY軸の値を確認すれば良いことが分かります。反対にZ軸の値はどの向きに傾けても似たような数字になっているため、Z軸の値ではこれらの傾きは判断できないといえます。
【判断の例】
- X軸の値が -5より小さい ➡ 左に傾いている
- X軸の値が 5より大きい ➡ 右に傾いている
- Y軸の値が 5より大きい ➡ 手前に傾いている
- Y軸の値が -5より小さい ➡ 奥に傾いている
2. 3 傾きを検出するデジタル水平器の作成
水平器は地面に対する面の傾きを調べるための道具です。最もシンプルな水平器はガラスの密閉容器の中に気泡ができるように液体を入れたもので、この気泡が2本の基準線の間の中央にあれば、その面は地面に対して水平であることを示しています。
ここでは、加速度センサーとLEDディスプレイを利用して、LEDの点灯位置で傾きを調べるデジタル水平器を製作してみましょう。
■ プログラムの作成
【 サンプルコード2-1-1 】をベースにデジタル水平器のプログラムを作成していきます。始めに、100ミリ秒おきに加速度センサーの値を調べて、X軸方向の値を変数x
に保存するコードに書き換えましょう。
変更【7行目~8行目】
1. from pystubit.sensor import StuduinoBitAccelerometer
2. import time
3.
4. accelerometer = StuduinoBitAccelerometer()
5. while True:
6. values = accelerometer.get_values()
7. x = values[0] #(X軸, Y軸, Z軸)のタプルで表されているため、[0]でX軸の値を取り出せます。
8. time.sleep_ms(100)
次に、X軸の値によって左右に傾いていると判断できるときに、それぞれ左中央(0,2)と右中央(4.2)のLEDを点灯するコードを追加します。
追加【2行目、10行目~13行目】
1. from pystubit.sensor import StuduinoBitAccelerometer
2. from pystubit.board import display
3. import time
4.
5. accelerometer = StuduinoBitAccelerometer()
6. while True:
7. values = accelerometer.get_values()
8. x = values[0]
9.
10. if x < -5:
11. display.set_pixel(0, 2, (31, 0, 0))
12. elif x > 5:
13. display.set_pixel(4, 2, (31, 0, 0))
14.
15. time.sleep_ms(100)
最後に、どの方向にも傾いていなかった場合、ディスプレイの中央のLEDを点灯するコードを追加します。また、clear()
メソッドでディスプレイの表示を一度リセット(クリア)して次の計測を行うようにします。完成したプログラムを実行して、動作を確認しましょう。
【 サンプルコード2-2-1 】
追加【14行目~15行目、18行目】
1. from pystubit.sensor import StuduinoBitAccelerometer
2. from pystubit.board import display
3. import time
4.
5. ac = StuduinoBitAccelerometer()
6. while True:
7. values = ac.get_values()
8. x = values[0]
9. y = values[1]
10.
11. if x < -5:
12. display.set_pixel(0, 2, (31, 0, 0))
13. elif x > 5:
14. display.set_pixel(4, 2, (31, 0, 0))
15. else:
16. display.set_pixel(2, 2, (31, 0, 0))
17.
18. time.sleep_ms(100)
19. display.clear()
チャプター3
ジャイロセンサーの使い方
ジャイロセンサーは正式には、ジャイロスコープと呼ばれる装置で、物体の回転の速さを調べることができます。そのため、有名な所では航空機や船舶で姿勢を制御するために使われています。回転の速さの表し方はいくつかあり、一定時間あたりの回転数で表す方法と、一定時間あたりに回転する角の大きさ(角度)で表す方法があります。
【 回転の速さで性能が表されるものの例 】
- ミキサー
1分間で12,000回の速さで刃が回転する。
- サーボモーター
1秒間に180度の速さで軸が回転する。
ここで使うジャイロセンサーは角の大きさで回転の速さを表します。この速さのことを「角速度」といいます。
速度が「m」や「km」などの距離を時間で割って求めるのに対し、角速度は角の大きさ「°(度)」を時間で割って求めます。
角速度 = 回転した角の大きさ ÷ 回転にかかった時間
そのため、単位は「deg/s(degrees/seconds)」で表すことができます。
※度は英語でdegreesといいます。
3. 1 ジャイロセンサーで角速度を調べる
新しいプログラムを作成し、ジャイロセンサーを使って角速度を調べてみましょう。
■ プログラムの作成
ジャイロセンサーを制御するクラスは「StuduinoBitGyro」という名前で定義されています。このクラスが定義されているpystubit.sensor
からインポートしてインスタンスgyro
を作成しましょう。
1. from pystubit.sensor import StuduinoBitGyro
2.
3. gyro = StuduinoBitGyro()
ジャイロセンサーの情報はget_values()
メソッドを使って取得します。
StuduinoBitGyro.get_values() ・・・ジャイロセンサーで検出した角速度を(X軸方向、Y軸方向、Z軸方向)のタプルで取得する。
以下のように0.2秒(200ミリ秒)置きにget_values()メソッドを実行し、print文でターミナルエリアに表示するコードを追加しましょう。
【 サンプルコード 3-1-1 】
追加【2行目、5行目~8行目】
1. from pystubit.sensor import StuduinoBitGyro
2. import time
3.
4. gyro = StuduinoBitGyro()
5. while True:
6. values = gyro.get_values()
7. print(values)
8. time.sleep_ms(200)
下の図は、ジャイロセンサーの各軸の方向を表しています。加速度センサーと同様に、ジャイロセンサーもX、Y、Zの3つの軸がありますが、これらの軸は回転の中心軸を表しており、中心軸に対して時計回りのときは正の値で、反時計回りのときは負の値で角速度が示されます。
■ 回転方向とジャイロセンサーの値との関係
上のプログラムを転送して実行します。Studuino:bitをそれぞれの軸の回りに回転させたときの値の変化をターミナルで確認しましょう。
- x軸を中心に時計回りに回転させたときの例
(回転させた直後に表示される値)
(250.12, 12.83, -14.31)
- x軸を中心に反時計回りに回転させたときの例
(回転させた直後に表示される値)
(-250.13, 17.16, -3.01)
- y軸を中心に時計回りに回転させたときの例
(回転させた直後に表示される値)
(-20.9, 250.12, -12.97)
- y軸を中心に反時計回りに回転させたときの例
(回転させた直後に表示される値)
(30.21, -250.13, -38.01)
- z軸を中心に時計回りに回転させたときの例
(回転させた直後に表示される値)
(-5.07, -4.91, 250.12)
- z軸を中心に反時計回りに回転させたときの例
(回転させた直後に表示される値)
(1.17, -4.29, -250.13)
ジャイロセンサーは初期設定では、-250deg/s2から250deg/s2の範囲で角速度を計測するようになっています。そのため、その範囲を超えている場合でも、-250deg/s2や250deg/s2と表示されます。
3. 2 振った向きによって色が変化するコンサートライトの作成
ミュージシャンのライブで観客が様々な色のライトを振って、演奏を盛り上げている様子を見たことがある人も多いのではないでしょうか。このようなライトは「コンサートライト」や「ペンライト」と呼ばれています。
ここでは、ジャイロセンサーを利用して、振った向き(回転の向き)によって、LEDディスプレイの点灯色が変わるコンサートライトを作成します。下の図では、左に振ったときは青色、右に振ったときは緑色、振っていないときは白色に点灯しています。
■ プログラムの作成
振った向きを判断するために、Z軸回りの角速度を利用します。【 サンプルコード 3-1-1 】をベースに、100ミリ秒おきにZ軸回りの角速度を調べて、変数z
に保存するコードに書き換えましょう。
変更【7行目~8行目】
1. from pystubit.sensor import StuduinoBitGyro
2. import time
3.
4. gyro = StuduinoBitGyro()
5. while True:
6. values = gyro.get_values()
7. z = values[2]
8. time.sleep_ms(100)
次に、LEDディスプレイを制御するために、pystubit.board
からStuduinoBitDisplayクラスのインスタンスdisplay
と、StuduinoBitImageクラスを省略して書いたImage
を取り込み、全てのLEDが点灯するようにイメージのインスタンスを作成します。
追加【2行目、6行目】
1. from pystubit.sensor import StuduinoBitGyro
2. from pystubit.board import display, Image
3. import time
4.
5. gyro = StuduinoBitGyro()
6. image = Image('11111:11111:11111:11111:11111:')
7.
8. while True:
9. values = gyro.get_values()
10. z = values[2]
11. time.sleep_ms(100)
左に振ったときは青色、右に振ったときは緑色、振っていないときは白色でLEDディスプレイを点灯します。z < -200
やz > 200
のように条件式を用意して、調べたZ軸回りの加速度から回転の向きを判断する分岐処理のコードを書きます。そして、StuduinoBitDisplayクラスのshow()
メソッドを使い、それぞれ決められた色でLEDディスプレイを点灯させます。
【 サンプルコード 3-2-1 】
追加【10行目~15行目】
1. from pystubit.sensor import StuduinoBitGyro
2. from pystubit.board import display, Image
3. import time
4.
5. gyro = StuduinoBitGyro()
6. image = Image('11111:11111:11111:11111:11111:')
7. while True:
8. values = gyro.get_values()
9. z = values[2]
10. if z < -200:
11. display.show(image, delay=100, color=(0, 0, 31)) #左に振る:青
12. elif z > 200:
13. display.show(image, delay=100, color=(0, 31, 0)) #右に振る:緑
14. else:
15. display.show(image, delay=100, color=(31, 31, 31)) #振らない:白
16.
17. time.sleep_ms(100)
show()
メソッドは、イメージの点灯色を指定することができます。この場合、color=(0, 0, 31)
のように、「引数の名前=値」の形式で渡さなければいけません。この形式で渡す引数をキーワード引数といいます。詳しくはテーマ.3-4で解説しますので、ここではそのまま書き写しておきましょう。
これでプログラムの完成です。実行して、動作を確認しましょう。
チャプター4
課題:奥や手前に振ったときにも色を変化させる
【 サンプルコード 3-2-1 】をベースに、奥や手前に振ったときにも色が変わるようにコードを追加しましょう。 奥に振ったときは黄色、手前に振ったときは赤色に点灯させましょう。
※ヒント:奥や手前に振ったかどうかの判断にはX軸回りの角速度を利用します。
4. 1 プログラムの作成
X軸回りの角速度から奥や手前に振ったかどうかを判断します。手前に振ったことを判定する「x < -200
」と、奥に振ったことを判定する「x > 200
」の条件式で2つのelif文を追加し、赤色と黄色でLEDディスプレイを点灯するコードを書きましょう。
【 サンプルコード 4-1-1 】
追加・変更【9行目、15行目~18行目】
1. from pystubit.sensor import StuduinoBitGyro
2. from pystubit.board import display, Image
3. import time
4.
5. gyro = StuduinoBitGyro()
6. image = Image('11111:11111:11111:11111:11111:')
7. while True:
8. values = gyro.get_values()
9. x = values[0]
10. z = values[2]
11. if z < -200:
12. display.show(image, delay=100, color=(0, 0, 31)) # 左に振る:青
13. elif z > 200:
14. display.show(image, delay=100, color=(0, 31, 0)) # 右に振る:緑
15. elif x < -200:
16. display.show(image, delay=100, color=(31, 0, 0)) # 手前に振る:赤
17. elif x > 200:
18. display.show(image, delay=100, color=(31, 31, 0)) # 奥に振る:黄
19. else:
20. display.show(image, delay=100, color=(31, 31, 31)) # 振らない:白
21.
22. time.sleep_ms(100)
チャプター5
おわりに
5. 1 このレッスンのまとめ
このレッスンではStuduino:bitに内蔵されている加速度センサーとジャイロセンサーの使い方を学びました。「加速度」と「角速度」の説明や、「X」「Y」「Z」の3つの軸の説明があり、少し難しいところもありましたが、2つのセンサーを使いこなすためには、必ず理解しておかなければいけない概念ですので、曖昧(あいまい)なままにせず、しっかりと復習をしておきましょう。
5. 2 次回のレッスンについて
次回のテーマ.3-3では、StuduinoBitImageクラスに用意されているメソッドや特殊な演算処理について学び、LEDディスプレイを利用した高度な表現をつくります。