MicroPythonでEV3のタッチセンサーを使ってみよう!
MicroPythonでレゴマインドストームEV3をプログラミングすることについては、「EV3をPythonでプログラミング~環境構築」で環境構築について、「MicroPythonでEV3を動かしてみよう!」で2つのモーターを使って移動することについて紹介しました。今回はタッチセンサーを使ってみます。
これまでEV3ソフトウェアでプログラミングを作っていて、はじめてテキスト言語(MicroPython)でプログラミングしてみる方を対象に書いています。
タッチセンサーが押されたら・・・のプログラム
前回の復習も兼ねて、ロボットを動かしながらタッチセンサーを使ってみましょう。では、「ロボットは前進し、タッチセンサーが押されたら停止する」プログラムを作ってみましょう。ロボットの左側モーターはポートB、右側モーターをはートC、タッチセンサーはポート1に接続しているものとします。
EV3ソフトウェア
EV3ソフトウェアでは、タンクまたはステアリングと待機ブロックのタッチセンサーモードを使って、以下のようにプログラミングすることができます(プログラム例ではタンクを使用)。他にも条件分岐を使ったり、ループ中断やループの終了条件を使っても同じ動作は可能ですね。
ここでは、待機ブロックのタッチセンサーモードを使ったプログラムを例に説明します。待機ブロックの後にタンクのオフを入れています。オフはなくてもモーターは停止しますが、タッチセンサーが押されたらタイヤが惰性で動かずにすぐに停止するようにオフを入れています。
MicroPython
今度は、同じ動作のプログラムをMicroPythonで作ってみましょう。While文で条件式を「タッチセンサーが押されていない」にする、while Trueとしてif文でタッチセンサーが押されたらリープを抜ける、などいろいろな方法があると思いますが、EV3ソフトウェアでの待機ブロックのセンサーモードを使ったプログラムに忠実に描くとすると、以下のようになるかと思います。
#!/usr/bin/env pybricks-micropython
from pybricks.ev3devices import Motor
from pybricks.ev3devices import TouchSensor
from pybricks.parameters import Port
motor_left = Motor(Port.B)
motor_right = Motor(Port.C)
touch_sensor = TouchSensor(Port.S1)
motor_left.run(360)
motor_right.run(360)
while not touch_sensor.pressed() :
pass
motor_left.brake()
motor_right.brake()
2~4行目
必要なモジュール(関数や」クラスなどをまとめたもの)をインポートします。
6~7行目
左側のモーターを出力ポートBに接続し、それをプログラムの中で「motor_left」という名前で扱うことを記述しています。同様に右側のモーターをポートCに接続し、「motor_rightという真苗で扱うことを記述しています。
8行目
ポート1に接続したタッチセンサーを、「touch_sensor」という名前で扱うことを記述しています。/p>
10~11行目
「run(360)」でモーターを回転させています。( )内の数値は角速度(度/秒)です。
13~14行目
while文の条件を「タッチセンサーが押されていない」として、タッチセンサーが押されるまでpass(何もしない)を繰り返します。
16~17行目
「brake()」でモーターを停止させています。
※ 「stop()」とすると、モーターはすぐに停止せず、惰性で回転を続けます。
まとめ
今回は、MocroPythonでEV3のタッチセンサーを使ってみました。
TouchSensorクラスのpressed()を使うと、タッチセンサーが押されたときは「True」を、押されていない場合は「False」を返します。
while 条件式:
条件式を満たしている(True)間、処理を繰り返し、条件式を満たさなくなると(False)while文は終了します。