- 追加された行はこの色です。
- 削除された行はこの色です。
[[2016a/Member]]
目次
#contents
*はじめに [#d334d1be]
*ロボットの説明 [#h8462d72]
*ロボットのプログラム・動作の説明 [#j8a31f73]
**プログラム [#x56c7df4]
#define THRESHOLD 42
#define gofw OnFwd(OUT_AC);Wait(5);
#define turn_left Off(OUT_A); OnFwd(OUT_C);
#define senkai_left OnFwd(OUT_C);OnRev(OUT_A);Wait(50);
#define turn_right OnFwd(OUT_A); Off(OUT_C);
#define senkai_right OnFwd(OUT_A);OnRev(OUT_C);Wait(80);
#define STEP 1
#define RUN_TIME 200
void line_follow(int t)
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
ClearTimer(0);
while (Timer(0)<t) {
if (SENSOR_2 < THRESHOLD){
turn_left;
} else {
turn_right;
}
Wait(STEP);
}Off(OUT_AC);
}
sub crossing_fwd()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int n=0;
while(n<15){
if (SENSOR_2 < THRESHOLD){
turn_left;n++;
} else {
turn_right;n=0;
}
Wait(STEP);
}Off(OUT_AC);Wait(100);gofw;
}
sub crossing_stop()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int n=0;
while(n<15){
if (SENSOR_2 < THRESHOLD){
turn_left;n++;
} else {
turn_right;n=0;
}
Wait(STEP);
}Off(OUT_AC);Wait(100);
}
sub crossing_right()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int n=0;
while(n<15){
if (SENSOR_2 < THRESHOLD){
turn_left;n++;
} else {
turn_right;n=0;
}
Wait(STEP);
}Off(OUT_AC);Wait(100);senkai_right;OnFwd(OUT_AC);Wait(60);
}
sub crossing_left()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int n=0;
while(n<15){
if (SENSOR_2 < THRESHOLD){
turn_left;n++;
} else {
turn_right;n=0;
}
Wait(STEP);
}Off(OUT_AC);Wait(100);senkai_left;
}
task main()
{
crossing_left();
crossing_left();
line_follow(50);
crossing_fwd();
line_follow(90);
crossing_fwd();
line_follow(105);
crossing_right();
crossing_left();
line_follow(100);
crossing_stop();
senkai_right;Wait(5);OnFwd(OUT_AC);Wait(80);Off(OUT_AC);
}
**動作 [#ab120a4e]
***定義 [#b2a29a95]
#define THRESHOLD 42 //閾値
#define gofw OnFwd(OUT_AC);Wait(5); //0.05秒直進
#define turn_left Off(OUT_A); OnFwd(OUT_C); //左折
#define senkai_left OnFwd(OUT_C);OnRev(OUT_A);Wait(50); //0.5秒旋回左折
#define turn_right OnFwd(OUT_A); Off(OUT_C); //右折
#define senkai_right OnFwd(OUT_A);OnRev(OUT_C);Wait(80); //0.8秒旋回右折
#define STEP 1 //1回の判断で動く時間
ラインの左を沿うプログラムなので旋回左折より旋回右折のほうが時間を長くした。
#ref()
***ライントレース [#u41b6e4e]
今回は、ラインの左を沿うプログラムにした。光センサーが閾値42より小さい時、すなわちライン上の時左折、閾値42以上の時、すなわちライン外の時右折する。これを元にサブルーチンを作った。
***サブルーチン [#raa18d31]
void line_follow(int t)
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
ClearTimer(0);
while (Timer(0)<t) {
if (SENSOR_2 < THRESHOLD){
turn_left;
} else {
turn_right;
}
Wait(STEP);
}Off(OUT_AC);
}
t秒間ライントレースするプログラム。
*結果 [#scfe4d8e]
*反省・感想 [#j29d14b9]