2009a

目次

更新履歴(6/16〜)

7/19

リナ、とさ犬:インデントを改良いたしました

t_min,t_maxを数字に変更いたしました

7/8

リナ:プログラムを改良。インデントを行いました

ぶつ切りにしてあるためにインデントしても見難いとは思いますが

幾分かましになったでしょうか

7/3

課題3スタート

それに伴いウッディは解体をされました。

およそ3週間という短い命を全うし、無事課題を成功させることができたウッディに敬意を表するとともに

必ずこのページで☆をとろうと決意を新たに頑張ろうと思いました。

などという決意表明はどうでもよく

ウッディが解体されたため、この先の更新は主にプログラムのみとなります。

本体の機構については覚えてることのみ、新たな動画写真の更新は不可能

となってしまったことをご了承ください。

6/24

コースの説明追加

リナ:プログラムの説明を増量しました

6/22

リナ:改良したプログラムをアップ

それにより説明等にも変更があります。

6/20

リナ:プログラム改良しました

後でアップします

6/19

ウッディ弐号機完成!!!写真等アップします

それに伴い一部ホームページ変更

リナ:プログラムの改良完了

6/18

ホームページ作成期限を知りました(笑)

ウッディが弐号機に進化予定

プログラムを更新しました。

6/17

ホームページにウッディの写真、機構の説明増加

6/16

アームの機構を変更しました。 before

アームbefore1
アームbefore2

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ after

アームafter1
アームafter2

これにより紙の隅に引っ掛かっていた等の問題が改善されました。

ロボットの説明

今回のロボットは小回りを利かすことを目的として、本体の横幅を小さくしました。

コンセプトは「こじんまり」です。

ところが通りすがりの人にみみっちいといわれ、みみっちいから「ミミ」と名づけられました。

結局少し大きくなってしまいましたが、バランスも考え、できる限り小さくまとめることを最優先に考えて作りました。

がしかし、やはり大きくなってしまったため、ウドの大木と言われ、ウドの大木から「ウッディ」と名付けられました。

このロボットは最初に述べた通り小回りが利くことを優先し、小型化を図ったため、ギアを二つに抑えました。

それにより、牛乳パックをつかむという行為ができません。

そのかわりに、内側に曲がっている腕を2本つけることで、安定して牛乳パックを運ぶことを目指しました。

他にも、前に重みが集中しているために、RCXの後ろにパーツを隙間なく並べていることや、

光センサーの高さの調節のためにパーツがはさんであることなど

パッと見ではわからないこだわりの塊となっております。

また、ウッディはライントレースが得意で、すごくスムーズに曲がっていけます(自社比)

初めは地面に近いことが理由だと思いましたが、車体が低いのと、横幅がせまい(タイヤ回り)のため、

横にぶれにくく、安定しやすいことも理由かと思います、

「こじんまり」というコンセプトが思わぬ利益を生んでくれました。

機体別解説

零号機(ミミ)

ミミと名付けられた所以

このときはまだこのサイズでした

壱号機

写真の撮り忘れにより、絵はないですが、

一号機改の前に出ている黒い部分が固定され、少し強度の低い感じでした

壱号機改(ウッディ)

正面
ウッディ正面
内部
ウッディ内部
裏面
ウッディ裏面

正面衝突、より中心に近い位置での衝突を考え、

固定をし牛乳パックをつかむ部分であった黒いパーツをタッチセンサーにつなげることにより、

壱号機より広い範囲のものに対してタッチセンサーが反応するようになりました。

つないだ部分が想定外にきれい動くので、6月11日現在大変満足しております。

特に苦労、工夫した点

.織奪船札鵐機

小さくすることがコンセプトであったのですが、

本体の下はすでにギアと光センサーでいっぱいで、タッチセンサーの入る位置はありませんでした。

そこで、タッチセンサーを進行方向と逆に向け、車体の前方に設置、黄色の棒の部分を押してセンサーを反応できるようにしました。

それにより、前方にパーツが出るのをできる限り抑えることができました。

センサー機構

↓解説↓

(前)

センサー機構解説

(後)

▲織奪船札鵐機屡娠後

タッチセンサーで反応させた後、元の位置にパーツが戻らず、

タッチセンサーを刺激しっぱなしということになってしまった、ということが一つ。

また、牛乳パックのような軽いものに触れても、動きがいいためにタッチセンサーに反応してしまうという二つの問題がありました。

そこで、タイヤのゴムを使うことにしました。

それによりゴムがばねの役割を果たし、元の位置にも戻り、弱い刺激では反応もしないようになりました。

(通常時)

ゴムbefore

↑↑↑↑↑↑↑↑↑↑↑↑

↓↓↓↓↓↓↓↓↓↓↓↓

(押されている状態)

ゴムafter
苦労した点まとめ
ウッディ正面

弐号機(ウッディ)

弐上

弐前

弐後

キモイです。

プログラムの都合上後ろにアームを2本つけたところ、

蜘蛛みたいになってしまって大後悔です

しかし、おかげでうまく動くので結果オーライでしょうか

弐号機は壱号機改の

・横幅が広くて、パックをよけにくい。
・前にアームが長く、間隔が狭いため、牛乳パックをはじいてしまう。
・上とは逆にアームを短く、または間隔を広くすると運べない

という欠点を改良するためにつくりなおされました。

しかし結局ベースは壱号機なので、正直弐号機というほど斬新でもないのですが。

見た目が大きく変わったとかいう理由も少しあり、というか、主な理由は

改のさらに改の言い方が見当たらなかったんでいっそ気分一新で弐号機となっています。

特に苦労、工夫した点

今回特筆すべき点は二つです。

〜芦鸞臻足のあれはいかにして引き継がれたか。

∩枋螻阿粒萍

です。


新アーム機構

このように、(見難いですが)短い黒のパーツを2種類使うことで、

理想の角度と程よい長さを実現しました。

また邪魔になりにくいように、先端を後ろに向けることにしました。 

相変わらず大満足!といきたいところですが、前回に比べて、

・小さいスペースにパーツが密集
・パーツが短いため試行錯誤できるパターン自体が少ない

などの理由だと思いますが

少しぎこちなくなってしまいました…

なのでぼちぼち満足しております(笑)


まずは長いと引っ掛かってしまうので短いアームを使用しました。

しかしそうするとやはりするするとパックがいとも簡単に抜けて行ってしまいました

そのために苦し紛れに写真のようにやりました。

本来はほんの冗談のようなものでした

新機構

ポイントは赤枠のところです

新機構2

これを付けたために、想像以上に引っかかるようになり、なかなか抜けなくなったのに加え、

アームは短くて済むので、牛乳パック関連のミスが激減しました。

おまけ

おまけ

ホイールのつもりです(笑)

少し物足りなかったのでつけてみました。

デザイン性アップで評価もアップ!

…とはいかないですね

コース

コース

交差点4か所

一周するのにラインを8回もまたぐなかなか大変なコースだと思います、

ゆるやかに見えますが、場所によって急だったり、同じような傾きがないために

走りがいのあるコースになっております。

(走る方向)

コース

プログラム

リナ

課題2の牛乳パックを次の交差点まで押してそのあとよけるというプログラムを作成

とさ犬

課題1の交差点にある牛乳パックをよけるというプログラムを作成

リナのプログラム

define

#define THRESHOLD 40
#define time1 50
#define time2 180 
#define time3 55
#define time4 70
#define time5 160
#define time6 45
#define TURN_LEFT OnFwd(OUT_A);OnRev(OUT_C);Wait(time1);
#define TURN_RIGHT OnFwd(OUT_C);OnRev(OUT_A);Wait(time3);
#define GO OnFwd(OUT_A+OUT_C);Wait(time2);
task main ()
{

センサー定義

    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_2,SENSOR_TOUCH);
    SetSensor(SENSOR_3,SENSOR_LIGHT);

関数定義

    int t;
    for(t=1;t<=24;)
    { 
        while(t<=24)
        {
            OnFwd(OUT_A+OUT_C);

タッチセンサー定義

            if (SENSOR_2==1)
            {
                OnRev(OUT_A+OUT_C);
                Wait(100)
                Off(OUT_A+OUT_C);
                Wait(100);
                OnFwd(OUT_A+OUT_C);
                Wait(100); 
            }
タッチセンサーに触れたところから1秒間後ろに下がって止まった後、
 
同じところにまで前進するようになっています 

ライントレース

            if(SENSOR_1>THRESHOLD) センサー1が白のとき
            {
                if(SENSOR_3>THRESHOLD) センサー3が白のとき(1,3)=(白,白)
                {
                    OnFwd(OUT_A+OUT_C);
                }
                else センサー3が黒のとき (1,3)=(白,黒)
                { 
                    OnRev(OUT_A);
                    OnFwd(OUT_C);
                }
            }
            else センサー1が黒のとき
            {
                if(SENSOR_3>THRESHOLD) センサー3が白のとき(1,3)=(黒,白)
                {
                    OnRev(OUT_C);
                    OnFwd(OUT_A);
                }
                else センサー3が黒のとき(1,3)=(黒,黒)
                {

交差点識別(関数による場合分け)

                    if((t!=2)&&(t!=6)&&(t!=12)&&(t!=16)&&(t!=18)&&(t!=22))

tの値が2でも6でも12でも16でも18でも22でもないとき
                    {
                        Off(OUT_A+OUT_C);
                        Wait(10);
                        t++;
                        OnFwd(OUT_A+OUT_C);
                        Wait(10);
                    }
交差点を認識しているかのチェックのため、少し止まる用にしてあります。

交差点識別(関数による場合分け)

                    else if ((t==2)||(t==18))

tの値が2か18の時

牛乳パック回避プログラム

                    {
                        OnRev(OUT_A+OUT_C);
                        Wait(time4);
                        TURN_LEFT;
                        GO;
                        TURN_RIGHT;
                        OnFwd(OUT_A+OUT_C);
                        Wait(time5);
                        TURN_RIGHT;
                        OnFwd(OUT_A+OUT_C);
                        Wait(130);
                        while((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))
                        { 
                            OnFwd(OUT_A+OUT_C);
                        }
                        OnFwd(OUT_A+OUT_C);
                        Wait(35);      
                        OnFwd(OUT_A);
                        OnRev(OUT_C);
                        Wait(time6);
牛乳パックを回避させた後、どちらかの光センサーが反応するまで直進をさせています。

そしてその後に少し進んでいるのは、光センサーの位置が車輪よりもかなり前なので、

そこで回転しては、光センサーの間からラインが出てしまうからです。

これにより、線を一度出た後でもライントレースをしやすくなっています。(1)

牛乳パック修正

                        ClearTimer(0);
                        while(Timer(0)<=20)
                        {
                            if(Timer(0)<5)
                            {
                                OnFwd(OUT_A+OUT_C);
                                if(SENSOR_1>THRESHOLD)
                                {
                                    if(SENSOR_3>THRESHOLD)
                                    {
                                        OnFwd(OUT_A+OUT_C);
                                    }
                                    else
                                    {
                                        OnRev(OUT_A);
                                        OnFwd(OUT_C);
                                    }
                                }
                                else
                                {
                                    if(SENSOR_3>THRESHOLD)
                                    {
                                        OnRev(OUT_C);
                                        OnFwd(OUT_A);
                                    }
                                }   
                            }   
                            else if(Timer(0)>=5)
                            {
                                OnRev(OUT_A+OUT_C);
                            }
                        }
                        t++;
                    }
初め0.5秒間ライントレースさせることにより、車体をラインと平行にしています。

その後に1,5秒間バックをさせることによって、

初め逆にライントレースしようかと思いましたが、車体の前方に光センサーがついているためか失敗したためこうしました
 
交差点を認識するまで押してしまった牛乳パックを元の位置に戻すようになっています。

そのためにウッディの後ろにアームはつきました。(1)

交差点識別(関数による場合分け)

                    else if ((t==6)||(t==16)||(t==22))
                    {
                        OnRev(OUT_A+OUT_C);
                        Wait(time4);
                        TURN_LEFT;
                        GO;
                        TURN_RIGHT;
                        OnFwd(OUT_A+OUT_C);
                        Wait(time5);
                        TURN_RIGHT;
                        OnFwd(OUT_A+OUT_C);
                        Wait(210);      
                        OnFwd(OUT_A);
                        OnRev(OUT_C);
                        Wait(time6);
                        OnRev(OUT_A+OUT_C);
                        Wait(150);
                        t++;
                    }  
この交差点は、前回と違い交差点の奥に直線が短く、迂回した後にラインに触れさせるプログラムでは、

うまくいきませんでした、なのでこの交差点だけはすべて時間で指示をして

上と同じような動きをさせています。(2)

交差点識別(関数による場合分け)

                    else if (t==12)
                    {
                        OnRev(OUT_A+OUT_C);
                        Wait(70);
                        TURN_LEFT;
                        GO;
                        TURN_RIGHT;
                        OnFwd(OUT_A+OUT_C);
                        Wait(160);
                        TURN_RIGHT;
                        OnFwd(OUT_A+OUT_C);
                        Wait(120);
                        while((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))
                        {
                            OnFwd(OUT_A+OUT_C);
                        }
                        OnFwd(OUT_A+OUT_C);
                        Wait(60);      
                        OnFwd(OUT_A);
                        OnRev(OUT_C);
                        Wait(time6);
                        ClearTimer(0);
                        while(Timer(0)<=22)
                        {
                            if(Timer(0)<7)
                            {
                                OnFwd(OUT_A+OUT_C);
                                if(SENSOR_1>THRESHOLD)
                                {
                                    if(SENSOR_3>THRESHOLD)
                                    {
                                        OnFwd(OUT_A+OUT_C);
                                    }
                                    else
                                    {
                                        OnRev(OUT_A);
                                        OnFwd(OUT_C);
                                    }
                                }
                                else
                                {
                                    if(SENSOR_3>THRESHOLD)
                                    {
                                        OnRev(OUT_C);
                                        OnFwd(OUT_A);
                                    }
                                }  
                            }
                            else if(Timer(0)>=7)
                            {
                                OnRev(OUT_A+OUT_C);
                            }
                        }
                        t++;
この交差点では奥の直線に触れる前に他の直線で光センサーが反応してしまい、

うまくいかなかったため、別に分けて微調整しています。

動きとやることは,搬紊錣蠅△蠅泙擦(3)
                    }   
                }
            }
        }
    }
    Off(OUT_A+OUT_C);
}

絵を交えた解説

(1)
曲がり方

,良分でまずラインを読み取ります。

交差点まで光センサーが行くので、もちろん牛乳パックは押し出されています。

そのあと△良分では、ライントレースを少しして、方向を安定させたのち、

バックをすることで、牛乳パックを交差点まで押し戻します。

(2)
コース
コース

特に説明はいらないかと思います。

絵と上の説明の通りです。

緑のときは短いために全部waitで区切る必要がありました。

(3)
コース

説明だけでは分かりにくかったと思います、

黄色の丸で囲った部分、この段階ではすでに

「光センサーが反応するまで直進」

のプログラムにはいっています。なのでここで反応してしまい、不具合が生じました。

というわけです。

プログラム解説

このプログラムは、自分の理解が足りないために、

「task2個とか分かんないから順を追ってやっていこう」

というのがコンセプトになっています

まずif文を用いて場合分けをし、ライントレースをしました。

そして、最後のelse else(光センサーが両方黒)に最初になった時に同じif文を突っ込み

また最後のelse elseのところだけを変えていたのが初めでした

それから改良をし、関数を使って、何交差点何回目で迂回するなどのできるようなプログラムとなっています

そして最後にバックをし、元のいちに戻すことを成功させ、課題を満たせるプログラムへとなりました

苦労した点

何回目の角で迂回するなどということをなかなかすることができず。

思うように動いてくれませんでした。

そのために四苦八苦をしましたが、最終的にはちゃんと思う通りに動いてくれました。

あとは迂回がなかなかきれいにはいかず苦労をしました。

とさ犬のプログラム

基本動作と定義
#define FW OUT_A+OUT_C
#define FA OUT_A
#define FC OUT_C
void go_st(int t)//
{ 
    OnFwd(FW); Wait(t); Off(FW);
}
void turn_l(int t)//
{ 
    OnFwd(FA);  Wait(t); Off(FW);
}
void turn_r(int t)//
{
    OnFwd(FC); Wait(t); Off(FW);
}
#define EYE_L SENSOR_1
#define EYE_R SENSOR_3
#define BUMPER SENSOR_2
#define THRESHOLD 40
task main()
{
    SetSensor(EYE_L,SENSOR_LIGHT);
    SetSensor(EYE_R,SENSOR_LIGHT);
    SetSensor(BUMPER,SENSOR_LIGHT);
    int t;
    for(0;t<=24;)
    {
        while(t<=24)
        {
            OnFwd(OUT_A+OUT_C);

            if((EYE_L>THRESHOLD)&&(EYE_R>THRESHOLD))//両方が白を認識すると前進
            {
                OnFwd(OUT_A+OUT_C);
            }

            if((EYE_L>THRESHOLD)&&(EYE_R<THRESHOLD))//右が黒を認識すると右へ曲がる
            {
                OnFwd(OUT_C);OnRev(OUT_A);
            }

            if((EYE_L<THRESHOLD)&&(EYE_R>THRESHOLD))//左が黒を認識すると左へ曲がる
            {
                OnFwd(OUT_A);OnRev(OUT_C);
            }

            if((EYE_L<THRESHOLD)&&(EYE_R<THRESHOLD))//両方が黒を認識すると一旦止まる
            {
                Off(OUT_A+OUT_C);
                Wait(10);
                t=t+1;
                OnFwd(OUT_A+OUT_C);
                Wait(10);
                {
                     if((t==1)||(t==9)||(t==17))//上のときtの値が1,9,7のときの迂回
                     { 
                         Off(FW);Wait(50);
                         turn_l(90);
                         Off(FA);
                         go_st(100);
                         Off(FW);
                         turn_r(110);
                         Off(FC);
                         go_st(180);
                         Off(FW);
                         turn_r(105);
                         Off(FC);
                         go_st(90);
                         Off(FW);Wait(10);
                         t=t+1;
                     }
                 }

                 if((t==4)||(t==12)||(t==20))//両方が黒でtの値が4,12,20のときの迂回
                 {
                     Off(FW);
                     Wait(50);
                     go_st(120);
                     Off(FW);
                     turn_r(120);
                     Off(FC);
                     go_st(210);
                     Off(FW);
                     turn_r(14 0);
                     Off(FC);
                     go_st(240);
                     Off(FW);
                     turn_r(110);
                     Off(FC);
                     go_st(60);
                     Off(FW);
                     Wait(10);
                     t=t+1;
                 }

 

                 if((t!=1)&&(t!=4)&&(t!=9)&&(t!=12)&&(t!=17)&&(t!=20))//tの値が1、4,9、12,17、20,のとき以外は前進
                 {
                     OnFwd(OUT_A+OUT_C);
                 }

                 if(BUMPER==1)//バンパーが反応したら一旦止まる
                 {
                     OnRev(OUT_A+OUT_C);
                     Wait(100);
                     Off(OUT_A+OUT_C);
                     Wait(100);
                 }

             }

             Off(OUT_A+OUT_C);
         }
     }
 }

苦労した点

関数が全く分からなくていろいろ調べたりしました。

感想

リナ

前回と違いプログラムは難しいと思っていましたが、今回もロボットでかなり苦労をしました

それに加えてプログラムも大変だったため

すごくすごく大変な思いをしましたが

かろうじて成功させることができてよかったと思いました。 

とさ犬

関数が意味不明すぎて理解するのにとても苦労しました。

空いているすべての時間をコレに費やす勢いで作っていたのですが、ギリギリまでかかってようやく完成しました。

貴重な時間を割いてプログラムの説明をしてくれたリナさんには本当に感謝しています。

何といってもとにかくとても大変でした。

☆をとるために(コメント)

☆をとるためのアドバイスをよろしくお願いします もちろん通常のコメントもokです

  • 更新履歴ありがたいです。今後もぜひ続けてください。ロボットとプログラムの説明もわかりやすいですが、インデント(ifなどの階層ごとに行う字下げ)を入れてもらうと見やすいです。 -- こさか? 2009-07-02 (木) 22:37:01
  • 追記:if*1という記述法、スマートですてきです。 -- こさか? 2009-07-02 (木) 22:41:59
  • tという変数は、曲がる回数を数えているのでしょうか?t_minとt_maxは数字を変えないのならば、定数でもいいかもしれません。 また、インデントは通常半角スペース4文字程度を入れると見やすくなりますよ。 -- こさか? 2009-07-10 (金) 12:41:58
  • tは、交差点の数を数えています。一周で8回交差点を通るので24回通ったらとめることで3周で止まるようになっています。 -- リナ? 2009-07-19 (日) 03:00:07
  • リナさんのプログラムの中で、n回目の -- こさか? 2009-07-23 (木) 22:16:11
  • t回目の交差点ではパックを○○する、というような仕組みになっていると思うのですが、パックを置く交差点を変えても、このプログラムは動くのでしょうか? とさ犬さんのプログラムについては、「if((t==1)||(t==9)||(t==17)」としているところがスマートじゃありません。毎周の1回目の交差点、という意味ならば、「1周(=8)で割った余りが1」を利用してはいかがでしょう?if*2についても同様です。 -- すみません途中送信しました? 2009-07-23 (木) 22:21:22
  • あれ、なんだか注釈扱いになってしまいました…すみません、*2となっているところは下を見てください。 -- こさか? 2009-07-23 (木) 22:22:06
  • pukiwiki では通常の文章中に二重の括弧が登場すると自動的に脚注になってしまうので、プログラムの説明等で手っ取り早く二重括弧を書きたい場合は、括弧と括弧の間に空白を入れてみてください。 -- 松本 2009-07-23 (木) 22:42:21
  • よく頑張っていることがわかります。ロボットの説明も詳しいですし、工夫もしていると思います。ただ、プログラムにはいくつか気になる点があります。
    *ライントレースやパックを迂回する仕組みの共通部分は部品として何度も使われているので、taskやマクロなどにした方がすっきりする点
    *パックを迂回した後、黒いラインに復帰する際、時間をしていするよりもuntilを使った方が正確である点(右に曲がって復帰するので、先に右側のセンサが黒を感知します。なので、左が黒を感知するまで右回転するという意味です。)
    *パックを迂回するのはパックがあるときのみなので、タッチセンサが反応した場合のifの()中でそれまでの交差点の数に応じて反応を場合分けすれば、どこにパックが置かれても迂回できると思います。
    • FI? 2009-07-26 (日) 19:20:57


*1 EYE_L>THRESHOLD)&&(EYE_R>THRESHOLD
*2 t==4)||(t==12)||(t==20

添付ファイル: filecourse4.png 196件 [詳細] filecourse5.png 241件 [詳細] filecourse3.png 212件 [詳細] filecourse2.png 191件 [詳細] filehowtocurve.png 203件 [詳細] filecourse1.png 198件 [詳細] file090619_1118~12.jpg 189件 [詳細] file090619_1118~4.jpg 195件 [詳細] file090619_1118~2.jpg 93件 [詳細] file090619_1120~01.jpg 209件 [詳細] file090619_1118~05.jpg 244件 [詳細] file090619_1118~04.jpg 194件 [詳細] file090619_1118~03.jpg 224件 [詳細] file090619_1118~02.jpg 91件 [詳細] file090619_1118~01.jpg 209件 [詳細] file090619_1033~01.jpg 96件 [詳細] file090616_0403~01.jpg 203件 [詳細] file090616_0404~01.jpg 218件 [詳細] file090616_0404~02.jpg 192件 [詳細] file090616_0405~01.jpg 209件 [詳細] file090616_0410~01.jpg 102件 [詳細] file090616_0410~02.jpg 203件 [詳細] file090616_0411~01.jpg 99件 [詳細] fileTS3M0015001.jpg 220件 [詳細] fileTS3M0018001.jpg 212件 [詳細] fileTS3M00190001.jpg 202件 [詳細] fileTS3M00180001.jpg 186件 [詳細] fileTS3M00170001.jpg 193件 [詳細] fileTS3M00160001.jpg 301件 [詳細] fileTS3M00150001.jpg 189件 [詳細]

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