2017a/Member/hiro/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題について [#o42b2683]
**課題2概要 [#gf5dd8fa]
図のようなコースを各チームで作成し、「ミッション」を遂行...
自分はE地点右折コースを選択。
*ロボットについて [#d95c8b9b]
#ref(./image1.JPG,40%,ロボット 全体図)
↑ロボットの全体図
今回はこのような簡単なロボットを製作した。
#ref(./image3.JPG,40%,ロボット 分解図)
↑ロボットの大部分を外した場合このようになる
**工夫した点 [#a975ae52]
・ロボットの全体図を見れば分かるが、とてもシンプルでコン...
?センサーとタイヤの距離(回転半径)をできるだけ短くした。
このことによって光センサーの動きを小さくし、コースアウ...
?左右のタイヤの距離を短くした。
小回りを利かせた。
?地面と光センサーの距離を短くした。
正確なセンサー値を得るためである。
#ref(./image5.JPG,40%,ロボット)
↑のように地面すれすれまで近ずけた。
?支えを付けた。
車体が後ろに傾くのを防ぐためである。
#ref(./image4.JPG,40%,支え)
*プログラム紹介 [#b69d1fd3]
今回はプログラミングが大事となる課題であった。それぞれに...
**定数について [#w2bdbd1a]
/*数値代入系*/
# define TMAX 28 //黒い線を28/100秒以上通過すると「交差...
/*動作制御系*/
# define forward OnFwd(OUT_AC); //直進
# define back OnRev(OUT_AC); //後退
# define t_left OnRev(OUT_A);OnFwd(OUT_C); //左旋回
# define left Off(OUT_A);OnFwd(OUT_C); //左回転
# define t_right OnFwd(OUT_A);OnRev(OUT_C); //右旋回
# define right OnFwd(OUT_A);Off(OUT_C); //右回転
# define KOUON PlaySound(SOUND_UP); //高音を鳴らす。
# define TEION PlaySound(SOUND_DOWN); //低音を鳴らす。
**マクロについて [#s87779e5]
# define tomaru(t) Off(OUT_AC);Wait(t); //t/100秒停止を...
# define power(s) SetPower(OUT_AC,s); //モーターのパワー...
**ライントレースについて [#u41482a0]
ただ単にプログラムを作成すると膨大な量を書く必要があるた...
/*グローバル変数*/
int n=0;
交差点、急カーブに何回通過したかをカウントする。変数nはm...
/*右ライントレース*/
sub migi(){
while(FastTimer(0)<TMAX){ //交差点・急カーブの判断を...
if(SENSOR_1<40){ //計測値が閾値40以下の場合、右旋回
OnFwd(OUT_A);OnRev(OUT_C);
}else if(SENSOR_1<42){ //計測値が閾値40~42の場合、...
OnFwd(OUT_A);Off(OUT_C);
}else if(SENSOR_1<52){ // 計測値が閾値42~52の場合...
OnFwd(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_1<55){ //計測値が閾値52~55の場合、...
Off(OUT_A);OnFwd(OUT_C);
} else { //計測値が閾値55以上の場合...
OnRev(OUT_A);OnFwd(OUT_C);
}
if(SENSOR_1>40){ //計測値が閾値40以上の場合、タイ...
ClearTimer(0);
}
}
n++; //今何回目の交差点・急カーブなのかをカウント
}
/*左ライントレース*/
sub hidari(){
while(FastTimer(0)<TMAX){ //交差点・急カーブの判断を...
if(SENSOR_1<40){ //計測値が閾値40以下の場合、左旋回
OnRev(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_1<42){ //計測値が閾値40~42の場合、...
Off(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_1<52){ //計測値が閾値42~52の場合、...
OnFwd(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_1<55){ //計測値が閾値52~55の場合、...
OnFwd(OUT_A);Off(OUT_C);
} else { //計測値が閾値55以上の場合...
OnFwd(OUT_A);OnRev(OUT_C);
}
if(SENSOR_1>40){ //計測値が閾値40以上の場合、タイマ...
ClearTimer(0);
}
}
n++; //今何回目の交差点・急カーブなのかをカウント
}
まず、自分のプログラムには欠点がある。それは、右ライン...
もし、E地点直進コースなら左折だけなので左ライントレース...
**main関数について [#p96285ee]
sub関数でライントレースの仕方をプログラムしたのでmain関...
また、各交差点、丁字路、直角コーナについてそれぞれ?〜?...
#ref(./image7.JPG,20%,計画図)
↑青で書かれた番号がそれぞれの通し番号である。作る前に自...
task main(){
power(0);
SetSensor(SENSOR_1,SENSOR_LIGHT);
ClearTimer(0);
while(n<=13){
変数nが13以下の場合、while関数内に存在する。
**?〜?まで [#qd6001cb]
?右折
if(n==0){ //?の丁字路
migi();
KOUON; //高音を鳴らす
t_left;Wait(10);
forward;Wait(40); //左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、丁字路を認識した後10/100秒左旋回した後40/100秒直進...
?一時停止+左折
else if(n==1){ //?の丁字路
hidari();
back;Wait(20);
tomaru(80); //一時停止
TEION; //低音を鳴らす
t_left;Wait(30);
forward;Wait(50); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、丁字路を認識した後、一時停止してから30/100秒左旋回...
?直進
else if(n==2){ //?の丁字路
hidari();
KOUON; //高温を鳴らす
t_right;Wait(15);
forward;Wait(50); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、丁字路を認識した後、15/100秒右旋回し、50/100秒直進...
?左折
else if(n==3){ //?の丁字路
hidari();
KOUON; //高音を鳴らす
t_right;Wait(15);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、丁字路を認識した後、15/100秒右旋回し、50/100秒全身...
?一時停止+直進
else if(n==4){ //?の交差点
migi();
tomaru(80); //一時停止
TEION; //低音を鳴らす
t_left;Wait(25);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、交差点を認識した後、一時停止してから25/100秒左旋回...
?一時停止+直進
else if(n==5){ //?の交差点
migi();
tomaru(80); //一時停止
TEION; //低音を鳴らす
t_left;Wait(25);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?は、?と同じ場合なので同じ処理をする
?右折
else if(n==6){ //?の直角コース
migi();
KOUON; //高音を鳴らす
t_right;Wait(50);
forward;Wait(50);
right;Wait(15); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、直角コースと認識した後、50/100秒右旋回し50/100秒直...
?急カーブ
else if(n==7){ //?の急カーブコース
migi();
forward;Wait(15);
t_right;Wait(70);
forward;Wait(30);
right;Wait(50);
t_right;Wait(80); //変数nがカウントされない...
ClearTimer(0); //タイマーをリセットする
}
?では急カーブに差し掛かるので、一度変数nがカウントされた...
**?〜?まで [#zb53621a]
?〜?の行動はよく見ると?〜?の行動と全く一緒であることを認...
?右折
else if(n==8){ //?の直角コース
migi();
KOUON; //高音を鳴らす。
t_left;Wait(10);
forward;Wait(40); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
行動は?と?同じなのでプログラムも同じである。
?一時停止+左折
else if(n==9){ //?の丁字路
hidari();
back;Wait(20);
tomaru(80); //一時停止
TEION; //低音を鳴らす
t_left;Wait(30);
forward;Wait(50); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
行動は?と?同じなのでプログラムも同じである。
?直進
else if(n==10){ //?の丁字路
hidari();
KOUON; //高音を鳴らす
t_right;Wait(15);
forward;Wait(50); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
行動は?と?同じなのでプログラムも同じである。
?左折
else if(n==11){ //?の丁字路
hidari();
KOUON; //高音を鳴らす
t_right;Wait(15);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
行動は?と?同じなのでプログラムも同じである。
**?〜?まで [#cda6b226]
?右折
else if(n==12){ //?の直角コース
migi();
KOUON; //高音を鳴らす
t_right;Wait(50);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、直角コースと認識した後、50/100秒右旋回し、50/100秒...
?直進
else if(n==13){ //?の直角コース
migi();
KOUON; //高音を鳴らす
t_left;Wait(25);
forward;Wait(250); //スタート地点へ移動
}
?では、直角コースと認識した後、25/100秒左旋回し、250/100...
}
n(変数)が14とカウントされたのでwhile関数から脱出。
Off(OUT_AC); //停止させる
}
完成!!
*反省・感想 [#ta686651]
今回はプログラミンングがメインの課題であった。sub関数が分...
終了行:
目次
#contents
*課題について [#o42b2683]
**課題2概要 [#gf5dd8fa]
図のようなコースを各チームで作成し、「ミッション」を遂行...
自分はE地点右折コースを選択。
*ロボットについて [#d95c8b9b]
#ref(./image1.JPG,40%,ロボット 全体図)
↑ロボットの全体図
今回はこのような簡単なロボットを製作した。
#ref(./image3.JPG,40%,ロボット 分解図)
↑ロボットの大部分を外した場合このようになる
**工夫した点 [#a975ae52]
・ロボットの全体図を見れば分かるが、とてもシンプルでコン...
?センサーとタイヤの距離(回転半径)をできるだけ短くした。
このことによって光センサーの動きを小さくし、コースアウ...
?左右のタイヤの距離を短くした。
小回りを利かせた。
?地面と光センサーの距離を短くした。
正確なセンサー値を得るためである。
#ref(./image5.JPG,40%,ロボット)
↑のように地面すれすれまで近ずけた。
?支えを付けた。
車体が後ろに傾くのを防ぐためである。
#ref(./image4.JPG,40%,支え)
*プログラム紹介 [#b69d1fd3]
今回はプログラミングが大事となる課題であった。それぞれに...
**定数について [#w2bdbd1a]
/*数値代入系*/
# define TMAX 28 //黒い線を28/100秒以上通過すると「交差...
/*動作制御系*/
# define forward OnFwd(OUT_AC); //直進
# define back OnRev(OUT_AC); //後退
# define t_left OnRev(OUT_A);OnFwd(OUT_C); //左旋回
# define left Off(OUT_A);OnFwd(OUT_C); //左回転
# define t_right OnFwd(OUT_A);OnRev(OUT_C); //右旋回
# define right OnFwd(OUT_A);Off(OUT_C); //右回転
# define KOUON PlaySound(SOUND_UP); //高音を鳴らす。
# define TEION PlaySound(SOUND_DOWN); //低音を鳴らす。
**マクロについて [#s87779e5]
# define tomaru(t) Off(OUT_AC);Wait(t); //t/100秒停止を...
# define power(s) SetPower(OUT_AC,s); //モーターのパワー...
**ライントレースについて [#u41482a0]
ただ単にプログラムを作成すると膨大な量を書く必要があるた...
/*グローバル変数*/
int n=0;
交差点、急カーブに何回通過したかをカウントする。変数nはm...
/*右ライントレース*/
sub migi(){
while(FastTimer(0)<TMAX){ //交差点・急カーブの判断を...
if(SENSOR_1<40){ //計測値が閾値40以下の場合、右旋回
OnFwd(OUT_A);OnRev(OUT_C);
}else if(SENSOR_1<42){ //計測値が閾値40~42の場合、...
OnFwd(OUT_A);Off(OUT_C);
}else if(SENSOR_1<52){ // 計測値が閾値42~52の場合...
OnFwd(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_1<55){ //計測値が閾値52~55の場合、...
Off(OUT_A);OnFwd(OUT_C);
} else { //計測値が閾値55以上の場合...
OnRev(OUT_A);OnFwd(OUT_C);
}
if(SENSOR_1>40){ //計測値が閾値40以上の場合、タイ...
ClearTimer(0);
}
}
n++; //今何回目の交差点・急カーブなのかをカウント
}
/*左ライントレース*/
sub hidari(){
while(FastTimer(0)<TMAX){ //交差点・急カーブの判断を...
if(SENSOR_1<40){ //計測値が閾値40以下の場合、左旋回
OnRev(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_1<42){ //計測値が閾値40~42の場合、...
Off(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_1<52){ //計測値が閾値42~52の場合、...
OnFwd(OUT_A);OnFwd(OUT_C);
}else if(SENSOR_1<55){ //計測値が閾値52~55の場合、...
OnFwd(OUT_A);Off(OUT_C);
} else { //計測値が閾値55以上の場合...
OnFwd(OUT_A);OnRev(OUT_C);
}
if(SENSOR_1>40){ //計測値が閾値40以上の場合、タイマ...
ClearTimer(0);
}
}
n++; //今何回目の交差点・急カーブなのかをカウント
}
まず、自分のプログラムには欠点がある。それは、右ライン...
もし、E地点直進コースなら左折だけなので左ライントレース...
**main関数について [#p96285ee]
sub関数でライントレースの仕方をプログラムしたのでmain関...
また、各交差点、丁字路、直角コーナについてそれぞれ?〜?...
#ref(./image7.JPG,20%,計画図)
↑青で書かれた番号がそれぞれの通し番号である。作る前に自...
task main(){
power(0);
SetSensor(SENSOR_1,SENSOR_LIGHT);
ClearTimer(0);
while(n<=13){
変数nが13以下の場合、while関数内に存在する。
**?〜?まで [#qd6001cb]
?右折
if(n==0){ //?の丁字路
migi();
KOUON; //高音を鳴らす
t_left;Wait(10);
forward;Wait(40); //左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、丁字路を認識した後10/100秒左旋回した後40/100秒直進...
?一時停止+左折
else if(n==1){ //?の丁字路
hidari();
back;Wait(20);
tomaru(80); //一時停止
TEION; //低音を鳴らす
t_left;Wait(30);
forward;Wait(50); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、丁字路を認識した後、一時停止してから30/100秒左旋回...
?直進
else if(n==2){ //?の丁字路
hidari();
KOUON; //高温を鳴らす
t_right;Wait(15);
forward;Wait(50); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、丁字路を認識した後、15/100秒右旋回し、50/100秒直進...
?左折
else if(n==3){ //?の丁字路
hidari();
KOUON; //高音を鳴らす
t_right;Wait(15);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、丁字路を認識した後、15/100秒右旋回し、50/100秒全身...
?一時停止+直進
else if(n==4){ //?の交差点
migi();
tomaru(80); //一時停止
TEION; //低音を鳴らす
t_left;Wait(25);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、交差点を認識した後、一時停止してから25/100秒左旋回...
?一時停止+直進
else if(n==5){ //?の交差点
migi();
tomaru(80); //一時停止
TEION; //低音を鳴らす
t_left;Wait(25);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?は、?と同じ場合なので同じ処理をする
?右折
else if(n==6){ //?の直角コース
migi();
KOUON; //高音を鳴らす
t_right;Wait(50);
forward;Wait(50);
right;Wait(15); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、直角コースと認識した後、50/100秒右旋回し50/100秒直...
?急カーブ
else if(n==7){ //?の急カーブコース
migi();
forward;Wait(15);
t_right;Wait(70);
forward;Wait(30);
right;Wait(50);
t_right;Wait(80); //変数nがカウントされない...
ClearTimer(0); //タイマーをリセットする
}
?では急カーブに差し掛かるので、一度変数nがカウントされた...
**?〜?まで [#zb53621a]
?〜?の行動はよく見ると?〜?の行動と全く一緒であることを認...
?右折
else if(n==8){ //?の直角コース
migi();
KOUON; //高音を鳴らす。
t_left;Wait(10);
forward;Wait(40); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
行動は?と?同じなのでプログラムも同じである。
?一時停止+左折
else if(n==9){ //?の丁字路
hidari();
back;Wait(20);
tomaru(80); //一時停止
TEION; //低音を鳴らす
t_left;Wait(30);
forward;Wait(50); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
行動は?と?同じなのでプログラムも同じである。
?直進
else if(n==10){ //?の丁字路
hidari();
KOUON; //高音を鳴らす
t_right;Wait(15);
forward;Wait(50); //次の左車線へ移動
ClearTimer(0); //タイマーをリセットする
}
行動は?と?同じなのでプログラムも同じである。
?左折
else if(n==11){ //?の丁字路
hidari();
KOUON; //高音を鳴らす
t_right;Wait(15);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
行動は?と?同じなのでプログラムも同じである。
**?〜?まで [#cda6b226]
?右折
else if(n==12){ //?の直角コース
migi();
KOUON; //高音を鳴らす
t_right;Wait(50);
forward;Wait(50); //次の右車線へ移動
ClearTimer(0); //タイマーをリセットする
}
?では、直角コースと認識した後、50/100秒右旋回し、50/100秒...
?直進
else if(n==13){ //?の直角コース
migi();
KOUON; //高音を鳴らす
t_left;Wait(25);
forward;Wait(250); //スタート地点へ移動
}
?では、直角コースと認識した後、25/100秒左旋回し、250/100...
}
n(変数)が14とカウントされたのでwhile関数から脱出。
Off(OUT_AC); //停止させる
}
完成!!
*反省・感想 [#ta686651]
今回はプログラミンングがメインの課題であった。sub関数が分...
ページ名: