目次
#contents

* ロボットの説明 [#ga6d89ba]
私たちの制作したロボットは、最初に制作した型のロボットに、ペンを上げ下げするためのパーツとミディアムモーターを取り付けた形となっています。ペンの上げ下げには歯車を使用しました。ロボットの構造の中でも、ペンが文字を書いている途中でずれないよう固定する方法には特にこだわりました。レゴのパーツにペンを固定できるのは、ペンの太さが一定でないので輪ゴムを使いました。しかし、輪ゴムのみでは完全に固定することが出来なかったので回転できるパーツを取り付け、前後左右からペンを押し、上下のみ動くようにしました。このパーツにより太さの違う他のペンでも取り付けることが出来ます。EV3の充電差込口正面にパーツがありますが、解体することなく充電することが出来ます。
***ロボットのサイズ [#kf640908]
縦:26.5cm 横:14.5cm 高さ:18.5cm

&ref(2018b/Member/shaymin/Mission1/s_IMG_20181108_125846.jpg,100%,ペンの上げ下げに使用した歯車の構造);
&ref(2018b/Member/shaymin/Mission1/s_IMG_20181108_131220.jpg,100%,横から見た図);
&ref(2018b/Member/shaymin/Mission1/s_IMG_20181108_131211.jpg,100%,ペンを前後左右から固定したパーツ);
&ref(2018b/Member/shaymin/Mission1/s_IMG_20181108_125851.jpg,100%,正面);

* プログラムの説明 [#aa8b3d03]
書く漢字は『香川』です。
**出力先、出力元を指定 [#ib5d7624]
 #!/usr/bin/env python3
 from ev3dev.ev3 import *
 from time import sleep
 ml = LargeMotor('outA')
 mr = LargeMotor('outB')
 mm = MediumMotor('outD')
**プログラムを簡略化するため、合言葉を作成 [#z747d1bf]
***記憶させた数値を初期化する [#vb0aa46e]
 def re():
    ml.reset()
    mr.reset()
***動作関連の定義 [#uc2d230d]
 def s(t):
    sleep(t)⇔動作が完了するまでにかかる時間がそれぞれ違うので、ここで数値を定義せず、時間を代入できるようにした
 def arg(kakudo):
    ml.run_to_rel_pos(position_sp=-kakudo, speed_sp=100, stop_action='hold')
    mr.run_to_rel_pos(position_sp=kakudo, speed_sp=100, stop_action='hold')⇔その場で機体の向きを変えるためのルールを作成
 def go(left,right):
    ml.run_to_rel_pos(position_sp=left, speed_sp=100, stop_action='hold')
    mr.run_to_rel_pos(position_sp=right, speed_sp=100, stop_action='hold')⇔直進する命令を作成
 def pd():
    mm.run_to_rel_pos(position_sp=-30, speed_sp=400, stop_action='hold')⇔ミディアムモーターでペンを下げる命令を作成
 def pu():
    mm.run_to_rel_pos(position_sp=30, speed_sp=400, stop_action='hold')⇔ペンを上げる命令を作成
**プログラム本体 [#sa60208a]
***香の下半分 [#pfed8abf]
この漢字の中で最も難しいのは回転を多く利用する『日』なので、ズレの少ない最初に書くことにした。
 if __name__ == '__main__':
    re()
    pd()
    s(3)
    re()
    go(120,120)⇔香川の『日』の左の縦棒
    s(3)
    pu()
    s(3)
    re()
    arg(195)
    s(4)
    re()
    go(-70,-70)
    s(3)
    re()
    arg(-195)
    s(4)
    re()
    go(-120,-120)
    s(3)
    pd()
    s(3)
    re()
    go(120,120)⇔香川の『日』の右の縦棒
    s(3)
    pu()
    s(3)
    re()
    go(-370,-370)
    s(5)
    re()
    arg(195)
    s(5)
    re()
    go(220,220)
    s(5)
    pd()
    s(2)
    re()
    go(80,80)⇔香川の『日』の上の横棒
    s(3)
    pu()
    s(2)
    re()
    arg(-195)
    s(5)
    re()
    go(-60,-60)
    s(3)
    re()
    arg(195)
    s(5)
    re()
    go(-80,-80)
    s(3)
    re()
    pd()
    s(2)
    go(80,80)⇔香川の『日』の真ん中の横棒
    s(3)
    re()
    pu()
    s(2)
    re()
    arg(-195)
    s(5)
    re()
    go(-60,-60)
    s(3)
    arg(195)
    s(5)
    re()
    go(-80,-80)
    s(3)
    pd()
    s(2)
    re()
    go(80,80)⇔香川の『日』の下の横棒
    s(3)
    pu()
    s(2)⇔ここまでが香川の『日』を書く命令
***香の上半分 [#y9490603]
書き終わりを中心線にすることで次の『川』を書き始めやすいようにしている。
    go(60,60)
    s(2)
    re()
    arg(195)
    s(5)
    re()
    go(-60,-60)
    s(3)
    re()
    arg(-195)
    s(5)
    re()
    arg(195/4)
    s(3)
    go(-200,-200)
    s(5)
    pd()
    s(2)
    re()
    go(120,120)⇔香川の日の上の『ノ木』の『ノ』
    s(4)
    pu()
    s(2)
    re()
    go(-120,-120)
    s(4)
    arg(-195/4)
    s(3)
    pd()
    s(2)
    re()
    go(200,200)⇔香川の日の上の『ノ木』の木の横棒
    s(5)
    pu()
    s(2)
    re()
    go(-380,-380)
    s(8)
    re()
    arg(-195/2)
    s(3)
    go(200,200)
    s(4)
    pd()
    s(2)
    go(100,100)⇔香川の日の上の『ノ木』の木の右下の斜め払い
    s(3)
    pu()
    s(2)
    go(-210,-210)
    s(4)
    arg(-230)
    s(5)
    go(250,250)
    s(4)
    pd()
    s(2)
    go(100,100)⇔香川の日の上の『ノ木』の木の左下の斜め払い
    s(3)
    pu()
    s(2)
    go(-350,-350)
    s(4)
    arg(130)
    s(3)
    go(210,210)
    s(5)
    pd()
    s(2)
    go(130,130)⇔香川の日の上の『ノ木』の木の縦棒
    s(4)
    pu()
    s(2)⇔香川の『香』の完成
***川 [#q9596d9f]
上記のプログラムの終わりからスムーズに次の書き初めに移れるよう書き順を変更している
    re()
    go(-400,-400)
    s(6)
    re()
    pd()
    s(2)
    go(50,50)⇔『川』の2画目
    s(2)
    re()
    pu()
    s(2)
    arg(195)
    s(5)
    re()
    go(-30,-30)
    s(2)
    re()
    arg(-195)
    s(5)
    go(-60,-60)
    s(2)
    pd()
    s(2)
    re()
    go(60,60)⇔『川』の3画目
    s(2)
    pu()
    s(2)
    re()
    arg(-195)
    s(5)
    re()
    go(-60,-60)
    s(2)
    re()
    arg(195)
    s(5)
    go(-65,-65)
    s(2)
    pd()
    s(2)
    re()
    go(65,65)⇔『川』の1画目
    s(2)
    pu()
    s(2)⇔『川』の完成

*完成品 [#iadbdb24]
**写真はこちら [#z7cb0717]
&ref(2018b/Member/shaymin/Mission1/新規ドキュメント_2018-11-09_00.00.15_1[1].jpg,100%,take3);
**動画はこちら [#j8fd2ba0]


* 考察 [#d7b33b62]
**欠点と対策 [#w81e434c]
キャタピラを使わず、EV3本体を動かして文字を書くのはとても難易度が高い。同じ数値を代入しても同じ動きをするとは限らず、本体を90度回転させるモーター回転数を何度も実験し、最も正確に回転できる『回数が多かった』数値を今回のプログラムに代入している。勿論、電池の残量、床の材質、モーター本体の調子も大きく影響してくるので、10回書いて同じものが一つとして生まれなかった。出来るだけ床の材質に左右されないよう、全ての動作の速度を落としている。
**利点 [#p7cbcb5f]
この型のロボットは『曲線』を書くことが出来る。今回は漢字だったのでキャタピラを使ったロボットが有利だったが、絵やひらがなを描く場合はこの型が向いている。
そして小型で強度もあり、持ち運びが楽である。
*余談 [#qdd17e30]
上記のプログラム以外にも、ペンの筆圧を調整するため、実行し適当な数値を入力することでペンの位置を調整できるプログラムも作成した。
**ペンの位置を数値を入力することで調節するプログラム [#ke2bc5da]
 #!/usr/bin/env python3
 from ev3dev.ev3 import *
 from time import sleep
 mm = MediumMotor('outD')
 mm.reset()
 a = input("motiagerukakudo(30)to(-30)")
 mm.run_to_rel_pos(position_sp=a, speed_sp=100, stop_action='hold') 

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