目次
#contents
*課題 [#tf9e242a]
*ロボット [#i593e6bf]
**缶をつかむ部分 [#se7af7a4]
#ref(./ro3.jpg,50%,)

**缶をあげる部分 [#e130524a]
#ref(./ro2.jpg,50%,)
**動力 [#jcd994d8]
**全体 [#a985328b]
#ref(./ro1.jpg,50%,)
*プログラム [#nb492bf3]
**マスター側 [#xaacd2e0]
 // マスター側(タイヤ、センサー)
 /*
 B  -> 右のモーター
 C  -> 左のモーター
 S1 -> 光センサー
 S2 -> 超音波センサー
 */
**定義 [#j5c85497]
 #define CONN 1          // スレーブの接続番号
 #define SPEED 40
 #define OROSE 11        // アームを降ろさせる	
 #define TOJIRO 12       // 缶を掴ませる
 #define AGERO 13        // アームを上げさせる 
 #define HIRAKE 14       // 缶を離させる
 #define TUM 15          // 缶の上まで下ろす
 #define RYO 16          // 完了
 #define SIRO0 47         // 白のしきい値
 #define SIRO1 54
 #define KURO0 42         // 黒のしきい値
 #define KURO1 37
**ライントレース [#zec7eb5a]
 sub line_l()              //左側のライントレース
 {
  SetSensorLight(S1);
  if (SENSOR_1 > SIRO1){
      Off(OUT_B);
      OnFwd(OUT_C,SPEED);
     } else if (SENSOR_1 > SIRO0){
                OnFwd(OUT_B,20);
                OnFwd(OUT_C,SPEED);
     } else if (SENSOR_1 > KURO0){
                OnFwd(OUT_BC,SPEED);
     } else if (SENSOR_1 > KURO1){
                OnFwd(OUT_B,SPEED);
                OnFwd(OUT_C,20);
     } else {
             OnFwd(OUT_B,SPEED);
             Off(OUT_C);
     }
 }

 sub line_r()              // 右側のライントレース
 {
  SetSensorLight(S1);
  if (SENSOR_1 > SIRO1){
      Off(OUT_C);
      OnFwd(OUT_B,SPEED);
     } else if (SENSOR_1 > SIRO0){
                OnFwd(OUT_C,20);
                OnFwd(OUT_B,SPEED);
     } else if (SENSOR_1 > KURO0){
                OnFwd(OUT_BC,SPEED);
     } else if (SENSOR_1 > KURO1){
                OnFwd(OUT_C,SPEED);
                OnFwd(OUT_B,20);
     } else {
             OnFwd(OUT_C,SPEED);
             Off(OUT_B);
     }
 }
**アームの動作 [#xfae4857]
 sub orose(int t)     // アームを下ろす
 {
  int msg;
  SendRemoteNumber(CONN,MAILBOX1,OROSE);
  Wait(t);
 }

 sub hirake(int t)    // アームを開く
 {
  int msg;
  SendRemoteNumber(CONN,MAILBOX1,HIRAKE);
  Wait(t);
 }

 sub tojiro(int t)    // 缶をつかむ
 {
  int msg;
  SendRemoteNumber(CONN,MAILBOX1,TOJIRO);
  Wait(t);
 }

 sub agero(int t)     // アームを上げる
 {
  int msg;
  SendRemoteNumber(CONN,MAILBOX1,AGERO);
  Wait(t);
 }

 sub tum(int t)       // 二段目まで下ろす
 {
  int msg;
  SendRemoteNumber(CONN,MAILBOX1,TUM);
  Wait(t);
 }
**一連の動作 [#l04525a2]
 sub iti()        // Eの缶と一番上の缶
 {
  SetSensorLight(S1);
  SetSensorLowspeed(S2);
  until (BluetoothStatus(CONN) == NO_ERR);
  hirake(1000);
  while(SensorUS(S2) > 10){
        OnFwdSync(OUT_BC,SPEED,0);
       }
  Off(OUT_BC);
  tojiro(1000);
  long t0 = CurrentTick();
  while(CurrentTick()-t0 < 7000){
        line_l();
       }
  OnFwd(OUT_B,-40);
  OnFwd(OUT_C,40);
  Wait(700);
  t0 = CurrentTick();
  while(CurrentTick()-t0 < 2500){
        line_r();
       }
  t0 = CurrentTick();
  while(CurrentTick()-t0 < 1000){
        OnFwdSync(OUT_BC,SPEED,0);
       }
  Off(OUT_BC);
  Wait(500);
  RotateMotor(OUT_BC,-SPEED,65);
  Wait(100);
  agero(3000);
  while(SensorUS(S2) > 15){
        OnFwdSync(OUT_BC,SPEED,0);
       }
  Off(OUT_BC);
  tum(3000);
  Wait(500);
  while(SensorUS(S2) > 10){
        OnFwdSync(OUT_BC,SPEED,0);
       }
  Off(OUT_BC);
  tojiro(1000);
  OnFwd(OUT_BC,60);
  Wait(500);
  Off(OUT_BC);
  RotateMotor(OUT_C,SPEED,250);
  Wait(1000);
  Off(OUT_BC);
  OnFwd(OUT_BC,40);
  Wait(1000);
  Off(OUT_BC);
  hirake(1000);
 }
**task main [#a76eeaff]
 task main();
 {
  iti();
 }
**その他の缶のプログラム(未完成) [#z1417260]
本番に間に合わず未完成となってしまったプログラムである。
未完成のため数値は参考にならないがどのような流れで動かそうとしていたのかを見てほしい。

一番目と同様に2缶ごとゴールに運んでいく。一番目の後Fを取りTの缶の上に乗せゴールまで運ぶ。
次にGを取りHの缶の上に乗せゴールまで運ぶ。最後に中身の入っている缶を取りに行く。このとき、中身の入った缶が1,2,3のどこに置いてあってもいいように1,2,3の順番をまっすぐ動き、超音波センサーをつかって缶の場所を把握し取りに行く。その後最後に残った下の急カーブにある缶を上にのせゴールまで運ぶ。以上の流れでプログラムを作ったが調整途中で未完成のままになってしまった。
*結果・反省 [#d161449b]



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS