- 追加された行はこの色です。
- 削除された行はこの色です。
[[2016a/Member]]
・目次
#contents
*課題 [#ubab1e3f]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
*コース図 [#id45d691]
http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission2 (参照)
*ミッション [#oc3264ca]
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。
•A地点からB地点へ (一人目) ◦A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点
•B地点からC地点へ (二人目) ◦B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点
•C地点からA地点へ (三人目) ◦C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点
私は、B地点からC地点のルートを担当した。
*メンバー [#qb973488]
tom・funatsu・tatsuya
*ロボットの説明 [#j547dadf]
私達は、NXTと言う種類のロボットを使用した。
#ref(2016a/Member/tom/Mission2/IMG_2677.JPG)
#ref(2016a/Member/tom/Mission2/IMG_2679.JPG)
<センサー部分>
#ref(2016a/Member/tom/Mission2/IMG_2678.JPG)
*プログラム [#k22b8b3f]
・定義
#define BLACK 43
#define WHITE 54
#define SPEED1 19
#define go_forward OnFwd(OUT_BC,SPEED1);
#define turn_left(t,w1,w2) OnFwd(OUT_B,w1); OnRev(OUT_C,w2); Wait(t);Off(OUT_BC);
#define turn_left1 OnFwd(OUT_B,SPEED1);Off(OUT_C);
#define turn_left2 OnFwd(OUT_B,SPEED1);OnRev(OUT_C,SPEED1);
#define turn_right(t,w1,w2) OnFwd(OUT_C,w1); OnRev(OUT_A,w2); Wait(t);Off(OUT_BC);
#define turn_right1 Off(OUT_B);OnFwd(OUT_C,SPEED1);
define turn_right2 OnRev(OUT_B,SPEED1);OnFwd(OUT_C,SPEED1);
#define STEP 1
#define turn_right2 OnRev(OUT_B,SPEED1);OnFwd(OUT_C,SPEED1);
#define short_break Off(OUT_BC);Wait(1000);PlaySound(SOUND_UP);
#define cross_line go_forward;Wait(200);Off(OUT_BC);Wait(1000);
#define nMAX 350
今回はこの定義を使った。
・サブルーチン
void line_trace()//ラインに沿って走り交差点で止まる
void line_trace()//黒い線上に沿って走る
{
SetSensorLight(S1);
int nOnline=0;
while (nOnline < nMAX ) {
if (SENSOR_1 < BLACK-5) {
turn_right2;
nOnline++;
} else {
if (SENSOR_1 < BLACK) {
turn_right1;
} else if (SENSOR_1 < WHITE) {
go_forward;
} else if (SENSOR_1 < WHITE+5) {
turn_left1;
} else {
turn_left2;
}
nOnline=0;
}
Wait(STEP);
}
short_break;
nOnline=0;
Off(OUT_BC);
}
void line_closs()
void line_closs()//機体の向きを調整する
{
cross_line;
SetSensorLight(S1);
do{
if (SENSOR_1 < BLACK) {
turn_right1;
} else if (SENSOR_1 > WHITE) {
turn_left2;
}
}
while((SENSOR_1 > BLACK)&&(SENSOR_1 < WHITE));
Off(OUT_BC);
}
void line_right()
void line_right()//交差点で右に曲がる
{
cross_line;
turn_right(1000,40,40);
SetSensorLight(S1);
do{
if (SENSOR_1 < BLACK) {
turn_right1;
} else if (SENSOR_1 > WHITE) {
turn_left2;
}
}
while((SENSOR_1 > BLACK)&&(SENSOR_1 < WHITE));
Off(OUT_BC);
}
void line_left()
void line_left()交差点で左に曲がる
{
cross_line;
turn_left(1000,40,40)
SetSensorLight(S1);
do{
if (SENSOR_1 < BLACK) {
turn_right1;
} else if (SENSOR_1 > WHITE) {
turn_left2;
}
}
while((SENSOR_1 > BLACK)&&(SENSOR_1 < WHITE));
Off(OUT_BC);
}
void last_move()
void last_move()C地点にゴールする
{
go_forward;
Wait(1500);
Off(OUT_BC);
}
・メインプログラム
task main()
{
line_trace();
line_right();
line_trace();
line_closs();
line_trace();
line_closs();
line_trace();
line_right();
line_trace();
line_right();
line_trace();
last_move();
}
*反省点 [#o8744fcd]
スタートからゴールするまで4分3秒と時間がかかった。
ゴール地点と認識しないことが多かった。
*感想 [#m3902dd1]
電池の残量によってモーターの出力が変わってしまうことが多々あった。
その度に、プログラムを変更し、調整するのには苦労した。
今度は、センサーによるコース認識の感度を上げ、より確実なものにしたい。