- 追加された行はこの色です。
- 削除された行はこの色です。
[[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