*似顔絵ロボットの製作 [#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]