目次 #contents *課題1について [#radd0cf1] これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ合計10画以上のものを選び、それをA4の紙を書くロボットを製作せよ。 **方針 [#k3715ab8] 今回自分が選んだ地名は信州大学に来るまで自分が住んでた「町田」にした。 *ハードの説明 [#dba22391] まずロボットの全体図である。 #ref(s_IMAG0693.jpg) X軸移動は無限軌道で、Y軸移動は本体下部の車輪で行う。 #ref(ps_IMAG0690.jpg) 矢印で示した部分の端から端までが取り付けたモーターの180度の回転に相当する。 これによりX軸の長さの調節が容易に行えた。 #ref(ps_IMAG0692.jpg) こちらのモーターも、モーターの回転した角度で線の長さを調節する。 #ref(ps_IMAG0691.jpg) アーム部分である。 こちらは円で囲まれている部分に沿う形でペンを取り付け、後述の二種類の関数によってアームの上げ下げというシンプルな動きだけやってもらう。 また今回のロボットはあまり筆圧が強くないと予想して、筆圧が弱くてもよい筆ペンを使用した。 #ref(s_IMAG0700.jpg) ペン装着時はこのようになる。 #ref(ps_IMAG0699.jpg) #ref(ps_IMAG0698.jpg) これらのパーツの接合部は上二つの画像を見てほしい。 特に赤枠で囲っている部分が重要な接合部である。 *プログラミングの説明 [#x7ddee0f] ***アームを制御するプログラム [#p4b6aa4f] def lift_up(): global cir if cir=='on': mL.run_to_abs_pos(position_sp=-30,speed_sp=100,stop_action='brake') cir='off' sleep(1.5) def lift_down(): global cir if cir=='off': mL.run_to_abs_pos(position_sp=0,speed_sp=100,stop_action='brake') cir='on' sleep(1.5) 関数名の通りlift_upではアームを上げ、lift_downではアームを下げる。 またここでpythonの変数の一つであるglobal変数を用いてる。 これは関数の外側で宣言することによって関数内からでもアクセスできるようになる、というものである。 global cir cir='on' 今回は上記の変数を最初に宣言することでcir='on'のときにはlift_upのみが、cir='off'のときにはlift_downのみが作動するようにした。 これによってアームの誤作動を防ぐのが目的である。 ***X軸移動を制御するプログラム [#m8e56f0e] def width(degree=0,speed=100): if 0<=degree<=180: mW.run_to_abs_pos(position_sp=degree,speed_sp=speed,stop_action='hold') sleep(2) ***Y軸移動を制御するプログラム [#d64c74c0] def run(degree=120,speed=50): mR.run_to_abs_pos(position_sp=degree,speed_sp=speed,stop_action='hold') 上記の二つの関数内のdegreeの値を変えることによって無限軌道と車輪のモーターを動かしていく。 その際目安となる値は以下の図を参照する。 #ref(s_IMAG0694.jpg) 赤字がX軸移動のwidth関数、青字がY軸移動のrun関数でのモーターの回転の角度である。 この値の場所に移動してペンを下ろし、そのまま線を引く工程を繰り返すことで字を書くことができる。 以下にこれらの関数を用いたプログラムを書く。 その際に、字を書いている部分ではコメントでその移動を記述する。 #(a,b)→(a,c) というように記述するが、この際括弧の中の一つ目の値はwidth関数の、二つ目の値はrun関数のdegreeの値を表す。 矢印はどちらか一つの値が変わることを表す。 ***「町」 [#r9bde65f] ***「町」のプログラム [#r9bde65f] lift_up() width(180) lift_down() width(90) #(180,0)→(90,0) lift_up() width(180) run(30) sleep(2) lift_down() width() #(180,30)→(0,30) lift_up() width(180) run(60) sleep(2) lift_down() width(90) run(0) sleep(2) #(180,60)→(90,60)→(90,0) lift_up() width(135) lift_down() run(60) sleep(2) #(135,0)→(135,60) lift_up() width(180) lift_down() run(0) sleep(2) #(180,60)→(180,0) lift_up() run(30) sleep(2) width(45) lift_down() run(110) sleep(3) #(45,30)→(45,110) lift_up() ***「田」 [#q7f0fc78] ***「田」のプログラム [#q7f0fc78] run(140) sleep(2) width(150) lift_down() width(30) #(150,140)→(30,140) lift_up() width(150) run(180) sleep(2) lift_down() width(30) #(150,180)→(30,180) lift_up() width(150) run(220) sleep(2) lift_down() width(30) run(140) sleep(2) #(150,220)→(30,220)→(30,140) lift_up() width(90) lift_down() run(220) sleep(2) #(90,140)→(90,220) lift_up() width(150) lift_down() run(140) sleep(2) #(150,220)→(150,140) lift_up() *結果 [#gf72983c] #ref(s_aIMAG0682.jpg) *考察 [#f1c8b3fd] 実際に書いてみたところ横の線は特に問題はなかったが、縦の線を書いていると斜めに進んでしまうという問題が見つかった。これはおそらくアームの部分のペンを支える機構が不足していたため、ペンと紙との摩擦によって力がかかり曲がってしまったのだと思う。 アーム周りのパーツを増やし補強するというのが、この問題の解決法だろう。 また今回の「町田」はかなり省略して書いているところがあり、書き順も正規のものとは大きく異なる。「町」のプログラムの下から二行目に width(90) を入力して撥ねを再現するなど改善の余地がある。 を入力して撥ねを再現する、繋げて書かないなど改善の余地がある。 しかしモーターを角度で制御すると寸法の調整がしやすいという有益な情報が発見できたので、次回の課題にも生かしていきたい。