課題1:お絵かきロボット

A3の紙に相棒の似顔絵を書くロボットを作成せよ。

•ひとりにつき一つ以上のプログラムを作成すること。

•ペン以外はキットに含まれる部品を使うこと。

•キットに付属の高価な輪ゴムは切れやすいので切れないように細心の注意を払うこと。

•改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。

ロボットの仕組み

マシン左.jpg

男に無駄な装飾は不要、ということでシンプルな構造に。
基本設計に少し手を加えたものです。
しかし、あまりにシンプルすぎたためか、ペンを上げ下げする時に安定しないことあるのが問題になりました。
その問題は、輪ゴムをきつめにしめることと、アームの間に棒を差し込んでペンを安定させることで解決を図りました。
しかし、固い地面が相手の時はペンがズレていくことがあったのが問題点でした。
詳細は後述。

マシン右2.jpg

ペンを上げる際に、必要以上に回転しないようにストッパーを装着。
これがないとペンが余計な線を書いてしまいます。
正面から見て左に接地してあるペンが、270度くらい回転して接地してしまい、おかしな線を書いてしまうのです。
応急処置的な装備でしたが、思いのほかもってくれたので最終的にそのままに。
しかし、今思うともう少し改良してもよかったかな…とも思います。

装飾品.jpg

ペン装着アタッチメント。
ペンを挟んで固定します。
輪ゴムはそのときのために用いるわけですね。
最終的には、黄色のアームの間にペンを安定させるために棒を挟み込みました。
これによって左右のブレを少なくする効果が見込めるのです。

似顔絵について

村人Aの場合

完成予想図

完成予想図.jpg

   基本プログラム

#define EYE 50//目の長さ
#define NOSE 50//鼻の長さ
#define MOUSE 85//口の長さ
void go_straigth(int t)//直進
{
OnFwd(OUT_A+OUT_C);
Wait(t);
Off(OUT_A+OUT_C);
}

 

void back(int t)//バック
{
OnRev(OUT_A+OUT_C);
Wait(t);
Off(OUT_A+OUT_C);
} 
sub turn_left()//左に曲がる
{
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(97);
Off(OUT_A+OUT_C);
}
sub turn_right()//右に曲がる
{
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(100);
Off(OUT_A+OUT_C);
} 
sub arm_down()//アームを下ろす
{   
OnFwd(OUT_B);
Wait(13);
Off(OUT_B);
} 
sub arm_up()//アームを上げる
{
OnRev(OUT_B);
Wait(13);
Off(OUT_B);
} 

お絵描きプログラム

task main()
{ 
go_straigth(EYE);//目を描く
arm_up();
Wait(300);
go_straigth(EYE);
arm_down();
Wait(300);
go_straigth(EYE);
arm_up();
Wait(100);
back(75); 
turn_left();
go_straigth(110);
arm_down();
Wait(300);
go_straigth(NOSE);//鼻を描く
arm_up();
Wait(300);
go_straigth(45);
turn_left();
go_straigth(40);
arm_down();
Wait(300);
go_straigth(MOUSE);//口を描く
back(60);
arm_up();
Wait(300);
back(80);
turn_left();
go_straigth(90);
repeat(4)//顔の輪郭
{  
arm_down();
Wait(300);
go_straigth(160);
back(95);
arm_up();
Wait(300);
turn_right();
}
arm_down();
Wait(300);
go_straigth(50);
}

さぁ、どうかな?

↓に続く

村人Aの完成図

完成品.jpg

なかなかいい。だが線がゆがんでいる。

工夫した点

プログラミングは初めてなので、できるだけ単純な直線だけで顔を表現した。 走っていいるとどんどん角度がずれていくので、こまめに角度などの微調整をして思い通りの顔が描けるように頑張った。 途中途中アームの上げ下ろしのときなどに、止まって正確な絵が描けるようにした。

もぇくぇの場合

#define go_straight OnFwd(OUT_A+OUT_C);
#define turn_left OnRev(OUT_A);OnFwd(OUT_C);
#define turn_right OnRev(OUT_C);OnFwd(OUT_A);
#define go_back OnRev(OUT_A+OUT_C);
#define turn_left_back Off(OUT_A);OnRev((OUT_C);
#define turn_right_back Off(OUT_C);OnRev(OUT_A);
#define pen_up OnFwd(OUT_B);Wait(10);Off(OUT_B);
#define pen_down OnRev(OUT_B);Wait(10);Off(OUT_B);

task main()
{
 go_straight;/*左輪郭*/
 Wait(100);
 pen_up;
 go_straight;
 Wait(15);
 turn_left;
 Wait(70);
 go_back;
 Wait(50);
 pen_down;
 go_straight;/*左アゴ*/
 Wait(60);
 pen_up;
 go_straight;
 Wait(27);
 turn_left;
 Wait(50);
 go_back;
 Wait(40);
 pen_down;
 go_straight;/*右アゴ*/
 Wait(60);
 pen_up;
 go_straight;
 Wait(20);
 turn_left;
 Wait(70);
 go_back;
 Wait(40);
 pen_down;
 go_straight;/*右輪郭*/
 Wait(90);
 pen_up;
 go_straight;
 Wait(20);
 turn_left;
 Wait(90);
 go_back;
 Wait(70);
 pen_down;
 go_straight;/*前髪*/
 Wait(185);
 pen_up;
 go_straight;
 Wait(80);
 turn_right;
 Wait(150);
 go_straight;
 Wait(0);
 pen_down;
 go_straight;/*頭*/
 Wait(60);
 pen_up;
 go_straight;
 Wait(40);
 turn_right;
 Wait(60);
 go_back;
 Wait(20);
 pen_down;
 go_straight;/*頭頂部*/
 Wait(160);
 pen_up;
 go_straight;
 Wait(50);
 turn_right;
 Wait(100);
 go_back;
 Wait(15);
 pen_down;
 go_straight;/*後頭部*/
 Wait(140);
 pen_up;
 go_straight;
 Wait(55);
 turn_right;
 Wait(100);
 go_back;
 Wait(10);
 pen_down;
 go_straight;/*後ろ髪*/
 Wait(40);
 pen_up;
 go_straight;
 Wait(25);
 pen_down;
 go_straight;/*口*/
 Wait(30);
 pen_up;
 go_straight;
 Wait(50);
 turn_right;
 Wait(100);
 go_straight;
 Wait(20);
 pen_down;
 go_straight;/*右目*/
 Wait(35);
 pen_up;
 go_straight;
 Wait(30);
 turn_right;
 Wait(100);
 go_straight;
 Wait(80);
 turn_right;
 Wait(100);
 go_back;
 Wait(40);
 pen_down;
 go_straight;/*左目*/
 Wait(40);
 pen_up;
 Off(OUT_A+OUT_C);
}

もぇくぇの完成図

蛍光ペンで書いたので見づらい…

苦労したこと

村人A

マシンがまっすぐ進まないので、少しずつ直線などがずれていくので、思い通りの絵がなかなかうまくかけなかった。それにかなり頭を悩まされた。

プログラムは難しい。

もぇくぇ

ペンを上げ下げして新しい直線を描くときに位置の微調整が難航したことと、
ある程度プログラムを組んでいくと挙動が安定しない、
つまりうまく直線がつながらないことがあることに苦労をさせられました。
角度の微調整が一番時間がかかったかもしれない。
しかも
「さっきはうまくいったのに、何で今回は角度ズレるんだよ!」
という状況が発生することも多かった、なぜだ。

反省

村人A

もうちょっとプログラムを簡略化できたのではないかと、思った。 もうちょっと頭を使って、難しい絵が描けたのではないかとおもった。

もぇくぇ

結構、直線の位置を調整したにもかかわらず完璧にはつながらなかったこと、
簡略化のため鼻や眉毛など一部の顔のパーツを省略したことが少し心残りです。
ペンの保持性も少し弱かったかな…と思った。
固い地面でやると、保持性がペンを叩きつける時の衝撃に負け、ペンがふっとんでいってしまった。
家の床は結構柔らかかったからうまくいったのだが…
これからはこういうことも考えていかなくてはいけないと思った。

コメント

好きなことを書いてください

  • 全体的にできているようですが、写真とプログラムの一部がうまく貼れていないようです。wikiを参照して、なおしてみてください -- FI? 2010-05-21 (金) 07:34:52
  • 内容を充実させることと、wikiの修正をお願いします -- TAKA? 2010-05-21 (金) 11:48:59
  • wikiの修正ができています。まだ内容が簡素だと思います。例えば、プログラムに沿って描いていく順番をまとめる、苦労したことへの取り組みなども詳しくまとめると良いと思います -- TAKA? 2010-06-01 (火) 12:27:42


添付ファイル: file完成予想図.jpg 193件 [詳細] fileマシン右2.jpg 192件 [詳細] file完成品.jpg 198件 [詳細] file装飾品.jpg 205件 [詳細] fileマシン左.jpg 221件 [詳細] fileマシン右.jpg 127件 [詳細] fileうわらば.jpg 200件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-23 (金) 17:33:05