目次

追記

12月28日・29日

図の追加(力の関係とギアの解説二枚)と、文章の一部の追加と表現の修正を行いました。

課題の説明

課題1:書道ロボット

各自の出身地または氏名の中の一文字をA4用紙の中に書きなさい。 ただし7画以上の文字を選ぶこと。もし7画以上の文字がない場合には合計7画以上になるように複数の文字を書きなさい。

実際に書いた字

kitamura.jpg

ロボット本体

書道ロボットにどのような性能が必要か二人で考えたところ、「安定して綺麗な線を引けるロボット」という結論に行き着きました。 そこで、製作方針として

  • 線を書いている時にバランスを崩さないように本体を大きく作る
  • 線が擦れないようにギアを組み合わせてゆっくり動かす

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

Robot.jpg

プリンターのように紙を巻き上げて書くようなロボットを基に作りました。 そのままのロボットでは紙が宙に浮いていて線が描けないことや、紙が絡まることがあったのでタイヤをつけて前後に動くように変更しました。

本体を大きく作る

回転して線を描くタイプのロボットの場合は小さく小回りの利くほうが良いですが、今回は完全に上下と左右が別々に動くので筆を一点に保つために大きく作りました。 タイヤの幅を大きくすることで、筆が左右に動いても不安定になりません。 また、コントローラ側の重量が若干重いので、タイヤを5つ装着し、反対側に余ったブロックをつけてバランスをよくしました。

ゆっくり動かす

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

model_before.jpg model.png

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

その他

プログラムの調整を何度も行うことが予想されたので、終了時に所定の場所まで自動で戻れるようにセンサーを着けています。

TOUCH_SENSOR.jpg

プログラム

単調なプログラムが続くので、特にこだわった部分だけを書きます。 全体のコードは添付ファイルを見てください filekita.nqc filemura.nqc

共通部分

『北』と『村』という字は別々のプログラムで書きましたが、共通のマクロや関数を使用してます。

筆を右に動かしながら下げる

書道の経験からですが、筆画の初めは斜めに入ると字全体が綺麗に見えるというテクニックがあります。 今回の書道ロボットでもこのテクニックを用いています。

#define DOWN SetPower(OUT_B,10);fwd(OUT_A,40);OnRev(OUT_A);OnFwd(OUT_B);Wait(30);Off(OUT_A);Wait(20);

最後のWaitは、筆を下げた直後に次の動作に入ると字がブレてしまうことへの対処です。

筆を上げる

#define UP SetPower(OUT_B,10);OnRev(OUT_B);Wait(50);Off(OUT_B);

後ろに下がりながら筆を上げる

ロボットの特性上、筆を上げるときに前にはねることがあります。このマクロは筆を上げる時に後ろに下がり、意図しないはねを抑えます。詳しくは『村』の字を書くで説明します。

#define SUP SetPower(OUT_B,10);OnFwd(OUT_C);OnRev(OUT_B);Wait(50);Off(OUT_BC);rev(OUT_C,50);

上下左右の力と移動時間を指定して動かす

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

low_power.png high_power.png

このことより、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);
	}

	/* ~~省略~~ */
}

『北』の字を書く

五画目について

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);
}

『北』の字で特にこだわって作ったのは、五画目のカーブの部分とはねの部分です。 カーブの部分は五回ほど筆を進める方向を変えて表現しています。 はねの部分はロボットの構造上筆を上げる時に上方向にはねてしまうのを上手く利用しています。

kita_gokakume.jpg

『村』の字を書く

三画目について

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というマクロを使用しています。これは、ロボットの構造上まっすぐ筆を上げることができず前方向にはねてしまうのを、後ろに下がりながら筆を上げることによって自然な払いを再現しています。

harai.jpg

反省

ロボットに関して

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

プログラムに関して

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

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

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

全体として

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


添付ファイル: filemodel.png 129件 [詳細] fileTOUCH_SENSOR.jpg 117件 [詳細] filelow_power.png 108件 [詳細] filehigh_power.png 94件 [詳細] filemodel_before.jpg 114件 [詳細] filekita_gokakume.jpg 104件 [詳細] fileharai.jpg 96件 [詳細] filekitamura.jpg 126件 [詳細] fileRobot.jpg 103件 [詳細] filemura.nqc 82件 [詳細] filekita.nqc 91件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-29 (火) 13:44:54