- 追加された行はこの色です。
- 削除された行はこの色です。
*似顔絵ロボットの製作 [#h33faf51]
目次
#contents
*課題内容 [#ga23cf62]
A4の用紙に、相方の似顔絵を描くロボットを製作する。
細かなルールは以下の通りである。
-用紙をテープなどで固定してはいけない。
-1人につき1つ以上のプログラムを制作すること。
-ペン以外の部品は、キットに含まれる物を使用すること。
-キットに付属の高価な輪ゴムは切れやすいので、扱う際は十分注意すること。
-改良や調整をしやすくするため、ロボット本体だけでなく、プログラムについても可能な部分についてはサブルーチンや関数、マクロなどを使って部品に分けること。
*メンバー [#aa01cd0c]
-ぐっP:工学部 電気電子工学科 ロボットもプログラムも久しぶり
-ひろ:
*ロボット紹介 [#e373491f]
**全体像 [#ffe0da88]
全体はこんな感じです。ペンの上げ下げにアームを用いた「アーム型」ロボットです。
**アーム [#e9724257]
両側からペンを挟み込むようにして固定します。
&ref(2011b/A2/課題1左/arm.jpg,80%,アーム); &ref(2011b/A2/課題1左/gear.jpg,80%,ギア);
両側からペンを挟み込むようにして固定します。ギアは、上下速度を遅くするために段分けして調整しました。
また、ペンを自重でおろすため、アームの先に気休め程度のおもりとしてブロックをつけています。
**キャスター [#g251b922]
-第一弾
ガイドブック46ページのキャスターを参考に製作。
問題点:走行中に用紙に引っかかり、用紙がずれてしまう。
-第二弾
用紙に引っかからないように、キャスターを本体の内側に設置することに。取り付け場所が狭いため、摩擦の少なそうな部品で代用。
問題点:それでも摩擦が生じ、用紙が曲がってしまう。
-第三弾
ならばいっそのこと、キャスターを用紙の外に出してしまおう!ということで製作。
問題点:動作の際に、非常にスペースをとる。しかし、スペースさえ確保できれば今までで一番描きやすい。
*予定図面 [#s90c82c1]
**ぐっP作「ひろの顔」 [#v39bdb58]
+輪郭を円で描く
+交互にバックして、髪を表現
+位置調整(1)
+目は直線で
+位置調整(2)
+回転を利用し、口を引く
+位置調整(3)
+鼻を描いてフィニッシュ
**ひろ作「ぐっPの顔」 [#keeaf015]
*プログラム [#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); 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() //ここからメインプログラム
{
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]
*実行結果 [#bd650708]
*感想 [#i4fe4676]