ロボットの全体像
EV3ガイドに乗っている基本ロボットにペンを上げ下げする機構を追加してある。
ペン先はプログラムを作りやすいようにロボットの中心になるようにした。
また、EV3は小型のモーターがあるので、ペンを上げ下げする構造にしても比較的小さく作れるメリットがあったので、
比較的簡単にモーターに直接アームをつけて、そこにペンをテープで止めるだけの構造にした。
また、この機構は横についている赤いピン4本を抜くだけで取り外せるので改造するのも簡単というメリットがある。
ロボットに顔を描かせるために必要な動作をまとめると
・ペンを上げ下げする
・ロボット本体が前後する
・ロボット本体が回転する
などの動作の組み合わせによって顔を描かせる。
これからのプログラムを簡単にするためにモーターなどを定義する。
今回のプログラムでは
モーターA(左タイヤ)=ml
モーターB(右タイヤ)=mr
モーターC(ペンの上げ下げ)=mf
として以下の文を用いて定義した。
ml = ev3.LargeMotor('outA') //左タイヤ mr = ev3.LargeMotor('outB') //右タイヤ mf = ev3.MediumMotor('outC') //ペンの上げ下げ~
また、簡単にロボットを動かすために以下の文によって「ロボットの前後」、「ペンの上げ下げ」を簡単に呼び出せるようにする。
def go(t,dl,dr): ml.run_forever(duty_cycle_sp=dl) mr.run_forever(duty_cycle_sp=dr) time.sleep(t/1000) ml.stop() mr.stop()
def pen(t,df): mf.run_forever(duty_cycle_sp=df) time.sleep(t/1000) mf.stop()
・ロボットの前後 =「go」
・ペンの上げ下げ =「pen」
で定義している。
テスト用のプログラムを書いて、何回かの試行を経て、左右の車輪にどのような回転をさせればどの程度ロボットが回転するのかを調べた。
用いたプログラムは以下のとおりである。
#!/usr/bin/python
import ev3dev.ev3 as ev3 import time
ml = ev3.LargeMotor('outA') mr = ev3.LargeMotor('outB') mf = ev3.MediumMotor('outC')
def go(t,dl,dr): ml.run_forever(duty_cycle_sp=dl) mr.run_forever(duty_cycle_sp=dr) time.sleep(t/1000) ml.stop() mr.stop()
・30度回転させたいとき
go(1000,15,-15)
go(1000,-15,15)
・45度回転させたいとき
go(1000,20,-20)
go(1000,-20,20)
・60度回転させたいとき
go(1000,24,-24)
go(1000,-24,24)
であることを調べた。この値を用いることで描写が前よりは簡単に行えるようになる。
ちなみにこの時のバッテリー状態はほぼ充電完了状態である。
よって、この値を適応させるにはできるだけ充電を完了した状態で試行するのが好ましい。
顔を描かせるときに、どの程度の大きさの顔を描けるのかを計測し、大体の見当をつけるため、
前項と同じプログラムを用いて
ある一定秒数ごとにどの程度ロボットが前進するのかを計測した。
すると、以下のようなデータが得られた。
両方の車輪のパワー30で1秒間前進させると、約5cm進む。
これによって顔を描写するときの大きさの大体の見当がつけられた。
今までで、顔を描くための代数と、回転させるための値を計測してきたので、
顔を描く本番のプログラムを書き始める。
プログラムの流れとしては
1.線の最初の点に移動する
2.筆をつける
3.ロボット本体を動かして描く
4.筆を離す
これらの繰り返しで顔を描写していく。
まず、試しに以下のプログラムで輪郭を描かせてみた。
#!/usr/bin/python
import ev3dev.ev3 as ev3 import time ml = ev3.LargeMotor('outA') mr = ev3.LargeMotor('outB') mf = ev3.MediumMotor('outC') def go(t,dl,dr): ml.run_forever(duty_cycle_sp=dl) mr.run_forever(duty_cycle_sp=dr) time.sleep(t/1000) ml.stop() mr.stop() def pen(t,df): mf.run_forever(duty_cycle_sp=df) time.sleep(t/1000) mf.stop() pen(1000,-50) go(2000,20,20) pen(1000,50) go(2000,20,20) go(1000,20,-20) go(2000,-20,-20) pen(1000,-50)
すると、ペンの上げ下げの点をもっと細かく調べないと線が一本で書けないということが分かった。
そして、その後の試行錯誤で、つけ、止めの点をそろえるのがとても大変だということが分かった。
ロボットに顔を書かせるためには、ペンを上げる点と、描き始める点がそろわなければならず、
かつそれがとても難しいということが分かった。
今回は時間がなくて、一回一回ごとに点をそろえるように実験していったら、最後まで顔を描くことができなかった。
今回の反省より次回に気を付けることをリスト化すると
・初めに方眼紙のような紙の上で、座標を用いてロボットを動かすと、計測もやりやすい。
・モーターのstopのコマンドを用いて、正確に自分が止まってほっしい点で止まるプログラムを用いる。
・できるだけ計算を簡単にするためにペンなど、ロボットに何かをさせる部分はある一点に集中させるとよい。今回は、タイヤとペンの先が大きく離れていたために、絵を描かせるために余計なプログラムを練らなければならなかった。もしこれがタイヤの中心にペン先が来ていたら、その場での回転とペンの上げ下げのみで、つける点と上げる点をそろえることができる。
などの点に気を付けて、次回のプログラムではロボットを作りたい。