- 追加された行はこの色です。
- 削除された行はこの色です。
*似顔絵ロボットの製作 [#h33faf51]
目次
#contents
*課題内容 [#ga23cf62]
A4の用紙に、相方の似顔絵を描くロボットを製作する。
細かなルールは以下の通りである。
-用紙をテープなどで固定してはいけない。
-1人につき1つ以上のプログラムを制作すること。
-ペン以外の部品は、キットに含まれる物を使用すること。
-キットに付属の高価な輪ゴムは切れやすいので、扱う際は十分注意すること。
-改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。
*メンバー [#aa01cd0c]
-ぐっP:工学部 電気電子工学科 ロボットもプログラムも久しぶり
-ひろ:
-ひろ:工学部 情報工学科 初心者です(レゴを除く)
*ロボット紹介 [#e373491f]
**全体像 [#ffe0da88]
&ref(2011b/A2/課題1左/zentai.jpg,65%,全体); &ref(2011b/A2/課題1左/side.jpg,65%,側面); &ref(2011b/A2/課題1左/top.jpg,65%,上面);
全体はこんな感じです。ペンの上げ下げにアームを用いた「アーム型」ロボットです。
**アーム [#e9724257]
両側からペンを挟み込むようにして固定します。
&ref(2011b/A2/課題1左/arm.jpg,80%,アーム); &ref(2011b/A2/課題1左/gear.jpg,80%,ギア);
両側からペンを挟み込むようにして固定します。ギアは、上下速度を遅くするために段分けして調整しました。
また、ペンを自重でおろすため、アームの先に気休め程度のおもりとしてブロックをつけています。
なお動作の際には、ぐっPは油性ペン、ひろはボールペンを使用しています。
**キャスター [#g251b922]
-第一弾
***初代 [#t6146704]
&ref(2011b/A2/課題1左/caster1.jpg,60%,初代);
ガイドブック46ページのキャスターを参考に製作。
問題点:走行中に用紙に引っかかり、用紙がずれてしまう。
-第二弾
***二代目 [#fcdf23fe]
用紙に引っかからないように、キャスターを本体の内側に設置することに。取り付け場所が狭いため、摩擦の少なそうな部品で代用。
&ref(2011b/A2/課題1左/caster2.jpg,70%,二代目);
用紙に引っかからないように、キャスターを本体の内側に設置することに。取り付け場所が狭いため、摩擦の少なそうな部品で代用。(黄色のブロックをずらしているのは、後でとりやすくするため)
問題点:それでも摩擦が生じ、用紙が曲がってしまう。
-第三弾
***三代目 [#q1e9a217]
&ref(2011b/A2/課題1左/caster3.jpg,70%,三代目);
ならばいっそのこと、キャスターを用紙の外に出してしまおう!ということで製作。
問題点:動作の際に、非常にスペースをとる。しかし、スペースさえ確保できれば今までで一番描きやすい。
*予定図面 [#s90c82c1]
**ぐっP作「ひろの顔」 [#v39bdb58]
+輪郭を円で描く
+交互にバックして、髪を表現
+位置調整(1)
+目は直線で
+位置調整(2)
+回転を利用し、口を描いてフィニッシュ
+回転を利用し、口を引く
+位置調整(3)
+鼻を描いてフィニッシュ
&ref(2011b/A2/課題1左/kao1.jpg,70%,予定図); &ref(2011b/A2/課題1左/kao2.jpg,70%,手順前半);&ref(2011b/A2/課題1左/kao3.jpg,70%,手順後半);
**ひろ作「ぐっPの顔」 [#keeaf015]
+回転して輪郭を書く
+移動
+回転して口を書く
+移動
+鼻を書く
+移動(90度回転)
+目を書く
&ref(2011b/A2/課題1左/g_e.jpg,150%,予定図);
*プログラム [#te65bce5]
**ぐっPのプログラム [#a435c9f9]
#define BACK_TIME 18 //髪の部分の後退時間を指定
#define GO_TIME 10 //直進、後退時間を指定
#define UP_TIME 10 //アームの上げ時間を指定
#define DOWN_TIME 200 //アームの下げ時間(待ち時間)を指定
#define WAIT_TIME 50 //待ち時間を指定
void turn_right(int t) //t秒間の右旋回を定義
{
OnFwd(OUT_A); OnRev(OUT_C); Wait(t);
Off(OUT_AC);
Off(OUT_AC); Wait(WAIT_TIME);
}
void turn_left(int t) //t秒間の左旋回を定義
{
OnRev(OUT_A); OnFwd(OUT_C); Wait(t);
Off(OUT_AC);
}
void left_back() //左後退を定義
{
OnFwd(OUT_C); Wait(BACK_TIME);
Off(OUT_C);
}
void right_back() //右後退を定義
{
OnFwd(OUT_A); Wait(BACK_TIME);
Off(OUT_A);
}
void back() //後退を定義
{
OnFwd(OUT_AC); Wait(GO_TIME);
Off(OUT_AC);
}
void go_straight() //直進を定義
{
OnRev(OUT_AC); Wait(GO_TIME);
Off(OUT_AC);
}
void go_right() //右折を定義
{
OnRev(OUT_A); Wait(BACK_TIME);
Off(OUT_A);
}
void arm_up() //アームアップを定義
{
OnRev(OUT_B); Wait(UP_TIME);
Off(OUT_B);
}
void arm_down() //アームダウンを定義
{
OnFwd(OUT_B); Wait(2); //最初に勢いをつけて、
Float(OUT_B); Wait(DOWN_TIME); //あとは自重で下ろす。
}
void shita_yose() //下方向への幅寄せを定義
{
turn_right(10); //右旋回
back(); //後退
turn_left(10); //左旋回
}
void ue_yose() //上方向への幅寄せを定義
{
turn_left(10); //左旋回
back(); //後退
turn_right(10); //右旋回
}
task main()
task main() //ここからメインプログラム
{
turn_right(165); //輪郭
repeat(2){ //髪始め
right_back();
left_back();
}
right_back(); //髪終わり
arm_up();
go_right(); //位置調整
shita_yose();
repeat(2){ //目始め
go_straight();
arm_down();
go_straight();
arm_up();
} //目終わり
repeat(2){
ue_yose(); //位置調整
go_straight();
}
turn_left(20);
arm_down();
turn_left(15); //口
arm_up();
back2(8); //位置調整
arm_down();
turn_right(6); //鼻
arm_up();
}
**ひろのプログラム [#l1b03198]
sub pen_up() //ペンを上げる
{
OnRev(OUT_B);
Wait(12);
Off(OUT_B);
}
sub pen_down() //ペンを下げる
{
OnFwd(OUT_B);
Wait(5);
Float(OUT_B);
Wait(100);
}
sub hanten(){ //180度回転
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(90);
Off(OUT_A+OUT_C);
}
sub tyokkaku(){
OnFwd(OUT_A); //90度回転
OnRev(OUT_C);
Wait(45);
Off(OUT_A+OUT_C);
}
sub susumu(){ //前進
OnFwd(OUT_A+OUT_C);
Wait(11);
Off(OUT_A+OUT_C);
}
task main(){
pen_up();
tyokkaku();
pen_down(); //輪郭
hanten();
pen_up(); //輪郭終わり
tyokkaku(); //移動
susumu();
pen_down(); //口
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(12);
Off(OUT_A+OUT_C);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(24);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(12);
Off(OUT_A+OUT_C);
pen_up(); //口終わり
susumu(); //移動
pen_down(); //鼻
susumu();
pen_up(); //鼻終わり
tyokkaku(); //移動
Off(OUT_A+OUT_C);
pen_up();
susumu();
susumu();
pen_down(); //目
susumu();
pen_up(); //目1回
susumu();
pen_down(); //目
susumu();
pen_up();
susumu();
susumu(); //目2回
Off(OUT_A+OUT_C); //完成:-)
}
*実行結果 [#bd650708]
**ぐっPの結果 [#l3d87a73]
&ref(2011b/A2/課題1左/h_nigaoe.jpg,70%,ひろの似顔絵);
円の半径がずれて、輪郭や髪が中途半端になってしまった。口も斜めになってしまったが、これはこれで斜めから見たようにみえるので(たぶん)OKである。
**ひろの結果 [#e26497f4]
&ref(2011b/A2/課題1左/g_nigaoe.jpg,70%,ぐっPの似顔絵);
*反省点 [#d57549ad]
-全体的に移動が速くなってしまっていたので、タイヤの大きさやギア比で調節するべきだった。
-補強の仕方がただ重ねるだけだったのであまり効果がなく、固定部分をブロックで挟むようにしたほうがよかった。
-加えて、余計なパーツを使う羽目になってしまったので、効率よくつかうべきだった。
-授業時間内に完成が間に合わなかったので、間に合うように更に努力すべきだった。
*感想 [#i4fe4676]
-ペンが中心から離れるほど円が書きやすく、四角が描きにくくなり、眼鏡を書けなかった。書く絵を先に考えてからロボットを作るべきだった。ペンをもう1本真ん中につけて、シーソーのように2本のぺんを上げ下げしてかけば、円も四角も書きやすかったはず。先に何をするか明確にイメージする必要性を思い知った。(ひろ)
-反省点にもある通り動作が速かったので、ちょっとしたことでもペンがずれたり、軌道が変わったりして苦労しました。その都度プログラムをいじったり、本体を修正していったけれど、その試行錯誤を繰り返していくうちにだんだんと形になってくれたのでよかったです。相方とも協力できて、なんだかんだで楽しく作れました。次回は作業時間などを考えて計画的に製作したいです。(ぐっP)
最後に、コメントがあれば是非書き込んでいってください。
#comment