- 追加された行はこの色です。
- 削除された行はこの色です。
[[2014a/Member]]
目次
#contents
* 課題の説明 [#mffb653f]
詳しい説明は[[2014a/Mission1]]を参照
写真の入れかた例え:&ref(2014a/Member/mame/Mission1/sample2-small.jpg.30%);
* メンバー [#j0ee8e63]
mame
dai
* ロボット本体 [#g0b2bc6e]
** ライトセンサー [#jf97ef47]
** ドライブベース [#ta82ecff]
** アーム [#qa948bf2]
* 課題 [#ff560aa8]
* プログラム [#w9871f04]
** プログラムの概要 [#v140454d]
#define SPEED_HIGH 40
#define SPEED_MEDIUM 30
#define SPEED_LOW 25
#define SPEED_ZERO 0
#define THRESHOLD 37 //しきい値
#define THRESHOLD 37 //しきい値
#define SPEED_H 25 //最も早い速度
#define SPEED_L 20 //最も遅い速度
#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/1000秒)
#define nMAX 300 //通常のカーブとして許容できる繰り返しの最大値
#define short_break Off(OUT_BC); Wait(1000); //小休止
#define CROSS_TIME 100 //交差点通過にかかる時間
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; //交差点を渡る
#define TURN_COUNT_MAX 300
#define GO_COUNT_MAX 150
#define Catch OnFwd(OUT_A,70);Wait(700);Off(OUT_A);
#define shoot OnRev(OUT_B,100);Wait(1000);Off(OUT_B);
#define Catch OnFwd(OUT_B,70);Wait(700);Off(OUT_B);
#define go_forward OnFwd(OUT_AC,50);
task main()
{
SetSensorLight(S1); //光センサーをセット
SetSensorLowspeed(S4); //超音波センサーをセット
int nOnline=0; //黒い線になった回数
int nCrossline=0; //交差点を渡った回数
void On(int leftSpeed, int rightSpeed){
if(leftSpeed > 0){
OnFwd(OUT_C, leftSpeed);
}else{
OnRev(OUT_C, -leftSpeed);
while (true) {
go_Fwd(OUT_BC); //黒線になるまで前進
until(SENSOR_1 = 1);
while (nOnline < nMAX) { //黒の認識が最大値より小さい間
if(SensorUS(S4) <= 8) { //8cm以内に障害物があった場合下記2行を実行する
OnFwd(OUT_A,70);Wait(500);Off(OUT_A); //
Wait(2000); //アームを前方向に2秒回転(ボールをつかむ)
}
if(rightSpeed > 0){
OnFwd(OUT_A, rightSpeed);
}else{
OnRev(OUT_A, -rightSpeed);
if(nCrossline >= 5) { //交差点を5回通過した場合
OnRev(OUT_A,100);Wait(1000);Off(OUT_A);
break; //アームを後方向に1秒回転(ボールを放つ)
}
}
void GoForward(){
On(SPEED_HIGH, SPEED_HIGH);
}
void GoLeft(){
On(SPEED_ZERO, SPEED_MEDIUM);
}
void GoRight(){
On(SPEED_MEDIUM, SPEED_ZERO);
}
void TurnLeft(){
On(-SPEED_LOW, SPEED_LOW);
}
void TurnRight(){
On(SPEED_LOW, -SPEED_LOW);
}
void Back(){
On(-SPEED_HIGH, -SPEED_HIGH);
}
void BackLeft(){
On(SPEED_ZERO, -SPEED_MEDIUM);
}
void BackRight(){
On(-SPEED_MEDIUM, SPEED_ZERO);
}
bool Light(){
if(SENSOR_1 < 28){
return 0;
}else if(SENSOR_1 < 35){
return 1;
}else if(SENSOR_1 < 40){
return 2;
}else if(SENSOR_1 < 45){
return 3;
}else{
return 4;
}
}
task main()
{
{SetSensorLowspeed(S4);
go_forward;
if(SensorUS(S4) <=8) { Catch;Off(OUT_BC); }
if (SENSOR_1 < THRESHOLD -11) { //白の場合
turn_left1; //左に旋回
nCrossline++; //交差点を渡る回数を増やす
} else {
if (SENSOR_1 < THRESHOLD-5) { //やや白の場合
turn_left0; //左に曲がる
} else if (SENSOR_1 < THRESHOLD+5) { //やや黒の場合
go_forward; //直進
} else if (SENSOR_1 < THRESHOLD +11) { //黒の場合
turn_right0; //右に曲がる
} else {
turn_right1; //右に旋回
}
nOnline=0; //カウントをリセットする
}
Wait(STEP); //(1/1000秒待機)
}
short_break; //小休止
turn_right1; Wait(nMAX*STEP); //進行方向修正
cross_line; //交差点を渡る
nOnline=0; //カウントをリセットする
}
}
{ int turnCount = 0;
int goCount = 0;
int nCorner = 0;
SetSensorLight(S1);
while(true){
Wait(1);
switch(Light()){
case 0:
TurnLeft();
if(turnCount < 0 || goCount < 0){
turnCount = 0;
goCount = 0;
}
turnCount++;
break;
case 1:
GoLeft();
if(turnCount < 0 || goCount < 0){
turnCount = 0;
goCount = 0;
}
goCount++;
break;
case 2:
GoForward();
break;
case 3:
GoRight();
if(turnCount > 0 || goCount > 0){
turnCount = 0;
goCount = 0;
}
goCount++;
break;
case 4:
TurnRight();
if(turnCount > 0 || goCount > 0){
turnCount = 0;
goCount = 0;
}
turnCount++;
break;
break;
}
if(turnCount > TURN_COUNT_MAX && goCount < GO_COUNT_MAX){
PlayTone(440, 100);
switch(nCorner++){
case 0:
case 1:
case 3:
TurnRight();
Wait(turnCount * 3);
Off(OUT_AC);
Wait(100);
GoForward();
Wait(100);
break;
case 4:OnRev(OUT_A,100);Wait(1000);Off(OUT_B);
}
turnCount = 0;
goCount = 0;
}
}
}
}
** ライントレースのプログラム [#r829ca55]
** ボールをつかむプログラム [#gad1054c]
** ボールを放つ(シュートする)プログラム [#vc7dbfbf]
task main()
{
OnFwd(OUT_BC);
}
** 反省と感想 [#a4021e1b]
難しかった。しきい値が安定しなかった。