- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009b/A2/ロボコン]]
-----------------------
CENTER:&size(30){ピンポン玉を集めて入れるロボットのプログラム};
-----------------------
*最初 [#m407171a]
#define Bright 45
#define GOFWD(t) OnRev(OUT_A+OUT_C); Wait(t);
#define Stop Off(OUT_A+OUT_C);
#define GOREV OnFwd(OUT_A+OUT_C);
task main ()
{
SetSensor(SENSOR_3, SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_1,SENSOR_ROTATION);
while(SENSOR_2 > Bright){
GOFWD(10);
}
Wait(10);
while(SENSOR_2>Bright){
OnRev(OUT_C);
Off(OUT_A);
}
PlaySound(SOUND_DOUBLE_BEEP) ;
ClearSensor(SENSOR_1);
while (abs(SENSOR_1)< 60) {
if (SENSOR_2 < Bright) { // 醇M醇`醇S潤ッ醇Q„遵ャ…遵ャ¢遵ャ遵ー遵ャ∆遵ャ´
OnRev(OUT_A);
Off(OUT_C);
Wait(20);
}
else { // 醇M醇`醇S潤ッ遵ャ潤・・遵沛・O遵ャ遵ス遵ャΩ遵ャ∆遵ャ´
Off(OUT_A);
OnRev(OUT_C);
Wait(20);
}
}
Stop;
ClearSensor(SENSOR_1);
OnRev(OUT_B);
//start arm;
/*while(abs(SENSOR_1)<5){
OnRev(OUT_C);
Float(OUT_A);
Wait(40);
OnFwd(OUT_A);
Wait(5);
}*/
ClearTimer(0);
while(FastTimer(0)<150){
OnRev(OUT_A);
Float(OUT_C);
Wait(60);
OnFwd(OUT_C);
Wait(20);
}
Stop;
PlaySound(SOUND_DOUBLE_BEEP) ;
while(abs(SENSOR_1)<40){
GOFWD(10);
}
Stop;
Wait(100);
//stop arm;
PlaySound(SOUND_FAST_UP) ;
ClearSensor(SENSOR_1);
/*while(SENSOR_3<Bright){
GOREV;
}*/
while(abs(SENSOR_1)<40){
GOREV;
}
Stop;
Off(OUT_B);
/*ClearTimer(0);
while(FastTimer(0)<150){
OnFwd(OUT_A);
Float(OUT_C);
Wait(40);
*ピンポン玉を集めて入れるロボットNo.1 [#r1d1437a]
#define Bright 45 //閾値
#define GOFWD(t) OnRev(OUT_A+OUT_C);Wait(t); //前進
#define Stop Off(OUT_A+OUT_C); //停止
#define GOREV OnFwd(OUT_A+OUT_C); //後退
task main (){
SetSensor(SENSOR_1,SENSOR_ROTATION); //センサー1を回転センサー
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2を光センサー(前)
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3を光センサー(後)
//1番目
Wait(3000); //30秒待つ
while(SENSOR_2>Bright){ //光センサー(前)が暗くなるまで前進
GOFWD(10);
}
Wait(10); //0.01秒前進
while(SENSOR_2>Bright){ //光センサー(前)が暗くなるまで、左に曲がる
OnRev(OUT_C);
Wait(5);
Off(OUT_A);
}
Stop;*/
while(SENSOR_2>Bright){
OnFwd(OUT_C);
OnRev(OUT_A);
PlaySound(SOUND_DOUBLE_BEEP);
ClearSensor(SENSOR_1); //回転センサーをリセット
while (abs(SENSOR_1)< 60) { //回転センサーの絶対値が60未満の間
if (SENSOR_2 < Bright) { //光センサー(前)が暗かったら
OnRev(OUT_A); //0.2秒、右に曲がる
Off(OUT_C);
Wait(20);
}else{ //その他の場合、0.2秒、左に曲がる
Off(OUT_A);
OnRev(OUT_C);
Wait(20);
}
}
/*while(SENSOR_3>Bright){
GOREV;
}*/
PlaySound(SOUND_FAST_UP) ;
Stop;
ClearTimer(0);
ClearSensor(SENSOR_1);
while (FastTimer(0)<500) {
if (SENSOR_3 < Bright) { // 醇M醇`醇S潤ッ醇Q„遵ャ…遵ャ¢遵ャ遵ー遵ャ∆遵ャ´
OnFwd(OUT_C);
Off(OUT_A);
}
else { // 醇M醇`醇S潤ッ遵ャ潤・・遵沛・O遵ャ遵ス遵ャΩ遵ャ∆遵ャ´
Off(OUT_C);
OnFwd(OUT_A);
}
}
Stop;
ClearSensor(SENSOR_1);
while(abs(SENSOR_1)<=20){
OnFwd(OUT_C);
Float(OUT_A);
Wait(20);
OnRev(OUT_A);
}
ClearTimer(0);
while(FastTimer(0)<500){
OnFwd(OUT_A+OUT_C);
}
/*ClearSensor(SENSOR_1);
while(abs(SENSOR_1)<=180){
OnFwd(OUT_A+OUT_C);
}
Stop;*/
/*ClearSensor(SENSOR_1);
while(abs(SENSOR_1)<=90){
OnFwd(OUT_A);
Stop; //停止
OnRev(OUT_B); //アームを動かし始める
ClearTimer(0); //タイマー0をリセット
while(FastTimer(0)<150){ //タイマー0が1.5秒未満の間、以下を繰り返す
OnRev(OUT_A); //大きく右に曲がる(0.6秒)
Float(OUT_C);
Wait(40);
OnRev(OUT_C);
Wait(40);
}
Stop;*/
/*while((SENSOR_3>Bright) || (SENSOR_2>Bright)){
if(SENSOR_3<Bright){
OnRev(OUT_C);
Off(OUT_A);
}else if(SNESOR_2<Bright){
OnRev(OUT_A);
Off(OUT_C);
}else{
GOFWD(10);
}
}
GOREV(300);*/
//ClearSensor(SENSOR_1);
/*while(SENSOR_2 < Bright){
OnRev(OUT_A);
Float(OUT_C);
}*/
while(SENSOR_2<Bright){
OnRev(OUT_A+OUT_C);
}
ClearTimer(0);
ClearSensor(SENSOR_1);
while (abs(SENSOR_1)<=450) {
if (SENSOR_2 < Bright) { // 醇M醇`醇S潤ッ醇Q„遵ャ…遵ャ¢遵ャ遵ー遵ャ∆遵ャ´
OnRev(OUT_A);
Off(OUT_C);
}
else { // 醇M醇`醇S潤ッ遵ャ潤・・遵沛・O遵ャ遵ス遵ャΩ遵ャ∆遵ャ´
Off(OUT_A);
OnRev(OUT_C);
}
}
Stop;
}
/*task arm(){
while(true){
OnFwd(OUT_B);
Wait(60);
OnFwd(OUT_C); //右回りに回転(0.2秒)
Wait(20);
}
Off(OUT_B);
}*/
*二個目 [#fb5f7e3b]
#define FWD_AC OnFwd(OUT_A+OUT_C);
#define FWD_A OnFwd(OUT_A);
#define FWD_C OnFwd(OUT_C);
#define REV_AC OnRev(OUT_A+OUT_C);
#define REV_A OnRev(OUT_A);
#define REV_C OnRev(OUT_C);
#define OFF_AC Off(OUT_A+OUT_C);
#define OFF_A Off(OUT_A);
#define OFF_C Off(OUT_C);
#define FLOAT_AC Float(OUT_A+OUT_C);
#define FLOAT_A Float(OUT_A);
#define FLOAT_C Float(OUT_C);
#define THRESHOLD 45
#define ARM_OPEN OnFwd(OUT_B);
#define ARM_CLOSE OnRev(OUT_B);
#define ARM_STOP Off(OUT_B);
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_ROTATION);
SetSensor(SENSOR_3,SENSOR_LIGHT);
Stop; //停止
PlaySound(SOUND_DOUBLE_BEEP);
ClearSensor(SENSOR_1); //回転センサーをリセット
while(abs(SENSOR_1)<40){ //回転センサーの絶対値が40未満の間
GOFWD(10); //前進
}
Stop; //停止(1秒)
Wait(100);
Wait(3000);
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<=21){
FWD_AC;
//2番目
PlaySound(SOUND_FAST_UP);
ClearSensor(SENSOR_1); //回転センサーをリセット
while(abs(SENSOR_1)<40){ //回転センサーの絶対値が40未満の間
GOREV; //後退
}
while(abs(SENSOR_2)<=45){
line_trace();
Stop; //停止
Off(OUT_B); //アームを止める
while(SENSOR_2>Bright){ //光センサー(前)が暗くなるまで
OnFwd(OUT_C); //右に回転
OnRev(OUT_A);
}
45r();
OFF_AC;
Wait(100);
/*while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){
if(SENSOR_1>THRESHOLD){
REV_C;OFF_A;
}else if(SENSOR_3>THRESHOLD){
REV_A;OFF_C;
}else{
REV_AC;
PlaySound(SOUND_FAST_UP);
Stop; //停止
//ここから後ろ向きに走行
ClearTimer(0); //タイマー0をリセット
while (FastTimer(0)<500) { //タイマー0が5秒未満の間、以下を繰り返す
if (SENSOR_3 < Bright) { //光センサー(後)が暗かったら
OnFwd(OUT_C); //後ろの方向で右へ曲がる
Off(OUT_A);
}else { //その他の場合
Off(OUT_C); //後ろの方向で左へ曲がる
OnFwd(OUT_A);
}
}
OFF_AC;
ARM_CLOSE;
Wait(25);
ARM_STOP;*/
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<25){
FWD_AC;
Stop; //停止
ClearSensor(SENSOR_1); //回転センサーをリセット
while(abs(SENSOR_1)<=20){ //回転センサーの絶対値が20以下の間、以下を繰り返す
OnFwd(OUT_C); //大きく右に曲がる(0.2秒)
Float(OUT_A);
Wait(20);
OnRev(OUT_A); //右回りに回転(0.05秒)
Wait(5);
}
OFF_AC;
Wait(100);
ARM_CLOSE;
Wait(50);
ARM_STOP;
ClearSensor(SENSOR_2);
/*while(abs(SENSOR_2)<25){
REV_AC;
}*/
while(abs(SENSOR_2)<24){
REV_AC;
ClearTimer(0); //タイマー0をリセット
while(FastTimer(0)<500){ //タイマー0が5秒未満の間
OnFwd(OUT_A+OUT_C); //後退
}
OFF_AC;
Wait(100);
ClearSensor(SENSOR_2);
ClearTimer(0);
while(SENSOR_1>THRESHOLD) {
FWD_C;REV_A;
//3番目
while(SENSOR_2>Bright){ //光センサー(前)が暗くなるまで
OnRev(OUT_A+OUT_C); //前進
}
ClearSensor(SENSOR_2);
while(SENSOR_3>THRESHOLD){
line_trace1();
//ここから前向きに走行
ClearSensor(SENSOR_1); //回転センサーをリセット
while (abs(SENSOR_1)<=450) { //回転センサーの絶対値が450以下の間
if (SENSOR_2 < Bright) { //光センサー(前)が暗かったら
OnRev(OUT_A); //右に曲がる
Off(OUT_C);
}else { //その他の場合、
Off(OUT_A); //左に曲がる
OnRev(OUT_C);
}
}
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<=15){
FWD_A;REV_C;
Stop; //停止
}
''このプログラムでロボットが動く経路''~
実際の動きを大まかに示したものであり、実際はより細かく動く。経路は、1番目から順にその場面ごとプログラムの場所を始めのところに示してある。矢印の定義は次の通りである。
※なお、このプログラムはロボコンで実際に使ったものをそのまま表示している。そして、3番目のプログラムは時間がなく、実際にその通りに動くか確認はされていない。~
&ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y1.jpg,50%);:前進、ライントレース &ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y2.jpg,50%);:後退 &ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y3.jpg,50%);:右向きに回転 &ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y4.jpg,50%);:左向きに回転
&ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y5.jpg,50%);:
ClearTimer(0); //タイマー0をリセット
while(FastTimer(0)<150){ //タイマー0が1.5秒未満の間、以下を繰り返す
OnRev(OUT_A); //大きく右に曲がる(0.6秒)
Float(OUT_C);
Wait(60);
OnFwd(OUT_C); //右回りに回転(0.2秒)
Wait(20);
}
Stop; //停止
&ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/y7.jpg,50%);:
while(SENSOR_2>Bright){ //光センサー(前)が暗くなるまで
OnFwd(OUT_C); //右に回転
OnRev(OUT_A);
}
&ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/y6.jpg,50%);:
ClearSensor(SENSOR_1); //回転センサーをリセット
while(abs(SENSOR_1)<=20){ //回転センサーの絶対値が20以下の間、以下を繰り返す
OnFwd(OUT_C); //大きく右に曲がる(0.2秒)
Float(OUT_A);
Wait(20);
OnRev(OUT_A); //右回りに回転(0.05秒)
Wait(5);
}
&ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/y8.jpg,50%);:
while(SENSOR_2>Bright){ //光センサー(前)が暗くなるまで
OnRev(OUT_A+OUT_C); //前進
}
1番目
#ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/a1.jpg,around,50%)
CENTER:2番目
CENTER:&ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/a2.jpg,right,around,50%);
#Clear
CENTER:3番目
CENTER:&ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/a3.jpg,right,around,50%);
#Clear
*ピンポン玉を集めて入れるロボットNo.2 [#nf733c40]
#define FWD_AC OnFwd(OUT_A+OUT_C); //モーターAとCを前進
#define FWD_A OnFwd(OUT_A); //モーターAを前進
#define FWD_C OnFwd(OUT_C); //モーターCを前進
#define REV_AC OnRev(OUT_A+OUT_C); //モーターAとCを後退
#define REV_A OnRev(OUT_A); //モーターAを後退
#define REV_C OnRev(OUT_C); //モーターCを後退
#define OFF_AC Off(OUT_A+OUT_C); //モーターAとCを停止
#define OFF_A Off(OUT_A); //モーターAを停止
#define OFF_C Off(OUT_C); //モーターCを停止
#define FLOAT_AC Float(OUT_A+OUT_C); //モーターAとCをFloatで停止
#define FLOAT_A Float(OUT_A); //モーターAをFloatで停止
#define FLOAT_C Float(OUT_C); //モーターCをFloatで停止
#define THRESHOLD 45 //閾値
#define ARM_OPEN OnFwd(OUT_B); //アームを開く
#define ARM_CLOSE OnRev(OUT_B); //アームを閉じる
#define ARM_STOP Off(OUT_B); //アームを止める
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサー(左)
SetSensor(SENSOR_2,SENSOR_ROTATION); //センサー2を回転センサー
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサー(右)
//1番目
Wait(3000); //30秒待つ
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<=21){ //回転センサーの絶対値が21以下の間
FWD_AC; //前進
}
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<30){
line_trace1();
while(abs(SENSOR_2)<=45){ //回転センサーの絶対値が45以下の間
line_trace(); //左右の光センサーを使ってライントレースをする
}
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<5){
FWD_C;REV_A;
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<5){ //回転センサーの絶対値が5未満の間
FWD_A;REV_C; //右回りに回転
}
OFF_AC;
Wait(10);
FWD_AC;
Wait(300);
OFF_AC;
ARM_OPEN;Wait(30);
ARM_STOP;
while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){
REV_AC;
OFF_AC; //停止(1秒)
Wait(100);
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<25){ //回転センサーの絶対値が25未満の間
FWD_AC; //前進
}
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<=5){
FWD_C;REV_A;
OFF_AC; //停止(1秒)
Wait(100);
ARM_CLOSE;Wait(50); //アームを0.5秒間閉じ始める
ARM_STOP; //アームを止める
//2番目
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<24){ //回転センサーの絶対値が24未満の間
REV_AC; //後退
}
while(SENSOR_1>THRESHOLD){
line_trace3();
OFF_AC; //停止(1秒)
Wait(100);
while(SENSOR_1>THRESHOLD) { //光センサー(左)が明るい間
FWD_C;REV_A; //左回りに回転
}
while(abs(SENSOR_2)<=5){
FWD_C;REV_A;
ClearSensor(SENSOR_2); //回転センサーをリセット
while(SENSOR_3>THRESHOLD){ //光センサー(右)が明るい間
line_trace1(); //光センサー(左)だけのライントレース
}
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<200){
line_trace3();
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<=15){ //回転センサーの絶対値が15以下の間
FWD_A;REV_C; //右回りに回転
}
OFF_AC;
/*while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){
line_trace();
//3番目
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<30){ //回転センサーの絶対値が30未満の間
line_trace1(); //光センサー(左)だけのライントレース
}
while(SENSOR_1<THRESHOLD){
FWD_A;REV_C;
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<5){ //回転センサーの絶対値が5未満の間
FWD_C;REV_A; //左回りに回転
}
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<=15){
line_trace();
OFF_AC; //停止(0.01秒)
Wait(10);
FWD_AC; //前進(3秒)
Wait(300);
OFF_AC; //停止
ARM_OPEN;Wait(30); //アームを開く(0.03秒)
ARM_STOP; //アームを止める
//4番目
while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){ //光センサー(左)と光センサー(右)が共に暗くなるまで
REV_AC; //後退
}
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<=5){
FWD_C;REV_A;
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<=5){ //回転センサーの絶対値が5以下の間
FWD_C;REV_A; //左回りに回転
}
FWD_AC;Wait(300);
OFF_AC;
/*ARM_OPEN;
Wait(25);
ARM_STOP;
while((SENSOR_1>THRESHOLD) ||(SENSOR_3>THRESHOLD)){
REV_AC;
while(SENSOR_1>THRESHOLD){ //光センサー(左)が暗くなるまで
line_trace3(); //光センサー(右)だけのライントレース
}
while(abs(SENSOR_2)<5){
FWD_C;REV_A;
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<=5){ //回転センサーの絶対値が5以下の間
FWD_C;REV_A; //左回りに回転
}
while(SENSOR_1)*/
}
sub line_trace(){
if(SENSOR_1<THRESHOLD){
FWD_C;REV_A;
}else if(SENSOR_3<THRESHOLD){
FWD_A;REV_C;
}else {
FWD_AC;
ClearSensor(SENSOR_2); //回転センサーをリセット
while(abs(SENSOR_2)<200){ //回転センサーの絶対値が200未満の間
line_trace3(); //光センサー(右)だけのライントレース
}
}
sub line_trace1(){
if(SENSOR_1<THRESHOLD){
FWD_A;OFF_C;
}else{
FWD_C;OFF_A;
OFF_AC; //停止
}
sub line_trace(){ //左右の光センサーを用いたライントレース
if(SENSOR_1<THRESHOLD){ //光センサー(左)が暗かったら
FWD_C;REV_A; //左回りに回転
}else if(SENSOR_3<THRESHOLD){ //光センサー(右)が暗かったら
FWD_A;REV_C; //右回りに回転
}else { //その他の場合
FWD_AC; //前進
}
}
sub line_trace3(){
if(SENSOR_3<THRESHOLD){
FWD_C;OFF_A;
}else{
FWD_A;OFF_C;
}
sub line_trace1(){ //左の光センサーだけを用いたライントレース
if(SENSOR_1<THRESHOLD){ //光センサー(左)が暗かったら
FWD_A;OFF_C; //右に曲がる
}else{ //その他の場合
FWD_C;OFF_A; //左に曲がる
}
}
sub 45r(){
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<5){
FWD_A;REV_C;
}
sub line_trace3(){ //右の光センサーだけを用いたライントレース
if(SENSOR_3<THRESHOLD){ //光センサー(右)が暗かったら
FWD_C;OFF_A; //左に曲がる
}else{ //その他の場合
FWD_A;OFF_C; //右に曲がる
}
}
}
sub 45l(){
ClearSensor(SENSOR_2);
while(abs(SENSOR_2)<5){
FWD_C;REV_A;
}
}
''このプログラムでロボットが動く経路''~
実際の動きを大まかに示したものであり、実際はより細かく動く。経路は、1番目から順にその場面ごとプログラムの場所を始めのところに示してある。矢印の定義は次の通りである。
※なお、このプログラムはロボコンで実際に使ったものをそのまま表示している。そして、3番目以降は時間切れのために実際に動作が図のように動くかどうか確認はできていない。~
&ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y1.jpg,50%);:前進、ライントレース &ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y2.jpg,50%);:後退 &ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y3.jpg,50%);:右向きに回転 &ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y4.jpg,50%);:左向きに回転
&ref(2009b/A2/ロボコン/紙パックを移動させるロボット/y5.jpg,50%);:
while(SENSOR_1>THRESHOLD) { //光センサー(左)が明るい間
FWD_C;REV_A; //左回りに回転
}
1番目
#ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/b1.jpg,around,50%)
CENTER:2番目
CENTER:&ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/b2.jpg,right,around,50%);
#Clear
3番目
#ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/b3.jpg,around,50%)
CENTER:4番目
CENTER:&ref(2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット/b4.jpg,right,around,50%);
#Clear