目次
今回の課題は、ロボットを作成し自分の住んだことのある地名を書くというものであった。(10文字以上で)
完成形はこちらである。↓
最初に考えたのは、コンパスのようにまわりながら書くものであった。
(緑の縁で囲まれた部分が動く。) しかし動かしてみようとするとアダプタをつないだ時にその長さの違いなどからどうしてもアダプタから不要な力がはたらいてしまうため、断念せざるを得なかった。 こういったこともありev3をつなげても関係なく動けるような形にしようと考えた。そこで思いついたものはプリンター型のロボットである。
なぜかというとev3を乗せて車のように動かすとなるとどうしても乗せる場所や重心の移動を考慮せねばならず自由に作ることは難しいと思ったからである。つまり本体ではなく紙の方を動かせばその心配をせずに済むと考えた。さらにアームとベルトとタイヤの動きをそれぞれz,x,y軸での座標の移動とすることができるので、文字を書く際もプログラミングの時点で動かす前から完成形がある程度想定できるということもありメリットが多い。
プリンターのようにするためにまずタイヤを紙を動かすローラーの役割にしようと考えた。そのためにはタイヤ間の距離がA4用紙の幅とほぼ同じくらいでなければならず、車間距離を実際に計測して製作を進めていった。最初は距離だけでいいと思っていたが、作るうちにタイヤにある程度の重心が乗らないと、紙を動かしてくれないということに気が付いた。そのあとは特にこの2つの問題に注目して製作を進めていった。
何とか製作が終了したと思った矢先に、文字を書く上でベルトコンベアの高低差が大きな問題として立ちはだかった。
↑上の画像の青い丸で囲まれた部分に車輪が置かれていることでこの問題が発生した。ベルトコンベアがたるんでしまうと横に動かしたときにペンの高さが変わってしまい、低くなる部分に合わせたときは高くなる部分で紙から離れてしまう。逆に高くなる部分に合わせるとペンが低くなるところで筆圧が強くなり紙に引っかかってしまうという問題点がある。
上図のようにペンの高さと筆圧が変わってしまう。 そこでなるべくその差をなくせるように高さを可動式にした。こうすれば万が一動かすときに高さが合わなくてもすぐに修正が可能であると考えたからだ。
完璧に高さを一定にするという目的はかなわなかったが、この作業により書ける時の完成度はかなりあがった。
図の赤い矢印で記された範囲が動かせる。
ほぼ毎回同じクオリティーのものが書けるようになったため微調整などもかなりやりやすい。
このロボットは座標を行使って動くので最初に方眼紙を使い完成形を想定してからプログラミングを始めた。
task_main() lift = MediumMotor('outA') #リフト belt = LargeMotor('outB') #ベルト tire = LargeMotor('outC') #モーター
リフト、ベルトタイヤを動かすためのモーターの出力の定義
def motor_init(): for m in [lift,belt,tire]: m.reset() m.speed_sp=100 m.stop_action='hold' def liftup(): lift.run_to_rel_pos(position_sp=-110) sleep(2) def liftdown(): lift.run_to_rel_pos(position_sp=110) sleep(2) def beltmove(t): belt.run_to_rel_pos(position_sp=t) def tiremove(t): tire.run_to_rel_pos(position_sp=-t*0.9)
ここでタイヤ、ベルト、アームの動かしかたが定義できる。スピードは少し遅いが100にすることで書く時の左右のタイヤの動きの誤差を気にせず動かせる。tiremoveのところで0.9をかけているのはベルトに比べタイヤの動く距離が長かったことから、同じ命令で同じだけ進ませようと調整した結果である。
「川」を描くプログラミング
def kawa(t): tiremove(t*2) #移動 sleep(2) liftdown() tiremove(t*5) #一角目始 sleep(2) tiremove(t*3) beltmove(t*-2) #一角目終 sleep(2) liftup() tiremove(t*-7) #移動 sleep(3) beltmove(t*5) sleep(3) liftdown() tiremove(t*4) #二角目 sleep(2) liftup() tiremove(t*-5) #移動 sleep(3) beltmove(t*3) sleep(2) liftdown() tiremove(t*8) #三角目 sleep(3) liftup()
説明の「#移動」は線を引かずロボットのペンの位置のみを変更するということを表している。
このtは座標を1だけ動かすことをしめす。t*2,3...で進む座標が2、3...のようになっていく。-が付く場合は+と逆方向に動く。 「東」の 5画目までを描くプログラミング
def higashi_zenhan(t): beltmove(t*-7) #移動 sleep(3) tiremove(t*2) sleep(3) liftdown() beltmove(t*8) #一角目 sleep(3) liftup() tiremove(t*2) #移動 sleep(3) beltmove(-t) sleep(3) liftdown() tiremove(t*4) #ここでは東の「口」の部分(二,三、五画目)を一気に書いた。
sleep(3)
beltmove(t*-6) sleep(3) tiremove(t*-4) sleep(3) beltmove(t*6) sleep(3) liftup() tiremove(t*2) #移動 sleep(3) liftdown() beltmove(t*-6) #四画目 sleep(3)
「東」の後の部分を描くプログラミング
def higashi_kouhan(t): liftup() tiremove(t*-5) #移動 sleep(3) beltmove(t*3) sleep(3) liftdown() tiremove(t*11) #六画目 sleep(4) liftup() tiremove(t*-4) #移動 sleep(3) liftdown() tiremove(t*4) #八画目 beltmove(t*4) sleep(2) liftup() tiremove(t*-4) #移動 sleep(2) beltmove(t*-4) liftdown() tiremove(t*4) #七画目 beltmove(t*-4) sleep(3) liftup()
*一画で複数の命令をするときのみ始と終を記入した。 動きをまとめる。ここで文字の大きさなどの変更ができる。
def move() motor_init() kawa(20) higashi_zenhan(20) higashi_kouhan(20)
線が弱弱しいか…?
文字を横方向に書くのにベルトコンベアを縦方向に書くのにタイヤをそれぞれ利用したことでプログラミングでの指定が座標できかなり手間がかからずプログラミングができた。縦横の移動で結構まっすぐな線が引けていたと思う。
確かに縦と横の移動には強かったが、斜めに描くところで線がひょろっとしてしまい、まっすぐに描くことができなかったので、もっとペンをつかむアームの部分を安定させることができれば斜めもきれいに書けたかもしれない。 今回は「川東」と比較的狭くて知名度のないところを書いてしまったので,もっとメジャーな「松本」や「長野」などを書けば印象に残りやすかったかなと考えた。