- 追加された行はこの色です。
- 削除された行はこの色です。
【現在編集中です】
#contents
*目的 [#t6b2d6a8]
黒いラインに沿って動くロボットを作成する。
*手段 [#a42fd4f3]
RC2を使用
**コース [#rc85d36b]
#ref(081120_182510.jpg)
**マシン [#y401a416]
(マシン写真&説明。何枚必要?)
#ref(081209_213121.jpg)
・上から見た全体図
#ref(081204_165653[1].jpg)
・飾りのない全体像
***工夫した点 [#eb7dc61a]
・光センサの読み取り幅を、レゴの凸凹で固定するのではなく、
軸を通すことによって臨機応変に幅を調節できるようにしてある。
#ref(081204_165725[1].jpg)
*↑↓光センサの可動部分
#ref(081204_165725[1].gif)
*プログラム [#hbfb1c42]
・その1
(担当:)
void go_straight(int t){
OnFwd(OUT_A);
OnFwd(OUT_C);
Wait(t);
Off(OUT_A+OUT_C);
Wait(45);
}
void back_straight(int t){
OnRev(OUT_A);
OnRev(OUT_C);
Wait(t);
Off(OUT_A+OUT_C);
Wait(45);
}
void turn_right(int t){
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(t);
Off(OUT_A+OUT_C);
Wait(45);
}
void turn_left(int t){
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(t);
Off(OUT_A+OUT_C);
Wait(45);
}
void turn2(int t){
OnFwd(OUT_C);
Wait(t);
Off(OUT_A+OUT_C);
Wait(45);
}
task main(){
int line_count;
int count_value=0;
int back_flag=0;
int back_time=0;
ClearTimer(0);
ClearTimer(1);
#define THRESHOLD 47
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
OnFwd(OUT_A);
OnFwd(OUT_C);
while(1){
while((SENSOR_1> THRESHOLD)&&(SENSOR_3> THRESHOLD)){
if((Timer(0)>20)&&(back_flag==1)){
OnFwd(OUT_A+OUT_C);
back_flag=0;
back_time=back_time+20;
}
if((SENSOR_2>0)&&(back_flag==0)){
OnRev(OUT_A);
OnRev(OUT_C);
back_flag=1;
ClearTimer(0);
}
if(Timer(1)>(2400+back_time)){
break;
}
}
if(Timer(1)>(2400+back_time)){
break;
}
if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){
line_count=0;
while(line_count==0){
if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){
line_count++;
Wait(20);
count_value++;
}
}
}else{
if(SENSOR_1< THRESHOLD){
Off(OUT_A);
while(SENSOR_1<THRESHOLD){//Left
if(back_flag==0){
OnFwd(OUT_C);
}else{
OnRev(OUT_A);
OnFwd(OUT_C);
}
if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){
break;
}
}
}else{
Off(OUT_C);
while(SENSOR_3<THRESHOLD){//Right
if(back_flag==0){
OnFwd(OUT_A);
}else{
OnRev(OUT_C);
OnFwd(OUT_A);
}
if((SENSOR_1< THRESHOLD)&&(SENSOR_3< THRESHOLD)){
break;
}
}
}
}
}
Off(OUT_A+OUT_C);
}
・その2
(担当:メガネ1)
#define THRESHOLD 47 //閾値
int stop_line;
task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサ
SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサ
SetSensor(SENSOR_2,SENSOR_TOUCH);//タッチセンサ
stop_line = 0;//交差点カウント
while(stop_line < 13) { //交差点通行数12=2周
if ((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD))
{OnFwd(OUT_A+OUT_C);}//両方白→前進
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD))//左が線上→左に回転
{
OnFwd(OUT_C);
OnRev(OUT_A);
}
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD))//右が線上→右に回転
{
OnRev(OUT_C);
OnFwd(OUT_A);
}
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)){//両方が線上→一旦停止
Off(OUT_A+OUT_C);
Wait(300);
OnFwd(OUT_A+OUT_C);Wait(45);
stop_line = stop_line + 1;
}
if(SENSOR_2 == 1){//タッチセンサオン→少し下がって一旦停止
OnRev(OUT_A+OUT_C);
Wait(20);
Off(OUT_A+OUT_C);
Wait(300);
OnFwd(OUT_A+OUT_C);Wait(30);
stop_line = stop_line + 1;
}
}
Off(OUT_A+OUT_B+OUT_C);//二周回って終了
}
*結果 [#dfa17b1b]
(動画がいけそうなら動画ペタリ)
・残念ながらここに動画は張り付けられないが、きちんと作動することが確認できた。
*考察/感想 [#xe36f72a]
・最初に書いたプログラムが全く動かなかったため、最初から打ち直さなくてはならずやや焦った。
(行っての感想/考察)
・結果的にそれなりに満足な動きと見た目になったため、よかったと思う。
- whileを使ってもよかったと思います<二週回って終了のライン -- [[なかむら]] &new{2008-12-11 (木) 13:55:27};
#comment
一応書くべきことはきちんとかけています。全体的にもう少し詳しく書きましょう。~
例えば、ライントレースの原理を図で説明したり、プログラムにはどのような選択肢があって、どうしてそれを選んだのか等。 FI