2015a/Member/solo/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2015a/Member]]
*ライントレースについて [#e6a32001]
**コース [#ia7a4573]
&ref(./2015a-mission2.png,50%);
**内容 [#u05c2930]
コース上の黒線をたどりながら途中にあるピンポン球を回収し、目的地まで移動。そして、ピンポン球をゴールにシュートする。今回はB地点からA地点まで移動する。ただし、交差点、三叉路は直進する。
**今回のコースについて [#b223f9b9]
今回はBからAに向かって移動。道中にはピンポン球があり、それをつかんでAまで持って行き、ゴールへシュートを打つ。
*ロボットについて [#be69aa76]
**ロボットの基本構造 [#gd8eae80]
&ref(./_S__5988355.jpg,20%);
&ref(./_S__5988356.jpg,20%);
&ref(./_S__5988357.jpg,20%);
&ref(./_S__5988358.jpg,20%);
ロボットはシステム部分、車輪部分、アーム&光センサー部分の3つの構造から成り立っている。それぞれバラバラにすることができ、組み立てることによってロボットができる。光センサーは車体正面から見て少し左側にある。
**アーム及びシュート方法について [#v501414d]
&ref(./_19821.jpg,20%);
このロボットのアームは挟む、放すことができる。しかし、シュートは自動でできないのでプログラミングでロボットをうまく動かしてシュートする必要がある。
*プログラムについて [#a83d592f]
**プログラム及び説明[#kc6c9f3e]
今回はサブルーチンを用いてプログラミングした。
***定数及び定義 [#f9b27b40]
#define BLACK 39 //しきい値(黒の部分の最高値)
#define WHITE 50 //しきい値(白の部分の最低値)
#define Bcount 14 //線上における反応回数の上限
#define turn_L OnFwd(OUT_C); Off(OUT_A); //左に曲がる
#define turn_R OnFwd(OUT_A); Off(OUT_C); //右に曲がる
#define spin_L OnRev(OUT_A); Off(OUT_C); //左に旋回
#define STEP 1 //一回の判定によって行動する時間
#define junction OnRev(OUT_A); Wait(60); Off(OUT_A);\
Wait(200); OnFwd(OUT_AC); Wait(60); Off(OUT_AC);
//交差点にあたった時の行動
#define arm_open OnFwd(OUT_B); Wait(7); Off(OUT_B); //アームを開く
#define arm_close OnRev(OUT_B); Wait(7); Off(OUT_B); //アームを閉じる
#define STOP Off(OUT_AC); Wait(200); //一時停止
***ライントレース [#oae9115a]
sub linetrace_A()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int line_in=0;
int junction_count=0;
while(junction_count < 1){ //交差点一回まで動く
while(line_in < Bcount) { //線上連続反応回数で交差点を認識
if(SENSOR_2 < BLACK){ //黒なら右
turn_R;
line_in++;
} else {
if (SENSOR_2 < WHITE){ //境界線上なら左
turn_L;
} else { //白なら右旋回
spin_L;
}
line_in=0;
}
Wait(STEP);
}
Off(OUT_AC); //交差点を渡る
Wait(200);
junction;
line_in=0;
junction_count++;
}
}
このライントレースは最初の直角がきちんと曲がれるように製作。交差点を一回渡るごとに停止する。しかし、曲線にはめっぽう弱く、うまく働かないので次のようなプログラムも製作。
***ライントレース(急カーブ対応版) [#i70ae453]
sub linetrace_B()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int line_in=0;
int junction_count=0;
while(junction_count < 1){ //交差点一回まで動く
while(line_in < Bcount - 7){ //線上連続反応回数で交差点を認識
if(SENSOR_2 < BLACK){
OnFwd(OUT_A); OnRev(OUT_C); //黒なら右旋回
line_in++;
} else {
OnFwd(OUT_C); OnRev(OUT_A); //白なら左旋回
line_in=0;
}
Wait(STEP);
}
Off(OUT_AC); //交差点を渡る
Wait(200);
junction;
line_in=0;
junction_count++;
}
}
左右の車輪を前回転、後回転それぞれに回すことで急なカーブも曲がれるようにしている。この二つのライントレースを組み合わせて走る。
***シュート [#m6ca76c0]
sub shoot()
{
arm_open; OnFwd(OUT_AC); Wait(10);
Off(OUT_AC);
}
Aまで来たらボールをそのまま押し込んでゴールに入れる。
***メイン [#c44f63ef]
task main()
{
arm_open; // アームを開く
Wait(100);
linetrace_A(); //B地点からQ地点まで
Wait(100);
arm_close; //アームを閉じてボールをキャッチ
Wait(100);
linetrace_B(); //Q地点からP地点まで
linetrace_A(); //P地点からA地点まで
Wait(100); //シュート
shoot();
}
*まとめ [#se4ab5cc]
**よかった点 [#p527ea12]
・しっかり直角カーブを曲がれた
・ロボットを前回よりできる限り軽く、簡単な作りにできた
**反省点 [#k0ed4e46]
・ロボットが壊れやすかった
・ライントレースのプログラムを直角も急カーブもうまく対応できるものを作れたらよかった
・音を付けて次にどのような動きをするかを解かりやすくするべきだった
終了行:
[[2015a/Member]]
*ライントレースについて [#e6a32001]
**コース [#ia7a4573]
&ref(./2015a-mission2.png,50%);
**内容 [#u05c2930]
コース上の黒線をたどりながら途中にあるピンポン球を回収し、目的地まで移動。そして、ピンポン球をゴールにシュートする。今回はB地点からA地点まで移動する。ただし、交差点、三叉路は直進する。
**今回のコースについて [#b223f9b9]
今回はBからAに向かって移動。道中にはピンポン球があり、それをつかんでAまで持って行き、ゴールへシュートを打つ。
*ロボットについて [#be69aa76]
**ロボットの基本構造 [#gd8eae80]
&ref(./_S__5988355.jpg,20%);
&ref(./_S__5988356.jpg,20%);
&ref(./_S__5988357.jpg,20%);
&ref(./_S__5988358.jpg,20%);
ロボットはシステム部分、車輪部分、アーム&光センサー部分の3つの構造から成り立っている。それぞれバラバラにすることができ、組み立てることによってロボットができる。光センサーは車体正面から見て少し左側にある。
**アーム及びシュート方法について [#v501414d]
&ref(./_19821.jpg,20%);
このロボットのアームは挟む、放すことができる。しかし、シュートは自動でできないのでプログラミングでロボットをうまく動かしてシュートする必要がある。
*プログラムについて [#a83d592f]
**プログラム及び説明[#kc6c9f3e]
今回はサブルーチンを用いてプログラミングした。
***定数及び定義 [#f9b27b40]
#define BLACK 39 //しきい値(黒の部分の最高値)
#define WHITE 50 //しきい値(白の部分の最低値)
#define Bcount 14 //線上における反応回数の上限
#define turn_L OnFwd(OUT_C); Off(OUT_A); //左に曲がる
#define turn_R OnFwd(OUT_A); Off(OUT_C); //右に曲がる
#define spin_L OnRev(OUT_A); Off(OUT_C); //左に旋回
#define STEP 1 //一回の判定によって行動する時間
#define junction OnRev(OUT_A); Wait(60); Off(OUT_A);\
Wait(200); OnFwd(OUT_AC); Wait(60); Off(OUT_AC);
//交差点にあたった時の行動
#define arm_open OnFwd(OUT_B); Wait(7); Off(OUT_B); //アームを開く
#define arm_close OnRev(OUT_B); Wait(7); Off(OUT_B); //アームを閉じる
#define STOP Off(OUT_AC); Wait(200); //一時停止
***ライントレース [#oae9115a]
sub linetrace_A()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int line_in=0;
int junction_count=0;
while(junction_count < 1){ //交差点一回まで動く
while(line_in < Bcount) { //線上連続反応回数で交差点を認識
if(SENSOR_2 < BLACK){ //黒なら右
turn_R;
line_in++;
} else {
if (SENSOR_2 < WHITE){ //境界線上なら左
turn_L;
} else { //白なら右旋回
spin_L;
}
line_in=0;
}
Wait(STEP);
}
Off(OUT_AC); //交差点を渡る
Wait(200);
junction;
line_in=0;
junction_count++;
}
}
このライントレースは最初の直角がきちんと曲がれるように製作。交差点を一回渡るごとに停止する。しかし、曲線にはめっぽう弱く、うまく働かないので次のようなプログラムも製作。
***ライントレース(急カーブ対応版) [#i70ae453]
sub linetrace_B()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int line_in=0;
int junction_count=0;
while(junction_count < 1){ //交差点一回まで動く
while(line_in < Bcount - 7){ //線上連続反応回数で交差点を認識
if(SENSOR_2 < BLACK){
OnFwd(OUT_A); OnRev(OUT_C); //黒なら右旋回
line_in++;
} else {
OnFwd(OUT_C); OnRev(OUT_A); //白なら左旋回
line_in=0;
}
Wait(STEP);
}
Off(OUT_AC); //交差点を渡る
Wait(200);
junction;
line_in=0;
junction_count++;
}
}
左右の車輪を前回転、後回転それぞれに回すことで急なカーブも曲がれるようにしている。この二つのライントレースを組み合わせて走る。
***シュート [#m6ca76c0]
sub shoot()
{
arm_open; OnFwd(OUT_AC); Wait(10);
Off(OUT_AC);
}
Aまで来たらボールをそのまま押し込んでゴールに入れる。
***メイン [#c44f63ef]
task main()
{
arm_open; // アームを開く
Wait(100);
linetrace_A(); //B地点からQ地点まで
Wait(100);
arm_close; //アームを閉じてボールをキャッチ
Wait(100);
linetrace_B(); //Q地点からP地点まで
linetrace_A(); //P地点からA地点まで
Wait(100); //シュート
shoot();
}
*まとめ [#se4ab5cc]
**よかった点 [#p527ea12]
・しっかり直角カーブを曲がれた
・ロボットを前回よりできる限り軽く、簡単な作りにできた
**反省点 [#k0ed4e46]
・ロボットが壊れやすかった
・ライントレースのプログラムを直角も急カーブもうまく対応できるものを作れたらよかった
・音を付けて次にどのような動きをするかを解かりやすくするべきだった
ページ名: