[[2005/A2/課題1]]
*右 [#r3f12029]
[[2005/A2/課題1]]
*「右」という字を書く [#r3f12029]
-制作者:レタス、富岡
***ロボットの概要 [#l09a5f56]
-モーター2つが左右のタイヤをそれぞれ動かし、3つ目のモーターがペンを上下に動かす。

 //「右を書く」 プログラム:とみおか
 //コメント:数値によるロボットの動きの変更しやすさを前面に押し出してる
#ref(2005/A2/富岡/k1r.jpg,60%)
ロボ右前方からの様子。3つ目のモーターと、ペンを動かす部分が見える。

**ペンの動かし方 [#tb045b9d]
-溝の入った輪状のパーツに輪ゴムを取り付け、それをモーターで回すことで、輪ゴムに接している鉛筆が上下に動く。

#ref(2005/A2/富岡/k1r_pen.jpg,around,50%)
その仕組みを横からの断面図で見る。
#clear

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

#ref(2005/A2/富岡/k1r_kotei.jpg,50%)


**プログラム [#oe7a9aef]
 //「右を書く」
 
 
 #define L   OUT_A             //表現を変える
 #define Pen OUT_B             //OUT_AはL、OUT_BはPenに
 #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);
 #define pen_down OnFwd(Pen);            //マクロ:ペン下げる 回転は止めない
 #define pen_up   OnRev(Pen);Wait(3);Off(Pen);  //ペン少し上げる
 
 void go (int t1)               //関数たち:前進、( )で移動時間を受け取る
 {OnFwd(L+R);Wait(t1); Off(L+R);} 
 void back (int t2)                       //後退
 {OnRev(L+R);Wait(t2); Off(L+R);}
 void turn_left (int t3)                  //左旋回
 {OnRev(L); OnFwd(R); Wait(t3); Off(L+R);}
 void turn_right (int t4)                 //右旋回
 {OnFwd(L); OnRev(R); Wait(t4); Off(L+R);}
 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)    //左払いを実現する関数
 void cv_r (int t, int w1, int w2)       //1画目の曲線移動を生む関数
 {
   repeat(t){
     OnFwd(L+R);Wait(w1);
     Float(R);Wait(w2);
   }
     OnFwd(L+R);Wait(w1);    //一瞬前進
     Float(R);Wait(w2);      //一瞬右タイヤ回さず
   }                         //を繰り返す
 }
 
 
 
 task main()
 {
   Wait(100);
   Wait(100);                //この間にロボから離れる
 
   pen_down;                 //1画目書く
   pen_down;                 //1画目を書く
   cv_r(12,2,2);
   cv_r(18,2,3);
   cv_r(18,2,3);             //二段階の曲線で
   pen_up;
   Off(L+R);
   
   back(25);turn_right(60);back(10);     //2画目への移動
   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);
   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);
   pen_down;                //4画目     くち
   go(70);turn_right(40);   //紙から離さず書く(口部分の2画目)
   pen_up;
 
   go(50);turn_right(180);back(20);
   pen_down;               //5画目
   pen_down;                //5画目
   back(50);
   pen_up;
 }

コメントをどうぞ
***プログラム上での工夫 [#e88a36c7]
-1画目の左払いを実現するcv_r関数。~
どうしても曲線にしたかった。
直進と、右タイヤを回さないのを細かく繰り返せば、人が見たとき緩やかな曲線に見えると思ってやってみた。~
それっぽくはなった&wink;

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

#comment


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