目次

課題2

コース

下の図のようなコースを作成し、黒い線に沿って動き、紙コップを移動させるロボットを製作せよ。

コース

第1コースを選んだので次のようなコースをトレースするロボットを製作することになった。 Aをスタート→Bを直進→Cを右折→Fを直進→Rを左折(一時停止)→Pを直進→X地点の紙コップを取得してコースに戻る→Qを左折→Sを直進(一時停止) →Y地点に紙コップを置いてコースに戻る→Sを直進(一時停止)→Fを左折(一時停止)→Cを右折(一時停止)→D地点へ(ゴール)

ロボットの説明

ロボットの構造

ロボット全体1 ロボット全体2 ロボット全体3

スペース.jpg

上の3枚の写真は実際に動かしたロボットの上、横、後ろから撮影したものである。RISのテキストに載っていた四輪車をベースにし、光センサーの高さの調節や少しでも小回りが利くように前輪と後輪を逆にした。本体の横にモーターを付け、そのモーターの先に輪を作り、輪をモーターの回転によって上下させることで紙コップを取る、置く動作をできるようにした。最初は輪をブロックで作っていたが、ブロックだと重く、また下した時の衝撃で崩れてしまうことがあったので、細い棒をチューブで繋いだものに変更した。その結果軽く、かつ衝撃にも強い輪を作ることができた。また、当初はロボットの進む方向側で紙コップを取りるものを考えたが、置くことを考えた時に本体の後ろで紙コップを取っておいた方がスムーズに進めると考えたので、進む方向とは逆の後ろ側で取るようにした。

紙コップを取る輪の部分

ロボット全体5

スペース.jpg

また、その細い棒をチューブで繋いでできた輪は、そのままだとコースの紙をこすりながら進むようになってしまい、ロボットが進むのに支障をきたした。かつ、輪を下した時の輪の高さが低く、ロボットの動き次第では紙コップが輪の外にはじき出されてしまうことがあった。そこで、上の写真のように輪の先に青く細長いパーツを付けてみたところ、輪と紙が触れる表面積を減り、摩擦が減ることで、ロボットが進みやすくすることができた。また、それによって輪を下した時の輪の高さがある程度の高さに保たれるようになり、紙コップが輪からはじき出されることがなくなった。

光センサー部分

センサー

スペース.jpg

光センサー高めにつけると周りからの光の影響を受けやすくなり、誤作動を起こしやすい。また、低すぎると光センサーが感じ取る明るさの変化が急激なものとなってしまい、動きのがたつきが大きくなり進む速度も遅くなってしまう。何度も調整した結果、上の写真のような高さが程よい高さであると判断した。

プログラム

定義

多用すると予想された一定時間光センサーを用いずに前進する動きや、左右にまがる動き、右旋回、左旋回、また交差点判断の後直進する場合の動きを定義した。

#define right_Uturn OnFwd(OUT_A);OnRev(OUT_C);//右旋回
#define right_turn OnFwd(OUT_A);Off(OUT_C);//右回転
#define left_Uturn OnFwd(OUT_C);OnRev(OUT_A);//左旋回
#define left_turn OnFwd(OUT_C);Off(OUT_A);//左回転
#define Brightness 47//明るさ
#define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//時間指定可能な前進
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//時間指定可能な後進
#define right_through left_Uturn;Wait(20);go(30);//右側ライントレース時の交差点直進
#define left_through right_Uturn;Wait(25);go(30);//左側ライントレース時の交差点直進

サブルーチン

ライントレースをする際に線の右側をトレースするパターンと左側をトレースするパターンを使うため、その2つをサブルーチンとして作った。また、センサーが0.26秒以上黒い線の上を通っていた際に旋回を行い、一時停止するプログラムだけでは交差点で止まらずに曲がってしまう場所があったので、その地点のために0.26秒ではなく0.17秒で旋回を行うものも作った。実際に交差点で動かしてみると左下の図のように動く。右下の図の赤い線は光センサーの通る軌跡であり、緑の円で囲まれた部分は光センサーが照らす白い分部が、線に沿って動く時よりも減るため明るさの値が下がることで右折を行うようになる。青い円で囲まれた部分は、照らす分部がほぼ黒となるために旋回を行う。黄色い円で囲まれた部分は、ロボット本体の車体が線に対して平行に進まない状態のため、直進→右折を繰り返し行い少しずつ車体を線に平行に近づけながら進む分部である。

スペース.jpg

交差点判断 交差点判断

右側ライントレース

sub right_Line()//右側ライントレース
{
    SetSensor(SENSOR_2,SENSOR_LIGHT);//端子2に光センサーをセット
    ClearTimer(0);
    while(FastTimer(0)<=26)//0.26秒以内は繰り返し、0.26秒を超えたら交差点と判断
     {
        if(SENSOR_2>Brightness+5)//センサーの値が明るさの閾値+5以上の時左旋回を行う
         {
            left_Uturn;
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness+4)//センサーの値が明るさの閾値+4以上の時左折を行う
       {
            left_turn;
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness)//センサーの値が明るさの閾値以上の時直進を行う
        {
            OnFwd(OUT_AC);
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness-4)//センサーの値が明るさの閾値-4以上の時右折を行う
        {
            right_turn;
            ClearTimer(0);
        }
        else//上記のいずれかの条件も満たさなかった時右旋回を行う
        {
            right_Uturn;
        }
    }
    
    Off(OUT_AC);
}

短い右側ライントレース

sub right_Linehalf()//右側ライントレース短
{
    SetSensor(SENSOR_2,SENSOR_LIGHT);//端子2に光センサーをセット
    ClearTimer(0);
    while(FastTimer(0)<=17)//0.17秒以内は繰り返し、0.17秒を超えたら交差点と判断
    {
        if(SENSOR_2>Brightness+5)//センサーの値が明るさの閾値+5以上の時左旋回を行う
        {
            left_Uturn;
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness+4)//センサーの値が明るさの閾値+4以上の時左折を行う
        {
            left_turn;
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness)//センサーの値が明るさの閾値以上の時直進を行う
        {
            OnFwd(OUT_AC);
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness-4)//センサーの値が明るさの閾値-4以上の時右折を行う
        {
            right_turn;
            ClearTimer(0);
        }
        else//上記のいずれかの条件も満たさなかった時右旋回を行う
        {
            right_Uturn;
        }
    }
}

左側ライントレース

sub left_Line()//左側ライントレース
{
    SetSensor(SENSOR_2,SENSOR_LIGHT);//端子2に光センサーをセット
    ClearTimer(0);
    while(FastTimer(0)<=26)
    {
        if(SENSOR_2>Brightness+5)//センサーの値が明るさの閾値+5以上の時右旋回を行う
        {
            right_Uturn;
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness+4)//センサーの値が明るさの閾値+4以上の時右折を行う
        {
            right_turn;
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness)//センサーの値が明るさの閾値以上の時直進を行う
        {
            OnFwd(OUT_AC);
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness-4)//センサーの値が明るさの閾値-4以上の時左折を行う
        {
            left_turn;
            ClearTimer(0);
        }
        else//上記のいずれかの条件も満たさなかった時左旋回を行う
        {
            left_Uturn;
        }
    }
    Off(OUT_AC);
}

短い左側ライントレース

sub left_Linehalf()//左側ライントレース短
{
    SetSensor(SENSOR_2,SENSOR_LIGHT);//端子2に光センサーをセット
    ClearTimer(0);
    while(FastTimer(0)<=17)
    {
        if(SENSOR_2>Brightness+5)//センサーの値が明るさの閾値+5以上の時右旋回を行う
        {
            right_Uturn;
            ClearTimer(0);
        }
         else if(SENSOR_2>Brightness+4)//センサーの値が明るさの閾値+4以上の時右折を行う
        {
            right_turn;
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness)//センサーの値が明るさの閾値以上の時直進を行う
        {
            OnFwd(OUT_AC);
            ClearTimer(0);
        }
        else if(SENSOR_2>Brightness-4)//センサーの値が明るさの閾値-4以上の時左折を行う
        {
            left_turn;
            ClearTimer(0);
        }
        else//上記のいずれかの条件も満たさなかった時左旋回を行う
        {
            left_Uturn;
        }
    }
}

紙コップを取る

sub cup_get()//紙コップを取る
go(130);//Pから紙コップを取りに行くための移動
left_Uturn;//Pから紙コップを取りに行くための移動
Wait(65);
OnRev(OUT_AC);//Pから紙コップを取りに行くための移動
Wait(80);
Off(OUT_AC);
OnFwd(OUT_B);//アームを下し、紙コップを取る
Wait(30);
Off(OUT_B);

プログラムのメイン

task main()
{
right_Line();//A-B間
Wait(100);//一時停止
right_through;//交差点通過
int A;
for (A=1; A<=2; A++)//B-C間およびC-D間
{
    right_Line();
    Wait(100);
}
right_through;//交差点通過
ClearTimer(1);
while(FastTimer(1)<=850)//E-F間の2つ目の急なカーブまで
{    
    right_Line();
} 
Off(OUT_AC);
left_turn;//右側ライントレースの位置から左側ライントレースの位置に移動
Wait(30);
left_Linehalf();//E-F間の2つ目の急なカーブからRまで
Off(OUT_AC);//一時停止
Wait(100);
left_Uturn;//一時停止した位置から円の部分のライントレース二移るための調整
Wait(30);
go(30);//一時停止した位置から円の部分のライントレース二移るための調整
left_Linehalf();//R-P間
Off(OUT_AC);//一時停止
Wait(100);
cup_get();//紙コップを取る
left_Line();//紙コップを取った位置から戻りつつQ-S間
Off(OUT_AC);//一時停止
Wait(100);
left_through;//交差点通過
right_Uturn;//左側ライントレースの位置から右側ライントレースの位置に移動
Wait(30);
right_Linehalf();//Sから円を一周して再びSに戻ってくるまで
Off(OUT_AC);//一時停止
Wait(100);
left_Uturn;//右側ライントレースの位置から左側ライントレースの位置に移動
Wait(50);
go(40);//右側ライントレースの位置から左側ライントレースの位置に移動
left_Line();//S-F間
Off(OUT_AC);
OnRev(OUT_B);//紙コップを置くためにアームを上げる
Wait(30);
Off(OUT_B);
Wait(100);//一時停止
left_Uturn;//左側ライントレースの位置から右側ライントレースの位置に移動
Wait(40);
go(40);//左側ライントレースの位置から右側ライントレースの位置に移動
right_Line();//F-C間
right_Uturn;//CからDの方向へ向く
Wait(60);
go(150);//C-D間
}

まとめ

反省点

前回の課題で使わなかったパーツを使ってロボットを作ろうとしたが、ほとんど同じパーツになってしまった。また、交差点判断の際に時々旋回と判断せずに曲がってしまい、そこから動きがずれていってしまうことが多々あったため、もう少し工夫すべきだったと思った。また、光センサーの付ける位置を少し高めにしていたため、まわりの光や影の影響を受けやすい作りになってしまった。

感想

発表の前日まで1回も成功していなかったので、それまで少し心配だったが本番も成功できてよかった。次の課題ではもう少し早めに成功できるようにし、今回の課題で得たことをしっかりと使っていきたい。


添付ファイル: fileRISライントレース5.jpg 55件 [詳細] file2ライントレースRISセンサー.png 45件 [詳細] fileライントレースの仕方.gif 56件 [詳細] fileコース.png 53件 [詳細] fileスペース.jpg 78件 [詳細] fileRISライントレース4.JPG 48件 [詳細] fileRISライントレース3.JPG 67件 [詳細] fileRISライントレース2.JPG 47件 [詳細] fileRISライントレース1.JPG 73件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-01 (木) 20:33:29 (569d)