ロボティクス入門ゼミ

1. ハート形を描くロボット(必須)

ロボットにペンを取り付けA3用紙にハート型を描くロボットを作成しなさい。

#define gostraight OnFwd(OUT_A+OUT_C);Wait(135);Off(OUT_A+OUT_C);//まっすぐ進みます。(それだけ)
#define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(400);Off(OUT_A+OUT_C);//その場で回転して向きを変えます。
#define left OnFwd(OUT_A);Wait(1500);Off(OUT_A);//右のタイヤだけ動かして左向きに回ります。
 
 task main()
{
   SetPower(OUT_A,5);
   SetPower(OUT_C,5);
   
   left;/まずはハートの上のとこから半円を描きます。
   Wait(100);
   OnFwd(OUT_A);
   Wait(10);
   Float(OUT_A);
   gostraight;/一度止めてまっすぐ進み、
   turn;/その場で回転します。
   gostraight;/またまっすぐ進んで、
   Wait(100);
   left;/半円を書いて完成。
  }
 思っていたより時間の調整がシビアだった。
 更に同じ時間回してもいつも同じ角度回らず苦労した。

2. 台から落ちないロボット(必須)

机の上で動き回るロボットを作成しなさい。 ただし方向変換は机の端に来たときに行うこと。

 task main()
{ SetSensor(SENSOR_3,SENSOR_TOUCH); 
   SetSensor(SENSOR_1,SENSOR_TOUCH);  //センサーをタッチセンサーに設定
 while(true) 
   {OnFwd(OUT_A+OUT_C);  
   until((SENSOR_3==1)||(SENSOR_1==1)); //センサーが感知するまで前進
   Off(OUT_A+OUT_C); //感知したら止まる
   OnRev(OUT_A+OUT_C);  //後進
   Wait(100);
   OnFwd(OUT_A); 
   OnRev(OUT_C); //回転する
   Wait(100);}                     }
今思えば、このプログラミングはまだ楽だった。
センサーは前に2つつけてある。1度止まった後、回転するとき落ちないように
少しバックしてから回転するようにした。

3. ライントレースをするロボット(必須)

できるだけ速いロボットを作成すること

 #define THRESHOLD 39   // 閾値
 #define RUN_TIME 150   // トレースする時間(単位 1/10 秒)
task main ()
{
   SetSensor(SENSOR_1, SENSOR_LIGHT); //センサーをライトセンサーに設定   
   while ( true ) {        
    if (SENSOR_1 < THRESHOLD) {   //センサーが39以下の場合
         OnFwd(OUT_A+OUT_C);  //前進
       }
    else { //センサーが39以上の場合
           OnRev(OUT_A);  
           OnFwd(OUT_C);  //回転
           Wait(50);            
       } 
    if (SENSOR_1 < THRESHOLD){ 
           OnFwd(OUT_A+OUT_C);             
       }
    else {OnRev(OUT_C);
           OnFwd(OUT_A);  //逆方向に回転
           Wait(100);
                                   }
 }
 }
ラインに沿って走るというよりも、ラインの上をジグザグに走っていくプログラム。
うまくいくときはうまくいくけど、影などの影響かすぐにラインから逸れてしまうことも多くて、
数値の設定に苦労した。

4. 光を追いかけるロボット(必須)

まず最初に一回転してもっとも明るい方向(懐中電灯の方向)を探し、次に懐中電灯の光を追いかけて進むようなロボットを作成しなさい。

int light_max=0; //光センサーの値を0に指定
int time_max=0; //タイマーの値を0に指定


task main ()
{
  SetSensor(SENSOR_2,SENSOR_LIGHT);//光センサーを端子1にセット
  
  ClearTimer(0);//タイマーを0に
   
  While(Timer(1)<50){
   
       OnFwd(OUT_A);//一度ぐるっと回して
       OnRev(OUT_C);//光の強さと光の向きまでかかった時間を覚えさせる
       if(SENSOR_2>light_max){
            light_max = SENSOR_2;//光センサーが感知した最大の値を変数に指定
            time_max = Timer(0);//光の向きまでかかった時間を変数に指定
      
       }
       ClearTimer(0);
       While(Timer(0)<time_max){
           OnRev(OUT_A);//光の向きまで
           OnFwd(OUT_C);//逆に回転させる
       }
 
       Off(OUT_A+OUT_C);//一度とめて、
       Wait(10);
       OnFwd(OUT_A);//後はまっすぐ進む
       OnFwd(OUT_C);//
  }
}
変数を利用するのはうまくいったが、このプログラムだと、多分一回しか動かない。
時間があれば連続して光を探すプログラムを考えてみたい。(多分ない)

5. 演奏ロボット(必須)

インストラクション(説明書)の最後にある「Top Secret」を参考に、音楽を演奏しながら前進し障害物にぶつかったら(あるいは明るい光にあたったら)後退しながら方向を変えるロボットを作成しなさい。ただし移動のためのモータはひとつだけ使うものとし、また前進しているときと後進している時で違う音楽を演奏すること。

#define Do  523
#define Re  587
#define Mi  659
#define Fa  698
#define So 784  // 音の数値を設定
task music1()
{   while(true){
       PlayTone(Do,15); Wait(20);  
       PlayTone(Mi,15); Wait(20);  
       PlayTone(Fa,15); Wait(20);  
       PlayTone(So,60); Wait(20);
   
       PlayTone(Do,15); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(Fa,15); Wait(20);
       PlayTone(So,60); Wait(20);
   
       PlayTone(Do,15); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(Fa,15); Wait(20);
       PlayTone(So,30); Wait(20);
       PlayTone(Mi,30); Wait(20);
       PlayTone(Do,30); Wait(20);
       PlayTone(Re,30); Wait(20);
       PlayTone(Do,60); Wait(20);
   
       PlayTone(Mi,15); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(Re,15); Wait(20);
       PlayTone(Do,35); Wait(20);
       PlayTone(Do,5); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(So,15); Wait(20);
       PlayTone(So,15); Wait(20);
       PlayTone(Fa,60); Wait(20);
             
       PlayTone(Mi,15); Wait(20);
       PlayTone(Fa,15); Wait(20);
       PlayTone(So,30); Wait(20);
       PlayTone(Mi,30); Wait(20);
       PlayTone(Do,30); Wait(20);
       PlayTone(Re,30); Wait(20);
       PlayTone(Do,65); Wait(20);
     }
   
 task music2()
{
   while(true){
       PlayTone(Mi,15); Wait(20);  
       PlayTone(Mi,15); Wait(20);  
       PlayTone(Fa,15); Wait(20);  
       PlayTone(So,15); Wait(20);
    
       PlayTone(So,15); Wait(20);
       PlayTone(Fa,15); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(Re,15); Wait(20);
    
       PlayTone(Do,15); Wait(20);
       PlayTone(Do,15); Wait(20);
       PlayTone(Re,15); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(Mi,22); Wait(20);
       PlayTone(Re,8); Wait(20);
       PlayTone(Re,15); Wait(20);
   
       PlayTone(Mi,15); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(Fa,15); Wait(20);
       PlayTone(So,15); Wait(20);
       PlayTone(So,15); Wait(20);
       PlayTone(Fa,15); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(Re,15); Wait(20);
       
       PlayTone(Do,15); Wait(20);
       PlayTone(Do,15); Wait(20);
       PlayTone(Re,15); Wait(20);
       PlayTone(Mi,15); Wait(20);
       PlayTone(Re,22); Wait(20);
       PlayTone(Do,7); Wait(20);
       PlayTone(Do,30); Wait(20);
 
  task main()
  {
    start music1;  Wait(500);  //50秒間音楽1を鳴らす
    OnFwd(OUT_A+OUT_C); Wait(300);  //30秒間前進
    Off(OUT_A+OUT_C); Wait(200);  //すぐには止まらないのでしばらく待つ
    stop music1; //音楽を止める
    start music2;  Wait(600); //60秒間音楽2を鳴らす
    OnRev(OUT_A+OUT_C); Wait(600);  //60秒間後進
  }
 これは時間を指定して音楽を鳴らしながら走るプログラム。
 2のプログラムとこのmainのプログラムを足せば、
 どこかに当たったときに違う音楽を鳴らしながら後進するのができるはず(?)

6. 二足歩行ロボット(自由)

7. その他(自由)

全くのおまけみたいなものです。懐かしのメロディ...かな?

#define C 523//上から順に音階になっています(と思います)。(^^;) 一応ド
#define Y 554//ド#
#define D 587//レ
#define H 622//レ#
#define E 659//ミ
#define F 698//ファ
#define Q 740//ファ#
#define G 784//ソ
#define I 831// ソ#
#define A 880//ラ
#define J 932//ラ#
#define B 988//シ
#define K 1047//ド
#define P 1080//ド#
#define oto(a,b) PlayTone(a,b)
task main()
{
oto(E,25);Wait(50);
oto(E,25);Wait(28);
oto(E,25);Wait(50);
oto(A,25);Wait(28);
oto(Q,25);Wait(28);
oto(E,25);Wait(76);
oto(Q,25);Wait(50);
oto(Q,25);Wait(76);
oto(E,25);Wait(50);
oto(E,25);Wait(28);
oto(E,25);Wait(50);
oto(A,25);Wait(28);
oto(Q,25);Wait(28);
oto(E,25);Wait(76);
oto(Q,25);Wait(50);
oto(Q,25);Wait(76);
oto(E,25);Wait(28);
oto(Q,25);Wait(28);
oto(E,25);Wait(28);
oto(E,25);Wait(28);
oto(E,25);Wait(28);
oto(E,25);Wait(53);
oto(E,25);Wait(28);
oto(Q,25);Wait(28);
oto(A,25);Wait(28);
oto(Q,25);Wait(28);
oto(E,25);Wait(28);
oto(Q,25);Wait(78);
oto(A,25);Wait(28);
oto(B,25);Wait(28);
oto(A,25);Wait(28);
oto(A,25);Wait(28);
oto(A,25);Wait(28);
oto(A,25);Wait(53);
oto(A,25);Wait(28);
oto(B,25);Wait(28);
oto(P,25);Wait(28);
oto(B,25);Wait(28);
oto(A,25);Wait(28);
oto(B,25);Wait(103);
oto(E,25);Wait(28);
oto(E,25);Wait(28);
oto(E,25);Wait(53);
oto(P,25);Wait(128);
oto(B,25);Wait(28);
oto(A,25);Wait(28);
oto(Q,25);Wait(78);
oto(Q,25);Wait(28);
oto(A,25);Wait(28);
oto(B,25);Wait(28);
oto(A,25);Wait(28);
oto(Q,25);Wait(53);
oto(E,25);Wait(228);
oto(P,25);Wait(28);
oto(P,25);Wait(28);
oto(B,25);Wait(28);
oto(P,25);Wait(28);
oto(B,25);Wait(28);
oto(A,25);Wait(28);
oto(A,25);Wait(53);
oto(B,25);Wait(28);
oto(B,25);Wait(28);
oto(A,25);Wait(28);
oto(B,25);Wait(28);
oto(A,25);Wait(28);                  
oto(Q,25);Wait(28);
oto(Q,25);Wait(78);
oto(E,25);Wait(53);
oto(E,25);Wait(358);
oto(P,25);Wait(28);
oto(B,25);Wait(28);
oto(A,25);Wait(53);
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-02-12 (土) 07:27:56