2017a/Member/Kawachan/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*目次 [#b782d0ee]
#contents
*課題について [#yf9b9e75]
課題については[[課題2>2017a/Mission2]]を参照。コースはE地...
*ロボットについて [#m8075db9]
&ref(2017a/Member/Kawachan/Mission2/大きさ(長さ).jpg,50%,...
&ref(2017a/Member/Kawachan/Mission2/大きさ(幅).jpg,50%,大...
今回の課題ではロボットの大きさ制限(幅15cm長さ18cm以内)...
&ref(2017a/Member/Kawachan/Mission2/機体(角度大).jpg,50%,...
&ref(2017a/Member/Kawachan/Mission2/機体(角度小).jpg,50%,...
その際、後輪の位置によって機体の角度が微妙に変わるため、...
&ref(2017a/Member/Kawachan/Mission2/センサー接地面.jpg,50...
また、地面に接することで、より正確なライン判断にもつなが...
*プログラムについて [#s4fe308e]
&ref(2017a/Member/Kawachan/Mission2/コース.png,100%,コー...
今回は上図で色分けしたように11個のサブルーチンに分けてプ...
**スタート用サブルーチン(灰色) [#f1d8222c]
まず、スタート地点からライントレースを開始する位置まで移...
float GetAngle(float d) // 距離dからタイヤの回転数を計算...
{
const float diameter = 2.7; // タイヤの半径
const float pai=3.1415; // 円周率
float ang = d/(2*diameter*pai)*360.0; // 角度を計算する
return ang;
}
そして、スタート地点からライントレース開始地点までのセン...
sub START() // スタート用サブルーチン
{
int angleA = GetAngle(5); // 5.0cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleA); // 指定した角度で...
}
**ライントレース(左側)用サブルーチン(赤色) [#m65ce6d9]
次にライントレース用のサブルーチンを作成した。私のコース...
&ref(2017a/Member/Kawachan/Mission2/しきい値.png,50%,コー...
黒線の値を測ると画像のようになったため、以下のようにしき...
#define THRESHOLD 44
また、黒線の境目から大幅にそれた場合は両方のタイヤを回転...
#define SPEED_1 20 // ライントレース用
#define STEP 1
#define go_stright OnFwd(OUT_BC,SPEED_1);Wait(STEP);Off(...
#define turn_right_1 OnFwd(OUT_C,SPEED_1);Wait(STEP);Off...
#define turn_right_2 OnFwd(OUT_C,SPEED_1);OnRev(OUT_B,SP...
#define turn_left_1 OnFwd(OUT_B,SPEED_1);Wait(STEP);Off(...
#define turn_left_2 OnFwd(OUT_B,SPEED_1);OnRev(OUT_C,SPE...
次に、直角・交差点に差し掛かった時にはライントレースのサブ...
コースでの試運転を続けた結果、150回の連続が妥当だと判断し...
#define nMax 150
サブルーチン本体は以下の通りである。
sub Line_tolesu_left() // 左側のライントレース用サブルー...
{
SetSensorLight(S3);
int n=0;
while (n <= nMax) {
if (SENSOR_3 < THRESHOLD-11) {
turn_left_2; // 左旋回
n++; // カウントを増やす
} else {
if (SENSOR_3 < THRESHOLD-6) {
turn_left_1; // 左折
} else if (SENSOR_3 < THRESHOLD+6) {
go_stright; // 直進
} else if (SENSOR_3 < THRESHOLD+11) {
turn_right_1; // 右折
} else {
turn_right_2; // 右旋回
}
n=0; //回数リセット
}
}
Off(OUT_BC);
}
**F・G・H用サブルーチン(青色) [#u0b57ee3]
コースのF・G・Hはクランクのカーブであるため、ライントレース...
・タイヤとタイヤの幅・・・11.2cm
11.2cm×2×3.1415(円周率)×45度/360度=8.7962cm
クランクや交差点などでは少しでも遂行タイムを短くするため...
#define SPEED_2 30 // ライントレース以外
試運転をしてみると、ただ回転するだけでは、回転した後のセ...
sub FGH() // F,G,H用サブルーチン
{
PlaySound(SOUND_UP);
int angleB = GetAngle(1); // 1.0cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleB); // 指定した角度で...
int angleC = GetAngle(8.79); // 8.79cm進むのに必要な回...
RotateMotor(OUT_B,SPEED_2,angleC); // 指定した角度でモ...
RotateMotor(OUT_C,SPEED_2,-angleC);
}
**Q・R用サブルーチン(緑色) [#sa154e34]
このサブルーチンは基本的に前項の「F・G・H用サブルーチン」と同...
sub QR() // Q,2回目のR用サブルーチン
{
Wait(1000);
PlaySound(SOUND_DOWN);
int angleD = GetAngle(1); // 1.0cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleD); // 指定した角度で...
int angleE = GetAngle(8.79); // 8.79cm進むのに必要な回...
RotateMotor(OUT_B,SPEED_2,angleE); // 指定した角度でモ...
RotateMotor(OUT_C,SPEED_2,-angleE);
}
**R・S用サブルーチン(黄緑色) [#l67ee2ac]
R・Sでは一方のタイヤを4cm分進めることで、そのままロータリ...
sub RS() // R,2回目のS用サブルーチン
{
PlaySound(SOUND_UP);
int angleF = GetAngle(4); // 4cm進むのに必要な回転角度
RotateMotor(OUT_C,SPEED_2,angleF); // 指定した角度でモ...
}
**S・P用サブルーチン(橙色) [#yb8b7eb3]
ロータリーから抜け出す地点では一方のタイヤを回転させる事...
sub SP() // S,P用サブルーチン
{
PlaySound(SOUND_UP);
int angleG = GetAngle(10); // 10cm進むのに必要な回転角度
RotateMotor(OUT_B,SPEED_2,angleG); // 指定した角度でモ...
}
**急カーブ用サブルーチン(桃色) [#bdeee54a]
この地点はカーブの半径が最小の4cmであるのに加え、センサー...
sub Curve() // 急カーブ用サブルーチン
{
int angleH = GetAngle(3); // 3cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleH); // 指定した角度で...
}
**ライントレース(右側)用サブルーチン(茶色) [#pfafe2af]
黒線の右側に移動した後は、これまでのライントレース用サブ...
sub Line_tolesu_right() // 右側のライントレース用サブル...
{
SetSensorLight(S3);
int n=0;
while (n <= nMax) {
if (SENSOR_3 < THRESHOLD-11) {
turn_right_2;
n++;
} else {
if (SENSOR_3 < THRESHOLD-6) {
turn_right_1;
} else if (SENSOR_3 < THRESHOLD+6) {
go_stright;
} else if (SENSOR_3 < THRESHOLD+11) {
turn_left_1;
} else {
turn_left_2;
}
n=0; //回数リセット
}
}
Off(OUT_BC);
}
**T用サブルーチン(水色) [#zbf22573]
Tでは一時停止した後に音を鳴らし、交差点を直進する。ライン...
sub T() // T用サブルーチン
{
Wait(1000);
PlaySound(SOUND_DOWN);
int angleI = GetAngle(2.5); // 2.5cm進むのに必要な回転...
RotateMotor(OUT_BC,SPEED_2,angleI); // 指定した角度で...
}
**E用サブルーチン(黄色) [#d1273fc3]
このサブルーチンはQ・R用サブルーチンと同じであるが、サブル...
sub E() // E用サブルーチン
{
Wait(1000);
PlaySound(SOUND_DOWN);
int angleJ = GetAngle(1); // 1cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleJ); // 指定した角度で...
int angleK = GetAngle(8.79); // 8.79cm進むのに必要な回...
RotateMotor(OUT_B,SPEED_2,angleK); // 指定した角度でモ...
RotateMotor(OUT_C,SPEED_2,-angleK);
}
**ゴール用サブルーチン(紫色) [#dba9acc0]
ゴール用サブルーチンでは、T用サブルーチンでの理由と同様に...
sub GOAL() // ゴール用サブルーチン
{
int angleL = GetAngle(1); // 1cm進むのに必要な回転角度
RotateMotor(OUT_C,SPEED_2,angleL); // 指定した角度でモ...
int angleM = GetAngle(17); // 17cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleM); // 指定した角度で...
}
*メインプログラム [#e6c91527]
ロボットに送信したtask mainは以下の通り
task main()
{
START();
Line_tolesu_left();
FGH();
Line_tolesu_left();
QR();
Line_tolesu_left();
RS();
Line_tolesu_left();
SP();
Line_tolesu_left();
FGH();
Line_tolesu_left();
Curve();
Line_tolesu_right();
Curve();
Line_tolesu_left();
FGH();
Line_tolesu_left();
T();
Line_tolesu_left();
T();
Line_tolesu_left();
QR();
Line_tolesu_left();
RS();
Line_tolesu_left();
SP();
Line_tolesu_left();
E();
Line_tolesu_left();
GOAL();
}
*感想 [#p22722d5]
前回の課題ではプログラムが長くなってしまったため、今回は...
終了行:
*目次 [#b782d0ee]
#contents
*課題について [#yf9b9e75]
課題については[[課題2>2017a/Mission2]]を参照。コースはE地...
*ロボットについて [#m8075db9]
&ref(2017a/Member/Kawachan/Mission2/大きさ(長さ).jpg,50%,...
&ref(2017a/Member/Kawachan/Mission2/大きさ(幅).jpg,50%,大...
今回の課題ではロボットの大きさ制限(幅15cm長さ18cm以内)...
&ref(2017a/Member/Kawachan/Mission2/機体(角度大).jpg,50%,...
&ref(2017a/Member/Kawachan/Mission2/機体(角度小).jpg,50%,...
その際、後輪の位置によって機体の角度が微妙に変わるため、...
&ref(2017a/Member/Kawachan/Mission2/センサー接地面.jpg,50...
また、地面に接することで、より正確なライン判断にもつなが...
*プログラムについて [#s4fe308e]
&ref(2017a/Member/Kawachan/Mission2/コース.png,100%,コー...
今回は上図で色分けしたように11個のサブルーチンに分けてプ...
**スタート用サブルーチン(灰色) [#f1d8222c]
まず、スタート地点からライントレースを開始する位置まで移...
float GetAngle(float d) // 距離dからタイヤの回転数を計算...
{
const float diameter = 2.7; // タイヤの半径
const float pai=3.1415; // 円周率
float ang = d/(2*diameter*pai)*360.0; // 角度を計算する
return ang;
}
そして、スタート地点からライントレース開始地点までのセン...
sub START() // スタート用サブルーチン
{
int angleA = GetAngle(5); // 5.0cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleA); // 指定した角度で...
}
**ライントレース(左側)用サブルーチン(赤色) [#m65ce6d9]
次にライントレース用のサブルーチンを作成した。私のコース...
&ref(2017a/Member/Kawachan/Mission2/しきい値.png,50%,コー...
黒線の値を測ると画像のようになったため、以下のようにしき...
#define THRESHOLD 44
また、黒線の境目から大幅にそれた場合は両方のタイヤを回転...
#define SPEED_1 20 // ライントレース用
#define STEP 1
#define go_stright OnFwd(OUT_BC,SPEED_1);Wait(STEP);Off(...
#define turn_right_1 OnFwd(OUT_C,SPEED_1);Wait(STEP);Off...
#define turn_right_2 OnFwd(OUT_C,SPEED_1);OnRev(OUT_B,SP...
#define turn_left_1 OnFwd(OUT_B,SPEED_1);Wait(STEP);Off(...
#define turn_left_2 OnFwd(OUT_B,SPEED_1);OnRev(OUT_C,SPE...
次に、直角・交差点に差し掛かった時にはライントレースのサブ...
コースでの試運転を続けた結果、150回の連続が妥当だと判断し...
#define nMax 150
サブルーチン本体は以下の通りである。
sub Line_tolesu_left() // 左側のライントレース用サブルー...
{
SetSensorLight(S3);
int n=0;
while (n <= nMax) {
if (SENSOR_3 < THRESHOLD-11) {
turn_left_2; // 左旋回
n++; // カウントを増やす
} else {
if (SENSOR_3 < THRESHOLD-6) {
turn_left_1; // 左折
} else if (SENSOR_3 < THRESHOLD+6) {
go_stright; // 直進
} else if (SENSOR_3 < THRESHOLD+11) {
turn_right_1; // 右折
} else {
turn_right_2; // 右旋回
}
n=0; //回数リセット
}
}
Off(OUT_BC);
}
**F・G・H用サブルーチン(青色) [#u0b57ee3]
コースのF・G・Hはクランクのカーブであるため、ライントレース...
・タイヤとタイヤの幅・・・11.2cm
11.2cm×2×3.1415(円周率)×45度/360度=8.7962cm
クランクや交差点などでは少しでも遂行タイムを短くするため...
#define SPEED_2 30 // ライントレース以外
試運転をしてみると、ただ回転するだけでは、回転した後のセ...
sub FGH() // F,G,H用サブルーチン
{
PlaySound(SOUND_UP);
int angleB = GetAngle(1); // 1.0cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleB); // 指定した角度で...
int angleC = GetAngle(8.79); // 8.79cm進むのに必要な回...
RotateMotor(OUT_B,SPEED_2,angleC); // 指定した角度でモ...
RotateMotor(OUT_C,SPEED_2,-angleC);
}
**Q・R用サブルーチン(緑色) [#sa154e34]
このサブルーチンは基本的に前項の「F・G・H用サブルーチン」と同...
sub QR() // Q,2回目のR用サブルーチン
{
Wait(1000);
PlaySound(SOUND_DOWN);
int angleD = GetAngle(1); // 1.0cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleD); // 指定した角度で...
int angleE = GetAngle(8.79); // 8.79cm進むのに必要な回...
RotateMotor(OUT_B,SPEED_2,angleE); // 指定した角度でモ...
RotateMotor(OUT_C,SPEED_2,-angleE);
}
**R・S用サブルーチン(黄緑色) [#l67ee2ac]
R・Sでは一方のタイヤを4cm分進めることで、そのままロータリ...
sub RS() // R,2回目のS用サブルーチン
{
PlaySound(SOUND_UP);
int angleF = GetAngle(4); // 4cm進むのに必要な回転角度
RotateMotor(OUT_C,SPEED_2,angleF); // 指定した角度でモ...
}
**S・P用サブルーチン(橙色) [#yb8b7eb3]
ロータリーから抜け出す地点では一方のタイヤを回転させる事...
sub SP() // S,P用サブルーチン
{
PlaySound(SOUND_UP);
int angleG = GetAngle(10); // 10cm進むのに必要な回転角度
RotateMotor(OUT_B,SPEED_2,angleG); // 指定した角度でモ...
}
**急カーブ用サブルーチン(桃色) [#bdeee54a]
この地点はカーブの半径が最小の4cmであるのに加え、センサー...
sub Curve() // 急カーブ用サブルーチン
{
int angleH = GetAngle(3); // 3cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleH); // 指定した角度で...
}
**ライントレース(右側)用サブルーチン(茶色) [#pfafe2af]
黒線の右側に移動した後は、これまでのライントレース用サブ...
sub Line_tolesu_right() // 右側のライントレース用サブル...
{
SetSensorLight(S3);
int n=0;
while (n <= nMax) {
if (SENSOR_3 < THRESHOLD-11) {
turn_right_2;
n++;
} else {
if (SENSOR_3 < THRESHOLD-6) {
turn_right_1;
} else if (SENSOR_3 < THRESHOLD+6) {
go_stright;
} else if (SENSOR_3 < THRESHOLD+11) {
turn_left_1;
} else {
turn_left_2;
}
n=0; //回数リセット
}
}
Off(OUT_BC);
}
**T用サブルーチン(水色) [#zbf22573]
Tでは一時停止した後に音を鳴らし、交差点を直進する。ライン...
sub T() // T用サブルーチン
{
Wait(1000);
PlaySound(SOUND_DOWN);
int angleI = GetAngle(2.5); // 2.5cm進むのに必要な回転...
RotateMotor(OUT_BC,SPEED_2,angleI); // 指定した角度で...
}
**E用サブルーチン(黄色) [#d1273fc3]
このサブルーチンはQ・R用サブルーチンと同じであるが、サブル...
sub E() // E用サブルーチン
{
Wait(1000);
PlaySound(SOUND_DOWN);
int angleJ = GetAngle(1); // 1cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleJ); // 指定した角度で...
int angleK = GetAngle(8.79); // 8.79cm進むのに必要な回...
RotateMotor(OUT_B,SPEED_2,angleK); // 指定した角度でモ...
RotateMotor(OUT_C,SPEED_2,-angleK);
}
**ゴール用サブルーチン(紫色) [#dba9acc0]
ゴール用サブルーチンでは、T用サブルーチンでの理由と同様に...
sub GOAL() // ゴール用サブルーチン
{
int angleL = GetAngle(1); // 1cm進むのに必要な回転角度
RotateMotor(OUT_C,SPEED_2,angleL); // 指定した角度でモ...
int angleM = GetAngle(17); // 17cm進むのに必要な回転角度
RotateMotor(OUT_BC,SPEED_2,angleM); // 指定した角度で...
}
*メインプログラム [#e6c91527]
ロボットに送信したtask mainは以下の通り
task main()
{
START();
Line_tolesu_left();
FGH();
Line_tolesu_left();
QR();
Line_tolesu_left();
RS();
Line_tolesu_left();
SP();
Line_tolesu_left();
FGH();
Line_tolesu_left();
Curve();
Line_tolesu_right();
Curve();
Line_tolesu_left();
FGH();
Line_tolesu_left();
T();
Line_tolesu_left();
T();
Line_tolesu_left();
QR();
Line_tolesu_left();
RS();
Line_tolesu_left();
SP();
Line_tolesu_left();
E();
Line_tolesu_left();
GOAL();
}
*感想 [#p22722d5]
前回の課題ではプログラムが長くなってしまったため、今回は...
ページ名: