バンパーの写真はもう残っておらず、バンパーの解説はできませんでした。すみません。図や説明を増やして、他の部分をわかりやすくしていました。

目次

(1)課題の内容

2箇所以上交差点のある周回コース(黒い線)をA0版の画用紙上描き、その自作のコースを3周するロボットを作成せよ。ただし、

①速さと正確さを追求すること

②交差点で優先側を走っていない場合には一時停止し、もう一台のロボットが優先道路上にある場合には行き過ぎるのを待つこと

③前方を進むもう一台のロボットに追いついて接触した時、以下のいずれかの動作をさせること (重複しないようにひとり一つ選ぶ)

(a)3秒間停止して待つ。   (b)その場で1回だけ360度旋回する   (c)180度旋回して5秒間コースを逆走し、再び180度旋回してもとの向きに走る

*なお、私達のグループは(a)と(b)を選択した。

(2)コースの説明

071213_1122~01.jpg

上の図のように、交差点が3つ、カーブが4つある。比較的シンプルなコースだが、 (a)カーブのすぐ後の交差点や(b)急カーブのすぐ近くに交差点がある所が難所である。

難所1+.jpg

カーブを曲がりきらないと、交差点で一時停止したとき、車体が黄色の矢印の方向を向いてしまう。そして、そのまま直進するため、その方向にコースアウトする。(上の図を参照)

難所2.jpg

急カーブを曲がりきらないと、2つ光センサが黄色の丸の上に乗ってしまう。このとき黒黒と認識するため、一時停止の後直進し、次のカーブをまわれなくなる。

これらの難所はカーブを正確に回れるようにすることで乗り切れた。詳しくは(5)工夫した点参照。

(3)ロボットの説明

①正面

正面から見た図.jpg

最初に設定した位置ではセンサーが離れすぎてしまうので少し狭くするため片方だけ1ブロック分内側に移してある。ロボットの前方にはダブルバンパーを取り付けた。

②側面

側面.jpg

前方のタイヤのみがモーターとつながっている。後輪はゴム無しである。

③全体図

全体図.jpg

④各パーツ

ロボットの各パーツ.jpg

制作過程の失敗談1:歯車の数

当初は、前輪と後輪を連結したマシンを考えていた。この場合、前輪と後輪の間にある歯車の数が偶数個だと前輪と後輪の回転方向が逆になる。そのため、噛み合わせがうまくいっても前進することができない。このことはディファレンシャル・ギアの原理に関わっている。

失敗談1.jpg

制作過程の失敗談2:左右のタイヤを連結させてしまったこと

オリジナルの車体を作った際、左右の車輪を連結してしまった。そのため、プログラムは正常でもうまく曲がることができなかった。くだらないミスだったが、気づくまでに少し時間がかかった。

(4)プログラムの説明

①プログラム

#define THRESHOLD 40  //閾値を定義
#define Do  523 //音の高さを定義
#define Re  587
#define Mi  659
#define Fa  698
#define So  784
#define Ra  880
sub SHOUTOTU() 
{OnRev(OUT_A+OUT_C);Wait(10);Off(OUT_A+OUT_C);Wait(300);} //衝突の際のサブルーチン


task play_music() //キラキラ星   
{ while(true)
   {PlayTone(Do,30); Wait(40);  
    PlayTone(Do,30); Wait(40);  
    PlayTone(So,30); Wait(40);  
    PlayTone(So,30); Wait(40);
    PlayTone(Ra,30); Wait(40);
    PlayTone(Ra,30); Wait(40);
    PlayTone(So,40); Wait(60);
    PlayTone(Fa,30); Wait(40);
    PlayTone(Fa,30); Wait(40);
    PlayTone(Mi,30); Wait(40);
    PlayTone(Mi,30); Wait(40);
    PlayTone(Re,30); Wait(40);
    PlayTone(Re,30); Wait(40);
    PlayTone(Do,40); Wait(60);  
    PlayTone(So,30); Wait(40);
    PlayTone(So,30); Wait(40);
    PlayTone(Fa,30); Wait(40);
    PlayTone(Fa,30); Wait(40);
    PlayTone(Mi,30); Wait(40);
    PlayTone(Mi,30); Wait(40);
    PlayTone(Re,40); Wait(60);
    PlayTone(So,30); Wait(40);
    PlayTone(So,30); Wait(40);
    PlayTone(Fa,30); Wait(40); 
    PlayTone(Fa,30); Wait(40);
    PlayTone(Mi,30); Wait(40);
    PlayTone(Mi,30); Wait(40);
    PlayTone(Re,40); Wait(60);
    PlayTone(Do,30); Wait(40);
    PlayTone(Do,30); Wait(40);
    PlayTone(So,30); Wait(40);
    PlayTone(So,30); Wait(40);
    PlayTone(Ra,30); Wait(40);
    PlayTone(Ra,30); Wait(40);
    PlayTone(So,40); Wait(60);
    PlayTone(Fa,30); Wait(40);
    PlayTone(Fa,30); Wait(40);
    PlayTone(Mi,30); Wait(40);
    PlayTone(Mi,30); Wait(40);
    PlayTone(Re,30); Wait(40);
    PlayTone(Re,30); Wait(40);
    PlayTone(Do,50); Wait(70);
     Wait(20);}}
int kaisuu;  //kaisuuという変数を定義して、何周走ったかの目安にする。
task main()//プログラム本体
{  kaisuu=0; //初めkaisuuは0
   SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1を光センサとする
   SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3を光センサとする
   SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ2をタッチセンサとする
   
   start play_music ; //「キラキラ星」演奏スタート
   while(kaisuu<=9) //交差点の停止部分を9回通過するまで、以下のプログラムを実行。
   {if(SENSOR_1>THRESHOLD && SENSOR_3>THRESHOLD){OnFwd(OUT_A+OUT_C);} 
    //両方の光センサが白のとき直進
    if(SENSOR_1>THRESHOLD && SENSOR_3<THRESHOLD){OnRev(OUT_C);OnFwd(OUT_A);}
    //左が白、右が黒のとき右に曲がる。
    if(SENSOR_1<THRESHOLD && SENSOR_3>THRESHOLD){OnFwd(OUT_C);OnRev(OUT_A);}
    //左が黒、右が白のとき左に曲がる。
   *if(SENSOR_1<THRESHOLD && SENSOR_3<THRESHOLD)                   
    {kaisuu++;Off(OUT_A+OUT_C);Wait(100);OnFwd(OUT_A+OUT_C);Wait(85);}
    //両方の光センサが黒のとき、1秒停止 した後直進。このとき、kaisuuを1増やす。*
    if(SENSOR_2==1){stop play_music;SHOUTOTU();start play_music;} }
    //タッチセンサが反応したら、3秒停止した後、再スタートする。停止中は音楽を止めている。
stop play_music;  //音楽停止
Float(OUT_A+OUT_C);} //ロボットも停止

②衝突した際、その場で1回だけ360度旋回する場合はsub SHOUTOTU()の中身を以下のようにする。

sub SHOUTOTU()
{OnRev(OUT_A+OUT_C);Wait(10);
OnFwd(OUT_A);OnRev(OUT_C); Wait(215);}

③ライントレースの原理

ライントレースには、以下の二つの方法がある。

(a)光センサをロボットの前方に、道路の幅よりやや広く並べて取り付ける。 両方白→直進 右のみ白→左に曲がる 左のみ白→右に曲がる 両方黒→停止後直進

(b)光センサをロボットの前方に、くっつけて取り付ける。 両方白→停止後、直進 右のみ白→左に曲がる 左のみ白→右に曲がる 両方黒→直進

交差点ではみ出さずに停止できるので、この課題では(a)の方が優れている。

ライントレースの流れ(重要な部分のみ).jpg

ライントレース.jpg

④untilを用いるか否か

例えば右の光センサが白、左が黒のとき、左に曲がらなければならない。何秒間左に曲がれば良いのだろうか?

左も白になるという条件まで左に曲がるように、until を用いてプログラムを組むこともできる。しかし、例えば上の例の瞬間から左が白になるまでは、右の光センサの変化が無視され、コースの変化に対して柔軟に対応できなくなる。

実際、交差点の停止部分で回転し続け、うまくいかなかった。これは以下のような理由による。コースによっては、交差点の停止部分で右が白、左が黒→黒黒と変化することがある。このプログラムでは、白黒→黒黒と変化してもなお、untilの前の命令(すなわち、左が白になるまで左回転)を実行し続けているからである。(下の図参照)

until.jpg

⑤交差点

両方の光センサが黒を認識することで、交差点に到達したことを認識し、停止するようにプログラムした。その後、85秒間直進する。何秒直進するかを調節するのが大変だった。短すぎると、反対側の黒の太線部分で停止しまうし、長すぎると直後のカーブをつっきてしまうからだ。

⑥衝突した際には

マシンの前方にタッチセンサを備えつけ、それが反応することで他のマシンとの接触を認識する。その後、3秒間停止して再び動き出すようにプログラムした。

⑦いかにして、3周したら停止させるか?

以下の2つの方法が考えられるが、前者をとった。

(a)whileの条件に時間を用いる

1周にかかる時間を計測し、その3倍の時間の間だけwhileの中身が実行されるようにする。

(b)whileの条件に変数を用いる

交差点の停止部分で両方の光センサが黒を認識する度に1増加するような変数を定義し、3周した時点で止まるようにする。

衝突した際に3秒間だけ停止するようにプログラムしたから、衝突した場合3周回る前に停止してしまう。よって、後者の方が適している。

(5)工夫した点

①速さと正確さは両立できない

とりあえず、スピードを抑え、コースを3周することをまず第一に考えた。直線は問題なかったから、いかにきついカーブでもまわれるかが問題だった。

②正確さの追求

(a)左右のタイヤ間の距離

左右のタイヤ間の距離が小さいほど、小回りがきく。そのため、モーターの大きさから考えて幅が最小である、オリジナルの車体を作った。

(b)前輪と後輪をつなぐか?

実際に、試してみたところそれぞれのタイヤが独立していた方が方向転換がうまく行き、スムーズに曲がれた。だから、前輪と後輪を独立させた。

(c)ゴム無しの後輪

最初は前後輪ともにゴムのタイヤにしていた。しかし、カーブを曲がる際に、後輪のゴムが抵抗となってスムーズに曲がることができなかった。松本先生のアドバイスで、後輪をゴムのついていないタイヤに変えることで摩擦を減らし、スムーズに曲がれるようにした。

Bさの追求〜ギア及びタイヤの半径比〜

今回のマシンのように、前輪のみがモーターと直結しているマシンが、1秒間直進した場合に進む距離を求め、最速の組み合わせを考えてみた。

一秒間にタイヤが回転する回数は b×2×3.14×a÷(c×2×3.14)=a×b/c

よって、求める距離は (a×b/c)×d×2×3.14

a:モーターの1秒間あたりの回転数 b:モーターに取り付けたギアの半径 c:タイヤに取り付けたギアの半径 d:タイヤの半径 

*円周率は3.14とした。

aは定数だから、bとdをできるだけ大きくして、cを小さくすれば速くなることがわかる。

しかし、空中で回転させる場合は問題ないが、実際に地面で回転させる場合は計算と合わなかった。 これは、一定なのはモータの回転数ではなく出力であること、タイヤに取り付けたギアの半径を小さくして、タイヤの半径が大きくすれば、地面との摩擦によるモーメント(前進方向と逆向き)が前進方向のモーメントと比較して、大きくなるためだと考えられる。(下の図参照)

摩擦.jpg

(6)改善点

①難所の(a)を乗りきる別の方法

難所の(a)はカーブを曲がる能力を上げることで乗り切れた。しかし、交差点を、停止部分と垂直に進むためのプログラムも考えてみた。これは上のプログラムの黒黒の場合の中身に(*にはさまれている部分)に相当する。

Off(OUT_A+OUT_C);Wait(100);
OnFwd(OUT_A+OUT_C);until(SENSOR_1>40 || SENSOR_3>40);)
if(SENSOR_1<40 && SENSOR_3>40)
{Off(OUT_C);OnFwd(OUT_A);until(SENSOR_1>40 && SENSOR_3>40);}
if(SENSOR_1>40 && SENSOR_3<40)
{OnFwd(OUT_C);Off(OUT_A);until(SENSOR_1>40 && SENSOR_3>40);}
if(SENSOR_1>40 && SENSOR_3>40){OnFwd(OUT_A+OUT_C);Wait(85);}

黒黒となったら、どちらかの光センサが白となるまで直進。白白となったら、停止部と平行になったと判断して直進。右が白、左が黒の場合、右の前輪が出すぎだと判断し、左のタイヤを前に進める。右が黒、左が白の場合も同様。以下の図は左が前に出て停止した場合である。

シンプログラム.jpg

停止後何秒直進するかの調節がまだのため、このプログラムは試作段階である。

②軽量化

モーターが同じ力しか出せない以上、できるだけ軽い方が早く走れると考えた。穴が開いている部品を使ったり、使う部品は最小限にする等の工夫が考えられる。しかし、軽くすると丈夫さが失われ、そのバランスが問題である。

4輪→3輪

曲がる際には摩擦が少ないほうがうまくいく。3輪の方が4輪よりも摩擦が少ない。

(7)感想

カーブの後すぐにある一時停止に車体が斜めの状態で侵入してしまい、一時停止の後直進するというプログラムによってコースアウトしてしまい直すのに苦労しました。結局ロボット自体を変えるしか方法がなく、組み替えるのに時間がかかって大変でした。

最初は課題1より簡単だと思っていたが、むしろこっちの方が大変で時間がかかった。それだけにキチンと3周したところを見たときはとてもうれしかった。

(8)コメントをお願いします

  • 初めて見た人にもわかるように、そのバンパーの機構でどのように接触センサーを押しているかの説明がほしいです。 -- クノ? 2007-12-15 (土) 20:43:36


添付ファイル: file失敗談1.jpg 377件 [詳細] fileライントレース.jpg 343件 [詳細] fileライントレースの流れ(重要な部分のみ).jpg 291件 [詳細] file摩擦.jpg 438件 [詳細] fileシンプログラム.jpg 352件 [詳細] fileuntil.jpg 386件 [詳細] file全体図.jpg 349件 [詳細] file側面.jpg 379件 [詳細] fileロボットの各パーツ.jpg 315件 [詳細] file正面から見た図.jpg 386件 [詳細] file難所2.jpg 309件 [詳細] file難所1+.jpg 300件 [詳細] file難所.jpg 98件 [詳細] fileライントレース 直進.jpg 97件 [詳細] fileライントレース 一時停止.jpg 91件 [詳細] file難所1.jpg 154件 [詳細] file難所1.jpg.svg 112件 [詳細] file071213_1122~01.jpg 407件 [詳細] file071213_0111~01.jpg 156件 [詳細] file071213_0051~01.jpg 150件 [詳細] file071213_0038~01.jpg 164件 [詳細] file071211_1652~01.jpg 150件 [詳細] file071206_2025~01.jpg 163件 [詳細] file071206_2026~01.jpg 173件 [詳細] file071206_2026~02.jpg 168件 [詳細]

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