2013a/Member/shu/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2013a/MemberOnly/進行状況]]
#contents
*ロボット [#md7beda4]
#ref(2013a/Member/shu/Mission2/zentai.jpeg,100%,全体)
#ref(2013a/Member/shu/Mission2/hutaage.jpeg,100%,全体2)
**ロボットの説明 [#me354e0f]
***車軸回り [#w6c47205]
課題1の車軸回りを参考にして、同じように細めに作りました。~
前回の課題であった壊れやすさを補うために様々な改良が施さ...
たとえばL字型の部品を使ってモーターを固定している点など...
前回より強固な車軸ができたと思います。~
#ref(2013a/Member/shu/Mission2/syaziku.jpeg,100%,車軸回り)
***発射機構&受取機構 [#v3b7201d]
ここが一番の課題でした。~
最初の計画ではプーリの回転を使った機構を考えていましたが...
受け取るときはふたを被せるようにしてボールを押さえつける...
打ち出すときはふたの一番奥についている棒ではじいて打ち出...
打ち出す棒がまっすぐなのでボールがふたの中のどの位置にあ...
#ref(2013a/Member/shu/Mission2/huta.jpeg,100%,発射機構&...
~
この機構を動かすためにはモーターを非常に不安定な場所につ...
また、モーターがうまく収まらず、歯車同士のかみ合わせが非...
このかみ合わせを直すために大小さまざまな歯車を組み合わせ...
これによって何とか動くまでにかみ合わせを修正できました。~
#ref(2013a/Member/shu/Mission2/haguruma.jpeg,100%,歯車)
**工夫した点 [#lfa10ce7]
-ボールを撃つ機構とボールを受け取る機構を一つのモーターで...
-車輪の間隔を限界まで狭くして小回りのききやすいロボットに...
-被せる蓋を横に広くすることでパスミスをカバーしやすくした。
-車高を低くすることで重心を低くし、安定性を出した。
**苦労した点 [#w25f0a11]
歯車をうまくかみ合わせるのが非常に難しく、最終的に少し歯...
また、ライントレース用の光センサーと車軸との距離をできる...
*コース攻略 [#yca92c60]
**ボールをシュートする側 [#od625558]
#ref(2013a/Member/shu/Mission2/robocon2013a.png,100%,シュ...
+スタートは�から
+�から�までは交差点ありのライントレース
+交差点の数で�を判断してコース内側を向く
+パスをもらったら向きを戻して�まで交差点ありライン...
+交差点を過ぎてからの時間指定で�を判断してコース内...
+パスを打ったら向きを戻して�まで交差点ありライント...
+交差点を過ぎてからの時間指定で�を判断してコース内...
+パスをもらったら向きを戻して交差点ありライントレース
+�の交差点を判断したら左に旋回してシュート
**ボールをシュートしない側 [#va31b664]
#ref(2013a/Member/shu/Mission2/not_shot.png,100%,シュート...
+スタートは�から
+�から�までは交差点ありのライントレース
+交差点からの時間で�を判断したらボールのほうを向い...
+ボールを取ったら左旋回をしてまっすぐ進み、ラインについた...
+�の交差点を判断したらコース内側を向きパスを打つ
+パスを打ったら元の向きに戻って交差点ありライントレース
+交差点からの時間で�を判断してコース内側を向き、パ...
+パスをもらったら元の向きに戻って交差点ありライントレース
+�の交差点を判断したらコース内側を向いてパス
*プログラム [#ja822e4d]
**全体紹介 [#o849cfc6]
***ボールをシュートする側 [#se6ab982]
#define BLACK_high 36 //一番黒いしきい値
#define BLACK_low 38 //少し黒いしきい値
#define WHITE_low 42 //少し白いしきい値
#define WHITE_high 44 //一番白いしきい値
#define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //...
#define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左...
#define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //...
#define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //...
#define go_fwd OnFwd(OUT_AC); //前進
#define short_break Off(OUT_AC); Wait(100); //小休止
#define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
#define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受...
#define time2 10 //シュートしない側が交差点から一回目に...
#define time3 10 //シュートしない側が交差点から二回目に...
#define nMAX 300 //交差点と判断する基準
#define STEP 1 //ライントレース時の待ち時間
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0;
int nCross=0;
int counter=0;
while (nCross < 2) {
//交差点までのライントレース
while (nOnline < nMAX) {
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low) {
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP); //交差点を感知してwhileから抜ける
short_break;
nCross++;
nOnline=0;
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 4500);
CATCHBALL;
turn_left_senkai;
Wait(70);
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
nCross=0;
turn_right_senkai;
wait(70);
until(FastTimer(1) > 6000);
SHOTBALL;
turn_left_senkai;
Wait(70);
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
turn_right_senkai;
Wait(70);
until(FastTimer(1) > 7500);
CATCHBALL;
turn_left_senkai;
Wait(70);
while(counter < 1){
while(nOnline < nMAX){
if (SENSOR_1 < 38){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < 39){
turn_right_kaiten;
} else if (SENSOR_1 < 42){
go_fwd;
} else if (SENSOR_1 < 44){
turn_left_kaiten;
} else {
turn_left_senkai;
}
}
nOnline=0;
}
Wait(STEP);
}
short_break;
turn_left_senkai; Wait(150);
go_rev; Wait(100);
SHOTBALL;
}
***ボールをシュートしない側 [#o71443ca]
#define BLACK_high 36 //一番黒いしきい値
#define BLACK_low 38 //少し黒いしきい値
#define WHITE_low 42 //少し白いしきい値
#define WHITE_high 44 //一番白いしきい値
#define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //...
#define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左...
#define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //...
#define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //...
#define go_fwd OnFwd(OUT_AC); //前進
#define short_break Off(OUT_AC); Wait(100); //小休止
#define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
#define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受...
#define TURNSTEP 10 //横のセンサーを使う時の繰り返しの...
#define time2 10 //シュートしない側が交差点から一回目に...
#define time3 10 //シュートしない側が交差点から二回目に...
#define nMAX 300 //交差点と判断する基準
#define STEP 1 //ライントレース時の待ち時間
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0;
int nCross=0;
ClearTimer(0);
while(nCross <= 1){
while(nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_left_senkai ;
nOnline++ ;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nOnline == 0;
nCross ++;
short_break;
cross_line;
}
nCross=0;
go_fwd;
Wait(500);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(100); //ボールに向く
CATCHBALL;
OnFwd(OUT_AC);
Wait(200); //ボールを取る
until(SENSOR_1 < BLACK_low){
turn_left_kaiten;
} //コースに戻る
while(nCross <= 1){
if(SENSOR_1 < BLACK_high){
turn_left_senkai;
nOnline ++;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nCross=0;
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 4500);
SHOTBALL;
turn_right_senkai;
Wait(70);
while(nCross <= 1){
if(SENSOR_1 < BLACK_high){
turn_left_senkai;
nOnline ++;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nCross=0;
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 6000);
CATCHBALL;
turn_right_senkai;
Wait(70);
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 7500);
SHOTBALL;
}
**ボールをシュートする側の細かな説明 [#oc4badff]
***定義 [#fa647009]
#define BLACK_high 36 //一番黒いしきい値
#define BLACK_low 38 //少し黒いしきい値
#define WHITE_low 42 //少し白いしきい値
#define WHITE_high 44 //一番白いしきい値
#define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //...
#define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左...
#define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //...
#define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //...
#define go_fwd OnFwd(OUT_AC); //前進
#define short_break Off(OUT_AC); Wait(100); //小休止
#define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
#define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受...
#define time2 10 //シュートしない側が交差点から一回目に...
#define time3 10 //シュートしない側が交差点から二回目に...
#define nMAX 300 //交差点と判断する基準
#define STEP 1 //ライントレース時の待ち時間
~
まずはライントレース時のしきい値とライントレースするとき...
続いてこの課題で重要な動きであるボールの発射と受け取りの...
最後に時間関係の定数を定義します。~
***スタートから第一のパス [#e200f31d]
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0;
int nCross=0;
int counter=0;
while (nCross < 2) {
//交差点までのライントレース
while (nOnline < nMAX) {
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low) {
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP); //交差点を感知してwhileから抜ける
short_break;
nCross++;
nOnline=0;
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 4500);
CATCHBALL;
turn_left_senkai;
Wait(70);
~
まずはスタート位置から二回交差点をこえるまでライントレー...
二回目の交差点をこえたら左に旋回してパスをもらう準備をし...
スタートしてからの時間がある点をこえたときにパスをします。~
そのままボールを持ちながら進む方向へと向きを変えます。~
***第一パスから第二パス [#x6eebfdc]
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
nCross=0;
turn_right_senkai;
wait(70);
until(FastTimer(1) > 6000);
SHOTBALL;
turn_left_senkai;
Wait(70);
~
第一パスを終えたらそのままライントレースを行い交差点まで...
交差点をこえた時から時間をはかり二つの交差点の中心までラ...
中心についたら右に旋回してパスを待ちます。~
再びスタートしてからの時間がある点をこえたときにパスをし...
パスを打ち終わったら元の向きに戻ります。~
***第二パスから第三パス [#r3994544]
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
turn_right_senkai;
Wait(70);
until(FastTimer(1) > 7500);
CATCHBALL;
turn_left_senkai;
Wait(70);
~
ここは第一から第二とほぼ同じ動きをします。~
違うところは交差点から時間で進むときの距離が短いことです。~
***第三パスからシュート [#xca79d27]
while(counter < 1){
while(nOnline < nMAX){
if (SENSOR_1 < 38){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < 39){
turn_right_kaiten;
} else if (SENSOR_1 < 42){
go_fwd;
} else if (SENSOR_1 < 44){
turn_left_kaiten;
} else {
turn_left_senkai;
}
}
nOnline=0;
}
Wait(STEP);
}
short_break;
turn_left_senkai; Wait(150);
go_rev; Wait(100);
SHOTBALL;
}
~
まずはゴール近くの交差点までひたすらライントレースをしま...
この交差点を基準にすることで時間指定するよりも誤差が格段...
あとは左に旋回し、後ろに少し下がってからシュートを打ちま...
後ろに下がるのは規定に「輪の中に入った状態でシュートをし...
**ボールをシュートしない側の細かな説明 [#s01974ff]
***定義 [#xcb8f087]
#define BLACK_high 36 //一番黒いしきい値
#define BLACK_low 38 //少し黒いしきい値
#define WHITE_low 42 //少し白いしきい値
#define WHITE_high 44 //一番白いしきい値
#define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //...
#define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左...
#define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //...
#define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //...
#define go_fwd OnFwd(OUT_AC); //前進
#define short_break Off(OUT_AC); Wait(100); //小休止
#define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
#define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受...
#define TURNSTEP 10 //横のセンサーを使う時の繰り返しの...
#define time2 10 //シュートしない側が交差点から一回目に...
#define time3 10 //シュートしない側が交差点から二回目に...
#define nMAX 300 //交差点と判断する基準
#define STEP 1 //ライントレース時の待ち時間
~
ここはシュートする側とほぼ同じになります。~
進む時間に微妙な違いがあります。~
***スタートからボールを取るまで [#p983ccd5]
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0;
int nCross=0;
ClearTimer(0);
while(nCross <= 1){
while(nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_left_senkai ;
nOnline++ ;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nOnline == 0;
nCross ++;
short_break;
cross_line;
}
nCross=0;
go_fwd;
Wait(500);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(100); //ボールに向く
CATCHBALL;
OnFwd(OUT_AC);
Wait(200); //ボールを取る
~
まずは交差点までライントレースをします。~
交差点をこえたら一定時間直進をし、そのまま右に旋回しボー...
ライントレースしながらの時間指定だとしきい値によって進む...
ボールに向いたらそのまま直進しボールを取ります。~
***ボールを取ってから第一パスまで [#g6ff842b]
until(SENSOR_1 < BLACK_low){
turn_left_kaiten;
} //コースに戻る
while(nCross <= 1){
if(SENSOR_1 < BLACK_high){
turn_left_senkai;
nOnline ++;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nCross=0;
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 4500);
SHOTBALL;
turn_right_senkai;
Wait(70);
~
ボールを取ったらラインを感知するまで左に進み、ラインに乗...
交差点までライントレースをして、交差点を感知したらコース...
スタートしてからの時間がある点をこえたところでパスをして...
***第一パスから第二パス [#m3639805]
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 6000);
CATCHBALL;
turn_right_senkai;
Wait(70);
~
第一パスを終えたら再び時間指定付きライントレースを行いま...
ここの距離は短いので誤差は少なくて済みます。~
ある点まですすんだらコース内側を向き、パスの準備をします。~
スタートしてからの時間がある点をこえたところでパスをして...
***第二パスから第三パス [#q41cab41]
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 7500);
SHOTBALL;
}
~
第二パスを終えたら次の交差点までライントレースをします。~
交差点をこえたら少し進んでから左に旋回してコース内側を向...
スタートしてからの時間がある点をこえたところでパスをして...
*感想 [#j043eb13]
今回は二つのロボットを使うということで役割分担をしっかり...
ロボット自体はほとんど同じ形にすることでシュート位置のず...
前回の課題では準備不足が祟って失敗してしまったので今回は...
しかしテスト期間と重なったのもあってかなかなか4人で集まる...
結局集まれるようになったのは本番の一週間前からでほとんど...
しかしここでプログラムを合わせるとロボットが命令どうりに...
これによって動作を一つずつ確認しながらプログラムを合わせ...
そんな不完全なまま本番に臨んでしまい、結果は散々たるもの...
今回の敗因はお互いの認識に若干の誤差があったため思うよう...
これは社会にでてからチームでプログラムを作るときにとても...
もっと深く話し合ってお互いの認識が一致しているか確認して...
このゼミはこれで終わりですが、ここでの失敗を別の機会に生...
終了行:
[[2013a/MemberOnly/進行状況]]
#contents
*ロボット [#md7beda4]
#ref(2013a/Member/shu/Mission2/zentai.jpeg,100%,全体)
#ref(2013a/Member/shu/Mission2/hutaage.jpeg,100%,全体2)
**ロボットの説明 [#me354e0f]
***車軸回り [#w6c47205]
課題1の車軸回りを参考にして、同じように細めに作りました。~
前回の課題であった壊れやすさを補うために様々な改良が施さ...
たとえばL字型の部品を使ってモーターを固定している点など...
前回より強固な車軸ができたと思います。~
#ref(2013a/Member/shu/Mission2/syaziku.jpeg,100%,車軸回り)
***発射機構&受取機構 [#v3b7201d]
ここが一番の課題でした。~
最初の計画ではプーリの回転を使った機構を考えていましたが...
受け取るときはふたを被せるようにしてボールを押さえつける...
打ち出すときはふたの一番奥についている棒ではじいて打ち出...
打ち出す棒がまっすぐなのでボールがふたの中のどの位置にあ...
#ref(2013a/Member/shu/Mission2/huta.jpeg,100%,発射機構&...
~
この機構を動かすためにはモーターを非常に不安定な場所につ...
また、モーターがうまく収まらず、歯車同士のかみ合わせが非...
このかみ合わせを直すために大小さまざまな歯車を組み合わせ...
これによって何とか動くまでにかみ合わせを修正できました。~
#ref(2013a/Member/shu/Mission2/haguruma.jpeg,100%,歯車)
**工夫した点 [#lfa10ce7]
-ボールを撃つ機構とボールを受け取る機構を一つのモーターで...
-車輪の間隔を限界まで狭くして小回りのききやすいロボットに...
-被せる蓋を横に広くすることでパスミスをカバーしやすくした。
-車高を低くすることで重心を低くし、安定性を出した。
**苦労した点 [#w25f0a11]
歯車をうまくかみ合わせるのが非常に難しく、最終的に少し歯...
また、ライントレース用の光センサーと車軸との距離をできる...
*コース攻略 [#yca92c60]
**ボールをシュートする側 [#od625558]
#ref(2013a/Member/shu/Mission2/robocon2013a.png,100%,シュ...
+スタートは�から
+�から�までは交差点ありのライントレース
+交差点の数で�を判断してコース内側を向く
+パスをもらったら向きを戻して�まで交差点ありライン...
+交差点を過ぎてからの時間指定で�を判断してコース内...
+パスを打ったら向きを戻して�まで交差点ありライント...
+交差点を過ぎてからの時間指定で�を判断してコース内...
+パスをもらったら向きを戻して交差点ありライントレース
+�の交差点を判断したら左に旋回してシュート
**ボールをシュートしない側 [#va31b664]
#ref(2013a/Member/shu/Mission2/not_shot.png,100%,シュート...
+スタートは�から
+�から�までは交差点ありのライントレース
+交差点からの時間で�を判断したらボールのほうを向い...
+ボールを取ったら左旋回をしてまっすぐ進み、ラインについた...
+�の交差点を判断したらコース内側を向きパスを打つ
+パスを打ったら元の向きに戻って交差点ありライントレース
+交差点からの時間で�を判断してコース内側を向き、パ...
+パスをもらったら元の向きに戻って交差点ありライントレース
+�の交差点を判断したらコース内側を向いてパス
*プログラム [#ja822e4d]
**全体紹介 [#o849cfc6]
***ボールをシュートする側 [#se6ab982]
#define BLACK_high 36 //一番黒いしきい値
#define BLACK_low 38 //少し黒いしきい値
#define WHITE_low 42 //少し白いしきい値
#define WHITE_high 44 //一番白いしきい値
#define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //...
#define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左...
#define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //...
#define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //...
#define go_fwd OnFwd(OUT_AC); //前進
#define short_break Off(OUT_AC); Wait(100); //小休止
#define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
#define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受...
#define time2 10 //シュートしない側が交差点から一回目に...
#define time3 10 //シュートしない側が交差点から二回目に...
#define nMAX 300 //交差点と判断する基準
#define STEP 1 //ライントレース時の待ち時間
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0;
int nCross=0;
int counter=0;
while (nCross < 2) {
//交差点までのライントレース
while (nOnline < nMAX) {
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low) {
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP); //交差点を感知してwhileから抜ける
short_break;
nCross++;
nOnline=0;
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 4500);
CATCHBALL;
turn_left_senkai;
Wait(70);
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
nCross=0;
turn_right_senkai;
wait(70);
until(FastTimer(1) > 6000);
SHOTBALL;
turn_left_senkai;
Wait(70);
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
turn_right_senkai;
Wait(70);
until(FastTimer(1) > 7500);
CATCHBALL;
turn_left_senkai;
Wait(70);
while(counter < 1){
while(nOnline < nMAX){
if (SENSOR_1 < 38){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < 39){
turn_right_kaiten;
} else if (SENSOR_1 < 42){
go_fwd;
} else if (SENSOR_1 < 44){
turn_left_kaiten;
} else {
turn_left_senkai;
}
}
nOnline=0;
}
Wait(STEP);
}
short_break;
turn_left_senkai; Wait(150);
go_rev; Wait(100);
SHOTBALL;
}
***ボールをシュートしない側 [#o71443ca]
#define BLACK_high 36 //一番黒いしきい値
#define BLACK_low 38 //少し黒いしきい値
#define WHITE_low 42 //少し白いしきい値
#define WHITE_high 44 //一番白いしきい値
#define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //...
#define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左...
#define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //...
#define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //...
#define go_fwd OnFwd(OUT_AC); //前進
#define short_break Off(OUT_AC); Wait(100); //小休止
#define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
#define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受...
#define TURNSTEP 10 //横のセンサーを使う時の繰り返しの...
#define time2 10 //シュートしない側が交差点から一回目に...
#define time3 10 //シュートしない側が交差点から二回目に...
#define nMAX 300 //交差点と判断する基準
#define STEP 1 //ライントレース時の待ち時間
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0;
int nCross=0;
ClearTimer(0);
while(nCross <= 1){
while(nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_left_senkai ;
nOnline++ ;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nOnline == 0;
nCross ++;
short_break;
cross_line;
}
nCross=0;
go_fwd;
Wait(500);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(100); //ボールに向く
CATCHBALL;
OnFwd(OUT_AC);
Wait(200); //ボールを取る
until(SENSOR_1 < BLACK_low){
turn_left_kaiten;
} //コースに戻る
while(nCross <= 1){
if(SENSOR_1 < BLACK_high){
turn_left_senkai;
nOnline ++;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nCross=0;
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 4500);
SHOTBALL;
turn_right_senkai;
Wait(70);
while(nCross <= 1){
if(SENSOR_1 < BLACK_high){
turn_left_senkai;
nOnline ++;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nCross=0;
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 6000);
CATCHBALL;
turn_right_senkai;
Wait(70);
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 7500);
SHOTBALL;
}
**ボールをシュートする側の細かな説明 [#oc4badff]
***定義 [#fa647009]
#define BLACK_high 36 //一番黒いしきい値
#define BLACK_low 38 //少し黒いしきい値
#define WHITE_low 42 //少し白いしきい値
#define WHITE_high 44 //一番白いしきい値
#define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //...
#define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左...
#define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //...
#define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //...
#define go_fwd OnFwd(OUT_AC); //前進
#define short_break Off(OUT_AC); Wait(100); //小休止
#define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
#define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受...
#define time2 10 //シュートしない側が交差点から一回目に...
#define time3 10 //シュートしない側が交差点から二回目に...
#define nMAX 300 //交差点と判断する基準
#define STEP 1 //ライントレース時の待ち時間
~
まずはライントレース時のしきい値とライントレースするとき...
続いてこの課題で重要な動きであるボールの発射と受け取りの...
最後に時間関係の定数を定義します。~
***スタートから第一のパス [#e200f31d]
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0;
int nCross=0;
int counter=0;
while (nCross < 2) {
//交差点までのライントレース
while (nOnline < nMAX) {
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low) {
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP); //交差点を感知してwhileから抜ける
short_break;
nCross++;
nOnline=0;
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 4500);
CATCHBALL;
turn_left_senkai;
Wait(70);
~
まずはスタート位置から二回交差点をこえるまでライントレー...
二回目の交差点をこえたら左に旋回してパスをもらう準備をし...
スタートしてからの時間がある点をこえたときにパスをします。~
そのままボールを持ちながら進む方向へと向きを変えます。~
***第一パスから第二パス [#x6eebfdc]
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
nCross=0;
turn_right_senkai;
wait(70);
until(FastTimer(1) > 6000);
SHOTBALL;
turn_left_senkai;
Wait(70);
~
第一パスを終えたらそのままライントレースを行い交差点まで...
交差点をこえた時から時間をはかり二つの交差点の中心までラ...
中心についたら右に旋回してパスを待ちます。~
再びスタートしてからの時間がある点をこえたときにパスをし...
パスを打ち終わったら元の向きに戻ります。~
***第二パスから第三パス [#r3994544]
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
turn_right_senkai;
Wait(70);
until(FastTimer(1) > 7500);
CATCHBALL;
turn_left_senkai;
Wait(70);
~
ここは第一から第二とほぼ同じ動きをします。~
違うところは交差点から時間で進むときの距離が短いことです。~
***第三パスからシュート [#xca79d27]
while(counter < 1){
while(nOnline < nMAX){
if (SENSOR_1 < 38){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < 39){
turn_right_kaiten;
} else if (SENSOR_1 < 42){
go_fwd;
} else if (SENSOR_1 < 44){
turn_left_kaiten;
} else {
turn_left_senkai;
}
}
nOnline=0;
}
Wait(STEP);
}
short_break;
turn_left_senkai; Wait(150);
go_rev; Wait(100);
SHOTBALL;
}
~
まずはゴール近くの交差点までひたすらライントレースをしま...
この交差点を基準にすることで時間指定するよりも誤差が格段...
あとは左に旋回し、後ろに少し下がってからシュートを打ちま...
後ろに下がるのは規定に「輪の中に入った状態でシュートをし...
**ボールをシュートしない側の細かな説明 [#s01974ff]
***定義 [#xcb8f087]
#define BLACK_high 36 //一番黒いしきい値
#define BLACK_low 38 //少し黒いしきい値
#define WHITE_low 42 //少し白いしきい値
#define WHITE_high 44 //一番白いしきい値
#define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //...
#define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左...
#define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C); //...
#define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //...
#define go_fwd OnFwd(OUT_AC); //前進
#define short_break Off(OUT_AC); Wait(100); //小休止
#define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
#define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受...
#define TURNSTEP 10 //横のセンサーを使う時の繰り返しの...
#define time2 10 //シュートしない側が交差点から一回目に...
#define time3 10 //シュートしない側が交差点から二回目に...
#define nMAX 300 //交差点と判断する基準
#define STEP 1 //ライントレース時の待ち時間
~
ここはシュートする側とほぼ同じになります。~
進む時間に微妙な違いがあります。~
***スタートからボールを取るまで [#p983ccd5]
task main(){
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nOnline=0;
int nCross=0;
ClearTimer(0);
while(nCross <= 1){
while(nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_left_senkai ;
nOnline++ ;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nOnline == 0;
nCross ++;
short_break;
cross_line;
}
nCross=0;
go_fwd;
Wait(500);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(100); //ボールに向く
CATCHBALL;
OnFwd(OUT_AC);
Wait(200); //ボールを取る
~
まずは交差点までライントレースをします。~
交差点をこえたら一定時間直進をし、そのまま右に旋回しボー...
ライントレースしながらの時間指定だとしきい値によって進む...
ボールに向いたらそのまま直進しボールを取ります。~
***ボールを取ってから第一パスまで [#g6ff842b]
until(SENSOR_1 < BLACK_low){
turn_left_kaiten;
} //コースに戻る
while(nCross <= 1){
if(SENSOR_1 < BLACK_high){
turn_left_senkai;
nOnline ++;
} else if(SENSOR_2 < BLACK_low){
turn_left_kaiten;
} else if(SENSOR_2 < WHITE_low){
go_fwd;
} else if(SENSOR_2 < WHITE_high){
turn_right_kaiten;
} else {
turn_right_senkai;
}
}
nCross=0;
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 4500);
SHOTBALL;
turn_right_senkai;
Wait(70);
~
ボールを取ったらラインを感知するまで左に進み、ラインに乗...
交差点までライントレースをして、交差点を感知したらコース...
スタートしてからの時間がある点をこえたところでパスをして...
***第一パスから第二パス [#m3639805]
while (FastTimer(0) <= time2){
if(SENSOR_1 < BLACK_high) {
turn_right_senkai;
} else if (SENSOR_1 < BLACK_low) {
back_turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low) {
go_fwd;
} else if (SENSOR_1 < WHITE_high) {
back_turn_left_kaiten;
} else {
turn_left_senkai;
}
Wait(STEP);
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 6000);
CATCHBALL;
turn_right_senkai;
Wait(70);
~
第一パスを終えたら再び時間指定付きライントレースを行いま...
ここの距離は短いので誤差は少なくて済みます。~
ある点まですすんだらコース内側を向き、パスの準備をします。~
スタートしてからの時間がある点をこえたところでパスをして...
***第二パスから第三パス [#q41cab41]
while (nCross < 1){
while (nOnline < nMAX){
if(SENSOR_1 < BLACK_high){
turn_right_senkai;
nOnline++;
} else {
if (SENSOR_1 < BLACK_low){
turn_right_kaiten;
} else if (SENSOR_1 < WHITE_low){
go_fwd
} else if (SENSOR_1 < WHITE_high){
turn_left_kaiten;
} else {
turn_left_senkai;
}
nOnline==0;
}
Wait(STEP);
}
PlaySound(SOUND_UP);
short_break;
nCross++;
nOnline=0;
}
turn_left_senkai;
Wait(70);
until(FastTimer(1) > 7500);
SHOTBALL;
}
~
第二パスを終えたら次の交差点までライントレースをします。~
交差点をこえたら少し進んでから左に旋回してコース内側を向...
スタートしてからの時間がある点をこえたところでパスをして...
*感想 [#j043eb13]
今回は二つのロボットを使うということで役割分担をしっかり...
ロボット自体はほとんど同じ形にすることでシュート位置のず...
前回の課題では準備不足が祟って失敗してしまったので今回は...
しかしテスト期間と重なったのもあってかなかなか4人で集まる...
結局集まれるようになったのは本番の一週間前からでほとんど...
しかしここでプログラムを合わせるとロボットが命令どうりに...
これによって動作を一つずつ確認しながらプログラムを合わせ...
そんな不完全なまま本番に臨んでしまい、結果は散々たるもの...
今回の敗因はお互いの認識に若干の誤差があったため思うよう...
これは社会にでてからチームでプログラムを作るときにとても...
もっと深く話し合ってお互いの認識が一致しているか確認して...
このゼミはこれで終わりですが、ここでの失敗を別の機会に生...
ページ名: