目次 #contents *ロボットの選択 [#ze8b6ad0] 今回、私は「高崎」を書くロボット製作することになった。 「高崎」という感じは画数がとても多く、ペンをローバーに固定し、ローバーを動かすことで文字を書くロボットでは、電池の消耗、難易度的に無理があると考えた。 また、2本のアームで文字を書くロボットは構造自体は簡単だが、プログラミングが非常に高度なものとなるため、現実的でないと考えた。 以上のことから、私たちのグループでは、構造が比較的簡単で、なおかつプログラミングも容易な「XY軸ロボット」を作成することになった。 *ロボットの作成 [#ad80646f] **試作1 [#u112e39a] &ref(2017b/Member/yuitom/Mission1/WR_sisaku1_1.jpg,100.1号機の画像); -地上ローバー(y軸ローバー) 地上ローバーは縦方向にのみ動くことができればいいので、モータ(モータA)は1つしか使用していない。また、上の画像の位置からは見ることができないが、地上ローバーは駆動車輪2つ+無動力車輪1つの計3つの車輪で構成されている。 -橋上ローバー(x軸ローバー) 橋上ローバーは、ペンを上げ下げするモータ(モータB)と、橋の上を行き来するモータ(モータA)から構成されるローバーである。モータを2台使用していることから、かなり重くなってしまい、結果的に橋を丈夫にするために、多くの部品を使用することとなった。また、橋上ローバーは、レゴの凹凸をレールとして使用しているため、動かして横に落下することはなかった。 -試作1からわかった4つの課題 1.全体に関して � ゝ々修�複雑化してしまい、持ち帰る際に分解する時、非常に時間がかかってしまう。 →構造の簡略化+分解性の向上。 2.地上ローバーに関して �◆|肋絅蹇璽弌爾瞭阿�と、橋の末端部(地上ローバーから最も離れた部分)の動きにズレが出てしまう。 →動力を橋下にまで伸ばし、ブレを少なくする。 3.橋に関して �� 橋上ローバーのレールとして使用した、レゴの凹凸だが、この凹凸に車輪が引っかかってしまい、橋上ローバーが正確に動作しない。 →レゴの凹凸を使用するのではなく、ならべく滑らかなレールを使用した橋の作成。 �ぁゞ兇�短すぎるため、橋上ローバーが大きく動けず、文字を書くことが難しい。 →橋の延長+橋の耐久性の維持。 4.橋上ローバーに関して 特になし 以上の4点が、試作1からわかった課題である。今後は、上の4点の課題をどう克服して行くかをメインにロボットの改良を行っていく。 **試作2 [#d3ea963a] &ref(2017b/Member/yuitom/Mission1/WR_sisaku2_2.jpg,100%,2号機の画像); &ref(2017b/Member/yuitom/Mission1/WR_sisaku2_2.jpg,65%,2号機の画像); -地上ローバー 課題� 々渋い隆蔑�化+分解性の向上。 →構造の簡略化に成功し、結果的に橋との接続部もより簡単に、より強いものとすることができた。 課題�◆‘偉呂魘恐爾砲泙膿�ばし、ブレを少なくする。 →橋の中央の下に新たに駆動輪を一つ増やし、それを地上ローバーのモータにつなげることで、動力を橋下にまで伸ばすことに成功し、若干ブレが少なくなった。 -橋上ローバー 課題� 々渋い隆蔑�化+分解性の向上。 課題�ぁゞ兇留篦后楸兇梁儺彑�の維持。 →レゴの細長く楕円形の部品を用い、より強固で長く、より構造を簡略化し、分解性も高めた。また、橋上ローバーが落ちないように、比較的高さのあるレールを使用したはしを制作した。 課題�� レゴの凹凸を使用するのではなく、ならべく滑らかなレールを使用した橋の作成。 &ref(2017b/Member/yuitom/Mission1/WR_sisaku2_3.jpg,60%,二号機のレールの画像); →上の画像のような、レールにすることで、滑らかなレールの作成に成功した。 -試作2からわかった新たな課題 1.全体に関して 特になし 2.地上ローバーに関して �ァゞ兇硫爾龍酘偉悗�ペンにあたってしまい、正確な字を書くことができない。 →橋下の駆動輪の位置を移動しペンの邪魔にならないようにする。 3.橋に関して 特になし 4.橋上ローバーに関して �Α.撻鵑魏爾欧疹�態で、橋上ローバーの場合は後方へ引く動作、地上ローバーの場合は前方へ引く動作に弱いことが分かった。 →橋上ローバーによるペンのブレを最大限抑える。 5.プログラミングに関して �Α.撻鵑魏爾欧疹�態で、橋上ローバーの場合は後方へ引く動作、地上ローバーの場合は前方へ引く動作に弱いことが分かった。 →書き順の変更+ペンの上げ下げによるブレの軽減。 以上の2点が、試作2から分かった課題である。 **試作3(完成機) [#q35ad2eb] &ref(2017b/Member/yuitom/Mission1/WR_sisaku3_3.jpg,65%,3号機の画像); -地上ローバー 課題�ァゞ恐爾龍酘偉悗琉銘屬魄榮阿轡撻鵑亮挧發砲覆蕕覆い茲Δ砲垢襦� &ref(2017b/Member/yuitom/Mission1/WR_sisaku3_4.jpg,60%,3号機駆動輪の構造の画像); →上の画像のように、ギアを使用し、地上ローバーのモーターの力を平行移動させてやることで改善。それに伴い、課題�△痢崙偉呂魘恐爾砲泙膿�ばし、ブレを少なくする。」も改善に成功した。 また、最小限の部品を使用することで、課題�,痢峭渋い隆蔑�化+分解性の向上。」も試作2の分解性を維持した。 -橋上ローバー 課題�Αゞ蕎絅蹇璽弌爾砲茲襯撻鵑離屮譴鮑蚤膰騨泙┐襦� &ref(2017b/Member/yuitom/Mission1/WR_sisaku3_1.jpg,60%,3号機の画像); →上の画像のようにペンを固定することで、橋上ローバーによるペンのブレを最大限抑えることに成功した。 *基本のプログラム [#y582a7b6] **定義による数値の管理 [#l5887e7a] ロボットは動かすたびにバッテリーを消耗し、動きが鈍くなる。それによる誤差は正確な文字を書くことの障害となってしまう。そのため、私たちのグループでは、数値関係のほとんどを定義によって管理し、より誤差の修正を容易にできるようにした。 -モータの速度と時間 私たちのグループでは、「何cm進むか」というサブルーチンを使用している。そのため、モータA、Bの定義は前進後退で細かく分けられている。 また、モータCの速度がかなり遅く設定されている理由は、ロボットの安定性のためと、ペンのブレ軽減のためである。 #define Aforward_onecm 198 // モータA(地上ローバー)の1cm前進に用いる時間 #define Aback_onecm 190 // モータAの1cm後退に用いる時間 #define Cforward_onecm 195 // モータC(橋上ローバー)の1cm前進に用いる時間 #define Cback_onecm 190 // モータCの1cm後退に用いる時間 #define speed_C -15 // モータCの速度 #define speed_A 25 // モータAの速度 -ペンの速度と時間 私たちのグループでは、ペンの速度は15と比較的遅いものとなっている。その理由は、ペンの上げ下げをする時間が早いと、橋上ローバーが揺れてしまい、正確にペンを下すことができないためである。 #define speed_B 15 // ペンの上げ下げの速度 #define pendown_time 113 // ペンの下げる時間 #define penup_time 130 // ペンのあげる時間 -ペンの上げ下げ 私たちのグループでは、「ペンの速度と時間」でも記述した通り、橋上ローバーの揺れによるペンのブレが課題となっていた(課題�Α法�このことから、ペンの上げ下げでは、ペンを上げる前、ペンを下した後に wait(200) を入れることで、ブレを最大限抑えることに成功し、より正確な文字が書けるようになった。 #define pen_down OnFwd(OUT_B,speed_B);Wait(pendown_time);Off(OUT_B);Wait(200); // ペンを下す #define pen_up Wait(200);OnRev(OUT_B,speed_B);Wait(penup_time);Off(OUT_B); // ペンを上げる **正確な動作をするために… [#la35d4f1] 私たちのグループでは、正確に文字を書くために、数値を入れることでその数値の分だけ動くサブルーチンを使用している。そのことにより、よりプログラミングをやりやすく、また改善しやすくすることに成功した。 -前進と後退 〇〇(何cm進む)と数値を入力することにより、前後方向の移動を統一した。 また、� 沖◆�int ��)としたとき、 �,脇阿�すモータを指す。�△�forwardで前進、backで後退を表す。��は何cm進むかを指す。 例)モータA、3cm前進 → A_forward(3); sub A_forward(int x)// A前進 { OnFwd(OUT_A,speed_A); Wait(Aforward_onecm*x); Off(OUT_A); } sub A_back(int x)// A後退 { OnRev(OUT_A,speed_A); Wait(Aback_onecm*x); Off(OUT_A); } sub C_forward(int x)// C前進 { OnFwd(OUT_C,speed_C); Wait(Cforward_onecm*x); Off(OUT_C); } sub C_back(int x)// C後退 { OnRev(OUT_C,speed_C); Wait(Cback_onecm*x); Off(OUT_C); } -前進と後退の応用 「前進と後退」のプログラムを使用し、〇〇(横に何cm進む、縦に何cm進む)と数値を数値を入力することにより、直角の運動のプログラムを簡略化した。 また、A��x_C��y(int ��,int �ぁ砲箸靴燭箸�、�,魯癲璽�Aに対して、forwardの「f」で前進、backはRevの「r」で後退を表し、��でモータAが何cm進むかを表す。�◆↓い眛瑛佑任△襦� 例)モータAは3cm前進して、モータBは4cm後退 → Afx_Cry(3,4); sub Afx_Cfy(int x,int y)// A前進 C前進 { A_forward(x); Wait(500); C_forward(y); } sub Arx_Cfy(int x,int y)// A後退 C前進 { A_back(x); Wait(500); C_forward(y); } sub Afx_Cry(int x,int y)// A前進 C後退 { A_forward(x); Wait(500); C_back(y); } sub Arx_Cry(int x,int y)// A後退 C後退 { A_back(x); Wait(500); C_back(y); } **斜め線を書く [#x6a5e1ff] 文字を書くために必要不可欠な要素、それは「斜め線」である。今回、私が書く「高崎」にも斜め線は含まれており、この斜め線をいかにうまく書くかがとても大きな課題となった。 今回は、一辺が〇cmの正方形の対角線を書くことで、文字の中の斜め線を再現した。 また、slanting_� �int �◆砲箸靴燭箸�、�,�downで右上から左下へ、upで右下から左上に向かって対角線を描くことを表し、�△楼貶佞�何cmの正方形にするのかを表す。 例)一辺が4cmの正方形の対角線を右上から左下にかけて書く → slanting_down(4); sub slanting_up(int x)// 斜め上がり { OnRev(OUT_A,speed_A); OnRev(OUT_C,-13); Wait(Aback_onecm*x); Off(OUT_AC); } sub slanting_down(int x)// 斜め下がり { OnRev(OUT_A,speed_A); OnFwd(OUT_C,-13); Wait(Aback_onecm*x); Off(OUT_AC); } **口を書く [#c5d275b4] 「高崎」という文字には合計で3つの「口」が使用されている。そのため、task main()にいちいちプログラミングを書いていると、そのプログラムは「takasaki_write1」のように膨大なものとなってしまう。このことから、3つの「口」をすべて同じサブルーチンでまとめることにより、より分かりやすく、より簡単なプログラムを作ることができると考えた。 今回、ロボットの課題�Δ寮�質上、口の書き方は「右上から左下へ」を意識した非常に独特なものとなっている。 また、1画ごとにペンを上げているが、この理由は、ペンのブレを少なくすることで、より正確に、よりきれいな口を書くためである。 sub write_square ()// 口を書く { pen_down A_back(3); // 一画目(右上からスタート) pen_up Wait(500); pen_down C_forward(2); // 二画目(左下でゴール) pen_up Afx_Cry(3,2); // 右上に移動 Wait(500); pen_down C_forward(2); // 三画目(右上からスタート) pen_up Wait(500); pen_down A_back(3); // 四画目(左下でゴール) pen_up } *高崎を書くプログラム [#dbc3103d] **takasaki_write1(試作2) [#n2822aba] &ref(2017b/Member/yuitom/Mission1/TW_1_1.jpg,100,高崎の書き順�,硫菫�); 今回は、最初に縦の線を書き、その後横の線を書くことにより文字を書くプログラムを作成した。 上の「高崎」の字上に記入されている数字は何画目に記入するかを表す。また、プログラム上では pen_up // {書いている漢字}{画数}で表す。 例)高崎の「高」の1画目が記入終わり → pen_up // 高� � task main() { pen_down C_forward(3); pen_up // 高�� A_forward(2); C_back(1); pen_down C_back(1); pen_up // 高�� C_back(2); pen_down C_back(1); pen_up // 高�� C_back(2); A_forward(1); pen_down C_forward(1); pen_up // 高�� A_forward(1); C_forward(1); pen_down C_forward(1); pen_up // 高�� C_forward(2); pen_down C_forward(1); pen_up // 高�� C_forward(1); A_forward(2); pen_down C_back(3); pen_up // 高�� C_back(3); pen_down A_back(6); pen_up // 高�� C_forward(1); A_forward(4); pen_down A_back(2); pen_up // 高�� C_forward(1); A_forward(2); pen_down A_back(2); pen_up // 高�� C_forward(1); A_forward(4); pen_down A_back(6); pen_up // 高�� C_forward(1); A_forward(4); pen_down A_back(2); pen_up // 高�� C_forward(1); A_forward(2); pen_down A_back(2); pen_up // 高�� A_back(2); C_forward(6); //「高」から「崎」へ移動 pen_down C_forward(3); pen_up // 崎�� A_forward(1); pen_down C_back(4); pen_up // 崎�� A_forward(1); C_forward(1); pen_down C_forward(3); pen_up // 崎�� A_forward(1); C_forward(1); pen_down C_back(1); pen_up // 崎�� C_back(5); A_forward(2); pen_down C_forward(1); pen_up // 崎�� C_forward(4); pen_down C_forward(1); pen_up // 崎�� C_forward(1); A_forward(1); pen_down C_back(3); pen_up // 崎�� C_back(3); A_forward(1); pen_down A_back(4); pen_up // 崎�� C_forward(2); A_forward(4); pen_down slanting_up(2); Wait(200); slanting_down(2); pen_up // 崎�� and 崎�� C_forward(1); A_forward(4); pen_down A_back(4); pen_up // 崎�� C_forward(1); A_forward(2); pen_down A_back(2); pen_up // 崎�� C_forward(1); A_forward(2); pen_down A_back(2); pen_up // 崎�� A_back(1); C_back(1); pen_down A_back(2); pen_up // 崎�� } -評価 &ref(2017b/Member/yuitom/Mission1/TW_1.jpg,100,書き順�,能颪い拭峭盧蝓廚硫菫�); 高崎と認識することが難しいものが出来上がった。特に1cmの縦線(例 高�◆↓�…)が書くことができず、点となってしまったことがかなり問題があった。 -takasaki_write1から分かった課題 � .廛蹈哀薀爐�長すぎて見ずらく、改善の際に時間がかかってしまう。 →サブルーチンなどをうまく使用し、さらにプログラムを短くわかりやすくする。 �◆〇邵�2の課題�Α屮撻鵑魏爾欧疹�態で、橋上ローバーの場合は後方へ引く動作、地上ローバーの場合は前方へ引く動作に弱いことが分かった。」 →書き順の変更+ペンの上げ下げによるブレの軽減。(この時、ペンの速度は25) �� 1cmの縦線(例 高�◆↓�…)が書くことができない。 →書き順の変更+文字全体の拡大。 �ぁー个畧�が非常に雑である(この時、モータAの速度は54) →速度をさらに遅くすることによるブレの軽減。 以上の4点の課題が分かった。 **takasaki_write5(試作2、3 本番にて使用) [#ofd307d4] &ref(2017b/Member/yuitom/Mission1/TW_2_1.jpg,100,高崎の書き順�△硫菫�); 今回は、前回の課題から、書き順を大きく変更した。 task main () { pen_down C_forward(2); pen_up // 高�� A_forward(4); pen_down A_back(7); pen_up // 高�� Afx_Cfy(5,1); write_square (); // 高���� Afx_Cfy(5,1); pen_down A_back(7); Wait(500); C_forward(4); pen_up // 高�� Afx_Cry(7,4); pen_down C_forward(4); pen_up // 高�� Arx_Cry(3,3); write_square (); // 高�Л─ヾ粟� C_forward(7); // 移動 高→崎 pen_down C_forward(4); Wait(500); A_back(3); pen_up // 崎�� C_back(4); pen_down C_forward(4); pen_up // 崎�� Afx_Cry(2,6); pen_down C_forward(6); pen_up // 崎�� Afx_Cry(5,2); write_square (); // 崎�き� Afx_Cry(5,3); pen_down A_back(5); pen_up // 崎�� A_forward(4); pen_down C_forward(5); pen_up // 崎�� Afx_Cry(1,8); pen_down A_back(5); pen_up // 崎�� Afx_Cry(3,2); pen_down C_forward(2); Wait(500); slanting_down(3); pen_up // 崎�� A_forward(6); pen_down slanting_up(3); pen_up // 崎�� 完成 } -評価 &ref(2017b/Member/yuitom/Mission1/TW_2.jpg,100,書き順�△砲茲詼榿屬痢峭盧蝓廚硫菫�); takasaki_write1と比較し、とてもきれいな高崎を書くことができた。しかし、斜め線が繋がっていない、揺れているなどまだ改善すべき点は多く、少々悔しい結果となった。 -各課題に対する対応 課題� .汽屮襦璽船鵑覆匹鬚Δ泙�使用し、さらにプログラムを短くわかりやすくする。 →「前進と後退の応用」のサブルーチンを新たに作成し、ペン上げ後の移動のプログラムをわかりやすく、改善のしやすいものにした。また、「口」のサブルーチンも作成し、さらなるプログラムの簡略化に成功した。 課題�◆―颪�順の変更+ペンの上げ下げによるブレの軽減。(この時、ペンの速度は25) →ペンの上げ下げの速度を25→15に下げ、ペンのブレを大幅に改善した。また、書き順を大幅に変更したことにより、文字をより正確に、きれいに書くことに成功した。 課題�� 書き順の変更+文字全体の拡大。 →文字を+1cmしたことにより、より正確に、きれいに書くことが可能となった。 課題�ぁー个畧�の速度をさらに遅くすることによるブレの軽減。 →モータAの速度を54→25に下げ、それに伴いモータBの速度も下げた。それにより、ペンのブレが大幅に軽減され、やや揺れるが、前回よりもきれいな斜め線を描くことに成功した。 *まとめ [#s4815b67] -地上ローバー 今回、試作1と比べ試作3は非常に高い安定性を得ることに成功したが、まだ完全に安定しているとは言えなかった。これは、無動力車輪(前輪)が本体に近すぎたためと考えられるため、無動力車輪を離すことで、より安定性のある機体を作成できたのではないかと考えている。 -橋上ローバー 今回は、ペンを横から持つ形で固定したため、課題�Α屮撻鵑魏爾欧疹�態で、橋上ローバーの場合は後方へ引く動作、地上ローバーの場合は前方へ引く動作に弱い。」という問題点が発生してしまった。このことから、「XY軸ロボット」はペンを垂直に立て物が最も適しているのではないのかということが分かった。 -プログラミング 今回は、いろいろなサブルーチンを使用したことにより、プログラミングの大幅な削減に成功した。しかし、まだ削ることができると考えているため、少々心残りである。