2016b/Member/Megukyo/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2016b/Member]]
*目次 [#p78c52c6]
#contents
*課題概要 [#lac1e0b9]
#ref(2016b/Mission3/2016b-mission3.png,50%,コース)
ピッチャーロボットはAを出てM内に入る。バッターロボットはC...
*ピッチャーロボットについて [#q2e08f0b]
**車体 [#u9079446]
#ref(2016b/Member/Megukyo/Mission3/pittyarzentai.jpg,50%,...
車体はこのようになっており、塔のような部分にボールを搭載...
#ref(2016b/Member/Megukyo/Mission3/pittyarsensar.jpg,50%,...
センサーは光、超音波センサを使用、車体フレームの外側に付...
#ref(2016b/Member/Megukyo/Mission3/pittyarkikousaibu.jpg,...
前方
#ref(2016b/Member/Megukyo/Mission3/utidasikukou.jpg,50%,...
後方~
打ち出し機構部分は一個のモーターで駆動しており、前方の打...
#ref(2016b/Member/Megukyo/Mission3/utidaksikikou.jpg,50%,...
横から見るとこのようになっている。
**プログラム[#sd1c2f32]
プログラムは、大まかには、まずピッチャーロボットがMまで到...
#define moter_conect_move OUT_AB //駆動輪モ...
#define moter_conect_option OUT_C //駆動輪以...
#define moter_conect_move_L OUT_A //左駆動輪...
#define moter_conect_move_R OUT_B //右駆動輪...
#define SPEED 55 //通常モー...
#define SPEED_FAST 60 //通常モー...
#define SPEED_SLOW 40 //通常モー...
#define SPEED_line_trace 30 //ライント...
#define SPEED_FAST_line_trace 40 //ライント...
#define SPEED_SLOW_line_trace 30 //ライント...
#define THRESHOLD 40 //白と黒の...
const float diameter = 5.45; //タイヤの...
const float track = 11.38; //タイヤの...
const float pi=3.1415; //円周率
//関数エリア
void stop_move() //すべての...
{
Off(OUT_ABC);
Wait(1);
}
void fwdDist(float d) //距離 d cm...
{
stop_move(); //モーター...
float angle = d/(pi*diameter)*360.0; //前進に必要な...
RotateMotorEx(moter_conect_move, SPEED_SLOW, angle, 0...
}
void turnAng_L(float ang) //左に ang...
{
stop_move(); //モーター...
float angle = track/diameter * ang; //左回転に...
RotateMotorEx(moter_conect_move, SPEED_SLOW, angle, 1...
}
void turnAng_R(float ang) //右に an...
{
stop_move(); //モーター...
float angle = track/diameter * ang; //右回転に...
RotateMotorEx(moter_conect_move, SPEED_SLOW, angle, -...
}
int searchDirection(long ang) //一番近い...
{
stop_move(); //モーター...
long tacho_min ;
int d_min = 300 ;
long angle = (track/diameter)*ang;
turnAng_L(ang/2);
ResetTachoCount(moter_conect_move);
OnFwdSync(moter_conect_move,SPEED_SLOW,-100);
while(MotorTachoCount(moter_conect_move_L)<=angle)
{
int US_average = SensorUS(S4) ; //3回ほど超...
US_average = US_average+SensorUS(S4); //
US_average = US_average+SensorUS(S4); //
US_average = US_average / 3 ; //
if (US_average<d_min)
{
d_min = SensorUS(S4);
tacho_min = MotorTachoCount(moter_conect_move...
}
}
OnFwdSyncEx(moter_conect_move,SPEED_SLOW,100,RESET_NO...
until(MotorTachoCount(moter_conect_move_L)<=tacho_min...
Wait(360);
Off(moter_conect_move);Wait(500);
return d_min;
}
void line_trace(int sensor_light_lv) //ライント...
{
if (sensor_light_lv < THRESHOLD-8)
{
OnFwd(moter_conect_move_R,SPEED_FAST_line_trace);
OnFwd(moter_conect_move_L,-SPEED_FAST_line_trace);
}
else if (sensor_light_lv < THRESHOLD-5)
{
OnFwd(moter_conect_move_L,SPEED_SLOW_line_trace);
}
else if (sensor_light_lv < THRESHOLD +5)
{
OnFwdSync(moter_conect_move,SPEED_line_trace,0);
}
else if (sensor_light_lv < THRESHOLD+8)
{
OnFwd(moter_conect_move_R,SPEED_SLOW_line_trace);
}
else
{
OnFwd(moter_conect_move_L,SPEED_FAST_line_trace);
OnFwd(moter_conect_move_R,-SPEED_FAST_line_trace);
}
}
long intersection_judgment(long t0,int threshold)//Senso...
{
if (SENSOR_1 > threshold) //現在...
{
t0 = CurrentTick(); //現在...
}
return t0 ; //t0の...
}
//関数(task_mainで呼び出す)エリア
void set_sensor_all()
{
SetSensorLight(S1); // ライ...
SetSensorLowspeed(S4); //超音...
}
void firing_ball() //ボー...
{
stop_move(); //モー...
RotateMotor(moter_conect_option,85,537); //optio...
}
void line_tracing_in_seconds(float seconds) //secon...
{
stop_move();
long t0 =CurrentTick();
float temp=1000*seconds; //while...
while(CurrentTick()-t0 < temp) //temp...
{
line_trace(SENSOR_1); //ライ...
}
}
void line_trace_and_intersection_judgment(int threshold,...
{
stop_move(); //モー...
long t0 = CurrentTick(); //現在...
while(CurrentTick()-t0 < judgment_time) //judgm...
{
line_trace(SENSOR_1); //ライ...
t0=intersection_judgment(t0,threshold); //現在...
}
stop_move(); //モー...
Wait(1000); //交差...
PlaySound(SOUND_UP); //交差...
}
void move_A_to_inside_of_M() //スタ...
{
fwdDist(5.0); //5cm前進
line_tracing_in_seconds(1.2); //1.2秒...
turnAng_R(70.0); //右に7...
fwdDist(30.0); //30cm...
line_tracing_in_seconds(6.0); //6秒間...
line_trace_and_intersection_judgment(31,100); //交差...
line_tracing_in_seconds(7.2); //7.2秒...
turnAng_R(90.0); //右に9...
fwdDist(13.0); //13cm...
}
void mukiawase() //ロボ...
{
turnAng_L(10.0); //弁当...
int a =searchDirection(60); //一番...
turnAng_R(3.0); //バッ...
}
void send_action_finish() //バッ...
{
SendRemoteNumber(0,MAILBOX1,1);
}
int receive_action_signal() //バッ...
{
int temp = 0; //メッ...
while(temp==0) //メッ...
{
ReceiveRemoteNumber(MAILBOX2,true,temp); //メッ...
}
PlaySound(SOUND_UP); //メッ...
return temp; //受け...
}
//taskエリア
task main()
{
set_sensor_all(); //セン...
int action_number=0; //命令...
while(true)
{
action_number = receive_action_signal();//命令...
if (action_number == 1) //命令...
{
move_A_to_inside_of_M(); //ピッ...
action_number = 0; //命令...
}
else if (action_number == 2) //命令...
{
mukiawase(); //ロボ...
action_number = 0; //命令...
}
else if (action_number == 3) //命令...
{
firing_ball(); //ボー...
action_number = 0; //命令...
}
send_action_finish(); //動作...
PlaySound(SOUND_UP); //動作...
}
}
*バッターロボットについて [#ud4e2ee7]
**車体 [#aea2177c]
#ref(2016b/Member/Megukyo/Mission3/battarzentai2.jpg,50%,...
#ref(2016b/Member/Megukyo/Mission3/battarzentai.jpg,50%,...
バッターロボットは基本的なライントレースマシンのフレーム...
また、バッターロボットは普段の教室では起きなかった現象だ...
#ref(2016b/Member/Megukyo/Mission3/battarzentai3.jpg,50%,...
センサーはアーム付け根上部に超音波センサ、前方下部に光セ...
#ref(2016b/Member/Megukyo/Mission3/armzoom2.jpg,50%,車体)
初期位置
#ref(2016b/Member/Megukyo/Mission3/armzoom3.jpg,50%,車体)
超音波センサ使用時~
アームの先端はこのように遊動式となっており、球の衝撃を多...
#ref(2016b/Member/Megukyo/Mission3/armzoom.jpg,50%,車体)
球をキャッチする待機位置~
このロボットがボールを打つ一連の動作はまず、遊動式になっ...
#ref(2016b/Member/Megukyo/Mission3/armzoom4.jpg,50%,車体)
アームのみで撮影
**プログラム [#y8320fae]
プログラムは、大まかには、(まずピッチャーロボットがMまで...
#define moter_conect_move OUT_BC //駆動輪モーターの接...
#define moter_conect_option OUT_A //ハンドルのモーター...
#define moter_conect_move_L OUT_B //左駆動輪モーターの...
#define moter_conect_move_R OUT_C //右駆動輪モーターの...
#define SPEED 45 //通常モーター速度
#define SPEED_FAST 60 //通常モーター速度(...
#define SPEED_SLOW 40 //通常モーター速度(...
#define SPEED_line_trace 30 //ライントレース時の...
#define SPEED_FAST_line_trace 40
#define SPEED_SLOW_line_trace 30
#define THRESHOLD 44 //白と黒の中間の反射率
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 15; //タイヤのトレッド幅...
const float pi=3.1415; //円周率
/****************** ここから, 長谷部くんのコードを引用し...
//すべての出力モーターの停止
void stop_move()
{
Off(OUT_ABC); Wait(1);
}
//左に ang (°) 回転
void turnAng_L(float ang)
{
stop_move();
//左回転に必要な角度の計算
float angle = track / diameter * ang;
//計算した角度動かす
RotateMotorEx(moter_conect_move, SPEED_SLOW, angle, ...
}
//ライントレース
void line_trace(int sensor_light_lv)
{
if (sensor_light_lv < THRESHOLD - 8)
{
OnFwd(moter_conect_move_R, SPEED_FAST_line_trac...
OnFwd(moter_conect_move_L, -SPEED_FAST_line_trac...
}
else if (sensor_light_lv < THRESHOLD - 5)
{
OnFwd(moter_conect_move_L, SPEED_SLOW_line_trace);
}
else if (sensor_light_lv < THRESHOLD + 5)
{
OnFwdSync(moter_conect_move, SPEED_line_trace,0);
}
else if (sensor_light_lv < THRESHOLD + 8)
{
OnFwd(moter_conect_move_R, SPEED_SLOW_line_trace);
}
else
{
OnFwd(moter_conect_move_L, SPEED_FAST_line_trac...
OnFwd(moter_conect_move_R, -SPEED_FAST_line_trac...
}
}
//Sensorの値がThreshold(任意の反射率)以上のとき, 引数に...
//それ以外は変更せず引数を返す
long intersection_judgment(long t0, int threshold)
{
if (SENSOR_4 > threshold)
{
t0 = CurrentTick();
}
return t0;
}
//seconds(秒)間、ライントレースをする
void line_tracing_in_seconds(float seconds)
{
stop_move();
long t0 =CurrentTick();
float temp = 1000 * seconds;
while(CurrentTick() - t0 < temp)
{
line_trace(SENSOR_4);
}
}
//交差点を判断(Thresholdの値で判断)するまで、ライントレ...
void line_trace_and_intersection_judgment(int threshold,...
{
stop_move();
long t0 = CurrentTick();
while(CurrentTick()-t0 < judgment_time)
{
line_trace(SENSOR_4);
t0=intersection_judgment(t0,threshold);
}
stop_move(); Wait(1000);
PlaySound(SOUND_UP);
}
/****************** ここまで, 長谷部くんのコードを引用し...
//ピッチャーが移動中, 位置合わせ中の時に使用する. ピッチ...
//を返すまで次の行動に移らない.
sub waitpartner()
{
int msg = 0;
while(msg == 0)
{
ReceiveRemoteNumber(MAILBOX1, true, msg);
}
}
//バッター側のNXTが位置合わせを行わないほうがうまくいく...
//わせを行わない. (コメントアウト)
int searchDirection(long ang)
{
long tacho_min;
int d_min = 300;
/*long angle = (track / diameter) * ang;
turnAng_L(ang / 2);
ResetTachoCount(OUT_BC);
OnFwdSync(OUT_BC, SPEED, -100);
while(MotorTachoCount(OUT_B) <= angle)
{
if (SensorUS(S1) < d_min)
{
d_min = SensorUS(S1);
tacho_min = MotorTachoCount(OUT_B);
}
}
OnFwdSyncEx(OUT_BC, SPEED, 100, RESET_NONE);
until(MotorTachoCount(OUT_B) <= tacho_min || SensorU...
Wait(150); */
Off(OUT_BC); Wait(500);
return d_min;
}
sub ajustRobot()
{
int tmp = searchDirection(40); Wait(500);
}
//そのままではボールを打つハンドルが下がってきてしまうの...
//させて, 固定する
sub handlehold()
{
OnFwd(OUT_A, 10);
}
sub ball_catch()
{
//ボール発車前に毎回位置合わせをする場合, コメントを...
//ajustRobot(); SendRemoteNumber(1, MAILBOX2, 2); wa...
//ボール発射の司令
SendRemoteNumber(1, MAILBOX2, 3);
handlehold(); Wait(1550);
RotateMotor(OUT_A, 50, -50); OnRev(OUT_A, 50); Wait(...
}
sub ball_hit(int drctn)
{
if (drctn == 40) //4点(右)
{
RotateMotor(OUT_B, SPEED, 210); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, -190); Wait(500);
}
else if (drctn == 41) //4点(左)
{
RotateMotor(OUT_B, SPEED, -240); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, 250); Wait(500);
}
else if (drctn == 60) //6点(右)
{
RotateMotor(OUT_B, SPEED, 100); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, -100); Wait(500);
}
else if (drctn == 61) //6点(左)
{
RotateMotor(OUT_B, SPEED, -190); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, 190); Wait(500);
}
else if (drctn == 10) //10点
{
RotateMotor(OUT_B, SPEED, -100); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, 100); Wait(500);
}
else if (drctn == 00) //4点(右)
{
RotateMotor(OUT_B, SPEED, 30); Wait(500);
}
}
//スタート地点から規定の位置まで進む
sub start1()
{
RotateMotor(OUT_BC, SPEED, 40);
RotateMotor(OUT_C , SPEED, 355);
RotateMotor(OUT_BC, SPEED, 900);
//3秒間無条件でライントレース(丁字路判別を行わない)
line_tracing_in_seconds(3);
//ライントレース, 丁字路判別
line_trace_and_intersection_judgment(33,90);
RotateMotor(OUT_BC, SPEED, 300);
RotateMotor(OUT_B , SPEED, -100);
PlaySound(SOUND_LOW_BEEP);
}
task main()
{
SetSensorLowspeed(S1);
SetSensorLight(S4);
handlehold();
start1();
SendRemoteNumber(1, MAILBOX2, 1); waitpartner();
ajustRobot(); SendRemoteNumber(1, MAILBOX2, 2); Wait...
waitpartner(); handlehold();
//4点(右)を狙う
ball_catch(); ball_hit(40);
//4点(左)を狙う
ball_catch(); ball_hit(41);
//6点(左)を狙う
ball_catch(); ball_hit(60);
//6点(左)を狙う
ball_catch(); ball_hit(61);
//6点(左)を狙う
ball_catch(); ball_hit(61);
}
*結果・まとめ [#d201919e]
テスト段階では比較的うまくいっていたが、本番ではピッチャ...
*感想 [#p89490b7]
このロボティクス入門ゼミを通して今まで全く触れてこなかっ...
終了行:
[[2016b/Member]]
*目次 [#p78c52c6]
#contents
*課題概要 [#lac1e0b9]
#ref(2016b/Mission3/2016b-mission3.png,50%,コース)
ピッチャーロボットはAを出てM内に入る。バッターロボットはC...
*ピッチャーロボットについて [#q2e08f0b]
**車体 [#u9079446]
#ref(2016b/Member/Megukyo/Mission3/pittyarzentai.jpg,50%,...
車体はこのようになっており、塔のような部分にボールを搭載...
#ref(2016b/Member/Megukyo/Mission3/pittyarsensar.jpg,50%,...
センサーは光、超音波センサを使用、車体フレームの外側に付...
#ref(2016b/Member/Megukyo/Mission3/pittyarkikousaibu.jpg,...
前方
#ref(2016b/Member/Megukyo/Mission3/utidasikukou.jpg,50%,...
後方~
打ち出し機構部分は一個のモーターで駆動しており、前方の打...
#ref(2016b/Member/Megukyo/Mission3/utidaksikikou.jpg,50%,...
横から見るとこのようになっている。
**プログラム[#sd1c2f32]
プログラムは、大まかには、まずピッチャーロボットがMまで到...
#define moter_conect_move OUT_AB //駆動輪モ...
#define moter_conect_option OUT_C //駆動輪以...
#define moter_conect_move_L OUT_A //左駆動輪...
#define moter_conect_move_R OUT_B //右駆動輪...
#define SPEED 55 //通常モー...
#define SPEED_FAST 60 //通常モー...
#define SPEED_SLOW 40 //通常モー...
#define SPEED_line_trace 30 //ライント...
#define SPEED_FAST_line_trace 40 //ライント...
#define SPEED_SLOW_line_trace 30 //ライント...
#define THRESHOLD 40 //白と黒の...
const float diameter = 5.45; //タイヤの...
const float track = 11.38; //タイヤの...
const float pi=3.1415; //円周率
//関数エリア
void stop_move() //すべての...
{
Off(OUT_ABC);
Wait(1);
}
void fwdDist(float d) //距離 d cm...
{
stop_move(); //モーター...
float angle = d/(pi*diameter)*360.0; //前進に必要な...
RotateMotorEx(moter_conect_move, SPEED_SLOW, angle, 0...
}
void turnAng_L(float ang) //左に ang...
{
stop_move(); //モーター...
float angle = track/diameter * ang; //左回転に...
RotateMotorEx(moter_conect_move, SPEED_SLOW, angle, 1...
}
void turnAng_R(float ang) //右に an...
{
stop_move(); //モーター...
float angle = track/diameter * ang; //右回転に...
RotateMotorEx(moter_conect_move, SPEED_SLOW, angle, -...
}
int searchDirection(long ang) //一番近い...
{
stop_move(); //モーター...
long tacho_min ;
int d_min = 300 ;
long angle = (track/diameter)*ang;
turnAng_L(ang/2);
ResetTachoCount(moter_conect_move);
OnFwdSync(moter_conect_move,SPEED_SLOW,-100);
while(MotorTachoCount(moter_conect_move_L)<=angle)
{
int US_average = SensorUS(S4) ; //3回ほど超...
US_average = US_average+SensorUS(S4); //
US_average = US_average+SensorUS(S4); //
US_average = US_average / 3 ; //
if (US_average<d_min)
{
d_min = SensorUS(S4);
tacho_min = MotorTachoCount(moter_conect_move...
}
}
OnFwdSyncEx(moter_conect_move,SPEED_SLOW,100,RESET_NO...
until(MotorTachoCount(moter_conect_move_L)<=tacho_min...
Wait(360);
Off(moter_conect_move);Wait(500);
return d_min;
}
void line_trace(int sensor_light_lv) //ライント...
{
if (sensor_light_lv < THRESHOLD-8)
{
OnFwd(moter_conect_move_R,SPEED_FAST_line_trace);
OnFwd(moter_conect_move_L,-SPEED_FAST_line_trace);
}
else if (sensor_light_lv < THRESHOLD-5)
{
OnFwd(moter_conect_move_L,SPEED_SLOW_line_trace);
}
else if (sensor_light_lv < THRESHOLD +5)
{
OnFwdSync(moter_conect_move,SPEED_line_trace,0);
}
else if (sensor_light_lv < THRESHOLD+8)
{
OnFwd(moter_conect_move_R,SPEED_SLOW_line_trace);
}
else
{
OnFwd(moter_conect_move_L,SPEED_FAST_line_trace);
OnFwd(moter_conect_move_R,-SPEED_FAST_line_trace);
}
}
long intersection_judgment(long t0,int threshold)//Senso...
{
if (SENSOR_1 > threshold) //現在...
{
t0 = CurrentTick(); //現在...
}
return t0 ; //t0の...
}
//関数(task_mainで呼び出す)エリア
void set_sensor_all()
{
SetSensorLight(S1); // ライ...
SetSensorLowspeed(S4); //超音...
}
void firing_ball() //ボー...
{
stop_move(); //モー...
RotateMotor(moter_conect_option,85,537); //optio...
}
void line_tracing_in_seconds(float seconds) //secon...
{
stop_move();
long t0 =CurrentTick();
float temp=1000*seconds; //while...
while(CurrentTick()-t0 < temp) //temp...
{
line_trace(SENSOR_1); //ライ...
}
}
void line_trace_and_intersection_judgment(int threshold,...
{
stop_move(); //モー...
long t0 = CurrentTick(); //現在...
while(CurrentTick()-t0 < judgment_time) //judgm...
{
line_trace(SENSOR_1); //ライ...
t0=intersection_judgment(t0,threshold); //現在...
}
stop_move(); //モー...
Wait(1000); //交差...
PlaySound(SOUND_UP); //交差...
}
void move_A_to_inside_of_M() //スタ...
{
fwdDist(5.0); //5cm前進
line_tracing_in_seconds(1.2); //1.2秒...
turnAng_R(70.0); //右に7...
fwdDist(30.0); //30cm...
line_tracing_in_seconds(6.0); //6秒間...
line_trace_and_intersection_judgment(31,100); //交差...
line_tracing_in_seconds(7.2); //7.2秒...
turnAng_R(90.0); //右に9...
fwdDist(13.0); //13cm...
}
void mukiawase() //ロボ...
{
turnAng_L(10.0); //弁当...
int a =searchDirection(60); //一番...
turnAng_R(3.0); //バッ...
}
void send_action_finish() //バッ...
{
SendRemoteNumber(0,MAILBOX1,1);
}
int receive_action_signal() //バッ...
{
int temp = 0; //メッ...
while(temp==0) //メッ...
{
ReceiveRemoteNumber(MAILBOX2,true,temp); //メッ...
}
PlaySound(SOUND_UP); //メッ...
return temp; //受け...
}
//taskエリア
task main()
{
set_sensor_all(); //セン...
int action_number=0; //命令...
while(true)
{
action_number = receive_action_signal();//命令...
if (action_number == 1) //命令...
{
move_A_to_inside_of_M(); //ピッ...
action_number = 0; //命令...
}
else if (action_number == 2) //命令...
{
mukiawase(); //ロボ...
action_number = 0; //命令...
}
else if (action_number == 3) //命令...
{
firing_ball(); //ボー...
action_number = 0; //命令...
}
send_action_finish(); //動作...
PlaySound(SOUND_UP); //動作...
}
}
*バッターロボットについて [#ud4e2ee7]
**車体 [#aea2177c]
#ref(2016b/Member/Megukyo/Mission3/battarzentai2.jpg,50%,...
#ref(2016b/Member/Megukyo/Mission3/battarzentai.jpg,50%,...
バッターロボットは基本的なライントレースマシンのフレーム...
また、バッターロボットは普段の教室では起きなかった現象だ...
#ref(2016b/Member/Megukyo/Mission3/battarzentai3.jpg,50%,...
センサーはアーム付け根上部に超音波センサ、前方下部に光セ...
#ref(2016b/Member/Megukyo/Mission3/armzoom2.jpg,50%,車体)
初期位置
#ref(2016b/Member/Megukyo/Mission3/armzoom3.jpg,50%,車体)
超音波センサ使用時~
アームの先端はこのように遊動式となっており、球の衝撃を多...
#ref(2016b/Member/Megukyo/Mission3/armzoom.jpg,50%,車体)
球をキャッチする待機位置~
このロボットがボールを打つ一連の動作はまず、遊動式になっ...
#ref(2016b/Member/Megukyo/Mission3/armzoom4.jpg,50%,車体)
アームのみで撮影
**プログラム [#y8320fae]
プログラムは、大まかには、(まずピッチャーロボットがMまで...
#define moter_conect_move OUT_BC //駆動輪モーターの接...
#define moter_conect_option OUT_A //ハンドルのモーター...
#define moter_conect_move_L OUT_B //左駆動輪モーターの...
#define moter_conect_move_R OUT_C //右駆動輪モーターの...
#define SPEED 45 //通常モーター速度
#define SPEED_FAST 60 //通常モーター速度(...
#define SPEED_SLOW 40 //通常モーター速度(...
#define SPEED_line_trace 30 //ライントレース時の...
#define SPEED_FAST_line_trace 40
#define SPEED_SLOW_line_trace 30
#define THRESHOLD 44 //白と黒の中間の反射率
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 15; //タイヤのトレッド幅...
const float pi=3.1415; //円周率
/****************** ここから, 長谷部くんのコードを引用し...
//すべての出力モーターの停止
void stop_move()
{
Off(OUT_ABC); Wait(1);
}
//左に ang (°) 回転
void turnAng_L(float ang)
{
stop_move();
//左回転に必要な角度の計算
float angle = track / diameter * ang;
//計算した角度動かす
RotateMotorEx(moter_conect_move, SPEED_SLOW, angle, ...
}
//ライントレース
void line_trace(int sensor_light_lv)
{
if (sensor_light_lv < THRESHOLD - 8)
{
OnFwd(moter_conect_move_R, SPEED_FAST_line_trac...
OnFwd(moter_conect_move_L, -SPEED_FAST_line_trac...
}
else if (sensor_light_lv < THRESHOLD - 5)
{
OnFwd(moter_conect_move_L, SPEED_SLOW_line_trace);
}
else if (sensor_light_lv < THRESHOLD + 5)
{
OnFwdSync(moter_conect_move, SPEED_line_trace,0);
}
else if (sensor_light_lv < THRESHOLD + 8)
{
OnFwd(moter_conect_move_R, SPEED_SLOW_line_trace);
}
else
{
OnFwd(moter_conect_move_L, SPEED_FAST_line_trac...
OnFwd(moter_conect_move_R, -SPEED_FAST_line_trac...
}
}
//Sensorの値がThreshold(任意の反射率)以上のとき, 引数に...
//それ以外は変更せず引数を返す
long intersection_judgment(long t0, int threshold)
{
if (SENSOR_4 > threshold)
{
t0 = CurrentTick();
}
return t0;
}
//seconds(秒)間、ライントレースをする
void line_tracing_in_seconds(float seconds)
{
stop_move();
long t0 =CurrentTick();
float temp = 1000 * seconds;
while(CurrentTick() - t0 < temp)
{
line_trace(SENSOR_4);
}
}
//交差点を判断(Thresholdの値で判断)するまで、ライントレ...
void line_trace_and_intersection_judgment(int threshold,...
{
stop_move();
long t0 = CurrentTick();
while(CurrentTick()-t0 < judgment_time)
{
line_trace(SENSOR_4);
t0=intersection_judgment(t0,threshold);
}
stop_move(); Wait(1000);
PlaySound(SOUND_UP);
}
/****************** ここまで, 長谷部くんのコードを引用し...
//ピッチャーが移動中, 位置合わせ中の時に使用する. ピッチ...
//を返すまで次の行動に移らない.
sub waitpartner()
{
int msg = 0;
while(msg == 0)
{
ReceiveRemoteNumber(MAILBOX1, true, msg);
}
}
//バッター側のNXTが位置合わせを行わないほうがうまくいく...
//わせを行わない. (コメントアウト)
int searchDirection(long ang)
{
long tacho_min;
int d_min = 300;
/*long angle = (track / diameter) * ang;
turnAng_L(ang / 2);
ResetTachoCount(OUT_BC);
OnFwdSync(OUT_BC, SPEED, -100);
while(MotorTachoCount(OUT_B) <= angle)
{
if (SensorUS(S1) < d_min)
{
d_min = SensorUS(S1);
tacho_min = MotorTachoCount(OUT_B);
}
}
OnFwdSyncEx(OUT_BC, SPEED, 100, RESET_NONE);
until(MotorTachoCount(OUT_B) <= tacho_min || SensorU...
Wait(150); */
Off(OUT_BC); Wait(500);
return d_min;
}
sub ajustRobot()
{
int tmp = searchDirection(40); Wait(500);
}
//そのままではボールを打つハンドルが下がってきてしまうの...
//させて, 固定する
sub handlehold()
{
OnFwd(OUT_A, 10);
}
sub ball_catch()
{
//ボール発車前に毎回位置合わせをする場合, コメントを...
//ajustRobot(); SendRemoteNumber(1, MAILBOX2, 2); wa...
//ボール発射の司令
SendRemoteNumber(1, MAILBOX2, 3);
handlehold(); Wait(1550);
RotateMotor(OUT_A, 50, -50); OnRev(OUT_A, 50); Wait(...
}
sub ball_hit(int drctn)
{
if (drctn == 40) //4点(右)
{
RotateMotor(OUT_B, SPEED, 210); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, -190); Wait(500);
}
else if (drctn == 41) //4点(左)
{
RotateMotor(OUT_B, SPEED, -240); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, 250); Wait(500);
}
else if (drctn == 60) //6点(右)
{
RotateMotor(OUT_B, SPEED, 100); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, -100); Wait(500);
}
else if (drctn == 61) //6点(左)
{
RotateMotor(OUT_B, SPEED, -190); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, 190); Wait(500);
}
else if (drctn == 10) //10点
{
RotateMotor(OUT_B, SPEED, -100); Wait(500);
RotateMotor(OUT_A, 100, 100); Wait(1000);
handlehold();
RotateMotor(OUT_B, SPEED, 100); Wait(500);
}
else if (drctn == 00) //4点(右)
{
RotateMotor(OUT_B, SPEED, 30); Wait(500);
}
}
//スタート地点から規定の位置まで進む
sub start1()
{
RotateMotor(OUT_BC, SPEED, 40);
RotateMotor(OUT_C , SPEED, 355);
RotateMotor(OUT_BC, SPEED, 900);
//3秒間無条件でライントレース(丁字路判別を行わない)
line_tracing_in_seconds(3);
//ライントレース, 丁字路判別
line_trace_and_intersection_judgment(33,90);
RotateMotor(OUT_BC, SPEED, 300);
RotateMotor(OUT_B , SPEED, -100);
PlaySound(SOUND_LOW_BEEP);
}
task main()
{
SetSensorLowspeed(S1);
SetSensorLight(S4);
handlehold();
start1();
SendRemoteNumber(1, MAILBOX2, 1); waitpartner();
ajustRobot(); SendRemoteNumber(1, MAILBOX2, 2); Wait...
waitpartner(); handlehold();
//4点(右)を狙う
ball_catch(); ball_hit(40);
//4点(左)を狙う
ball_catch(); ball_hit(41);
//6点(左)を狙う
ball_catch(); ball_hit(60);
//6点(左)を狙う
ball_catch(); ball_hit(61);
//6点(左)を狙う
ball_catch(); ball_hit(61);
}
*結果・まとめ [#d201919e]
テスト段階では比較的うまくいっていたが、本番ではピッチャ...
*感想 [#p89490b7]
このロボティクス入門ゼミを通して今まで全く触れてこなかっ...
ページ名: