私たちは課題1・2同様EV3にTera Termを使用してWindowsOSのままに接続した。また、プログラミング言語にはPythonを使用した。
今回は2体のロボットを使用した。私たちは2体のうち、1体を紙コップを一つの場所に運ぶ仕事、1体を運ばれた紙コップを積んでいく仕事に分けた。 紙コップを運ぶロボットは光センサーを用いたライントレースと赤外線センサーを用いた紙コップの検出を行うように設計した。またコップを検出した際には機体前方のアームでつかむように設定した。
また、つかむ機構は以下の写真のようになっている。
紙コップを重ねるロボットは超音波センサーを用いて紙コップを検出するように設計した。その後ベルトコンベアを使って紙コップを上に持ち上げ、その後紙コップを下ろすという仕組みである。
また、写真右側のベルトコンベア下側についているモーターによってベルトコンベアを開くことにより、コップを正確に落下できるようにしてある。
紙コップを運ぶロボットのプログラムは以下のように定義した。
#!/usr/bin/python import ev3dev.ev3 as ev3 import time ml = ev3.LargeMotor('outB') mr = ev3.LargeMotor('outA') mm = ev3.MediumMotor('outC') cs = ev3.ColorSensor('in1') de = ev3.InfraredSensor('in2')
そして、以下のプログラムによって、コップを検出し、掴むという動きを行った。
def catch(): while de.value() < 50: if de.value() < 10: ml.run_forever(duty_cycle_sp=0) mr.run_forever(duty_cycle_sp=0) mm.run_forever(duty_cycle_sp=50) time.sleep(4) mm.run_forever(duty_cycle_sp=0) ml.run_forever(duty_cycle_sp=-20) mr.run_forever(duty_cycle_sp=-20) time.sleep(1.5) ml.run_forever(duty_cycle_sp=0) mr.run_forever(duty_cycle_sp=0) ml.run_forever(duty_cycle_sp=-50) mr.run_forever(duty_cycle_sp=50) time.sleep(1.6) ml.run_forever(duty_cycle_sp=0) mr.run_forever(duty_cycle_sp=0) else: ml.run_forever(duty_cycle_sp=15) mr.run_forever(duty_cycle_sp=15)
コップを持ち上げて積むロボットは以下のように定義した。
#!/usr/bin/python import ev3dev.ev3 as ev3 import time m1 = ev3.LargeMotor('outA') m2 = ev3.MediumMotor('outB') m3 = ev3.MediumMotor('outC') m4 = ev3.LargeMotor('outD') us = ev3.UltrasonicSensor('in1')
そして、コップを探すプログラミングは以下のとおりである。
def search(p): t0 = time.time() while time.time() - t0 < 0.001: if us.value() > p: m4.run_forever(duty_cycle_sp=50) t0 = time.time() else: m4.stop()
距離をpで定義したのは、コップを持っていない状態と持っている状態ではベルトコンベアの開き具合が異なるためである。
また、以下のプログラムでコップの移動を行った
def bring(x,y): m4.run_forever(duty_cycle_sp=x) time.sleep(y) m4.stop()
そして、以下のプログラムで片側のベルトコンベアの開閉を行った。
def close(): m1.run_forever(duty_cycle_sp=-37.5) time.sleep(0.32) m1.stop()
また、以下のプログラミングでコップの持ち上げを行った。
def up(): m3.run_forever(duty_cycle_sp=-50) m2.run_forever(duty_cycle_sp=50) time.sleep(2.25) m2.stop() m3.stop()
コップを下げるのは以下のプログラミングで行った。
def down(): m3.run_forever(duty_cycle_sp=50) m2.run_forever(duty_cycle_sp=-50) time.sleep(1.5) m2.stop() m3.stop()
最後にベルトコンベア片側の開くプログラミングは以下のとおりである。
def open(a,b): m1.run_forever(duty_cycle_sp=a) time.sleep(b) m1.stop()
a,bを定義した理由として、ベルトコンベアの開き具合を変えることで、コップを挟んだ状態で積むためのコップを真下に持ち込むことが可能になるからだ。
以上のプログラミングを以下のように並べることで、コップを認識して上に持ち上げ、その後積むコップを認識して上に持ち上げたコップを下す、という操作を行うことができる。
search(60) bring(45,0.2) close() up() search(60) open(20,0.275) bring(45,0.2) down() open(27.5,0.325) bring(-40,7.5)
ロボコンでは、紙コップを運ぶロボットのアームの動きやライントレースがうまくいかず、コップを運ぶことも積むこともできなかった。また、私個人としてはコップを積むロボットの出番がなかったことが何よりも悔しい限りである。
今回の課題を通して、プログラミングの難しさを改めて実感させられた。特に今回は多くの仕事があったため、様々なことをさせることが要求されていて非常に難しかった。さらには、2台で連携させる、という点に関してあまり手を付けられなかったため、そこもまだまだだったと思う。それに加え、センサーの正確性という点で思った通りにロボットが動かない、という事も数多くあったので、もっと試行回数を重ねて調節を行うことができればよかったのではないかと思う。