- 追加された行はこの色です。
- 削除された行はこの色です。
[[2012b/Member]]
*課題1レポートについて [#d896fcae]
*課題1レポート [#d896fcae]
*メンバー [#k5126c5c]
--atchoo:繊維学部所属 凡人である。
--aspect:工学部所属 なんだ、ただの神か。
--ウベック:パイロット AB型、乙女座、パイロット歴25年
**作成したロボットの紹介 [#t4a5c214]
-ロボットの名前
-パイロットの名前
YURIKA号
#ref(2012b/Member/atchoo/Mission1/2012-12-19_18-56-24_533.jpg,35%)
-ロボットの外観:
全体像としてはクレーン車をモチーフにしました。重心はどちらかというと前寄りにありますが安定した走行をすることができます。
-アーム:
このアームを作るにあたって参考となったのは「ゆりかご」です。最初は横から抑え込むものを考えていたのですが、車幅がサイズオーバーだったので諦めました。次に「クワガタの角」をイメージしたアームを作っていたのですがなかなかうまくいかず、球をいかに安定して回収、運搬、シュートをするかを考えたときに最終的に「ゆりかご」になりました。また左右のぶれを解消するためにゆりかごの先端に車輪の一部を搭載しました。球を回収、シュートするときはそれぞれゆりかごの先端と末端にある棒を使います。
#ref(2012b/Member/atchoo/Mission1/2012-12-19_18-54-54_670.jpg,20%)
球を回収するときの写真
#ref(2012b/Member/atchoo/Mission1/2012-12-19_18-55-16_581.jpg,20%)
球を取り込んだときの写真
#ref(2012b/Member/atchoo/Mission1/2012-12-19_20-47-16_445.jpg,20%)
球を打ち出すときの写真
ゆりかごが球を回収する時は巻き込むようにモーターを回転させ、球を打ち出すときは先ほどと逆回転させます。
-プログラムの説明:
今回の課題であるライントレースをするにあたり交差点の判断、直角カーブゆるやかなカーブなどなどと様々な壁が立ちはだかりました。そこで僕らのチームではswitch-case文というプログラムを使用することになりました。switch-case文ではプログラムを複数のパターンに分岐させ、その中から実行したいプログラムを選択して処理できます。このおかげで様々な壁を乗り越えることができました。
#define THRESHOLD 51 // しきい値
#define SPEED_H 50 // 直線用のスピード
#define SPEED_L 40 // カーブのスピード
#define SPEED_S 25 // シュート用のスピード
#define OnRL(speedR,speedL) \
OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define go_forward OnRL(SPEED_H,SPEED_H); // 直進
#define turn_left1 OnRL(SPEED_L,-SPEED_L);// 左旋回
#define turn_left0 OnRL(SPEED_L,0);// 左折
#define turn_right0 OnRL(0,SPEED_L);// 右折
#define turn_right1 OnRL(-SPEED_L,SPEED_L);// 右旋回
#define STEP 1 // 1回の判断で動く時間
#define nMAX1 140 // 通常のカーブとして許容できる繰り返しの最大値
#define nMAX2 150 // ゴールとして判断する繰り返しの最大値
#define xturn 170 //交差点突破の方向修正
#define yturn 200 //シュートの方向修正
#define short_break Off(OUT_BC); Wait(1000); // 小休止
#define CROSS_TIME 200 // 交差点通過にかかる時間
/* 交差点を渡る */
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
#define st1 8000 // 時間の変数1
#define st2 5000 // 時間の変数2
task main()
{
SetSensorLight(S3);
int nOnline = 0; // 続けて黒になった回数 (カウンタ)
long t0 = CurrentTick(); // タイマ
int pattern = 1;
//////////////////////////////////////////
/* 球の回収 */
//////////////////////////////////////////
OnFwd(OUT_BC,SPEED_S);Wait(0); // 若干前進
Off(OUT_BC);Wait(1000); //
OnFwd(OUT_A,SPEED_S);Wait(430); // 球の回収
Off(OUT_A);Wait(1000);
OnFwd(OUT_BC,SPEED_S);Wait(750); // 前進する
Off(OUT_BC);Wait(1000);
t0 = CurrentTick(); // タイマのリセット
while (true) {
switch(pattern){
//////////////////////////////////////////////////////////////////
/* 1:直角・急カーブを曲がるトレースパターン */
/* 2:交差点を直進するトレースパターン */
/* 3:交差点を突破するパターン */
/* 4:ゴールのパターン */
/* 5:シュートするパターン */
//////////////////////////////////////////////////////////////////
case 1:
//////////////////////////////////////////////////////////////////
/* 直角・急カーブを曲がるパターン */
//////////////////////////////////////////////////////////////////
if (CurrentTick() - t0 >= st1) { // パターンの変更の判断
t0 = CurrentTick(); // タイマのリセット
pattern = 2;
break;
}
if (SENSOR_3 < THRESHOLD-10) {
turn_left1;
} else if (SENSOR_3 < THRESHOLD-5) {
turn_left0;
} else if (SENSOR_3 < THRESHOLD+5) {
go_forward;
} else if (SENSOR_3 < THRESHOLD+10) {
turn_right0;
} else {
turn_right1;
}
Wait(STEP);
break;
case 2:
//////////////////////////////////////////////////////////////////
/* 交差点を直進していいパターン */
//////////////////////////////////////////////////////////////////
if (CurrentTick() - t0 >= st2) { //パターン変更の判断
Off(OUT_BC);Wait(1000);
t0 = CurrentTick();
pattern = 4;
break;
}
if(nOnline > nMAX1){ // 交差点判断
Off(OUT_BC);Wait(1000);
pattern = 3;
break;
}
if (SENSOR_3 < THRESHOLD-10) {
turn_left1;
nOnline++; // カウンタを増やす
} else if (SENSOR_3 < THRESHOLD-5) {
turn_left0;
nOnline++; // カウンタを増やす
} else {
if (SENSOR_3 < THRESHOLD+5) {
go_forward;
} else if (SENSOR_3 < THRESHOLD+10) {
turn_right0;
} else {
turn_right1;
}
nOnline=0; // カウンタをリセット
}
Wait(STEP);
break;
case 3:
//////////////////////////////////////////////////////////////////
/* 交差点を突破するパターン */
//////////////////////////////////////////////////////////////////
short_break; // 小休憩
turn_right1; Wait(xturn); // 進行方向修正
Off(OUT_BC);Wait(1000);
cross_line; // 交差点を渡る
nOnline=0; //カウンタをリセット
pattern = 2;
break;
case 4:
//////////////////////////////////////////////////////////////////
/* ゴールするパターン */
//////////////////////////////////////////////////////////////////
if(nOnline > nMAX2){ // ゴール判断
pattern = 5;
break;
}
if (SENSOR_3 < THRESHOLD-10) {
turn_left1;
nOnline++; // カウンタを増やす
} else {
if (SENSOR_3 < THRESHOLD-5) {
turn_left0;
} else if (SENSOR_3 < THRESHOLD+5) {
go_forward;
} else if (SENSOR_3 < THRESHOLD+10) {
turn_right0;
} else {
turn_right1;
}
nOnline=0; // カウンタをリセット
}
Wait(STEP);
break;
case 5:
//////////////////////////////////////////////////////////////////
/* シュートするパターン */
//////////////////////////////////////////////////////////////////
short_break; // 小休憩
turn_right1; Wait(yturn); // 進行方向修正
Off(OUT_BC);Wait(1000);
OnRev(OUT_A,SPEED_H);Wait(360); //シュート
Off(OUT_A);Wait(1000);
pattern = 6;
break;
default:
Off(OUT_ABC);
break;
}
}
}