[[2013b/MemberOnly/進行状況]]

*今回の課題 [#udf5a3a9]
 今回の課題はロボコンでした。コース上にある空き缶を集め、ゴールに積み上げて得点を競い合うものでした。

&ref(robocon3.png);
 得点の配点の内容は…
 得点の目安:

    空き缶を取りにいくまでの動作 (2点)
    空き缶を掴む動作 (4点)
    空き缶をを運ぶ動作(2点)
    空き缶を積み上げる動作(5点)
    2台のRCXまたはNXTの連携の良さ(3点)
    自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
    その他 (2点)
計20点で評価される。

*マイロボットの説明 [#lbd8afa1]
私たちの班は、エレベーター式にしました。アームのついている部分をモーターで巻き上げ缶を上に積み上げるものでした。駆動するモーターとは別に、アームを上に固定し安定させるために、もう一つ配線をつなげていないモーターを取り付けました。

&ref(robocon2.png);

*プログラム [#y57cfdbc]
このプログラムは理想のものです。ロボットが想像通り上手くいっていれば、使うはずでした。
**ライントレース側のプログラム [#h002361f]
 #define OPEN 1
 #define GO 2
 #define PUT 3
 #define BACK 4
 #define THERESHOLD 47
 #define OPEN 1 //缶を発見したことを知らせる
 #define GO 2 //缶を掴んだことを知らせる
 #define PUT 3 //ゴールに到着したことを知らせる
 #define BACK 4 //ゴールに缶を置いたことを知らせる
 #define THERESHOLD 47 //しきい値
 #define HIPOWER 3
 #define LOWPOWER 2
 #define set_power_H SetPower(OUT_AC,HIPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);
 #define go_forward set_power_H; OnRev(OUT_AC);
 #define turn_left1 set_power_L;\OnFwd(OUT_A); OnRev(OUT_C);
 #define turn_left0 set_power_L;\OnRev(OUT_C); Off(OUT_A);
 #define turn_right0 set_power_L;\OnRev(OUT_A); Off(OUT_C);
 #define turn_right1 set_power_L;\OnFwd(OUT_C); OnRev(OUT_A);
 #define go_forward set_power_H; OnRev(OUT_AC); //直進する
 #define turn_left1 set_power_L;\OnFwd(OUT_A); OnRev(OUT_C); //左旋回する
 #define turn_left0 set_power_L;\OnRev(OUT_C); Off(OUT_A); //左折する
 #define turn_right0 set_power_L;\OnRev(OUT_A); Off(OUT_C); //右折する
 #define turn_right1 set_power_L;\OnFwd(OUT_C); OnRev(OUT_A); //右旋回する
 #define STEP 1
 #define nMAX 35
 #define short_break Off(OUT_AC); Wait(100);
 #define cross_line go_forward set_power_H;\OnFwd(OUT_AC); Wait(20); short_break; 
 #define short_break Off(OUT_AC); Wait(100); //小休止する
 #define cross_line go_forward set_power_H;\OnFwd(OUT_AC); Wait(20); short_break; //交差点を通過する
 task main()
 {
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
   int nOnline=0;  
   ClearTimer(1);
   while (FastTimer(1) <= 500) {
     go_forward;
     if (SENSOR_3 > 48) {
     SendMessage(OPEN);
     if (SENSOR_3 > 48) { //缶を発見
     SendMessage(OPEN); //アームを開くように指示
     Off(OUT_AC);
    }
     until (Message() == GO);
     go_forward;
     until (Message() == GO); //アームの動作が終了時
     go_forward; //再び直進
   } 
   ClearTimer(0);
   while (true) {
       if (SENSOR_1 < THERESHOLD -4) {
       turn_right1;
       } else {
         if (SENSOR_1 < THERESHOLD -2) {
           turn_right0;
       } else if (SENSOR_1 < THERESHOLD +2) {
           go_forward;
       } else if (SENSOR_1 < THERESHOLD +4) {
           turn_left0;
       } else {
          turn_left1;
       }
     if (SENSOR_3 > 48) {
    SendMessage(OPEN);
     if (SENSOR_3 > 48) { 
    SendMessage(OPEN); 
    Off(OUT_AC);
    } 
    if (nOnline == 8) {
      OnFwd(OUT_A);
      OnRev(OUT_C);
      Wait(300); 
      SendMessage(PUT);
       }
 
    until (Message() == GO);
    until (Message() == GO); 
  while (FastTimer(0) < nMAX) {
    if (SENSOR_1 < THERESHOLD -4) {
      turn_right1;
      } else {
        if (SENSOR_1 < THERESHOLD -2) {
          turn_right0;
      } else if (SENSOR_1 < THERESHOLD +2) {
          go_forward;
      } else if (SENSOR_1 < THERESHOLD +4) {
          turn_left0;
      } else {
          turn_left1;
       }
      ClearTimer(0);
     }
    Wait(STEP);
    }
    turn_left1; Wait(nMAX*STEP);
    cross_line;
    nOnline++;
    PlaySound(SOUND_CLICK);
    ClearTimer(0); 
 
    if (SENSOR_3 > 48) {
    SendMessage(OPEN);
    if (SENSOR_3 > 48) { //缶を発見
    SendMessage(OPEN); //アームを開くように指示
    Off(OUT_AC);
    }
    until (Message() == BACK);
    OnRev(OUT_AC);
    Wait(100);
    } 
 }

**アーム側のプログラム [#zd05de34]
 #define OPEN 1
 #define GO 2
 #define PUT 3
 #define BACK 4
 #define PowerA SetPower(OUT_A,0);
 #define PowerB SetPower(OUT_A,7);
 #define PowerC SetPower(OUT_C,0);
 #define PowerD SetPower(OUT_C,10); 
 #define PowerA SetPower(OUT_A,0); // アームを開ける為のパワー
 #define PowerB SetPower(OUT_A,7); // アームを閉じ、缶を掴み続けるパワー
 #define PowerC SetPower(OUT_C,0); // アームを下ろすのと、アームを上で固定するパワー
 #define PowerD SetPower(OUT_C,10);  // アームを上げる為のパワー
 task main()
 {
  ClearMessage();
  while (true) {
    PowerC; OnFwd(OUT_C);
    until (Message() == OPEN);
    PowerA; OnRev(OUT_A); 
    Wait(40);
    PowerC; OnRev(OUT_C);
    Wait(90);
    PowerB; OnFwd(OUT_A);
    Wait(40);
    PowerD; OnFwd(OUT_C);
    Wait(160);
    SendMessage(GO);
    PowerC; OnFwd(OUT_C);
    until (Message() == PUT);
    PowerC; OnRev(OUT_C);
    Wait(50);
    PowerA; OnRev(OUT_A);
    Wait(40);
    SendMessage(BACK);
    }
   Wait(10); 
 }
*苦労した点 [#y75617c8]
今回のロボットは変更点が特に多かった。最終的にプログラムの面では、缶を運搬時にメロディーを流すなど、かなり完成されたものであった。しかし、二台のロボットの連携が上手くいかなかったこと、ロボット自体の構造に少し無理があったことが災いしライントレースをして缶を積み上げることはできなかった。本番では、手堅く一つの缶にしぼりゴールを目指した。 班の製作に移り変わった当初は、分離型にしようとしていました。しかし、製作していくうちに合体型の方が、成功率・安定性・プログラムの量の三つの点で優れている!と感じました。そこで、合体型を作り始めました。まずは大まかな構造を話し合いエレベーター式にしようと決めました。

&ref(robocon1.png); 

構造上の最大の問題点は、前部分のエレベーターをどう支えるかでした。これは、後部に支えを作ることで解決はしましたが、車体全体の重さがかなり重くなってしまいました。この影響により、車輪が重さに耐えきれず進まなくなてしまいました。そこで、先生からの助言もありエレベーターの下のタイヤを、駆動輪に変更しました。それによりこの問題は解決しました。駆動輪のは、ディファレンシャルギアを使いました。
 今回のロボットは変更点が特に多かった。最終的にプログラムの面では、缶を運搬時にメロディーを流すなど、かなり完成されたものであった。しかし、二台のロボットの連携が上手くいかなかったこと、ロボット自体の構造に少し無理があったことが災いしライントレースをして缶を積み上げることはできなかった。本番では、手堅く一つの缶にしぼりゴールを目指した。 班の製作に移り変わった当初は、分離型にしようとしていました。しかし、製作していくうちに合体型の方が、成功率・安定性・プログラムの量の三つの点で優れている!と感じました。そこで、合体型を作り始めました。まずは大まかな構造を話し合いエレベーター式にしようと決めました。

構造上の最大の問題点は、前部分のエレベーターをどう支えるかでした。これは、後部に支えを作ることで解決はしましたが、車体全体の重さがかなり重くなってしまいました。この影響により、車輪が重さに耐えきれず進まなくなてしまいました。そこで、先生からの助言もありエレベーターの下のタイヤを、駆動輪に変更しました。それによりこの問題は解決しました。駆動輪のは、ディファレンシャルギアを使いました。

&ref(robocon4.JPG);

*反省 [#b06b11c2]
プログラムはearthが、とてもがんばってくれました。ロボットの構造自体は多大な時間をかけたが、まだまだでした。特に、アームとエレベーターの固定を考えるべきであったと思いました。このプログラムを是非使って成功させたかった。しかし、この講義を受講できて良かった。とても楽しかった。班のみんなありがとう。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS