Pythonロボティクスコース レッスン 10
テーマ.3-1 ArtecRobo(アーテックロボ)の使い方
モーターやセンサーなどロボットの制作に必要なパーツの使い方を学ぼう
チャプター1
このレッスンで学ぶこと
このレッスンでは、キットのロボット拡張ユニットを使用して、DCモーターやサーボモーター、3種類のセンサーの使い方を学習します。
1. 1 レッスンを始める前の準備
このレッスンを始める前に、次の手順でStuduino:bitのファームウェアの更新を行ってください。(※初期状態では、このレッスンから使用する超音波距離センサーとカラーセンサーが使用できません。この更新作業を行うことで使用可能になります。)
※ファームウェア・・・Studuino:bitにあらかじめ組み込まれているプログラム。
- PCとStuduino:bitをUSBケーブルで接続します。
- Studuino_bitを起動します。
- 立ち上がった画面で「ロボットモード」を選択します。
- メニューバーから「ヘルプ」を選び、「ファームウェア更新」を選択します。
- ファームウェアの更新には1分程度かかります。OKをクリックします。
- 更新が完了したらOKをクリックして、Studuino:bitのリセットボタンを押します。
チャプター2
ArtecRoboについて
2. 1 ArteRoboの特徴
ArtecRoboは縦・横・斜めに自由に接続できるArtecBlocks(アーテックブロック)とArtecBlocksと接続可能な電子パーツから構成されたロボット・プログラミングの学習教材です。
ブロックを組み合わせるだけで、車型ロボットやロボットアーム、ゲームの筐体(きょうたい)など、様々な製品のモデルを製作することができます。
これまで使用してきたStuduino:bitはArtecRoboを制御するためのメインコンピューターとして使います。Studuino:bitをロボット拡張ユニットに接続することで、ブロック型のモーターやセンサーが制御できるようになります。
※Studuino:bitのカバーを外し、金属端子部分をロボット拡張ユニットに差し込みます。
2. 2 このレッスンから使用するArteRoboのパーツ
ArtecRoboには様々な電子パーツがあります。この講座で使用するのは、その中で次の2種類のモーターと3種類のセンサーです。
- DCモーター
- サーボモーター
- 赤外線フォトリフレクタ
- 超音波距離センサー
- カラーセンサー
また、センサーをロボット拡張ユニットに接続するときは、専用の接続コードを使用します。
- 接続コード(3芯15cm)
- 接続コード(3芯30cm)
- 接続コード(4芯30cm)
赤外線フォトリフレクタと超音波距離センサーには3芯のものを使い、カラーセンサーには4芯のものを使います。
ここからは、実際にこれらのパーツをPythonのプログラムで制御していきます。それぞれのパーツを箱から探し、取り出しておきましょう。
チャプター3
ロボット拡張ユニットの使い方
3. 1 各種パーツの接続端子
ロボット拡張ユニットの側面には複数の端子があります。それぞれアルファベットと数字からなる名前が付けられており、接続できるパーツが次のように決められています。
端子名 | 接続するパーツ |
---|---|
P13, P14, P15, P16 | サーボモーター |
M1, M2 | DCモーター |
P0, P1, P2 | 赤外線フォトリフレクタ, 超音波距離センサー |
I2C | カラーセンサー |
3. 2 ロボット拡張ユニットの電源
ロボット拡張ユニットを使用するときは、電池からの電源供給が必要です。電池ボックスに単3のアルカリ乾電池を3本入れます。
※乾電池を入れるときは、+端子と-端子の向きに注意してください。
電池ボックスの端子を底面にある電源端子に接続します。
接続後にロボット拡張ユニットの側面にある電源ボタンを長押しすると、ONの状態になり、Studuino:bitの電源ランプが点灯します。再び電源ボタンを長押しすると、OFFの状態になります。
Studuino:bitだけを使用する場合は、電池ボックスをStuduino:bit側の電源端子に接続します
※Studuino:bitには電源ボタンはなく、電池ボックスを接続した時点でONの状態になります。
また、電池ボックスには突起があり、ロボット拡張ユニットに取り付けておくと、持ち運びしやすくなります。
チャプター4
DCモーターの使い方
4. 1 DCモーターの仕組み
DCモーターは回転する向きと速さを制御できるモーターで、車型ロボットでタイヤを回転させるために使われることが多いパーツです。内部は複数のギヤ(歯車)が組み合わされていて、モーターのトルク(回転の力)を200倍ほどまで上げて、出力しています。
4. 2 DCモーターの接続
DCモーターはM1またはM2の端子に接続します。ここでは、M1に接続しましょう。
4. 3 DCモーターの制御プログラム
練習として、DCモーターが時計回りに5秒間回転するプログラムを作成します。
※裏表を反対にしておいた場合、回転方向が反対向き(反時計回り)になります。
■ DCMotorクラスのインポート
DCモーターはDCMotorクラスのメソッドを使って制御します。DCMotorクラスはpyatcrobo2.parts
内で定義されています。from~import文でDCMotorクラスをインポートして、インスタンスを作成しましょう。
1. from pyatcrobo2.parts import DCMotor
2.
3. dcm = DCMotor('M1')
上のプログラムのように、DCMotorクラスのインスタンスを作成するときは、引数として接続した端子名を文字列で渡します。そのため、M2の端子にDCモーターを接続した場合は「’M2’」を指定します。
■ 回転の速さと向きの設定
DCモーターは速さと向きの2つパラメーターを制御して回転させます。まず、回転の速さをpower()
メソッドで制御します。このメソッドは引数として「0~255」の範囲で速さを指定します。
DCMotor.power(power) ・・・DCモーターの回転の速さを設定する。
※実際には「速さ」ではなく、流れる「電流の強さ」を制御するメソッドのため、powerという名前が付いています。
また、回転の向きを制御するメソッドはcw()
とccw()
です。時計回りは英語で「clockwise」、反時計回りは「counter-clockwise」といいます。そのため、メソッド名はそれらを省略した「cw」、「ccw」となっています。これらのメソッドには引数はありません。
DCMotor.cw() ・・・DCモーターを時計回りに回転させる。
DCMotor.ccw() ・・・DCモーターを反時計回りに回転させる。
そのため、DCモーターを100の速さで時計回りに回転させるプログラムは次のように書くことができます。
追加【4行目、5行目】
1.from pyatcrobo2.parts import DCMotor
2.
3. dcm = DCMotor('M1')
4.dcm.power(100)
5.dcm.cw()
■ 回転の停止
DCモーターの回転を停止させるメソッドはbrake()とstop()の2つがあります。brake()は負荷をかけて、ぴったりと止めるのに対し、stop()は負荷をかけず自然に止まるのを待ちます。これらのメソッドにも引数はありません。
DCMotor.brake() ・・・DCモーターに負荷をかけ、ぴったりと回転を止める。
DCMotor.stop() ・・・DCモーターに負荷をかけず、ゆっくりと回転を止める。
また、ここでは5秒間走らせるため、time
モジュールのsleep_ms()
メソッドを使い、回転から停止までの間を5秒間(5000ミリ秒)あけます。sleep_ms()
メソッドの「ms」は「miliseconds(ミリ秒)」を省略した表記です。1ミリ秒は1秒の1000分の1の時間を表すため、5秒は5000ミリ秒と表すことができます。
【 サンプルコード 4-3-1 】
追加【2行目、7・8行目】
1.from pyatcrobo2.parts import DCMotor
2.import time
3.
4. dcm = DCMotor('M1')
5.dcm.power(100)
6.dcm.cw()
7.time.sleep_ms(5000)
8.dcm.brake()
これでプログラムの完成です。実行して動作を確認しましょう。
4. 4 回転の向きと回転の時間を変更したプログラムの作成
上の【 サンプルコード 4-3-1 】を変更して、10秒間反時計回りにDCモーターを回転させましょう。以下のコードのように、cw()
メソッドの代わりに、ccw()
メソッドを使い、time.sleep_ms()
の引数を「10000」ミリ秒に変更します。
【 サンプルコード 4-4-1 】
1.from pyatcrobo2.parts import DCMotor
2.import time
3.
4.dcm = DCMotor('M1')
5.dcm.power(100)
6.dcm.ccw()
7.time.sleep_ms(10000)
8.dcm.brake()
チャプター5
サーボモーターの使い方
5. 1 サーボモーターの仕組み
サーボモーターは、回転する位置を角度で指定できるモーターです。サーボモーターの内部にはロータリーエンコーダーという回転を計測する装置が備わっており、ArtecRoboのサーボモーターは0度から180度の範囲の中で、1度単位で正確に位置を測定して、回転を制御できるようになっています。
※サーボモーターは両側面に回転軸がありますが、内部のモーターとつながっているのは片方の回転軸だけです。モーターとつながっている回転軸は手で回すと重たさを感じます。
5. 2 サーボモーターの接続
サーボモーターはP13からP16の端子に接続します。ここではP13につなぎましょう。
5. 3 サーボモーターの制御プログラム
サーボモーターを0度から180度まで回転させるプログラムを作り、サーボモーターの制御方法を確認します。新しいプログラムを作成しましょう。
■ Servomotorクラスのインポート
サーボモーターはServomotorクラスのメソッドで制御します。このクラスもpyatcrobo2.parts
内で定義されています。from~import文でServomotorクラスをインポートして、インスタンスを作成しましょう。インスタンス作成時は、DCMotorクラスと同様に引数として接続した端子名を文字列で渡します。
1.from pyatcrobo2.parts import Servomotor
2.
3. servo = Servomotor('P13')
■ サーボモーターの回転位置の制御
サーボモーターの回転位置を制御するときは、set_angle()
メソッドを使います。このメソッドの引数には角度を単位「度(°)」で指定します。
Servomotor.set_angle(degree) ・・・サーボモーターを指定した位置まで回転させる。
set_angle()
メソッドの実行後、サーボモーターはすぐに回転を始めます。コンピューターはサーボモーターが指定した角度まで回転し終えるのを待たず、次の命令を実行するため、連続して回転させる場合は、次のset_angle()メソッドとの間に時間をあける必要があります。そのため、以下のコードではtime.sleep_ms(1000)
で間を1秒あけています。
追加【2行目、5行目~7行目】
【 サンプルコード 5-3-1 】
1. from pyatcrobo2.parts import Servomotor
2. import time
3.
4. servo = Servomotor('P13')
5. servo.set_angle(0)
6. time.sleep_ms(1000)
7. servo.set_angle(180)
5. 4 0度と180度を往復するプログラムの作成
上の【 サンプルコード 5-3-1 】にfor文と標準関数のrange()
を追加して、0度と180度の間を5回往復する動作を作りましょう。
単にfor文で囲むだけではなく、サーボモーターが180度から0度へ変化するときも、同様に時間をあける必要があるため、以下のコードのように末尾にtime.sleep_ms(1000)
を追加します。
【 サンプルコード 5-4-1 】
1. from pyatcrobo2.parts import Servomotor
2. import time
3.
4. servo = Servomotor('P13')
5. for i in range(5):
6. servo.set_angle(0)
7. time.sleep_ms(1000)
8. servo.set_angle(180)
9. time.sleep_ms(1000)
チャプター6
赤外線フォトリフレクタの使い方
6. 1 赤外線フォトリフレクタの仕組み
赤外線フォトリフレクタは赤外線の反射を利用し、正面に物体があるかどうかを調べるセンサーです。内部は赤外線の発光部と受光部に分かれており、発光部から出た赤外線が物体表面で反射し、受光部に入ってきたときの強さを検出する仕組みになっています。
6. 2 赤外線フォトリフレクタの接続
赤外線フォトリフレクタはP0からP2の端子に接続します。ここでは、センサー接続コード(3芯15cm)を使い、P0につなぎましょう。
6. 3 赤外線フォトリフレクタの制御プログラム
赤外線フォトリフレクタの値を調べるプログラムを作り、その特性を確認します。新しいプログラムを作成しましょう。
■ IRPhotoReflectorクラスのインポート
赤外線フォトリフレクタの情報はIRPhotoReflectorクラスのメソッドを使って取得します。このクラスはpyatcrobo2.parts
内で定義されています。import文でIRPhotoReflectorクラスをインポートし、インスタンスを作成しましょう。インスタンス作成時は、引数として接続した端子名を文字列で渡します。
1. from pyatcrobo2.parts import IRPhotoReflector
2.
3. ir = IRPhotoReflector('P0')
■ センサー値の取得
Studuino:bitの光センサーと同じで、赤外線フォトリフレクタで検出した赤外線の強さもコンピューター上では数値で表されます。この数値情報の取得にはget_value()
メソッドを使います。このメソッドには引数はありません。
IRPhotoReflector.get_value() ・・・赤外線フォトリフレクタの値(0~4095)を取得する。
実際に次のようにコードを追加して、プログラムを実行します。
【 サンプルコード 6-3-1 】
追加【2行目、5行目~8行目】
1. from pyatcrobo2.parts import IRPhotoReflector
2.
3. import time
4. ir = IRPhotoReflector('P0')
5. while True:
6. value = ir.get_value()
7. print(value)
8. time.sleep_ms(500)
print文で連続してターミナルエリアに文字を表示させるときは、間に少し時間をあける必要があります。もし時間をあけなかった場合、表示処理が重くなり、ソフトウェアが操作できない状態(ビジー状態)になることがあります。
では、正面になにもないときと手を近づけたときの値をターミナルで確認しましょう。
(ターミナルの表示例)
59 58 54 54 1106 1384 1378 1374
赤外線フォトリフレクタに手を近づけると、値が大きくなることが分かります。赤外線フォトリフレクタは検出した赤外線が強いほど大きな値を返すようになっており、また、この値は対象物との距離が近いほど大きくなります。
赤外線は太陽光にも含まれているため、赤外線フォトリフレクタを太陽に向けると大きな値を示します。そのため、赤外線フォトリフレクタは直接太陽光が当たらない環境下で使用してください。
チャプター7
超音波距離センサーの使い方
7. 1 超音波距離センサーの仕組み
超音波距離センサーは、超音波の反射を利用して、正面にある物体との距離を調べるセンサーです。超音波を発信した時間と反射した超音波を受信した時間の差(T)を測り、超音波の速度(V)から次の計算式で対象物までの距離(L)を求めます。
L = T×V÷2
※Tは超音波が対象物との間を往復するのにかかった時間を表しており、T×Vの結果は往復の距離となります。そのため「÷2」で対象物との距離を求めています。
※超音波は空気中をおよそ340m/sの速さで進みます。
7. 2 超音波距離センサーの接続
超音波距離センサーはP0もしくはP1の端子に接続します。ここでは、センサー接続コード(3芯30cm)を使い、P1につなぎましょう。
※ 超音波距離センサーはP2に接続して使用することができません
7. 3 超音波距離センサーの制御プログラム
ボタンAを押すと、正面の物体との距離を調べるプログラムを作り、超音波距離センサーの使い方を確認します。新しいプログラムを作成しましょう。
■ UltrasonicSensorクラスのインポート
超音波距離センサーから得られる距離情報は、UltrasonicSensorクラスのメソッドを使って取得します。このクラスもpyatcrobo2.parts
内で定義されています。from~import文でUltrasonicSensorクラスをインポートし、インスタンスを作成しましょう。
1. from pyatcrobo2.parts import UltrasonicSensor
2.
3. us = UltrasonicSensor('P1')
■ 距離の取得
距離の取得には、get_distance()
メソッドを使います。このメソッドの戻り値の単位は「cm」です。引数はありません。ArtecRoboの超音波距離センサーでは、およそ300cm(3m)までの距離を測ることができます。
UltrasonicSensor.get_distance() ・・・超音波距離センサーで正面にある物体との距離(cm)を取得する。
以下のようにコードを追加して、プログラムを実行します。手の位置を段階的に変えて、正確に距離が測定できているか確認しましょう。
【 サンプルコード 7-3-1 】
追加【2行目、5行目~8行目】
1. from pyatcrobo2.parts import UltrasonicSensor
2. import time
2.
4. us = UltrasonicSensor('P1')
5. while True:
6. distance = us.get_distance()
7. print(distance)
8. time.sleep_ms(1000)
9.
10. #プログラム実行時に ImportError: cannot import name UltrasonicSensor
11. #というエラーが表示される場合、Studuino:bitのファームウェアが古い可能性があります。
12. #下記のソフトウェアをインストールして、ファームウェアを更新します。
13. # https://www.artec-kk.co.jp/artecrobo2/pdf/jp/studuinobit_setup.pdf
14. #インストールしたら、ロボットモードで起動し、メニューのヘルプからファームウェアの
15. # 更新を選択してファームウェアを更新します。
(ターミナルエリアの表示例)
1.96 7.77 14.1
チャプター8
カラーセンサーの使い方
8. 1 カラーセンサーの仕組み
カラーセンサーは3色のLEDを照射して、その反射光の強さをRGBに分けて検出することで色の成分と明るさを調べるセンサーです。カラーセンサーも赤外線フォトリフレクタと同様に内部は発光部と受光部に分かれています。発光部には赤(Red)、青(Blue)、緑(Green)の3色のLEDがついています。
この3色のLEDを高速で順番に点灯させ、そのとき受光部で検出された反射光の強さを計測し、赤、緑、青の各色の強さを感知するようになっています。
8. 2 カラーセンサーの接続
カラーセンサーはI2Cに接続します。センサー接続コード(4芯30cm)を使い、つなぎましょう。
※I2C(Inter-Integrated Circuit)は、マイコンとデバイスの間での高速データ通信を行うために開発された通信方式です。カラーセンサーの場合、R(赤)G(緑)B(青)の3つのデータを送る必要があるため、I2Cが使われています。
8. 3 カラーセンサーの制御プログラム
ボタンAを押すと色を調べるプログラムを作り、カラーセンサーの使い方を確認します。新しいプログラムを作成しましょう。
■ ColorSensorクラスのインポート
カラーセンサーの情報は、ColorSensorクラスのメソッドで取得します。このクラスもpyatcrobo2.parts
で定義されています。from~import文でColorSensorクラスをインポートし、インスタンスを作成しましょう。インスタンス作成時の引数には必ず「’I2C’」を指定します。
1. from pyatcrobo2.parts import ColorSensor
2.
3. cs = ColorSensor('I2C')
■ 色情報の取得
色の成分と明るさを調べるときは、get_values()
メソッドを使います。このメソッドには引数はありません。メソッド名が「get_values
」と英語の名詞の複数形になっているのは、R(赤)G(緑)B(青)の3つの成分の強さと色の明るさの4つの情報が格納されたタプルが戻り値となっているためです。
ColorSensor.get_values() ・・・カラーセンサーで対象物のRGBの各成分の強さと色の明るさを調べる。戻り値は(R, G, B, 明るさ)のタプル。
それでは、下のようにコードを追加して、ボタンAが押されたときにカラーセンサーの情報を取得するようにしましょう。
【 サンプルコード 8-3-1 】
追加【2行目、3行目、6行目~10行目】
1. from pyatcrobo2.parts import ColorSensor
2. from pystubit.board import button_a
3. import time
4.
5. cs = ColorSensor('I2C')
6. while True:
7. if button_a.is_pressed():
8. values = cs.get_values()
9. print(values)
10. time.sleep_ms(1000)
キットの箱から赤、緑、青、黄の4色のブロックを取り出します。上のプログラムの転送後、各色のブロックにカラーセンサーを近づけ、Aボタンを押して値を調べましょう。
- ターミナルエリアの表示例(赤ブロック)
[127, 50, 45, 38]
- ターミナルエリアの表示例(緑ブロック)
[57, 96, 57, 24]
- ターミナルエリアの表示例(青ブロック)
[59, 41, 79, 22]
- ターミナルエリアの表示例(黄ブロック)
[59, 42, 17, 44]
赤ならR値、緑ならG値、青ならB値が最も大きくなっていることが分かります。黄は赤と緑の両方の光が含まれるため、R値とG値が近い大きさになります。
【 光の3原色 】
チャプター9
おわりに
9. 1 このレッスンのまとめ
このレッスンでは、ArtecRoboの以下のパーツの仕組みと、それを利用するためのコードの書き方を学習しました。
- DCモーター
- サーボモーター
- 赤外線フォトリフレクタ
- 超音波距離センサー
- カラーセンサー
これからのレッスンでは、Studuino:bitに内蔵されているパーツ(LEDディスプレイ、ブザー、ボタンなど)と、ここで使い方を学んだArtecRoboのパーツを組み合わせた様々な作例づくりを行っていきます。もし、パーツの使い方を忘れてしまったときは、このレッスンを振り返るようにしましょう。
9. 2 次のレッスンについて
次のレッスンは、Studuino:bitに搭載されている2つのセンサー「加速度センサー」「ジャイロセンサー」の使い方を学びます。