2005/A2/課題1

「右」という字を書く

  • 制作者:レタス、富岡

ロボットの概要

  • モーター2つが左右のタイヤをそれぞれ動かし、3つ目のモーターがペンを上下に動かす。
k1r.jpg

ロボ右前方からの様子。3つ目のモーターと、ペンを動かす部分が見える。

ペンの動かし方

  • 溝の入った輪状のパーツに輪ゴムを取り付け、それをモーターで回すことで、輪ゴムに接している鉛筆が上下に動く。
k1r_pen.jpg

その仕組みを横からの断面図で見る。

困った! -- けれど、工夫した点

  • 鉛筆がゴム面に密着しない!
    • 横、正面の穴空きブロックに、9箇所ピンを挿すことで解決 [smile]
      ゴム輪の回転に連動し、ぶれなくなった。ただ、たまにピンの差し込み加減の調整をしなければならない。
  • 移動中にペンを下げるも、ペンが浮き上がって書けない!
    • 書くべき間はモーターを回しっぱなしにし、ペンを下げ続けることで解決 [smile]
      車体が浮き上がることもなかった。
k1r_kotei.jpg

プログラム

//「右を書く」

#define L   OUT_A             //表現を変える
#define Pen OUT_B             //OUT_*をL・Rに、OUT_BはPenに
#define R   OUT_C             // プログラムしやすかった

#define pen_down OnFwd(Pen);            //マクロ:ペン下げる 回転は止めない
#define pen_up   OnRev(Pen);Wait(3);Off(Pen);  //ペン少し上げる

void go (int t)                 //関数たち:前進、( )で移動時間を受け取る
{OnFwd(L+R);Wait(t); Off(L+R);} 
void back (int t)                       //後退    ※〜(int t2)から改良
{OnRev(L+R);Wait(t); Off(L+R);}
void turn_left (int t)                  //左旋回
{OnRev(L); OnFwd(R); Wait(t); Off(L+R);}
void turn_right (int t)                 //右旋回
{OnFwd(L); OnRev(R); Wait(t); Off(L+R);}

void cv_r (int t, int w1, int w2)       //1画目の曲線移動を生む関数
{
  repeat(t){
    OnFwd(L+R);Wait(w1);    //一瞬前進
    Float(R);Wait(w2);      //一瞬右タイヤ回さず
  }                         //を繰り返す
}



task main()
{
  Wait(100);                //この間にロボから離れる

  pen_down;                 //1画目を書く
  cv_r(12,2,2);
  cv_r(18,2,3);             //二段階の曲線で
  pen_up;
  Off(L+R);
  
  back(25);turn_right(60);back(10);    //2画目への移動
  pen_down;                 //2画目
  back(150);
  pen_up;
  
  turn_right(20);go(190);turn_left(140);go(15);   //移動
  pen_down;                 //3画目
  go(50);
  pen_up;

  go(90);OnRev(L);Wait(230);
  pen_down;                //4画目     くち
  go(70);turn_right(40);   //紙から離さず書く(口部分の2画目)
  pen_up;

  go(50);turn_right(180);back(20);
  pen_down;                //5画目
  back(50);
  pen_up;
}

プログラム上での工夫

  • 1画目の左払いを実現するcv_r関数。
    どうしても曲線にしたかった。 直進と、右タイヤを回さないのを細かく繰り返せば、人が見たとき緩やかな曲線に見えると思ってやってみた。
    それっぽくはなった [wink]

コメントをどうぞ

  • 違う関数を定義する際に使用する変数(仮の変数)は同じものを使ってもかまいません。例えば go, back,…を定義するときはどの場合も int t を使って行うことができます (もちろん違う変数名を使ってもかまいませんが)。 -- 松本(教員)? 2005-11-24 (木) 12:05:13
  • 直しました。 なぜかエラーだと思い込んでいましたが、エラーになりませんでした。助かりました。 -- 富岡? 2005-11-29 (火) 21:29:11


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