- 追加された行はこの色です。
- 削除された行はこの色です。
[[2008b]]
#contents
*課題3:懐中電灯に向かってブロックを投げるロボット [#r9e61532]
**課題内容 [#td63ea4a]
インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。&Br;
(重複しないように一人一つ以上のプログラムを作成すること)
*ロボットの作成 [#u971828f]
**&size(16){ロボット本体について}; [#gb4ca32d]
-モーターひとつで動作する構造
&ref(F1000012.JPG);&br;
-白いホイールを投げる機能
&ref(F1000011.JPG);&br;
&ref(F1000009.JPG);&br;
**&size(16){プログラムについて}; [#i9f5510f]
-基本的な動作
//前進
void go_straight(int t,int w){
OnFwd(OUT_A);
Wait(t);
Off(OUT_A);
Wait(w);
}
//回転
void turn_right(int t,int w){
OnRev(OUT_A);
Wait(t);
Off(OUT_A);
Wait(w);
}
&Br;
-課題を実現するための動作
//白いホイールを投げる
void nage1(){
OnFwd(OUT_B);
Wait(30);
Off(OUT_B);
}
//懐中電灯の光を探す
void SeekLight(int j){
while((SENSOR_3<j)||(SENSOR_1<j)){
turn_right(10,40);
}
}
&Br;
-1.全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。
task main(){
#define THRESHOLD1 40//50cm手前位置判断用定数
#define THRESHOLD2 30//光源方向判断用定数
SetSensor(SENSOR_1,SENSOR_LIGHT);//右側センサー
SetSensor(SENSOR_3,SENSOR_LIGHT);//左側センサー
while(1){
if((SENSOR_3>THRESHOLD2)&&(SENSOR_1>THRESHOLD2)){//光源方向を向いているかを判定
if((SENSOR_3>THRESHOLD1)||(SENSOR_1>THRESHOLD1)){//光源との距離を判定
Off(OUT_A+OUT_B);
SeekLight(THRESHOLD2);
Wait(30);
nage1();
break;
}else{
go_straight(10,30);
}
}else{
SeekLight(THRESHOLD2);
}
}
Off(OUT_A+OUT_B);
}
&Br;
-2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。
task main(){
#define THRESHOLD1 40//50cm手前位置判断用定数
#define THRESHOLD2 30//光源方向判断用定数
//前回の光源情報記憶用変数
int light_right_old;
int light_left_old;
SetSensor(SENSOR_1,SENSOR_LIGHT);//右側センサー
SetSensor(SENSOR_3,SENSOR_LIGHT);//左側センサー
while(1){//光源が動くまで待機
light_right_old=SENSOR_1;
light_left_old=SENSOR_3;
Wait(40);
if(((light_right_old+5<SENSOR_1)||(light_right_old-5>SENSOR_1))
||((light_left_old+5<SENSOR_3)||(light_left_old-5>SENSOR_3))){
break;
}
}
while(1){//光源方向を向く
SeekLight(THRESHOLD2);
light_right_old=SENSOR_1;
light_left_old=SENSOR_3;
Wait(40);
if(((light_right_old+5>SENSOR_1)&&(light_right_old-5<SENSOR_1))
&&((light_left_old+5>SENSOR_3)&&(light_left_old-5<SENSOR_3))){
break;
}
}
while(1){//光源の50cm手前まで移動
if((SENSOR_3>THRESHOLD1)||(SENSOR_1>THRESHOLD1)){
Off(OUT_A+OUT_B);
SeekLight(THRESHOLD2);
Wait(30);
nage1();
break;
}else{
go_straight(10,30);
}
}
Off(OUT_A+OUT_B);
}
*まとめ [#ua067378]
**苦労した点・工夫した点[#hfa33386]
関数を使うことで、わかりやすいプログラムにすることができたと思う。&Br;
*コメント [#rcfab3a8]
何かコメントがありましたらお願いします。&Br;
&Br;
#comment