目次
#contents

*課題 [#m813dddb]
[[2017b/Mission1]]

*製作したロボットについて [#ub19c203]
紙とペンを動かし,文字を書くというプリンターに似た構造になっている~
#ref(2017b/Member/ibu/Mission1/comp_machine_ver2.jpg,100%,完成機)

**arm:Z軸制御機構 [#u5992dd5]
X軸制御機構(mx)を上げ下げするための機構である~
#ref(./x_module.jpg,100%,Z機構)
#ref(2017b/Member/ibu/Mission1/x_module.jpg,100%,Z機構)
***開発当初の問題点 [#b65038ff]
-安定して上げ下げできない(力のモーメントが大きい)
--mxが重かったため
--mxが長かったため
***変更点 [#vcc9ab0a]
-小型化
***変更後の問題点 [#uda297e6]
-手動で,リセット位置(pd()した状態)を設定する必要がある

**mx:X軸制御機構 [#j5d08eab]
ペンをX軸方向に動かすための機構~
#ref(./x_control.jpg,100%,X機構)
#ref(2017b/Member/ibu/Mission1/x_control.jpg,100%,X機構)
***問題点 [#ke641227]
-Z軸制御機構(arm)との接続が甘いため,書いていくうちにX軸制御機構(mx)全体が斜めに歪んでいってしまう

**my:Y軸制御機構 [#p85b7ed9]
紙を動かすための機構~
#ref(./y_module.jpg,100%,Y機構)
#ref(2017b/Member/ibu/Mission1/y_module.jpg,100%,Y機構)
***開発当初の問題点 [#n5ea663d]
-紙を安定して送り出せない
--他のパーツとの干渉
--モータ1つで軸に繋いだタイヤを2つ回し紙を動かしているが,その左右のタイヤの位置の歪み
***変更点 [#yd117fd3]
-後方にもタイヤを3つ設置した
--紙にかける力が安定化された
***変更後の問題点 [#fa0c7140]
-パーツとの干渉が若干残っている

**cs:カラーセンサ [#aa931c00]
紙が入っているかを確認するための機構~
***開発当初の問題点 [#jd90351a]
-紙との距離が遠く,また斜めになっていてうまく色を測れない場合があった
***変更点 [#ebda302a]
-紙との距離を近づけた

*オリジナルEV3ドロー用ソフトウェア「Printhon」[#p3586eab]
PrinthonはLEGO Mindstorms EV3プリンターのために開発したドロー用プログラムである.
**プログラム全体の流れ [#fe5f3af9]
Printhonは変数及び関数の定義用プログラム~
別途用意する字を書くプログラムにPrinthonをimportさせPrinthonを使用することができる.
**Printhon 0.1 [#w401317c]
***問題点 [#f1d25eaa]
-動作が遅い
--sleep()の引数を固定値にしていたため
-X軸方向の移動における誤差
--移動距離を指定できるようにするために測定した値mxcm([[ソースコード:http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2FMember%2FKoyo%2FMission1#t420fb61]]を参照)に誤差があった
-45度以外の斜線が書けない
--X方向の移動にかかる時間とY方向の移動にかかる時間が異なっているため

**Printhon 0.2 [#j143881c]
***変更点 [#hc4f274a]
-動作が速くなった
--sleep()の引数を移動速度と移動距離に応じた値に変更
-X軸方向の移動における誤差を修正
--mxcm([[ソースコード:http://yakushi.shinshu-u.ac.jp/robotics/?2017b%2FMember%2FKoyo%2FMission1#t420fb61]]を参照)を適正値に変更
-InteractivePrinthonを開発
--InteractivePrinthon 0.1はPrinthon 0.2と互換性がある.
--まず、ユーザが入力した動作を実行。その後同様に、ユーザからの入力を受け付け、実行するといったループを取り入れたインタラクティブなプログラムである.
--今後のアップデートでログの出力を可能にする.(つもりだった)
-相対的座標移動から絶対的座標移動に変更
--相対座標の場合,字を書くプログラムの変更が大変ではないかと考えたため
-Yの移動をモーターの回転時間から回転角度にした
-ペンの上げ下げをwrite関数内に組み込み
--字を書くプログラムを簡素化するため
***問題点 [#yadab5dd]
-45度以外の斜線が書けない

**Printhon 0.3 [#x9e302d2]
***変更点 [#lc09ab69]
-移動方法は相対的座標に戻した
--すでに相対的座標で書けるプログラムが存在していたため
-InteractivePrinthonを廃止
--Printhon 0.3はPrinthon 0.1をベースにしていたため,Printhon 0.2で使えたInteractivePrinthonが使えなくなった.
--不要に感じた
-write関数を廃止
--ペンの上げ下げ組み込んでいた関数だったが逆に使いづらくなる可能性があったため
***問題点 [#jdb1b06e]
-45度以外の斜線が書けない

**Printhon 0.4 [#k695f410]
***変更点 [#o8b7e534]
-45度以外の斜線が書けるようになった
***ソースコード [#t420fb61]
 #!/usr/bin/env python3
 from ev3dev.ev3 import *
 from time import sleep

 print("Printhon ver 0.4\n"
       "Please connect\n"
       "\tmy\tto\toutA\n"
       "\tarm\tto\toutC\n"
       "\tmx\tto\toutD\n"
       "\tcs\tto\tin1")
 input("Please press the enter key after connecting.")

 my = LargeMotor('outA')
 arm = LargeMotor('outC')
 mx = MediumMotor('outD')
 cs = ColorSensor('in1')

 # constants
 mxcm = 38.095238
 mycm = 20.050125313
 n = 56.25
 vxy_ratio = 5/3  # x:y=5:3
 #   *position_sp
 mxcm_print = mxcm
 mycm_print = mycm*-1
 mycm_paper = mycm
 #   *distance(cm)/speed
 sleep_x = n
 sleep_y = vxy_ratio*n
-mx.position_spにmxcmまたはmy.position_spにmycmをかけると、指定距離[cm]を移動させることができる
-指定距離にsleep_xまたはsleep_yをかけて速さで割った値がsleep()に与えるちょうどよい引数になる

 # speed
 #   common
 my_speed = 100
 arm_speed = 30
 #   x only
 mx_speed = 500
-my_speed及びarm_speedは全ての関数で共通してspeed_spの引数になる
-mx_speedはx()関数だけに与えられる引数になる((xy()関数ではmx.speed_spは別の値が与えられる))

 # paper
 paper_set_d = 4
 paper_out_d = 4
-paper_set_dは用紙をセットするときのセンサーからの移動距離
-paper_out_dは用紙を排出するときのセンサーからの移動距離

 def pu():
     arm.run_to_abs_pos(position_sp=-40)
     sleep(1)


 def pd():
     if cs.color != 6:  # nonwhite
         input("The paper could not be detected. Press Enter to continue.")
     arm.run_to_abs_pos(position_sp=0)
     sleep(2)


 def x(x):
     mx.run_to_rel_pos(position_sp=x*mxcm_print, speed_sp=mx_speed)
     sleep(abs(x)*sleep_x/mx_speed)


 def y(y):
     my.run_to_rel_pos(position_sp=y*mycm_print)
     sleep(abs(y)*sleep_y/my_speed)


 def xy(x, y):
     if y == 0:
         x(x)
     else:
         a = (vxy_ratio)*(x/y)
         mx.run_to_rel_pos(position_sp=x*mxcm_print, speed_sp=abs(my_speed*a))
         my.run_to_rel_pos(position_sp=y*mycm_print)
         sleep(abs(y)*sleep_y/my_speed)


 def paper_set():
     pu()
     input("I move the paper, is it OK?\n"
           "\tPress Enter to continue.")
     if cs.color == 4:  # yellow
         my.run_forever(speed_sp=my_speed)
         color = 6  # white
     else:
         my.run_forever(speed_sp=-my_speed)
         color = 4  # yellow
     while 1:
         if cs.color == color:
             my.stop()
             my.run_to_rel_pos(position_sp=paper_set_d*mycm_paper,
                               speed_sp=my_speed,
                               stop_action='hold')
             sleep(paper_set_d*sleep_y/my_speed)
             print("Paper loaded.")
             break


 def paper_out():
     pu()
     if cs.color == 6:  # white
         my.run_forever(speed_sp=-my_speed)
     while 1:
         if cs.color == 4: # yellow
             my.stop()
             my.run_to_rel_pos(position_sp=-paper_out_d*mycm_paper)
             sleep(paper_out_d*sleep_y/my_speed)
             break


 def mx_init():
     mx.reset()
     mx.run_to_rel_pos(speed_sp=mx_speed,
                       position_sp=-8.8*mxcm_print,
                       stop_action='brake')
     sleep(8.8*sleep_x/mx_speed)
     mx.reset()
     mx.run_to_abs_pos(speed_sp=mx_speed, stop_action='hold', position_sp=0)
     mx.run_to_rel_pos(speed_sp=mx_speed, stop_action='hold', position_sp=0)


 def my_init():
     my.reset()
     my.run_to_abs_pos(speed_sp=my_speed, stop_action='hold', position_sp=0)
     my.run_to_rel_pos(speed_sp=my_speed, stop_action='hold', position_sp=0)


 def arm_init():
     arm.reset()
     input("Please press the enter key after setting the arm")
     arm.reset()
     arm.run_to_abs_pos(speed_sp=arm_speed, stop_action='hold')


 def init_all():
     arm_init()
     paper_set()
     mx_init()
     my_init()
     print("Initialization of all motors has been completed.")


*使用例:"小松" [#k49a33ef]
**プログラム [#baeac43b]
 #!/usr/bin/env python3
 from printhon_ver0_4 import *

 init_all()
 input("Press enter to print \"komatsu\"")

 # ko
 pu()
 x(4)

 # 1
 pd()
 y(-4)
 xy(-0.3, 0.3)
 pu()

 y(2)
 x(-1.5)

 # 2
 pd()
 xy(-1, -1)
 pu()

 x(4)
 y(1)

 # 3
 pd()
 xy(1, -1)
 pu()


 # matsu
 x(-5)
 y(-3)

 # 1
 pd()
 x(1.5)
 pu()

 x(-0.5)
 y(1)

 # 2
 pd()
 y(-4)
 pu()

 y(3.2)

 # 3
 pd()
 xy(-1, -1)
 pu()

 xy(1, 1)

 # 4
 pd()
 xy(1.5, -1.5)
 pu()

 x(1)
 y(1)

 # 5
 pd()
 xy(-1, -1)
 pu()

 x(2)
 y(1)

 # 6
 pd()
 xy(1, -1)
 pu()

 x(-1.8)

 # 7
 pd()
 xy(-1.5, -1.5)
 x(2.5)
 pu()

 xy(-0.5, 0.5)

 # 8
 pd()
 xy(1, -1)

 paper_out()
 

**結果 [#a4098e83]

#ref(./reS__24272899.jpg,100%,プリント小松)~
https://youtu.be/WdNv92dy-Yc

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS