ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
今回私はロボットの完成に居合わせませんでした。プログラムも走らせてません。のでグループの人を参考に妄想でプログラムを書こうと思います。
2台分のパーツを1台に取り付けた。
カラーセンサーを2つ取り付けることによって精度上げた。
上図のように先端に棒がついている。この腕をトレイに向かって振り下げることでボールを外に出す。
下図のように動作部分を回すことで地面にあるボールを回収していく。
また逆回転させることでボールを撃ち出す。
#!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep r = LargeMotor('outC') l = LargeMotor('outA') csR = ColorSensor('in1') csL = ColorSensor('in2') a = LargeMotor('outD') h = MediumMotor('outB')
aがトレイを傾ける腕でhがボールを回収する腕。
左のタイヤを軸に右に曲がる
def move_r(t): r.run_timed(time_sp=t, speed_sp=-100, stop_action='hold') sleep(t/1000)
右のタイヤを軸に左に曲がる
def move_l(t): l.run_timed(time_sp=t, speed_sp=-100, stop_action='hold') sleep(t/1000)
タイヤの間を中心に左回り
def move_l2(t): r.run_timed(time_sp=t, speed_sp=-100, stop_action='hold') l.run_timed(time_sp=t, speed_sp=100, stop_action='hold') sleep(t/1000)
タイヤの間を中心に右回り
def move_r2(t): r.run_timed(time_sp=t, speed_sp=100, stop_action='hold') l.run_timed(time_sp=t, speed_sp=-100, stop_action='hold') sleep(t/1000)
後退する
def move_back(t): l.run_timed(time_sp=t, speed_sp=100, stop_action='hold') r.run_timed(time_sp=t, speed_sp=100, stop_action='hold') sleep(t/1000)
前進する
def move_forward(t): r.run_timed(time_sp=t, speed_sp=-100, stop_action='hold') l.run_timed(time_sp=t, speed_sp=-100, stop_action='hold') sleep(t/1000)
ライントレースの定義
def Trace_Method(): while True: if csL.value() >= 15 and csR.value() >= 15: move_forward(100) elif csL.value() <= 14 and csR.value() >= 15: move_l2(100) elif csL.value() >= 15 and csR.value() <= 14: move_r2(100) else: break
このロボットの機構の都合上ボールをゴールにシュートするときトレイを傾けてシュートする必要がある。となると一度トレイに球を入れてももう一度倒したら玉が転がって行ってしまう。なのでシュートチャンスは一度きりと考えた方がいいだろう。またトレイの中のボールを回収するのはかなり難易度が高いため元から地面に落ちているボール2つを回収する。
まずAからLまで行きボールを回収したのち180度回転し線J'K'上を目指す。着いたらL'でボールを回収しトレイに入れる。
まずLまで行くプログラムを考える。KまではTrace_Method()でいいのだがそのままだとおそらく止まってしまう。なので少し書き換える。
while True: if 80 >= csL.value() >= 20 and 80 >= csR.value() >= 20: move_forward(100) elif 10 < csL.value() <= 20 and 80 >= csR.value() >= 20: move_l2(100) elif 80 >= csL.value() >= 20 and csR.value() <= 20: move_r2(100) elif csL.value() <= 10: move_forward() else: h.run_timed(time_sp=1000,speed_sp=80,stop_action='hold') brake
たぶんきっとおそらくこれでLまで行きボール回収して停止するはずである。
次に回転してJ'K'まで進む。回転するプログラムはmove_r2()かmove_l2()を使えばおそらくできる。経験から時間は3300ぐらいだと予想する。J'K'まで進むプログラムだがうまく回転できていればどちらかのカラーセンサーが4回黒線を認識したらJ'K'上に着くはず。
i=0 while i=<3 if csR.value() > 10: move_forward(200) else: move_forward(200) i+=1
これでJ'K'上に着くはず。次にL'に向かう。このときボールを回収する腕が閉まっているためボールを回収するにはL'に着く前に開けておく必要がある(L'で開けると腕がボールに当たるため)。なのでここで開けておく。
h.run_timed(time_sp=1000,speed_sp=-80,stop_action='hold') while True: if 80 >= csL.value() >= 20 and 80 >= csR.value() >= 20: move_forward(100) elif csL.value() <= 20 and 80 >= csR.value() >= 20: move_l2(100) elif 80 >= csL.value() >= 20 and 10 < csR.value() <= 20: move_r2(100) elif csR.value() <= 10: move_l() else: h.run_timed(time_sp=1000,speed_sp=80,stop_action='hold') brake
これで2つ目のボールが回収できた(はず)。あとはトレイに入れるだけ。L'で180度回転しライントレースでトレイに向かう。
ここで重大なことに気づきました。シュートするときのベストなトレイから距離がわからない。目的地がわからないとさすがにプログラムが書けないので残念ですがここで妄想プログラミングを終わりとします。
そもそも一度も試していないので改善点はおそらくありますがありません。反省点は時間と発想。期末試験に追われて時間を取れなかった。できればあと3か月くらいは欲しかった。そして発想力。これはどうしようもないかもしれませんが、何もアイディアを思いつけなかったのが悲しかった。