2007a/A10/ロボコン

<お詫び>

このページには、今回ロボコンに使用したプログラムを載せていますが、A10はプログラムの完成が遅れたため、ほとんど試せないままロボコンに挑み、ロボコン当日のテストラン、本番ともにロボットが動かないまま終了してしまったので、以下のプログラムは非常に悔しいですが問題を抱えたままの状態です。今回は通信機能を使ったのでミスも多いと思います。授業終了後もマインドストームでいろいろ試そうと思うので、プログラムの間違いを指摘して頂けると嬉しいです。(タマジャン)

  • パック回収プログラム
#define MOTOR OUT_A+OUT_C
#define LEVEL 40
#define TURN_TIME 305  //調整
#define aaa 20
#define bbb 21
#define ccc 22
#define arm1_fin 30
#define arm2_fin 31
#define start_arm2 33
#define tukamu 23
#define hanasu 24
#define stop_task1 32
#define stop_task2 34
int count;
int musi;
sub back()
{SetPower(OUT_A+OUT_C,4);
OnRev(MOTOR);
Wait(500);
}
sub turn_right()
{
OnFwd(OUT_C);
Wait(TURN_TIME);
}
task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);//(進行方向左)光センサ
 SetSensor(SENSOR_2,SENSOR_LIGHT);//(まんなか)光センサ2
 SetSensor(SENSOR_3,SENSOR_LIGHT);//(進行方向右)光センサ3
 count=0;
 while(count<2){
   if((SENSOR_1<LEVEL)&&(SENSOR_2<LEVEL)&&(SENSOR_3<LEVEL))
   {count+=1;
    OnFwd(OUT_A);//光センサが全て線の上の時右に90度曲がる
    Wait(TURN_TIME);//
   }else{
    OnFwd(MOTOR);//それ以外の時は直進
   }
  }
   Off(MOTOR);//停止
   SendMessage(tukamu);//アーム閉じて
   SendMessage(aaa);//アップ!
   count=0;
   until(Message()==arm1_fin);//持ち上げ完了
   PlaySound(SOUND_CLICK);
   SendMessage(stop_task1);
   turn_right();//90度曲がる
//もう一回緑集め
  while(count<2){
   if((SENSOR_1<LEVEL)&&(SENSOR_2<LEVEL)&&(SENSOR_3<LEVEL))
    {count+=1;
    OnFwd(OUT_A);//光センサが全て線の上の時右に90度曲がる
    Wait(TURN_TIME);//
    }else{
     OnFwd(MOTOR);//それ以外の時は直進
    }}
    Off(MOTOR);//停止
    SendMessage(start_arm2);//アーム離して降ろして掴んで上げる
    until(Message()==arm2_fin);
    PlaySound(SOUND_CLICK);
    SendMessage(stop_task2);//
    until(Message()==80);//アーム完了
    PlaySound(SOUND_CLICK);
    turn_right();
    start line_oth;//白パック集めて
    until(Message()==50);
    PlaySound(SOUND_CLICK);
    stop line_oth;
    back();
    Off(MOTOR);
}
 task line_oth()
  {
   OnFwd(MOTOR);//直進
   musi=0;
   if((SENSOR_1<LEVEL)&&(SENSOR_3<LEVEL))//横の線を感知
    {musi+=1;}//一回横線を通ったらプラス1
   until(musi==2);//2回目の横線にきたら
   turn_right();//右にまがりまーす
   OnFwd(MOTOR);//直進
   until((SENSOR_1<LEVEL)&&(SENSOR_3<LEVEL));
   turn_right();
   OnFwd(MOTOR);
   until((SENSOR_1<LEVEL)&&(SENSOR_3<LEVEL));
   OnFwd(MOTOR);Wait(200);
   SendMessage(ccc);//「離して」
  }
  • パック積み上げプログラム
#define aaa 20
#define bbb 21
#define ccc 22
#define tukamu 23
#define arm1_fin 30
#define arm2_fin 31
#define stop_task1 32
#define start_arm2 33
#define stop_task2 34
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);//アームの上の限界センサ
SetSensor(SENSOR_2,SENSOR_TOUCH);//アームの下の限界センサ
 if(Message()==tukamu)//メッセージがきたら
  {
   PlaySound(SOUND_CLICK);
   OnFwd(OUT_B);//アーム閉じる
   }
  until(Message()==aaa);//アップ命令がきたら
  PlaySound(SOUND_CLICK);
  start arm1;//
  until(Message()==stop_task1);
  PlaySound(SOUND_CLICK);
  stop arm1;
  until(Message()==start_arm2);
  PlaySound(SOUND_CLICK);
  start arm2;
  until(Message()==stop_task2);
  PlaySound(SOUND_CLICK);
  stop arm2;//上がっている状態
  SendMessage(80);
  until(Message()==ccc);
  PlaySound(SOUND_CLICK);
  OnRev(OUT_B);Wait(050);
  SendMessage(50);
Off(OUT_A+OUT_B);
}
task arm1()
{
OnFwd(OUT_A);//アーム上がる
until(SENSOR_1==1);
Off(OUT_A);//センサが反応したら停止
SendMessage(arm1_fin);
}
task arm2()
{
OnRev(OUT_B);Wait(010);//アーム開く
OnRev(OUT_A);//アーム下がる
until(SENSOR_2==1);
Off(OUT_A);
OnFwd(OUT_B);//アームを閉じる
OnFwd(OUT_A);//アーム上がる
until(SENSOR_1==1);
Off(OUT_A);
SendMessage(arm2_fin);
}

ちなみに上記の2つのプログラムはA10で最初に決めた計画

  • 緑のパックを一番上に持ってくる
  • パックを3段積む
  • エリア内に2本のタワーを入れる

という欲張りな計画を実現しようとした結果、できあがった(未完成ですが)ものです。

ついでなので

1回目を見終った後に謙虚に「とにかく回収して1個でも積めれば良い」というコンセプトのもと、速攻で書いた乱暴なプログラムものせてみます。 ちなみに、これも動きませんでした。

  • 回収プログラム2
#define MOTOR OUT_A+OUT_C
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
OnFwd(MOTOR);
until(SENSOR_1==1)//
Off(MOTOR);
SendMessage(100);
until(Message()==110);
PlaySound(SOUND_CLICK);
OnFwd(MOTOR);
until(SENSOR_1==1);
Off(MOTOR);
SendMessage(120);
until(Message()==130);
PlaySound(SOUND_CLICK);
OnRev(OUT_A);
Wait(620);
OnFwd(MOTOR);
until(SENSOR_1==1);
Off(MOTOR);
SendMessage(140); 
until(Message()==150);
PlaySound(SOUND_CLICK);
OnRev(MOTOR);
Wait(300);
SendMessage(160);
until(Message()==170);
OnRev(MOTOR);
Wait(400);
Off(MOTOR);
}
  • 積み上げプログラム2
task main()
{ 
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_2,SENSOR_TOUCH);
until(Message()==100);
OnFwd(OUT_B);
OnFwd(OUT_A);
until(SENSOR_1==1);
Off(OUT_A);
SendMessage(110);
until(Message()==120);
OnRev(OUT_B);
Wait(010);
Off(OUT_B);
OnRev(OUT_A);
until(SENSOR_2==1);
Off(OUT_A);
OnFwd(OUT_B);
OnFwd(OUT_A);//上
until(SENSOR_1==1);
Off(OUT_A);
SendMessage(130);
until(Message()==140);
OnRev(OUT_B);
Wait(010);
Off(OUT_B);
OnRev(OUT_A);
until(SENSOR_2==1);
Off(OUT_A);
OnFwd(OUT_B);
SendMessage(150);
until(Message()==160);
OnRev(OUT_B);
Wait(010);
Off(OUT_B);
SendMessage(170);
}

さらに、 動かないプログラムばかり載せるのも、しのびないので、ロボコン後に助けをお借りして組み立てたロボットとプログラムも載せておきます。

(パックを感知して後ろに積む(?)プログラム)
#define MOTOR OUT_B+OUT_C
int arm_time;
task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_TOUCH);

ClearTimer(0);
OnFwd(MOTOR);
until(SENSOR_1==1);//パックにぶつかったら
OnFwd(OUT_A);//アームが動き出す
until(SENSOR_3==1);//180度アームが回るまでの時間を計り
arm_time=Timer(0);
Off(OUT_A);//パックをはなし
OnRev(OUT_A);Wait(arm_time);//同じ時間だけ戻る
Off(OUT_A);
}

このプログラムは1個掴んで後ろに移動させるだけですが、探すプログラム(これが大変なのですが)をつけたせば2段ならギリギリ積めそうです。 ロボットはこちら

ロボット1.jpg
ロボット2.jpg

添付ファイル: fileロボット1.jpg 182件 [詳細] fileロボット2.jpg 169件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-08-10 (金) 05:50:09