2015a/Member/ahiru/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*課題2(ライントレース) [#x23a59f6]
第二回目の課題は、ライントレース(&ボール運び)ロボット...
**自分のコース [#jf1949a7]
今回選択したコースはC→A。Cを出発、P・Q間のボールを確保、...
下の画像は、ルートを簡略に説明したgif画像。
#ref(mission2course001.gif)
*ロボットについて [#f1479046]
下はロボットの全体写真。真横から撮影したものである。
#ref(./mission2_001.jpg,50%)
前輪にモーター2つ、後輪にはキャスターを用いた。また、ボー...
**車体部分について [#kf654dea]
前輪のタイヤの間隔を出来る限り狭くするよう心掛けた。その...
また、モーターの間隔を狭くするにあたって、前後に余分な空...
#ref(./mission2_006.jpg,50%)
光センサーは、床から高さ5mm程度に設定している。あまり距離...
#ref(./mission2_005.jpg,50%)
また、前回同様、キャスターの高さ調節には苦労した。垂直に...
本体とキャスターの取り付け部分に余裕をもたせているのは、...
**アームについて [#efccc724]
今回作成したアームは、モーターの回転によって上下するとい...
アームには、前にボールが転がらないようにするという役割を...
#ref(./mission2_003.jpg,50%)
ピンポン玉のような軽いものでは大差はないかもしれないが、...
***アームのギア比 [#h462160c]
アームが早く上下してしまうと、こちらの意図しない負荷が部...
#ref(./mission2_007.jpg,50%)
今回用いたギア比は、
+モーター(1)に歯数8の歯車をつけ、2本目の棒(2)の歯数40...
+2本目の棒には歯数40の歯車と歯数24の歯車がついている。(...
+歯数24の歯車と、3本目の棒(3)の歯数40の歯車に噛ませる。...
3本目の棒にアームがついている。
よって、ギア比は(1/5)*(3/5)*(3/5)=(9/125)となる...
*プログラムについて [#n62cfe2b]
プログラム全体を記載する。
#define THRESHOLD 47 //基準となるしきい値
#define HIPOWER 7 //直進時
#define LOWPOWER 4 //カーブトレース時
#define setpower_H SetPower(OUT_AC,HIPOWER);
#define setpower_L SetPower(OUT_AC,LOWPOWER);
#define go_forward setpower_H; OnFwd(OUT_AC);
#define go_back(t) setpower_H; OnRev(OUT_AC); Wait(t);
#define turn_left1 setpower_L; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_right1 setpower_L; OnFwd(OUT_A); OnRev(OUT_...
#define turn_left2 setpower_L; OnFwd(OUT_C); Off(OUT_A);
#define turn_right2 setpower_L;OnFwd(OUT_A); Off(OUT_C);
#define STEP 1
#define nMAX 7 //黒をカウントする最大値
#define short_break Off(OUT_AC); Wait(200); //交差点判...
#define cross_time 30
#define armtime 50 //アームの上下時間
#define arm_up OnFwd(OUT_B); Wait(armtime); Off(OUT_B);
#define arm_down OnRev(OUT_B); Wait(armtime); Off(OUT_B);
sub cross_line() { //交差点横断
OnFwd(OUT_AC);
Wait(cross_time);
Off(OUT_AC);
}
sub shoot() { //ゴールへシュート
arm_up;
go_forward;
Wait(50);
go_back(50);
}
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
int lc=0; //交差点の数をカウント
int nc=0; //黒に連続でなった回数をカウント
while (lc < 5) { //ゴール手前交差点でループ解除
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -8) { //39未満は黒
turn_left1; //左折
nc++;
} else {
if (SENSOR_1 < THRESHOLD -4) { //39〜42は黒...
turn_left2; //左旋回
} else if (SENSOR_1 < THRESHOLD +4) { //43〜50は灰色
go_forward; //直進
} else if (SENSOR_1 < THRESHOLD +8) { //51〜54は白...
turn_right2; //右旋回
} else { //55以上は白
turn_right1; //右折
}
nc=0; //カウンタを...
}
Wait(STEP);
}
short_break; //交差点時
turn_right1;
Wait(nMAX + 14);
cross_line();
nc=0;
lc++; //通過した交差点をカウント
if (lc == 2) { //2つ目の交差点での動作
arm_down; //ボールを固定
go_back(20);
turn_left1;
Wait(55);
Off(OUT_AC);
}
if (lc == 3) { //3つ目の交差点での動作
go_back(20);
turn_left1;
Wait(40);
Off(OUT_AC);
}
}
go_back(50); //ゴール手前交差点での動作
Off(OUT_AC);
shoot();
Off(OUT_AC);
}
**プログラミングについて [#mf1882b0]
今回のプログラミングでは、3段階に分けてプログラムを組み立...
+スムーズなトレースが出来るようにすること。
+交差点判断を明確にし、判断後の動作を調節すること。
+アームを使用し、今回の課題に添わせる内容にすること。
最初に上記のプログラムにあるライントレースの部分だけを完...
スタートからゴール手前の交差点まで一連のトレースが可能に...
***交差点判断について [#cc01eadd]
連続で黒と判断された回数をカウントすることによって、交差...
また、交差点横断だけでは不十分な部分を、交差点に差し掛か...
**トレースの精度を向上させる [#ua335086]
スムーズなトレースをさせるために、黒と白の境界(灰色)を...
黒灰色・白灰色は共に光度差4を範囲としてあるが、灰色は光度...
setpowerを用いているのは、直進時とカーブ時に緩急をつける...
**実際の映像 [#e3729495]
上記のプログラムを用いて実際に動作させた時の動画。
#ref(shisou03.mp4)
*製作時間 [#l8b70f08]
ロボット本体製作・・・4時間
プログラミング(試走行含む)・・・5時間
*今回の課題を通じての反省 [#e01af27f]
今回は、前回の書道ロボットに比べ、かなりスムーズに完成し...
※課題2・・・2015/07/16 (木) 最終更新
*ロボットコンテスト [#fb517c2d]
※課題2のページに追加更新という形をとる。
**ロボットコンテスト概要 [#v4fb8b34]
ロボティクス入門ゼミ最終週(2015年7月31日)にロボティクス...
ロボコンの詳細は[[こちら:http://yakushi.shinshu-u.ac.jp/r...
**ロボットについて [#kcadc6b7]
#ref(./robokon.jpg,65%)
ロボコンのロボット本体の基本構造は上記の課題2で説明した構...
ロボコン用のロボットは、AB共にアームと光センサーの位置を...
課題2のロボットは上下に動くアームでボール持ち上げ移動させ...
アームが左右に開く場合、同じ高さでは互いにぶつかり合うた...
また、AとBのロボットのアームパーツ(黄色のボールを挟んで...
**プログラム [#j5e42927]
***ロボットAのプログラム [#y80aeb9f]
#define THRESHOLD 40 //基準となるしきい値
#define HIPOWER 7
#define LOWPOWER 4
#define setpower_H SetPower(OUT_AC,HIPOWER);
#define setpower_L SetPower(OUT_AC,LOWPOWER);
#define go_forward setpower_H; OnFwd(OUT_AC);
#define go_back(t) setpower_H; OnRev(OUT_AC); Wait(t);
#define turn_left1 setpower_L; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_right1 setpower_L; OnFwd(OUT_A); OnRev(OUT_...
#define turn_left2 setpower_L; OnFwd(OUT_C); Off(OUT_A);
#define turn_right2 setpower_L; OnFwd(OUT_A); Off(OUT_C);
#define STEP 1
#define nMAX 6 //黒をカウントする最大値
#define short_break Off(OUT_AC); Wait(200);
#define cross_time 33 //交差点横断時間
#define armtime 15 //アーム開閉時間
#define arm_open setpower_L; OnFwd(OUT_B); Wait(armtime)...
#define arm_close setpower_L; OnRev(OUT_B); Wait(armtime...
#define signal_go 25
#define first_ball 150
sub cross_line() { //交差点横断
OnFwd(OUT_AC);
Wait(cross_time);
Off(OUT_AC);
}
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
int lc=0;
int nc=0;
ClearTimer(0);
ClearMessage();
while(FastTimer(0) < first_ball) { //Aゾーンからボール...
if (SENSOR_1 < THRESHOLD -7) { //ライン左側トレース
turn_left1;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_left2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_right2;
} else {
turn_right1;
}
}
Wait(STEP);
}
arm_close();
while (lc < 3) { //Bゾーンまで向かうライントレース
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -7) { //ライン左側トレース
turn_left1;
nc++;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_left2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_right2;
} else {
turn_right1;
}
nc=0;
}
Wait(STEP);
}
PlaySound(SOUND_CLICK); //交差点識別時のサウンド
lc++;
if (lc == 1) { //交差点一回目の動作
turn_right1;
Wait(nMAX + 15);
cross_line();
nc=0;
}
if (lc == 2) { //交差点二回目の動作
turn_right1;
Wait(nMAX + 22);
cross_line();
turn_right1;
Wait(10);
Off(OUT_AC);
nc=0;
}
}
nc=0;
turn_right1; //Bゾーン手前の直角
Wait(nMAX + 14);
Off(OUT_AC);
SendMessage(signal_go); //ロボットB始動命令
Wait(40);
arm_open(); //ロボットBにボール受け渡し完了
go_back(65); //ロボットAがCへ向かう
turn_right1;
Wait(50);
go_forward;
Wait(110);
Off(OUT_AC);
go_forward;
until (SENSOR_1 < THRESHOLD -7); //ラインまで直進
turn_right1;
Wait(50);
Off(OUT_AC);
if (true) { //Cゾーンまでトレース
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -7) { //ライン右側トレース
turn_right1;
nc++;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_right2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_left2;
} else {
turn_left1;
}
nc=0;
}
Wait(STEP);
}
PlaySound(SOUND_CLICK); //交差点識別時のサウンド
turn_left1;
Wait(nMAX + 14);
cross_line();
}
nc=0;
go_forward; //Cゾーンに入る
Wait(75);
turn_right1; //ボール受け取りのための位置修正
Wait(110);
Off(OUT_AC);
PlaySound(SOUND_DOWN); //ボール受け取り準備完了
until (Message() ==signal_go); //ロボットBより再始動命令
PlaySound(SOUND_UP); //ロボットA再始動
arm_close(); //ボール受け取り
Wait(250);
go_forward; //Cゾーンから離脱
Wait(120);
int bc=0;
while (bc < 3) { //CゾーンからAへ向かうライントレース
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -7) { //ライン左側トレース
turn_left1;
nc++;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_left2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_right2;
} else {
turn_right1;
}
nc=0;
}
Wait(STEP);
}
PlaySound(SOUND_CLICK); //交差点認識時のサウンド
turn_right1;
Wait(nMAX + 14);
cross_line();
nc=0;
bc++;
if (bc == 2) { //交差点二回目の追加動作
turn_right1;
Wait(60);
Off(OUT_AC);
}
}
go_forward; //Aゾーンに帰還
Wait(60);
turn_right1; //静止の方向修正
Wait(130);
Off(OUT_AC);
PlaySound(SOUND_DOWN); //ロボットA、Mission遂行完了
}
***ロボットBのプログラム [#ra19993f]
#define THRESHOLD 44 //基準となるしきい値
#define HIPOWER 7
#define LOWPOWER 4
#define setpower_H SetPower(OUT_AC,HIPOWER);
#define setpower_L SetPower(OUT_AC,LOWPOWER);
#define go_forward setpower_H; OnFwd(OUT_AC);
#define go_back(t) setpower_H; OnRev(OUT_AC); Wait(t);
#define turn_left1 setpower_L; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_right1 setpower_L; OnFwd(OUT_A); OnRev(OUT_...
#define turn_left2 setpower_L; OnFwd(OUT_C); Off(OUT_A);
#define turn_right2 setpower_L; OnFwd(OUT_A); Off(OUT_C);
#define STEP 1
#define nMAX 5 //黒をカウントする最大値
#define short_break Off(OUT_AC); Wait(200);
#define cross_time 40 //交差点横断時間
#define armtime 15 //アーム開閉時間
#define arm_open setpower_L; OnFwd(OUT_B); Wait(armtime)...
#define arm_close setpower_L; OnRev(OUT_B); Wait(armtime...
#define signal_go 25
sub cross_line() { //交差点横断
OnFwd(OUT_AC);
Wait(cross_time);
Off(OUT_AC);
}
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
int lc=0;
int nc=0;
ClearMessage();
until (Message() == signal_go); //ロボットAがBゾーンに...
PlaySound(SOUND_UP); //ロボットB始動
arm_close; //ボール受け取り
Wait(250);
go_forward; //Bゾーン離脱
Wait(140);
Off(OUT_AC);
while (lc < 4) { //BゾーンからCゾーンへ向かうライントレ...
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -7) { //ライン右側トレース
turn_right1;
nc++;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_right2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_left2;
} else {
turn_left1;
}
nc=0;
}
Wait(STEP);
}
PlaySound(SOUND_CLICK); //交差点認識時のサウンド
lc++;
if (lc == 1) { //交差点一回目の動作
turn_left1;
Wait(nMAX + 14);
cross_line();
nc=0;
}
if (lc == 2) { //交差点二回目の動作
turn_right2;
Wait(25);
turn_right1;
Wait(35);
Off(OUT_AC);
nc=0;
}
if (lc ==3) { //交差点三回目の動作
turn_left1;
Wait(nMAX + 14);
cross_line();
nc=0;
}
}
turn_left1; //Cゾーン手前の直角
Wait(nMAX + 20);
Off(OUT_AC);
SendMessage(signal_go); //ロボットA再始動命令
Wait(10);
arm_open; //ボール受け渡し完了
go_back(80); //ライントレースのコース上から離脱
turn_right1;
Wait(60);
go_forward;
Wait(200);
Off(OUT_AC);
PlaySound(SOUND_DOWN); //ロボットB、Mission遂行完了
}
**プログラミング・走行について [#l47b9281]
プログラムのライントレース部分に関しては、課題2とほとんど...
ロボコンに向けてのプログラミングを行うにあたって、AB共に8...
自分たちの班のロボコンがスタートするまでに、何とか改善し...
その時のプログラムの主な変更、追加点として、速度調節のた...
始動命令(signal_go)を受け取った際に、受け取りましたという...
arm_open(); //ロボットBにボール受け渡し完了
go_back(65); //ロボットAがCへ向かう
turn_right1;
Wait(50);
go_forward;
Wait(110);
Off(OUT_AC);
go_forward;
until (SENSOR_1 < THRESHOLD -7); //ラインまで直進
turn_right1;
Wait(50);
Off(OUT_AC);
上記のプログラムは、ロボットAのプログラムを一部抜粋したも...
BゾーンからCゾーンへロボットAが向かう際に、ライントレース...
以下が上記のプログラム動作を可視化した説明用gif画像である。
#ref(./robokon_roboA_until.gif)
**製作時間 [#j79c47b8]
ロボット製作・・・5時間
プログラミング(試走行含む)・・・12時間
**ロボコン反省 [#z748479c]
今回のロボコンでは、無事タイムを残すことができ、結果1位を...
時間に追われて作業した結果、プログラムにはまだ改善の余地...
大学高年次なるにつれ、ロボット、プログラミングはますます...
終了行:
#contents
*課題2(ライントレース) [#x23a59f6]
第二回目の課題は、ライントレース(&ボール運び)ロボット...
**自分のコース [#jf1949a7]
今回選択したコースはC→A。Cを出発、P・Q間のボールを確保、...
下の画像は、ルートを簡略に説明したgif画像。
#ref(mission2course001.gif)
*ロボットについて [#f1479046]
下はロボットの全体写真。真横から撮影したものである。
#ref(./mission2_001.jpg,50%)
前輪にモーター2つ、後輪にはキャスターを用いた。また、ボー...
**車体部分について [#kf654dea]
前輪のタイヤの間隔を出来る限り狭くするよう心掛けた。その...
また、モーターの間隔を狭くするにあたって、前後に余分な空...
#ref(./mission2_006.jpg,50%)
光センサーは、床から高さ5mm程度に設定している。あまり距離...
#ref(./mission2_005.jpg,50%)
また、前回同様、キャスターの高さ調節には苦労した。垂直に...
本体とキャスターの取り付け部分に余裕をもたせているのは、...
**アームについて [#efccc724]
今回作成したアームは、モーターの回転によって上下するとい...
アームには、前にボールが転がらないようにするという役割を...
#ref(./mission2_003.jpg,50%)
ピンポン玉のような軽いものでは大差はないかもしれないが、...
***アームのギア比 [#h462160c]
アームが早く上下してしまうと、こちらの意図しない負荷が部...
#ref(./mission2_007.jpg,50%)
今回用いたギア比は、
+モーター(1)に歯数8の歯車をつけ、2本目の棒(2)の歯数40...
+2本目の棒には歯数40の歯車と歯数24の歯車がついている。(...
+歯数24の歯車と、3本目の棒(3)の歯数40の歯車に噛ませる。...
3本目の棒にアームがついている。
よって、ギア比は(1/5)*(3/5)*(3/5)=(9/125)となる...
*プログラムについて [#n62cfe2b]
プログラム全体を記載する。
#define THRESHOLD 47 //基準となるしきい値
#define HIPOWER 7 //直進時
#define LOWPOWER 4 //カーブトレース時
#define setpower_H SetPower(OUT_AC,HIPOWER);
#define setpower_L SetPower(OUT_AC,LOWPOWER);
#define go_forward setpower_H; OnFwd(OUT_AC);
#define go_back(t) setpower_H; OnRev(OUT_AC); Wait(t);
#define turn_left1 setpower_L; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_right1 setpower_L; OnFwd(OUT_A); OnRev(OUT_...
#define turn_left2 setpower_L; OnFwd(OUT_C); Off(OUT_A);
#define turn_right2 setpower_L;OnFwd(OUT_A); Off(OUT_C);
#define STEP 1
#define nMAX 7 //黒をカウントする最大値
#define short_break Off(OUT_AC); Wait(200); //交差点判...
#define cross_time 30
#define armtime 50 //アームの上下時間
#define arm_up OnFwd(OUT_B); Wait(armtime); Off(OUT_B);
#define arm_down OnRev(OUT_B); Wait(armtime); Off(OUT_B);
sub cross_line() { //交差点横断
OnFwd(OUT_AC);
Wait(cross_time);
Off(OUT_AC);
}
sub shoot() { //ゴールへシュート
arm_up;
go_forward;
Wait(50);
go_back(50);
}
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
int lc=0; //交差点の数をカウント
int nc=0; //黒に連続でなった回数をカウント
while (lc < 5) { //ゴール手前交差点でループ解除
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -8) { //39未満は黒
turn_left1; //左折
nc++;
} else {
if (SENSOR_1 < THRESHOLD -4) { //39〜42は黒...
turn_left2; //左旋回
} else if (SENSOR_1 < THRESHOLD +4) { //43〜50は灰色
go_forward; //直進
} else if (SENSOR_1 < THRESHOLD +8) { //51〜54は白...
turn_right2; //右旋回
} else { //55以上は白
turn_right1; //右折
}
nc=0; //カウンタを...
}
Wait(STEP);
}
short_break; //交差点時
turn_right1;
Wait(nMAX + 14);
cross_line();
nc=0;
lc++; //通過した交差点をカウント
if (lc == 2) { //2つ目の交差点での動作
arm_down; //ボールを固定
go_back(20);
turn_left1;
Wait(55);
Off(OUT_AC);
}
if (lc == 3) { //3つ目の交差点での動作
go_back(20);
turn_left1;
Wait(40);
Off(OUT_AC);
}
}
go_back(50); //ゴール手前交差点での動作
Off(OUT_AC);
shoot();
Off(OUT_AC);
}
**プログラミングについて [#mf1882b0]
今回のプログラミングでは、3段階に分けてプログラムを組み立...
+スムーズなトレースが出来るようにすること。
+交差点判断を明確にし、判断後の動作を調節すること。
+アームを使用し、今回の課題に添わせる内容にすること。
最初に上記のプログラムにあるライントレースの部分だけを完...
スタートからゴール手前の交差点まで一連のトレースが可能に...
***交差点判断について [#cc01eadd]
連続で黒と判断された回数をカウントすることによって、交差...
また、交差点横断だけでは不十分な部分を、交差点に差し掛か...
**トレースの精度を向上させる [#ua335086]
スムーズなトレースをさせるために、黒と白の境界(灰色)を...
黒灰色・白灰色は共に光度差4を範囲としてあるが、灰色は光度...
setpowerを用いているのは、直進時とカーブ時に緩急をつける...
**実際の映像 [#e3729495]
上記のプログラムを用いて実際に動作させた時の動画。
#ref(shisou03.mp4)
*製作時間 [#l8b70f08]
ロボット本体製作・・・4時間
プログラミング(試走行含む)・・・5時間
*今回の課題を通じての反省 [#e01af27f]
今回は、前回の書道ロボットに比べ、かなりスムーズに完成し...
※課題2・・・2015/07/16 (木) 最終更新
*ロボットコンテスト [#fb517c2d]
※課題2のページに追加更新という形をとる。
**ロボットコンテスト概要 [#v4fb8b34]
ロボティクス入門ゼミ最終週(2015年7月31日)にロボティクス...
ロボコンの詳細は[[こちら:http://yakushi.shinshu-u.ac.jp/r...
**ロボットについて [#kcadc6b7]
#ref(./robokon.jpg,65%)
ロボコンのロボット本体の基本構造は上記の課題2で説明した構...
ロボコン用のロボットは、AB共にアームと光センサーの位置を...
課題2のロボットは上下に動くアームでボール持ち上げ移動させ...
アームが左右に開く場合、同じ高さでは互いにぶつかり合うた...
また、AとBのロボットのアームパーツ(黄色のボールを挟んで...
**プログラム [#j5e42927]
***ロボットAのプログラム [#y80aeb9f]
#define THRESHOLD 40 //基準となるしきい値
#define HIPOWER 7
#define LOWPOWER 4
#define setpower_H SetPower(OUT_AC,HIPOWER);
#define setpower_L SetPower(OUT_AC,LOWPOWER);
#define go_forward setpower_H; OnFwd(OUT_AC);
#define go_back(t) setpower_H; OnRev(OUT_AC); Wait(t);
#define turn_left1 setpower_L; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_right1 setpower_L; OnFwd(OUT_A); OnRev(OUT_...
#define turn_left2 setpower_L; OnFwd(OUT_C); Off(OUT_A);
#define turn_right2 setpower_L; OnFwd(OUT_A); Off(OUT_C);
#define STEP 1
#define nMAX 6 //黒をカウントする最大値
#define short_break Off(OUT_AC); Wait(200);
#define cross_time 33 //交差点横断時間
#define armtime 15 //アーム開閉時間
#define arm_open setpower_L; OnFwd(OUT_B); Wait(armtime)...
#define arm_close setpower_L; OnRev(OUT_B); Wait(armtime...
#define signal_go 25
#define first_ball 150
sub cross_line() { //交差点横断
OnFwd(OUT_AC);
Wait(cross_time);
Off(OUT_AC);
}
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
int lc=0;
int nc=0;
ClearTimer(0);
ClearMessage();
while(FastTimer(0) < first_ball) { //Aゾーンからボール...
if (SENSOR_1 < THRESHOLD -7) { //ライン左側トレース
turn_left1;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_left2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_right2;
} else {
turn_right1;
}
}
Wait(STEP);
}
arm_close();
while (lc < 3) { //Bゾーンまで向かうライントレース
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -7) { //ライン左側トレース
turn_left1;
nc++;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_left2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_right2;
} else {
turn_right1;
}
nc=0;
}
Wait(STEP);
}
PlaySound(SOUND_CLICK); //交差点識別時のサウンド
lc++;
if (lc == 1) { //交差点一回目の動作
turn_right1;
Wait(nMAX + 15);
cross_line();
nc=0;
}
if (lc == 2) { //交差点二回目の動作
turn_right1;
Wait(nMAX + 22);
cross_line();
turn_right1;
Wait(10);
Off(OUT_AC);
nc=0;
}
}
nc=0;
turn_right1; //Bゾーン手前の直角
Wait(nMAX + 14);
Off(OUT_AC);
SendMessage(signal_go); //ロボットB始動命令
Wait(40);
arm_open(); //ロボットBにボール受け渡し完了
go_back(65); //ロボットAがCへ向かう
turn_right1;
Wait(50);
go_forward;
Wait(110);
Off(OUT_AC);
go_forward;
until (SENSOR_1 < THRESHOLD -7); //ラインまで直進
turn_right1;
Wait(50);
Off(OUT_AC);
if (true) { //Cゾーンまでトレース
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -7) { //ライン右側トレース
turn_right1;
nc++;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_right2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_left2;
} else {
turn_left1;
}
nc=0;
}
Wait(STEP);
}
PlaySound(SOUND_CLICK); //交差点識別時のサウンド
turn_left1;
Wait(nMAX + 14);
cross_line();
}
nc=0;
go_forward; //Cゾーンに入る
Wait(75);
turn_right1; //ボール受け取りのための位置修正
Wait(110);
Off(OUT_AC);
PlaySound(SOUND_DOWN); //ボール受け取り準備完了
until (Message() ==signal_go); //ロボットBより再始動命令
PlaySound(SOUND_UP); //ロボットA再始動
arm_close(); //ボール受け取り
Wait(250);
go_forward; //Cゾーンから離脱
Wait(120);
int bc=0;
while (bc < 3) { //CゾーンからAへ向かうライントレース
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -7) { //ライン左側トレース
turn_left1;
nc++;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_left2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_right2;
} else {
turn_right1;
}
nc=0;
}
Wait(STEP);
}
PlaySound(SOUND_CLICK); //交差点認識時のサウンド
turn_right1;
Wait(nMAX + 14);
cross_line();
nc=0;
bc++;
if (bc == 2) { //交差点二回目の追加動作
turn_right1;
Wait(60);
Off(OUT_AC);
}
}
go_forward; //Aゾーンに帰還
Wait(60);
turn_right1; //静止の方向修正
Wait(130);
Off(OUT_AC);
PlaySound(SOUND_DOWN); //ロボットA、Mission遂行完了
}
***ロボットBのプログラム [#ra19993f]
#define THRESHOLD 44 //基準となるしきい値
#define HIPOWER 7
#define LOWPOWER 4
#define setpower_H SetPower(OUT_AC,HIPOWER);
#define setpower_L SetPower(OUT_AC,LOWPOWER);
#define go_forward setpower_H; OnFwd(OUT_AC);
#define go_back(t) setpower_H; OnRev(OUT_AC); Wait(t);
#define turn_left1 setpower_L; OnFwd(OUT_C); OnRev(OUT_A);
#define turn_right1 setpower_L; OnFwd(OUT_A); OnRev(OUT_...
#define turn_left2 setpower_L; OnFwd(OUT_C); Off(OUT_A);
#define turn_right2 setpower_L; OnFwd(OUT_A); Off(OUT_C);
#define STEP 1
#define nMAX 5 //黒をカウントする最大値
#define short_break Off(OUT_AC); Wait(200);
#define cross_time 40 //交差点横断時間
#define armtime 15 //アーム開閉時間
#define arm_open setpower_L; OnFwd(OUT_B); Wait(armtime)...
#define arm_close setpower_L; OnRev(OUT_B); Wait(armtime...
#define signal_go 25
sub cross_line() { //交差点横断
OnFwd(OUT_AC);
Wait(cross_time);
Off(OUT_AC);
}
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
int lc=0;
int nc=0;
ClearMessage();
until (Message() == signal_go); //ロボットAがBゾーンに...
PlaySound(SOUND_UP); //ロボットB始動
arm_close; //ボール受け取り
Wait(250);
go_forward; //Bゾーン離脱
Wait(140);
Off(OUT_AC);
while (lc < 4) { //BゾーンからCゾーンへ向かうライントレ...
while (nc < nMAX) {
if (SENSOR_1 < THRESHOLD -7) { //ライン右側トレース
turn_right1;
nc++;
} else {
if (SENSOR_1 < THRESHOLD -3) {
turn_right2;
} else if (SENSOR_1 < THRESHOLD +3) {
go_forward;
} else if (SENSOR_1 < THRESHOLD +7) {
turn_left2;
} else {
turn_left1;
}
nc=0;
}
Wait(STEP);
}
PlaySound(SOUND_CLICK); //交差点認識時のサウンド
lc++;
if (lc == 1) { //交差点一回目の動作
turn_left1;
Wait(nMAX + 14);
cross_line();
nc=0;
}
if (lc == 2) { //交差点二回目の動作
turn_right2;
Wait(25);
turn_right1;
Wait(35);
Off(OUT_AC);
nc=0;
}
if (lc ==3) { //交差点三回目の動作
turn_left1;
Wait(nMAX + 14);
cross_line();
nc=0;
}
}
turn_left1; //Cゾーン手前の直角
Wait(nMAX + 20);
Off(OUT_AC);
SendMessage(signal_go); //ロボットA再始動命令
Wait(10);
arm_open; //ボール受け渡し完了
go_back(80); //ライントレースのコース上から離脱
turn_right1;
Wait(60);
go_forward;
Wait(200);
Off(OUT_AC);
PlaySound(SOUND_DOWN); //ロボットB、Mission遂行完了
}
**プログラミング・走行について [#l47b9281]
プログラムのライントレース部分に関しては、課題2とほとんど...
ロボコンに向けてのプログラミングを行うにあたって、AB共に8...
自分たちの班のロボコンがスタートするまでに、何とか改善し...
その時のプログラムの主な変更、追加点として、速度調節のた...
始動命令(signal_go)を受け取った際に、受け取りましたという...
arm_open(); //ロボットBにボール受け渡し完了
go_back(65); //ロボットAがCへ向かう
turn_right1;
Wait(50);
go_forward;
Wait(110);
Off(OUT_AC);
go_forward;
until (SENSOR_1 < THRESHOLD -7); //ラインまで直進
turn_right1;
Wait(50);
Off(OUT_AC);
上記のプログラムは、ロボットAのプログラムを一部抜粋したも...
BゾーンからCゾーンへロボットAが向かう際に、ライントレース...
以下が上記のプログラム動作を可視化した説明用gif画像である。
#ref(./robokon_roboA_until.gif)
**製作時間 [#j79c47b8]
ロボット製作・・・5時間
プログラミング(試走行含む)・・・12時間
**ロボコン反省 [#z748479c]
今回のロボコンでは、無事タイムを残すことができ、結果1位を...
時間に追われて作業した結果、プログラムにはまだ改善の余地...
大学高年次なるにつれ、ロボット、プログラミングはますます...
ページ名: