[[2019a/Member]]
#contents

*課題1の説明 [#i8e066bc]
**内容 [#cadfaad7]
これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上のものを選び、それをA4の紙を書くロボットを製作する.
**選んだ文字 [#u73016f2]
なるべく曲線をなくしたいので曲線が比較的少なそうな「信州」を選んだ。
**書く方法 [#ec94d47b]
XY座標で書く方法も考えたがやり方がわからず断念。ので、普通に動きながら書く方法に決めた。
*ロボット [#ff7a23a9]
**ロボットの機構 [#le15e07e]
といっても作り自体は簡単で、左のタイヤ、右のタイヤ、ペンを上げ下げするための機構の三つだけです。
**ロボットの見た目 [#ea3948d8]
 &size(24){上};
#ref(2019a/Member/reifur/Mission1/robot_zentai.jpg,30%,全体)
 &size(24){前};
#ref(2019a/Member/reifur/Mission1/robot_mae.jpg,30%,前)
 &size(24){横};
#ref(2019a/Member/reifur/Mission1/robot_migi.jpg,36.5%,右)
 &size(24){後ろ};
#ref(2019a/Member/reifur/Mission1/robot_usiro.jpg,30%,後ろ)
 &size(24){裏};
#ref(2019a/Member/reifur/Mission1/robot_ura.jpg,30%,裏)
**ロボットの詳しい説明 [#g3a7aa7d]
写真を見てもらうとわかるかもしれませんが基本的には組み立て説明書に載っているものを%%パクリ%%参考にし、ペンを動かす腕だけ形を変えたものです。なのでペンを固定して上げ下げするかが一番の、というより唯一の難関でした。
&br;最初はタイヤの間にペンを入れればその場で回転してもペンの位置は変わらないから楽なのでは?と思ったが作れなかったので普通に前につけることに。写真を見てもわかりにくいので図を使って説明します。

まず最初に下図のように作りました。
#ref(2019a/Member/reifur/Mission1/robot_zu1.jpg,30%,図1);
青色がロボット本体、黒い丸がタイヤ、赤がペンを持つ腕、黒い棒がマッキーです。ペンをどうやって持っているかですが、半分の厚さのパーツを使って無理やり横から挟んでます。上にも書きましたがペンの上げ下げの動く部分は組み立て説明書を参考にしました。「できたー」といざ動かしてみると、ペンがぶれるぶれる。横から固定しているため横にはぶれませんが縦にぶれました。結果思うように動かず。なので縦のブレを無くそうと頑張ったのがこちら。
#ref(2019a/Member/reifur/Mission1/robot_zu2.jpg,30%,図2);
黄色の部分に部品にあったゴム付けました。しかし結果はあまり変わらず。その後考えに考え抜いてたどり着いた最終形態がこちら!
#ref(2019a/Member/reifur/Mission1/robot_zu3.jpg,30%,図3);
緑の部分に棒を付けました。はい、それだけです。しかしこれをつけるだけでペンのブレが原因でうまくいかないことがなくなりました。
&br;動いているのを観察しているとどうやら後ろにバックするときはぶれていないことが判明。前に進むときの動きを考えるとロボットとペンは下図のように動きます。
#ref(2019a/Member/reifur/Mission1/robot_zu4.jpg,30%,図4);
つまりペンが後ろに行こうとするのをつっかえ棒のようなもので止めればいいだけだったのです。&size(10){なんでこんなことに気づかなかったんだ…。};
*プログラミング [#j73c907d]
最初に必要そうだと思ったプログラムは前に進む、左に曲がる、右に曲がる、後ろに戻る、ペンを上げる、ペンを下げるの計6つ。前後移動とペンの上げ下げはプログラムとしては単純なので説明は割愛させてもらいます。
**左右に曲がるプログラム [#q246502f]
やってみて難しかったのが左右に曲がるプログラム。考えてみれば当たり前だがペンが前についているので、ロボットがその場で回れ右したらペンの位置は大きく移動してしまう。なので、一度前に進み90度回りその後、後ろに戻るという方法で90度回りかつペンの位置は移動しないプログラムを書いた。ちなみに90度ぴったし回る方法がわからなかったのでrun_timedでだいたい90度になりそうな値を設定した。
**文字の書き順 [#p88b64ec]
本来の書き順通りに書いた方が見栄え的には良さそうなのだがプログラム的面倒くさい。楽をしようと思うと下図のように下から上に、上から下にを繰り返すのがよさそうだと思った。

#ref(2019a/Member/reifur/Mission1/robot_zu5.jpg,30%,図5);
で、実際の書き順は下図のようにした。

#ref(2019a/Member/reifur/Mission1/robot_zu6_3.jpg,40%,図6);
赤青赤青の順番で書いていくことに。
*実際のプログラム [#y0135a2c]
**モジュールのインポート、インスタンスの作成 [#g25e2eed]
 #!/usr/bin/env python3
 from ev3dev.ev3 import*
 from time import sleep
 
 l = LargeMotor('outD')       leftのl。左のタイヤ。
 r = LargeMotor('outA')       rightのr。右のタイヤ。
 a = MediumMotor('outB')      armのa。かと思ったが適当につけただけかもしれない。ペンの上げ下げ用。
 i = 1000                     何かに使えるかもと設定した。
**関数 [#l3573a39]
リセット
 def motor_init():
     l.reset()
     r.reset()
     a.reset()

前に進む関数
 def move_forward(t):
     l.run_timed(time_sp=t, speed_sp=150, stop_action='hold')
     r.run_timed(time_sp=t, speed_sp=150, stop_action='hold')
     sleep(t/1000)

その場で90度左に回る関数
 def move_l(t):
     l.run_timed(time_sp=t, speed_sp=-210, stop_action='hold')
     r.run_timed(time_sp=t, speed_sp=210, stop_action='hold')
     sleep(t/1000)

その場で90度右に回る関数
 def move_r(t):
     r.run_timed(time_sp=t, speed_sp=-210, stop_action='hold')
     l.run_timed(time_sp=t, speed_sp=210, stop_action='hold')
     sleep(t/1000)

バックする関数
 def move_back(t):
     l.run_timed(time_sp=t, speed_sp=-150, stop_action='hold')
     r.run_timed(time_sp=t, speed_sp=-150, stop_action='hold')
     sleep(t/1000)

ペンを上げる関数
 def move_up():
     a.run_timed(time_sp=1000, speed_sp=-60, stop_action='hold')
     sleep(1)

ペンを下げる関数
 def move_down():
     a.run_timed(time_sp=1000, speed_sp=60, stop_action='hold')
     sleep(1)

ペンの位置を変えずに左に90度回る関数
 def move_left():
     move_forward(650)
     move_l(i)
     move_back(660)

ペンの位置を変えずに右に90度回る関数
 def move_right():
     move_forward(650)
     move_r(i)
     move_back(640)
**文字のプログラム [#g8c4cb24]
ここから一画目、二画目という場合は本来のものではなく今回の書き順に則る。

リセット
 motor_init()
***信 [#td3b05fc]
一画目
 move_down()
 move_forward(i)
 move_up()
二画目
 move_forward(750)
 move_r(500)
 move_back(400)     ここで二画目の最初の位置に着く。
 move_down()
 move_back(600)
 move_up()
二画目を書いている途中でただ回るとペンの位置がずれることに気づく。

三角目
 move_l(500)
 move_forward(300)
 move_right()
 move_forward(1200)      ここで三画目の最初の位置に着く。
 move_down()
 move_forward(200)
 move_up()
四画目
 move_right()
 move_forward(300)
 move_right()
 move_back(300)     ここで四画目の最初の位置に。
 move_down()
 move_forward(600)
 move_up()
五画目
 move_left()
 move_forward(250)
 move_left()
 move_forward(150)    五画目の最初の位置。
 move_down()
 move_forward(400)
 move_up()        
六画目
 move_right()
 move_forward(200)
 move_right()      六画目の最初。
 move_down()
 move_forward(400)
 move_up()

ここから「信」の口の部分を書く
七画目
 move_forward(100)
 move_left()
 move_forward(200)       七画目の最初。
 move_down()
 move_forward(320)
 move_up()
八画目
 move_left()
 move_down()
 move_forward(480)
 move_up()
九画目
 move_left()
 move_down()
 move_forward(320)
 move_up()
十画目
 move_left()
 move_down()
 move_forward(480)
 move_up()
***州 [#c76637e8]
ここで大変残念なお知らせです。「州」のプログラムをコピーし忘れていることに気づきました。なので再現したものを載せておきます。
十一画目
 move_forward(200)
 move_down()
 move_forward(100)
 move_up()
十二画目に移る
 move_forward(200)
 move_right()
 move_forward(100)
 move_right()
十二画目
 move_down()
 move_forward(500)
 move_up()
十三画目に移る
 move_left()
 move_forward(100)
 move_left()
十三画目
 move_forward(200)
 move_down()
 move_forward(100)
 move_up()        
十四画目に移る
 move_forward(200)
 move_right()
 move_forward(100)
 move_right()
 move_down()
 move_forward(500)
 move_up()
十五画目に移る
 move_left()
 move_forward(100)
 move_left()
 move_forward(200)
十五画目
 move_down()
 move_forward(100)
 move_up()
十六画目に移る
 move_forward(200)
 move_right()
 move_forward(100)
 move_right()
 move_forward(500)
これでだいたいあっていると思いますが数値などが間違っているかもしれません。
*実際に書いたもの [#g0c32122]
#ref(2019a/Member/reifur/Mission1/sinsyu_ji.jpg,30%,信州);
なお、「信」から「州」に移る部分のプログラムを上では書いていませんが(コピーしていなかったため)実際に書いたプログラムだと移動距離が長すぎたため紙からはみ出しました。そのためこの画像の字を書いたときは手動で位置を変えました。
*改善点と反省点 [#w870bac1]
改善点としてはプログラムの数値をいじる、2つのタイヤとペンの距離を完全に同じするなどが思いつきました。あとは同じプログラムでも違う動きをする理由などを突き止めればもっといいものができたかもしれません。
&br;反省点としてはプログラムをコピーしたかしっかり確認する。これに尽きます。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS