目次に戻るベースリフト

プログラム

プログラム(ベース側)

ラインをトレースしパックを回収、その後サークル内に移動するためのプログラム

なおセンサー1は光センサー(右)、センサー3は光センサー(左)、OUT_Aはキャタピラ(右)、OUT_Cはキャタピラ(左)に接続

#define THRESHOLD 40 //黒線白線の区別の境界
#define SIGNALON 1 //メッセージ送受信用
#define SIGNALOFF 2 //メッセージ送受信用
#define SIGNALkeep 4 //メッセージ送受信用
#define SIGNALfin 5 //メッセージ送受信用




task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーに設定
   SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに設定

   int i;
   int i_min=1,i_max=4; //関数iを設定
   int x;
   int x_min=1,x_max=2; //関数xを設定

   
  
   ClearMessage(); //メッセージをクリア


   while(Message() == SIGNALOFF);{
   Off(OUT_A+OUT_C);} //OFFのメッセージ受信中はモーターを停止
      
   
   if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){   
   OnFwd(OUT_A+OUT_C);} //両側のセンサーが白と判断した場合直進
   
   while((SENSOR_1<=THRESHOLD)&&(SENSOR_3>THRESHOLD)){ //右側のセンサー黒と判断した場合
   for(i=i_min;i<i_max; i++){ //それが1〜3回目の時
   OnFwd(OUT_A+OUT_C);
   Wait(30);}} //30進む
   for(x=x_min;x<x_max; x++){ //4回目の時
   OnFwd(OUT_A); 
   OnRev(OUT_C);
   Wait(90); //45度曲がる
   Off(OUT_A+OUT_C);
   OnFwd(OUT_A+OUT_C);
   Wait(100); //100進む
   Off(OUT_A+OUT_C);
   ClearMessage(); //クリアメッセージ
   SendMessage(SIGNALkeep); //メッセージを送る
   until(Message()==SIGNALfin); //メッセージを受信するまで続ける
   OnRev(OUT_A+OUT_C);
   Wait(100); 100戻る
   OnFwd(OUT_C);
   OnRev(OUT_A);
   Wait(90);} //45度曲がる

    
   if((SENSOR_1>THRESHOLD)&&(SENSOR_3<=THRESHOLD)){  //左側のセンサーが黒と判断した場合
   OnFwd(OUT_C);
   OnRev(OUT_A);} //軌道修正
   
   if((SENSOR_1<=THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //両側のセンサーが黒と判断した場合
   OnFwd(OUT_A+OUT_C);} //前に進む
}

&ref(): File not found: "robocon-2007a-field-a2.gif " at page "2007a/A2/ロボコン"; このようなルートを」たどる・・・はずだった

補足

実はこのプログラムは間違っている。原因はforの働きを勘違いしていたことにある。このプログラムのまま動かすと、for以下終わるまで連続で動作することになってしまう。右側のセンサーで超えた黒線の数をカウントしたい場合

int count==0;

if(SENSOR_1>THRESHOLD){
count++}

while(count==3 || count==6){

などとしなければならなかった。

感想

ロボットの完成日と自分の予定により、プログラムの製作開始が当日の朝になってからであった。もっと早くから取り掛かることができていればと思うと非常に残念。

以前にもロボットにこだわりすぎて、肝心のプログラムに手が回らないという失敗をしているのにもかかわらず、今回またそれを繰り返してしまったことがなによりふがいなく思う。

また、本番ではパックの置かれる位置を勘違いしていたり、タッチセンサーがうまく働かないなど、2台の連動がうまくいかなかったりとトラブルが相次いだ。結果は1つも積み重ねられないという残念なものだった。

本番2回目は、なんとしてでも積むために

task main()
{
  repeat(3){
   
   ClearTimer(0);
   
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);    

   ClearMessage();
   while(Message() == SIGNALOFF);{
   Off(OUT_A+OUT_C);}
   
   
   
   while((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){
   OnFwd(OUT_A+OUT_C); }
   
   while((SENSOR_1>THRESHOLD)&&(SENSOR_3<=THRESHOLD)){
   OnFwd(OUT_C);
   OnRev(OUT_A);}
   
   while((SENSOR_1<=THRESHOLD)&&(SENSOR_3>THRESHOLD)){
   OnFwd(OUT_A);
   OnRev(OUT_C);}
   
   while((SENSOR_1<=THRESHOLD)&&(SENSOR_3<=THRESHOLD)){
   OnFwd(OUT_A+OUT_C);}
    
    
   if(FastTimer(0)>=5000);
   OnRev(OUT_A+OUT_C);
   Wait(100);
   Off(OUT_A+OUT_C);
   OnFwd(OUT_C);
   OnRev(OUT_A);
   Wait(280);
   Off(OUT_A+OUT_C);
   OnFwd(OUT_A+OUT_C);
   Wait(500);
   Off(OUT_A+OUT_C);
   
}   
}

というプログラムを急遽作成し、センサーもメッセージも関係なく動かした。結果3点取れたものの、これで良かったのか?と考えると後悔しか残らない結果である。

プログラム(リフト側)

#define SIGNALON 1
#define SIGNALOFF 2
#define SIGNAL 3
#define SIGNALkeep 4
sub lift_up()
{
  OnFwd(OUT_B);
  Wait(500);
  Off(OUT_B);
}
sub lift_down()
{
  OnRev(OUT_B);
  Wait(500);
  Off(OUT_B);
}
sub move_narrow()
{
  OnFwd(OUT_A+OUT_C);
  Wait(50);
  Off(OUT_A+OUT_C);
}
sub move_wide()
{
  OnRev(OUT_A+OUT_C);
  Wait(50);
  Off(OUT_A+OUT_C);
}
task main()
{
 SetSensor(SENSOR_2,SENSOR_TOUCH);
 int i;
 int i_min=1,i_max=1;
 
 int x;
 int x_min=1,x_max=1;
 
 int j;
 int j_min=1,j_max=1;
 
 ClearMessage();

 while(SENSOR_2 == 1)
 {
  for(i=i_min;i<=i_max; i++){
  SendMessage(SIGNALOFF);
  move_narrow();
  lift_up();
  SendMessage(SIGNALON);
  for(x=x_min;x<=x_max; x++){
  SendMessage(SIGNALOFF);
  move_wide();
  lift_down();
  move_narrow();
  lift_up();
  SendMessage(SIGNALON);
  for(j=j_min;j<=j_max; j++){
  SendMessage(SIGNALOFF);
  move_wide();
  lift_down();
  move_narrow();
  lift_up();
  SendMessage(SIGNALON);
  }
  }
  }
  }
  while(Message() == SIGNALkeep)
  {
   lift_down();
   move_wide();
  }
 }

目次に戻るベースリフト


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-08-07 (火) 23:46:14