[[2018a/Member]]
#contents
*課題1の説明[#j4fe118d]
**内容 [#sa10fea0]
これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上のものを選び、それをA4の紙を書くロボットを製作する.
**方針 [#i3d32ce4]
-前述の条件および扱いやすさから「千曲」という文字を書くことにした.(実は「長野」という文字に挑戦してみたが,時間的な面と難易度的な面で「長」だけ書いて挫折した.)~
-装置についてはプログラミングのしやすさを考え,独立した横方向と縦方向の動きをするロボットを扱うことにした.なお,扱うロボットはEV3である.~
-動力についてはモーターを用いたものにして,タイヤで移動する方式にした.~
-プログラミングについては2種類動作パターン(縦方向と横方向)によるいくつかの実験を通し,調節しながら行うことにした.
*扱うロボット AwithB の説明 [#s52bba27]
**ロボットの全体像 [#i969c979]
&ref(2018a/Member/gear/Mission1/robot_full.JPG,80%,ロボットの全体像);&size(20){1};
&ref(2018a/Member/gear/Mission1/robot_deviceA.jpg,50%,装置Aの全体像);&size(20){2};
&ref(2018a/Member/gear/Mission1/robot_deviceB.jpg,50%,装置Bの全体像);&size(20){3};
&ref(2018a/Member/gear/Mission1/robot_rail.jpg,50%,レールの全体像);&size(20){4};~
&size(20){1:ロボット(完成形)⇒分解すると...⇒ 2:装置A 3:装置B(+ペン昇降機) 4:レール +ほかEV3本体};~
~
製作したロボットのメカニズムはいたってシンプルである.紙に対して縦方向に動く装置A,レール上で横方向に動くペンを持った装置Bをモーターで動かして文字を書く(イメージとしては「装置Bが移動するためのレールを,装置Aが押している」と言ったほうがが正しいだろう).~
**装置Aの説明 [#j5279fe1]
装置Aは装置B,レール,EV3本体の三つの重量がある物体を運ぶので,移動のためのタイヤはキットの付属品で最も大きいものを選んだ.~
~
&ref(2018a/Member/gear/Mission1/robot_deviceA.jpg,45%,装置Aの全体像);
&ref(2018a/Member/gear/Mission1/robot_problem1.png,45%,装置Aの問題); &size(35){⇒};
&ref(2018a/Member/gear/Mission1/robot_deviceA_detail.jpg,42%,裏側より見た装置Aの全体像);
~
~
EV3本体を乗せる部分には,レールと装置A間の歪みを抑えるため,真下に&size(17){「キャリアボール&size(12){(鉄球の入ったケース.勝手に命名したが悪しからず)};」};,側面下方に&size(17){「補助アーム」};を取り付けた.これによって,実際に縦・横方向の二物体間のブレが軽減した.
**装置Bの説明 [#ue72c49c]
&ref(2018a/Member/gear/Mission1/robot_deviceB.jpg,45%,装置Bの全体像);
&ref(2018a/Member/gear/Mission1/robot_deviceB_detail3.jpg,55%,揺れてしまうモーターon装置B);~
~
装置Bはモーター部分を支えながらペン昇降機を運ぶ.この時,倒れるほどではないものの重心が安定せずモーター部分が上の写真のように装置B上で揺れてしまうということや,移動中にレールから脱輪するという問題が生じたが,次のように解決した.~
~
&ref(2018a/Member/gear/Mission1/robot_deviceB_detail1.JPG,55%,装置Bの改善策その1);
&ref(2018a/Member/gear/Mission1/robot_deviceB_detail2.jpg,45%,装置Bの改善策その2);~
~
前者の問題は左の写真のように部品を取り付け揺れを抑え,後者は右のように部品を取り付けて両輪の間隔を固定した.
**ペン昇降機の説明[#rcd45529]
-&size(18){ペン昇降のメカニズム};~
&ref(2018a/Member/gear/Mission1/robot_dvc-pen.JPG,57%,ペン昇降機の全体像);&size(20){昇降の様子⇒};
&ref(2018a/Member/gear/Mission1/robot_pen1.JPG,48%,ペン昇降の様子);&size(20){→};
&ref(2018a/Member/gear/Mission1/robot_pen2.JPG,48%,ペン昇降の様子);&size(20){→};
&ref(2018a/Member/gear/Mission1/robot_pen3.JPG,48%,ペン昇降の様子);~
~
ペンの上げ下げに関しては鉛直方向の動きを扱うことにした.この時,モーターの回転運動をどう上下運動に置換するかで&size(17){「クランクシャフト」};の原理を採用した.~
上の写真より鉛直方向の運動が確認できる.
-&size(18){ペンの取り付けと固定};~
&ref(2018a/Member/gear/Mission1/robot_dvc-pen_detail.JPG,60%,ペンの取り付け);
&ref(2018a/Member/gear/Mission1/robot_dvc-pen_detail2.jpg,70%,ペンの取り付け);~
~
ペンの固定にあたって,二種類のパーツで囲うように固定する手法をとった.この時パーツを完全に固定せず,さらにゴム製のパーツを用いる.こうすることで最大限までペンを締め付けられ,摩擦でさらにずれにくくなる.~
&ref(2018a/Member/gear/Mission1/pen_action.png,55%,ペンの取り付け);&size(20){⇒ ぴったり収まる!};
*文字を書くにあたって [#h73ac276]
**書き順と装置の移動 [#j07a163a]
&ref(2018a/Member/gear/Mission1/write_order-chikuma.JPG,68%,文字の書き順); &size(17){⇒「千曲」の書き順である.波線はペンで書く時の軌跡,実線はロボットの移動時の軌跡である.};~
~
今回は御覧の通り正式な筆順で書かない.ロボットの移動の効率性を鑑みたためである.
**注意点 [#o1eddf0f]
書く上で注意した点は以下の二つの項目である.
-プログラミング時に定義する数を減らすため,出来るだけ長さを統一させる.~
⇒今回は縦方向が三パターン,横方向が六パターンで実行した.
-文字は大きすぎないようにして,装置Aの移動範囲を小さくする.~
⇒文字が大きくなると,装置Bがレールの端に停止する場面が生じる.この時に装置Aが動くと,レールの重心が偏っているため動きが安定せず,装置Aによるきれいな直線を描けなくなる.
*実行プログラムの説明 [#h7e28663]
**プログラムの導入 [#l8c52752]
今回はEV3を扱っているため,プログラミングにTera TermというソフトからPythonという言語を用いる.~
以下は定義までの導入である.~
#!/usr/bin/env python3
from ev3dev.ev3 import * # EV3を扱うモジュールをインポート
from time import sleep # timeモジュールからsleep関数をインポート
mA = LargeMotor('outA') # 装置AのモーターをmAとおく
mB = LargeMotor('outB') # 装置BのモーターをmBとおく
mC = MediumMotor('outC') # ペン昇降機のモーターをmCとおく
この設定だとtimeモジュールからはsleep関数以外は適用されないので注意する.
**定義の挿入 [#ef9a59e4]
正確に装置を動かしたいので,モーターの回転角度を指定する関数を挿入した.角度値は実験より導出し,移動速度の絶対値については装置の慣性による影響を考慮し,装置にかかる衝撃を抑えるために比較的小さい値にした.~
-描画と移動は以下の通りに定義した.
--装置Aの場合
def move_back1(): # ��,��,�� (一画目から二画目,四画目から六画目までの移動)
mA.run_to_rel_pos(position_sp=-29,speed_sp=50,stop_action='hold')
sleep(2)
def move_for2(): # ��,�� (二画目から三画目までの移動,七画目の描画)
mA.run_to_rel_pos(position_sp=65,speed_sp=50,stop_action='hold')
sleep(2)
def move_back2(): #�� (八画目の描画)
mA.run_to_rel_pos(position_sp=-65,speed_sp=50,stop_action='hold')
sleep(2)
def move_for3(): #�� (九画目の描画)
mA.run_to_rel_pos(position_sp=98,speed_sp=50,stop_action='hold')
sleep(2)
def move_back3(): #21 (十画目の描画),
mA.run_to_rel_pos(position_sp=-98,speed_sp=50,stop_action='hold')
sleep(2)
def move_back4(): #�� (三画目の描画)
mA.run_to_rel_pos(position_sp=-115,speed_sp=50,stop_action='hold')
sleep(2)
--装置Bの場合
def slide_for2(): #��,�� (九画目から十画目,十画目から十一画目までの移動)
mB.run_to_rel_pos(position_sp=57,speed_sp=80,stop_action='hold')
sleep(2)
def slide_back2(): #�� (一画目から二画目までの移動)
mB.run_to_rel_pos(position_sp=-57,speed_sp=80,stop_action='hold')
sleep(2)
def slide_back3(): #�� (三画目から四画目までの移動)
mB.run_to_rel_pos(position_sp=-81,speed_sp=80,stop_action='hold')
sleep(2)
def slide_back4(): #�� (二画目から三画目までの移動)
mB.run_to_rel_pos(position_sp=-100,speed_sp=80,stop_action='hold')
sleep(2)
def slide_for5(): #��,�� (四画目,六画目の描画)
mB.run_to_rel_pos(position_sp=172,speed_sp=80,stop_action='hold')
sleep(2)
def slide_back5(): #�� (五画目の描画)
mB.run_to_rel_pos(position_sp=-172,speed_sp=80,stop_action='hold')
sleep(2)
def slide_for6(): #�� (二画目の描画)
mB.run_to_rel_pos(position_sp=220,speed_sp=80,stop_action='hold')
sleep(2)
--一画目の斜めの動き
def move_cross(): #�� (一画目の描画)
mA.run_to_rel_pos(position_sp=-46,speed_sp=30,stop_action='hold')
mB.run_to_rel_pos(position_sp=-126,speed_sp=80,stop_action='hold')
sleep(2)
御覧の通り全ての動きが一括して定義されて番号で区別されている.全ての動きの後にsleep(2),つまり「2秒間停止」させる関数が挿入されているが,これはある動作を行っている途中から次の動作が行われることを防ぎ,実験から全行程で停止時間は2秒間が望ましいことが分かったため挿入することにした.~
変数を用いて四画目から六画目までの繰り返しの移動を簡略化することもできそうだったが,入力する量はこちらの方が多くなりそうだったので既成の方にした.~
ちなみに定義するとしたら以下の通り.
def slide_for5(k): # position_spをkとおく
mB.run_to_rel_pos(position_sp=k,speed_sp=80,stop_action='hold')
sleep(2)
def slide5-6():
move_pos = 172 # move_posという変数を定義し172を代入
slide_for5(move_pos) # (k)にはmove_pos = 172という値が入っている(四画目の描画)
move_back3()
move_pos *= -1 # move_posに新たに-1をかけたものを代入
slide_for5(move_pos) # 五画目の描画
move_back3()
move_pos *= -1
slide_for5() # 六画目の描画
-ペンの昇降は以下の通りに定義した.
def pen_down(): # ペンの上昇
mC.run_to_rel_pos(position_sp=180,speed_sp=80,stop_action='hold')
sleep(2)
def pen_up(): # ペンの降下
mC.run_to_rel_pos(position_sp=-180,speed_sp=80,stop_action='hold')
sleep(2)
**実際の作動プログラム [#d10a48ce]
前述の定義を踏まえ以下のようにプログラムし実行した.
mA.reset()
mB.reset()
mC.reset()
pen_down()
move_cross() #一画目 「千」描画開始
pen_up()
move_back1()
slide_back2()
pen_down()
slide_for6() #二画目
pen_up()
move_for2()
slide_back4()
pen_down()
move_back4() #三画目 「千」描画終了
pen_up()
slide_back3()
move_back2()
pen_down()
slide_for5() #四画目 「曲」描画開始
pen_up()
move_back1()
pen_down()
slide_back5() #五画目
pen_up()
move_back1()
pen_down()
slide_for5() #六画目
move_for2() #七画目
pen_up()
slide_back5()
pen_down()
move_back2() #八画目
pen_up()
slide_for2()
pen_down()
move_for3() #九画目
pen_up()
slide_for2()
pen_down()
move_back3() #十画目 「曲」描画終了
pen_up()
*実行した結果と考察(発表会にて) [#sc7fe799]
**発表会で書いた実物 [#idbe3702]
&ref(2018a/Member/gear/Mission1/letter-chikuma.jpg,50%,「千曲」本番の結果); &size(17){その後に行った六回連続にわたる実験結果⇒};
&ref(2018a/Member/gear/Mission1/trial-chikuma.JPG,68%,「千曲」数回の実験結果);~
両方の写真から比較的形は安定していることがわかるが,本番の時のほうで一画目の傾きがずれてしまっている.~
また,他の人の発表と自分のを比較して,動きが結構遅いと感じた.そこで実際に速さを大きくして実行してみようと思い,一画目の斜めの動き以外の全動作の速さを2.5倍して実行してみた.その結果として以下の文字が描けた.~
~
&ref(2018a/Member/gear/Mission1/「千曲」take2.JPG,50%,「千曲」速さマシマシの結果); &size(17){⇒ 形は崩れていないが,筆圧が定まっていない.};~
~
やはり,ペンと紙面が接している以上動作は慎重に行わなければならないと考えた.
**生じた問題点とその考察 [#n34dc2c2]
実際に動かしてみて生じた問題点は「動きがずれる時がある」ことだった.これを以下のように考察した.~
筆を降下させた時に,レールから筆先までの距離が紙面までの距離より大きかったため,筆が紙面に引っ掛かり,移動距離が実際よりも小さくなってしまった.この問題は早期から生じていたが,扱うロボットの構造上めぼしい改善策は思いつかなかったゆえに,文字の仕上がりは最初のペンの取り付け方に依拠することになる.思いついた案としては,ペンの位置を固定して縦方向に紙自体を動かす,いわばコピー機の要領ならばうまく書けるのではと考えた.ただ,時間的な問題で
残念ながらこれを形にはしないが悪しからず.
*感想 [#pbcf37e7]
今回初めてロボットの設計とプログラミング行い,困難や思い悩んだことが多かったが,それと同時に,長い時間をかけて課題をこなすことに大きな達成感も感じた.この課題を通してロボット製作に関する知識や予想される問題点,その解決策への過程を学べ,面白さを身をもって感じたと考える.
訪問者合計&counter(all);
*おまけ [#v52c0894]
以下はあえなく挫折した当初の目標であった「長野」の産物である.~
~
&ref(2018a/Member/gear/Mission1/letter_nagano.JPG,50%,「長野」の「野」なし);~
~
思いがけずもいい出来だった.中間テストの存在が私に「野」を断念させた(泣).