* 目次 [#id9032f5]
#contents

* 追記 [#s8d95e47]
** 12月28日・29日 [#sd4aa10a]
図の追加(力の関係とギアの解説二枚)と、文章の一部の追加と表現の修正を行いました。

* 課題の説明 [#hb9fc5e3]
[[課題1:書道ロボット>2015b/Mission1]]
> 各自の出身地または氏名の中の一文字をA4用紙の中に書きなさい。 ただし7画以上の文字を選ぶこと。もし7画以上の文字がない場合には合計7画以上になるように複数の文字を書きなさい。

* 実際に書いた字 [#s9bdc04a]
#ref(2015b/Member/ugwis/Mission1/kitamura.jpg,50%)

* ロボット本体 [#rdae30fd]
書道ロボットにどのような性能が必要か二人で考えたところ、「安定して綺麗な線を引けるロボット」という結論に行き着きました。
そこで、製作方針として
- 線を書いている時にバランスを崩さないように本体を大きく作る
- モーターの動きを直接使うと動きが早くなり線が擦れたりするので、ギアを組み合わせてゆっくり動かす
- 線が擦れないようにギアを組み合わせてゆっくり動かす

を念頭に置き、ロボットを製作しました。

#ref(2015b/Member/ugwis/Mission1/Robot.jpg,50%)

プリンターのように紙を巻き上げて書くようなロボットを基に作りました。
そのままのロボットでは紙が宙に浮いていて線が描けないことや、紙が絡まることがあったのでタイヤをつけて前後に動くように変更しました。
** 本体を大きく作る [#h036a119]
回転して線を描くタイプのロボットの場合は小さく小回りの利くほうがいいのですが、今回は完全に上下左右と動きが分かれているので筆を一点に保つために大きく作りました。
回転して線を描くタイプのロボットの場合は小さく小回りの利くほうが良いですが、今回は完全に上下と左右が別々に動くので筆を一点に保つために大きく作りました。
タイヤの幅を大きくすることで、筆が左右に動いても不安定になりません。
また、コントローラ側の重量が重いので、タイヤを5つ装着し、反対側に余ったブロックをつけて少しバランスをよくしました。
また、コントローラ側の重量が若干重いので、タイヤを5つ装着し、反対側に余ったブロックをつけてバランスをよくしました。

** ゆっくり動かす [#hc49faf6]
モーターの動きはとても早く、筆を動かすスピードとしては速すぎます。そこで、ウォームとウォームホイールを用いて強くゆっくりした動きに変えています。
モーターの動きは筆を動かすスピードとしては速すぎます。そこで、ウォームとウォームホイールを用いてモーターの力を強くゆっくりした動きに変えています。
その力はラックへ伝えて筆を左右に動かしたり、タイヤに伝えて上下に動いています。

&ref(2015b/Member/ugwis/Mission1/model_before.jpg,50%);
&ref(2015b/Member/ugwis/Mission1/model.png,50%);

これはある角度から見た本体(左)と同じ角度から見た歯車の組み合わせの模式図(右)です。

** その他 [#ad2d10fb]
細かいプログラムの調整を何度も行うことが予想されたので、終了時に所定の場所まで自動で戻れるようにセンサーを着けています。
#ref(2015b/Member/ugwis/Mission1/sensor_and_rackgear.jpg,50%)
プログラムの調整を何度も行うことが予想されたので、終了時に所定の場所まで自動で戻れるようにセンサーを着けています。
#ref(2015b/Member/ugwis/Mission1/TOUCH_SENSOR.jpg,50%)

* プログラム [#n86ff36f]
単調なプログラムが続くので、特にこだわった部分だけを書きます。
全体のコードは添付ファイルを見てください
&ref(kita.nqc);
&ref(mura.nqc);

** 共通部分 [#v700232f]
『北』と『村』という字は別々のプログラムで書きましたが、マクロや関数など共通して使用している部分があります。
『北』と『村』という字は別々のプログラムで書きましたが、共通のマクロや関数を使用してます。

*** 筆を右に動かしながら下げる [#pa6fbcf7]
書道の経験からですが、筆画の初めは斜めに入ると字全体が綺麗に見えるというテクニックがあります。
今回の書道ロボットでもこのテクニックを用いています。
 #define DOWN SetPower(OUT_B,10);fwd(OUT_A,40);OnRev(OUT_A);OnFwd(OUT_B);Wait(30);Off(OUT_A);Wait(20);
最後のWaitは、筆を下げた直後に次の動作に入ると字がブレてしまうことへの対処です。

*** 筆を上げる [#debf1c08]
 #define UP SetPower(OUT_B,10);OnRev(OUT_B);Wait(50);Off(OUT_B);

*** 後ろに下がりながら筆を上げる [#o195e1d8]
特に下方向にはらう時など、あまり上方向にはねて欲しくない時に使います。詳しくは[[『村』の字を書く>#l2429489]]で説明します。
ロボットの特性上、筆を上げるときに前にはねることがあります。このマクロは筆を上げる時に後ろに下がり、意図しないはねを抑えます。詳しくは[[『村』の字を書く>#l2429489]]で説明します。
 #define SUP SetPower(OUT_B,10);OnFwd(OUT_C);OnRev(OUT_B);Wait(50);Off(OUT_BC);rev(OUT_C,50);

*** 上下左右の力と移動時間を指定して動かす [#qe124ee8]
これが今回のプログラムの肝になります。授業では触れていませんが、NQCにはSetPowerという関数があります。
モーターの動き続ける速度は力の強さにはほとんど関係ありませんが、力が弱いほど終端速度に達するまでの立ち上がりの時間が長くなります。

&ref(2015b/Member/ugwis/Mission1/low_power.png,50%);
&ref(2015b/Member/ugwis/Mission1/high_power.png,50%);

このことより、力に差がある場合0.01秒ごとに移動する量は実は異なっています。
これを利用して0.01秒ごとに動く→止まるを繰り返すことによって綺麗な斜めを表現しています。
このことより、0.01秒ごとに移動する量は実は異なっています。
これを利用して0.01秒ごとに動く→止まるを繰り返すことによって左右のスピードを調節し綺麗な斜めを表現しています。
 void move(int lx, int ly, int time)
 {
 
  	/* ~~省略~~ */
 
 	SetPower(OUT_A,x);
 	SetPower(OUT_C,y);
 	for(i=0;i<time;i++){
 		if(lx>0){
 			OnRev(OUT_A);
 		}
 		if(lx<0){
 			OnFwd(OUT_A);
 		}
 		if(ly>0){
 			OnFwd(OUT_C);
 		}
 		if(ly<0){
 			OnRev(OUT_C);
 		}
 		Wait(1);
 		Off(OUT_AC);
 	}
 
 	/* ~~省略~~ */
 }
** 『北』の字を書く [#h05a121a]
五画目について
 task main ()
 {
 	/* ~~省略~~ */
 
 	/* 五画目 */
 	DOWN;
 	move(0,10,110); 
 	move(1,9,4);
 	move(3,7,4);
 	move(5,5,4);
 	move(7,3,4);
 	move(9,1,4);
 	move(10,-1,130);
 	move(0,-10,30);
 	UP;
 
  	/* ~~省略~~ */
 
 	/* 筆を上げて右の所定の位置に戻る */
 	SetSensor(SENSOR_1, SENSOR_TOUCH);
 	OnRev(OUT_A);
 	until(SENSOR_1 == 1);
 	Off(OUT_A);
 }

『北』の字で特にこだわって作ったのは、五画目のカーブの部分とはねの部分です。
カーブの部分は五回ほど筆を進める方向を変えて表現しています。
はねの部分はロボットの構造上筆を上げる時に上方向にはねてしまうのを上手く利用しています。
#ref(2015b/Member/ugwis/Mission1/kita_gokakume.jpg,50%)

** 『村』の字を書く [#l2429489]
三画目について
 task main ()
 {
 	/* ~~省略~~ */
 
 	/* 三角目 */
 	DOWN;
 	move(-2,10,80);
 	move(-2,5,60);
 	SUP;
 
 	/* ~~省略~~ */
 
 	/* 筆を上げて右の所定の位置に戻る */
 	SetSensor(SENSOR_1, SENSOR_TOUCH);
 	OnRev(OUT_A);
 	until(SENSOR_1 == 1);
 	Off(OUT_A);
 }
三画目のはらいの部分にSUPというマクロを使用しています。これは、ロボットの構造上まっすぐ筆を上げることができず前方向にはねてしまうのを、後ろに下がりながら筆を上げることによって解消しています。
三画目のはらいの部分にSUPというマクロを使用しています。これは、ロボットの構造上まっすぐ筆を上げることができず前方向にはねてしまうのを、後ろに下がりながら筆を上げることによって自然な払いを再現しています。
#ref(2015b/Member/ugwis/Mission1/harai.jpg,50%)
* 反省 [#nb620c7f]
** ロボットに関して [#sb7e48ca]

結果としては製作する方針とあったロボットが出来たと認識していますが、タイヤの軸が少し不安定なことや長時間動かし続けると抜けてしまうパーツがあるというところを最後まで対処できず残念です。

** プログラムに関して [#i61485d5]

共通部分のmoveという関数は、北村という斜めの字の角度を細かく指定するために必要だったのですが、プログラムの転送に時間がかかることや0.01秒ごとに止まったり動いたりしているという観点から褒められるようなプログラムではありません。
共通部分のmoveという関数は、『北村』という斜めの字の角度を細かく指定するために必要だったのですが、プログラムの転送に時間がかかることや0.01秒ごとに止まったり動いたりしているという観点から褒められるようなプログラムではありません。

それとSetPowerを多用していますが、最大が7であることに気づかずにプログラム中に7以上の数字をしているのがなんとも言えないです。

ロボットを回転できるようにすればプログラムがもっとシンプルになったであろうと反省しております。

** 全体として [#g8c024ec]
出来るだけ効率よくロボットの製作、プログラムの作成を行ったつもりでしたが結局発表ギリギリまで作業をしてしまいました。
今回の課題は二人で共同のロボットを作るということで、なかなか一緒に作業ということができずどちらかが持って帰って改良するという形でやっていました。
次の課題はもっと余裕を持って行いたいです。

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