[[2019a/Member]]
#contents
*課題について [#sf9b88ae]
ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。


#ref(2019a/Member/Syoshida/Mission3/課題3コース.jpg,100%,課題3コースの説明)

ロボコンのフィールド平面図
フィールドの説明
フィールドは課題2で使用した紙を使用する。
生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
プラ容器には色をつけたり文字や記号を書いてもよい。
プラ容器は両面テープ等でフィールドに固定してもよい。
2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。



*ロボットについて [#j6ab90ed]
私は今回の課題では2体のロボットを製作し、それぞれを役割で分けて動作するようにしました。以下より2体のロボットは「ロボット1」、「ロボット2」と分けて呼ぶこととします。


**ロボット1について [#p4b90d6a]
ロボット1は容器に入ったピンポン玉を回収し、別の容器に移す役割を担う。


***ロボット1の全体像 [#j48e8f12]
#ref(2019a/Member/Syoshida/Mission3/ロボット1全体像.jpg,100%,ロボット1全体像)



***ロボット1の構造 [#i21d2f80]
-ロボット1は容器に入った2つのピンポン玉を動かすように作成しています。ピンポン玉を掴む動きに関してはピンポン玉が入った容器ごと掴むようにしてあります。~
~
-ロボット1は大きなタイヤを前側に、小さなタイヤを後ろ側に設置しました。これによって車体が後ろ側をふもととして坂となり、後述するピンポン玉の運搬方法に影響を与えます
#ref(2019a/Member/Syoshida/Mission3/ロボット1構造.jpg,40%,ロボット1の構造説明図)
&color(red,){Aと左のタイヤを動かすモーター(赤丸位置)};を接続~
&color(green,){Cと右のタイヤを動かすモーター(緑丸位置)};を接続~
&color(blue,){Bとアームを動かすモーター(青丸位置)};を接続~
&color(magenta,){端子2と光センサー(ピンク丸位置)};を接続~
&color(orange,){アームに輪ゴム(橙色丸位置)};を引っ掛け、本体と接続することによってアームがあがりやすいようにしました。これによってモーター1つでも重いアームをあげることが出来るようになりました。~
&color(orange,){アームに輪ゴム(橙色丸位置)};を引っ掛け、本体と接続することによってアームがあがりやすいようにしました。これによってモーター1つでも重いアームをあげることが出来るようになりました。また、アームの先にタイヤを設置してアームをスムーズに滑らせることが出来るようにしました。~
-光センサーを地面に近くなるようロボットに設置することによって光センサーの数字が明暗の違いによって大きく変動するようにしてあります。これによって、動きを細かく分けやすいようにしました。


***ライントレースについて [#d3d144fb]
光センサーが&color(red,){48より大きい値を示すとき(白)で右に曲がる};~
光センサーが&color(green,){45と49の間の値を示すとき(灰色)で左に曲がる};~
光センサーが&color(blue,){44より小さい値を示すとき(黒)で左に旋回する};
#ref(2019a/Member/Syoshida/Mission2/ロボティクスゼミ ライントレース 説明.jpg,40%,ライントレース説明の図)
このように3つの曲がる動きだけを入力し、大きなカーブを曲がりやすいようにしました。

***ピンポン玉を運ぶ仕組みについて [#dc628d46]
ピンポン玉が入った容器ごと運ぶ仕組みになっています。
#ref(2019a/Member/Syoshida/Mission3/ロボット1容器を掴む.jpg,30%,ロボット1容器を掴む説明の図)
図1~
~
図1のように持ち上げたい容器の横両方にタイヤのついたアームを滑り込ませ、容器のひっかけ部分をアームで持ち上げます。この時、アームについたタイヤが滑り止めの役割を担い、容器がアームから滑り落ちにくくなるようにしてあります。~
~
~
#ref(2019a/Member/Syoshida/Mission3/image2 - コピー.jpeg,30%,ロボット1ピンポン玉を移動させる)
図2~
~
~

図2より、アームを限界まであげることによって容器の中のピンポン玉がロボット側にこぼれ落ちます。そのこぼれ落ちたピンポン玉が斜めになっているロボットの背を通ってロボットの後ろに落ちるようにしました。ロボットの背に簡単な柵を設置してピンポン玉が横から滑り落ちることを防ぐようにしてあります。

***ロボット1の行動 [#tb491629]

#ref(2019a/Member/Syoshida/Mission3/ロボット1の行動.jpg,100%,ロボット1の行動)
BからC地点までは行動時間を設定したライントレースによって移動。その後はライントレース無しのタイヤの動きのみによる移動を行う。~
&color(red,){赤丸地点にて容器を掴む};~
&color(green,){緑丸地点にて容器を掴んだアームを上げ、もう一つの容器にボールを入れる};





**ロボット2について [#z1d001c9]
ロボット2は地面に置かれたピンポン玉を回収し、容器に入れるロボットであるが今回のプログラムでは回収するピンポン玉は一つだけとしている。その理由は2台のロボットを同時に動かすうえでロボット同士が接触してしまうことを防ぐためである。

***ロボット2の全体像 [#j48e8f12]
#ref(2019a/Member/Syoshida/Mission3/ロボット2全体像.jpg,50%,ロボット2全体像)

***ロボット2の構造 [#y36b1235]

#ref(2019a/Member/Syoshida/Mission3/.jpg,40%,ロボット2の構造説明図)
&color(red,){Aと左のタイヤを動かすモーター(赤丸位置)};を接続~
&color(green,){Cと右のタイヤを動かすモーター(緑丸位置)};を接続~
&color(blue,){Bとアームを動かすモーター(青丸位置)};を接続~

***ピンポン玉を運ぶ仕組みについて [#ibe89938]
#ref(2019a/Member/Syoshida/Mission3/ロボット2ボールを掴む.jpg,25%,ロボット2ボールを掴む)
図A~
~
輪ゴムを図Aの通りに設置し、ロボット2が地面に置かれたピンポン玉にアームを上から押しつけて輪ゴムの間に入り込むようにしました。
~
~
#ref(2019a/Member/Syoshida/Mission3/ロボット2ボールを落とす.jpg,25%,ロボット2ボールを落とす)
図B~
~
図Bのようにロボット2の上部につけられた柱にアームに引っかかったピンポン玉を押し付け、ロボット2に設置された輪ゴムからピンポン玉が抜け落ちるようにしました。


***ロボット2の行動 [#o7bef2be]

#ref(2019a/Member/Syoshida/Mission3/ロボット2の行動.jpg,100%,ロボット2の行動)
&color(red,){赤丸地点L′にて置かれたピンポン玉を掴む};~
&color(green,){緑丸地点にてピンポン玉を掴んだアームを上げ、もう一つの容器にボールを入れる};
容器にピンポン玉を一つ入れた後、後退して停止する。

*プログラミングについて [#o6594a4a]
**ロボット1のプログラミングの説明 [#me0fbc9c]
***#defineについて [#pd1ea27c]
***光センサーに関する定義 [#gd3f1f55]
光センサーの数値の定義に関しては状況によってセンサーの反応の具合が異なるため、
プログラムを見てすぐに変えられるよう多くを定義しませんでした。

***時間に関する定義 [#r4dd7555]
 #define RUN_TIME 610    //6.1秒

 #define STEP 5
***動きに関する定義 [#w9d4fe29]

 #define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(148);Off(OUT_AC);    //右に90度旋回

 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(120);Off(OUT_AC);    //左に90度旋回


***その他の定義 [#aa1c24e0]

 #define power(s) SetPower(OUT_B,s);    //アームの動きをゆっくりにする

***サブルーチンの設定 [#y6cf7c52]

 sub tores()    //ライントレースのサブルーチン
 
 { SetSensor(SENSOR_2,SENSOR_LIGHT);
   
    ClearTimer(0);
 
    while ( FastTimer(0) <= RUN_TIME ) {    
        if ( 48 < SENSOR_2 ){
            OnFwd(OUT_A); Off(OUT_C);    //白なら右へ
        } else if (45 <SENSOR_2 < 49) {
            Off(OUT_A); OnFwd(OUT_C);    //灰色なら左へ
        } else {
            OnRev(OUT_A);OnFwd(OUT_C);    //黒なら左へ旋回
         } 
        
     }
  }

 sub down()    //アームをゆっくりおろす動き
 {
         OnFwd(OUT_B);
         power(0);    
         Wait(50);
         Off(OUT_B);
         Wait(100);
 }

 sub up1()    //アームをゆっくりあげる動き
 { 
         OnRev(OUT_B);
         power(0);    
         Wait(30);
         Off(OUT_B);
         Wait(100);
 }

 sub throw()    //容器に入ったピンポン玉を取り出す動作
 { 
         OnFwd(OUT_B);
         power(0);   
         Wait(80);    //アームをゆっくりさげる
         Off(OUT_B);
         OnRev(OUT_B);
         Wait(50);    //アームを素早くあげる
         Off(OUT_B);
 } 


 
***実行するプログラム [#nae0eaf0]

 task main()
 {
         
         OnFwd(OUT_AC);    //地点Bまで前進
         Wait(100);
         tores();    //BからCまでのライントレース
         turn;    //ピンポン玉の入った容器のある方に向けて右に90度旋回
         OnRev(OUT_AC);    //少し後退してアームが容器に当たらないようにスペースをとる
         Wait(120);
         Off(OUT_AC);
         down();    //アームをおろす
         OnFwd(OUT_AC);    //前進してアームの間に容器を挟む
         Wait(130);
         Off(OUT_AC);
         up1();    //容器を持ち上げる(アームをあげる)
         OnRev(OUT_AC);    //そのまま後退して位置調整
         Wait(415);
         turn_left;    //左に90度旋回
         OnRev(OUT_AC);    //後退
         Wait(140);
         Off(OUT_AC);
         throw();    //運んでいた容器からピンポン玉を取り出し、別容器に移す
 }

終了

**ロボット2のプログラミングの説明 [#g203c405]

***#defineについて [#pd1ea27c]

***時間に関する定義 [#r4dd7555]
 #define RUN_TIME 700




***動きに関する定義 [#w9d4fe29]

 #define turn OnFwd(OUT_A);OnRev(OUT_C);

 #define turn2 OnFwd(OUT_C);OnRev(OUT_A);

 #define go OnFwd(OUT_AC);


***その他の定義 [#c82dcf9a]
 #define power(s) SetPower(OUT_B,s); //モータのパワーをsにする

***サブルーチンの設定 [#y6cf7c52]
 sub up()    //アームをゆっくりあげる動作(ピンポン玉を持ち上げる)
 {
         OnFwd(OUT_B);   
         power(1);
         Wait(50);
         Off(OUT_B);
 }

 sub up2()    //アームをゆっくりあげる動作(ピンポン玉をアームから離す)
 {
         OnFwd(OUT_B);
         power(2);
         Wait(20);
         Off(OUT_B);
 }

 sub down()    //アームをゆっくりさげる動作
 { 
         OnRev(OUT_B);
         power(2);
         Wait(50);
         Off(OUT_B);
 
 } 



 
***実行するプログラム [#nae0eaf0]
 task main()
 {
    go;Wait(110);Off(OUT_AC);    //A地点を出発して旋回する位置まで直進
    turn2;Wait(70);Off(OUT_AC);    //左に90度旋回
    go;Wait(210);Off(OUT_AC);    //K′地点まで直進
    turn;Wait(70);Off(OUT_AC);    //右に90度旋回
    go;Wait(30);Off(OUT_AC);    //L′地点まで直進
    down();Wait(30);    //ピンポン玉を掴む(アームをさげる)
    up();Wait(30);    //ピンポン玉を掴んで保持しながらアームをあげる
    turn2;Wait(70);Off(OUT_AC);    //左に90度旋回
    go;Wait(10);Off(OUT_AC);  //前進して容器に近づく
    up2();Wait(30);  //ピンポン玉を押し出して容器にピンポン玉を入れる
    OnRev(OUT_AC);Wait(1000);Off(OUT_AC);    //後退してコースから外れる
 }

終了

*結果 [#y39b78d2]
最終的にはうまくいかず、ボールを掴むことも出来なかった。

*まとめ [#k1bf251c]
これまでゼミで学んだことを詰め込んで挑戦したロボコンであったが結果は微妙なものであった。しかし、同じグループのメンバーと相談し合い、ロボットを作ることが出来たので良かったと思う。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS