#contents
*課題3 [#l91ff4e8]
#ref(課題3.png)
上の図のような紙を使用する。~
2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。~
空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。~

*ルール [#v1d44981]
基本ルール~
    ・競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。~
    ・図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。~
    ・空部分は領域からはみ出していてもよい。~
    ・Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。~
    ・開始の合図から5秒以内にスタートボタンを押す作業を完了すること。~
    ・競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。~
    ・途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。~

基本得点の計算方法~
    ・運んだ空き缶の数×3点~
    ・空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。~
    ・円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。~
    ・間違った円内に空き缶を置いた場合は、1個につき1点減点。~
    ・間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点~

技術点の計算方法~
 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安: ~
    ・空き缶を探し取りにいくまでの動作 (3点)~
    ・空き缶を掴む動作 (3点)~
    ・空き缶を運ぶ動作 (2点)~
    ・空き缶を置く動作 (2点)~
    ・空き缶を積む動作 (3点)~
    ・2台のRCXまたはNXT、EV3の連携の良さ(2点)~
    ・自立型のロボットとしての形や動作の美しさ、斬新さ(2点)~
    ・その他 (3点)~

*ロボットの説明 [#j17a6a10]
**アーム部分 [#q998f1fd]
#ref(IMG_E1322ex.JPG)
写真のように滑り止めのために、アームと缶の接触部分にタイヤに取り付けた。また、積んだ2缶を同時に運べるようにアームに高さをだした。
#ref(アーム.png)
アームの開閉は図のように行った。1つのモータでアームの手を両方動かすことができる。しかし、その分モータの出力が必要になる。
**アームを上下させる部分 [#z045562c]
#ref(IMG_1324.JPG)
#br
#ref(IMG_1323.JPG)
#br
#ref(アーム上下4.png)
図のような構造が2つ合わさって形成している。モータが回転することに伴って�”�分も回転する。すると、��部分の上先端が固定されたレールに沿って上下する。それに従って、アーム部分も上下する。
**車輪部分 [#i8829814]
#ref(タイヤ.png)
図のように前1輪、中2輪、後1輪の全4輪構造である。初めは中2輪、後1輪の全3輪構造だったが安定感がなかったので1つ増やした。
**ライトセンサー部分 [#e649c08d]
#ref(センサーライト.png)
矢印の位置(中2輪の中心より少し前)に設置した。


*プログラミングにあたっての準備 [#da7337a1]
**master [#f3b102c4]
 #define CONN 1//スレーブの番号を割り振り
 #define AGERU RemoteStartProgram(CONN,"ageru.rxe");Wait(4500); //アームの上げるのを定義
 #define SAGERU RemoteStartProgram(CONN,"sageru.rxe");Wait(3000); //アームの下げるのを定義
 #define TUKAMU RemoteStartProgram(CONN,"tukamu.rxe");Wait(3500); //アームで掴むのを定義
 #define HANASU RemoteStartProgram(CONN,"hanasu.rxe");Wait(3000); //アームで放すのを定義
 #define MODOSU RemoteStartProgram(CONN,"modosu.rxe");Wait(3000); //アームを開きもとに戻す
 #define KUZUSU TUKAMU;AGERU;OnRev(OUT_BC,10);Wait(1000);Off(OUT_BC);OnFwd(OUT_B,15);OnRev(OUT_C,15);Wait(1500);Off(OUT_BC);OnFwd(OUT_BC,10);Wait(1000);Off(OUT_BC);Wait(3000);SAGERU;HANASU;TUKAMU;AGERU;OnRev(OUT_BC,10);Wait(1000);Off(OUT_BC);OnFwd(OUT_C,15);OnRev(OUT_B,15);Wait(1600);Off(OUT_BC);OnFwd(OUT_BC,10);Wait(1300);Off(OUT_BC);Wait(1000);SAGERU;HANASU;
slaveにそれぞれの指令をさせる。

 #define BLACK 40
 #define LITTLE_BLACK 47
 #define LITTLE_WHITE 53
 #define WHITE 65
#ref(白黒.png)
図のように明るさを定義する。


 #define LEFT OnFwd(OUT_B,30);OnRev(OUT_C,30);Wait(1);Off(OUT_BC);
 #define LITTLE_LEFT OnFwd(OUT_B,35);OnFwd(OUT_C,20);Wait(1);Off(OUT_BC);
 #define LITTLE_RIGHT OnFwd(OUT_B,20);OnFwd(OUT_C,35);Wait(1);Off(OUT_BC);
 #define RIGHT OnFwd(OUT_C,30);OnRev(OUT_B,30);Wait(1);Off(OUT_BC);
 #define FRONT OnFwd(OUT_BC,25);Wait(1);Off(OUT_AC);
 #define LINE_LEFT if (SENSOR_1 < BLACK) {LEFT;KAZU += 3;} else if (SENSOR_1 < LITTLE_BLACK) {LITTLE_LEFT;KAZU += 1;} else if (SENSOR_1 > WHITE) {RIGHT;KAZU -= 1;} else if (SENSOR_1 > LITTLE_WHITE) {LITTLE_RIGHT;KAZU -= 3;} else {FRONT;KAZU *= 0;}
 #define LINE_RIGHT if (SENSOR_1 < BLACK) {RIGHT;KAZU += 3;} else if (SENSOR_1 < LITTLE_BLACK) {LITTLE_RIGHT;KAZU += 1;} else if (SENSOR_1 > WHITE) {LEFT;KAZU -= 1;}else if (SENSOR_1 > LITTLE_WHITE) {LITTLE_LEFT;KAZU -= 3;} else {FRONT;KAZU *= 0;}
右・左の各ライントレースを定義する。
交差点の判断の方法等はhttp://yakushi.shinshu-u.ac.jp/robotics/?2018a%2FMember%2Fngafy%2FMission2参照。

**slave [#yf657da2]
 AGERU
 task main(){OnRev(OUT_BC,30);OnRev(OUT_A,10);Wait(8000);}
 SAGERU
 task main(){OnFwd(OUT_BC,20);Wait(600);Off(OUT_BC);}
 TUKAMU
 task main(){OnRev(OUT_A,20);Wait(1000);}
 HANASU
 task main(){OnFwd(OUT_A,10);Wait(500);Off(OUT_A);}
 MODOSU
 task main(){OnFwd(OUT_A,20);Wait(1000);Off(OUT_A);}
#ref(上げ下げ.png)
#ref(つかみはなし3.png)
※HANASUはMODOSUの短いver.

*プログラム本編(仮) [#he4c13de]
 task main() {
 
 SetSensorLight(S1); //光センサを定義
 int KAZU=0;
 int n =  0;
 long t0 = CurrentTick();
 
 // until(BluetoothStatus(CONN)==NO_ERR); //つながるまで待機
 
 RemotePlayTone(1,440,1000);Wait(1500);   //最初に音を鳴らす
 
 MODOSU;  //最初に念のため開いておく
 
 while(n < 1){
              if (SENSOR_1  < BLACK){OnFwd(OUT_C,25);OnFwd(OUT_B,20);Wait(700);Off(OUT_BC);n++;Off(OUT_BC);Wait(1);}
              else {OnFwd(OUT_BC,20);Wait(1);Off(OUT_BC);} 
                }
 n = 0;    //黒を感知するまで進む//線を超えるために進む
 
 while(n < 1){
              if (SENSOR_1  < LITTLE_WHITE){OnFwd(OUT_C,35);OnFwd(OUT_B,20);Wait(100);Off(OUT_BC);n++;Off(OUT_BC);Wait(1);}
              else {OnFwd(OUT_B,40);OnFwd(OUT_C,20);Wait(1);Off(OUT_BC);} 
                }
 n = 0;    //黒を感知するまで曲がる
 
 repeat(2000){LINE_RIGHT;};KAZU *= 0;
 while(KAZU < 300){LINE_RIGHT;};
 PlaySound(SOUND_DOUBLE_BEEP);   //十字の交差点を感知
 
 OnFwd(OUT_C,30);OnRev(OUT_B,30);Wait(1200);    //右に曲がる
 OnFwd(OUT_BC,15);Wait(300);Off(OUT_BC);    //前に進む
 
 repeat(2000){LINE_RIGHT;};KAZU *= 0;
 while(KAZU < 200){LINE_RIGHT;};
 PlaySound(SOUND_DOUBLE_BEEP);    //円との交差点を感知
 
 KUZUSU;     //缶を崩す
 
 OnFwd(OUT_BC,15);Wait(200);Off(OUT_BC);
 OnRev(OUT_BC,15);Wait(200);Off(OUT_BC);
 OnFwd(OUT_C,15);OnRev(OUT_B,30);Wait(200);Off(OUT_BC);  
 OnFwd(OUT_B,15);OnRev(OUT_C,15);Wait(200);Off(OUT_BC);   //ぐちゃぐちゃやって整える
 
 Wait(1000);
 
 SAGERU;TUKAMU;  //引きずるために掴む
 
 Wait(2000);
 
 OnFwd(OUT_B,40);OnFwd(OUT_C,30);Wait(3000);Off(OUT_BC);    //円を超えるために進む
 
 repeat(3000){LINE_RIGHT};KAZU *= 0;
 while(KAZU < 200){LINE_RIGHT};
 PlaySound(SOUND_DOUBLE_BEEP);   //十字の交差点を感知
 }
なぜ、このプログラムが(仮)なのかというと、うまい具合に作動せず、本番で使用しなかったからだ。うまく作動しなかった原因としては、タイヤの位置だ。上にも書いたが、タイヤは前1輪、中2輪、後1輪で前後2輪が360°旋回する。ロボットを安定させるために取り付けたものだが、前後の2輪がお互い別々の方向を向いていた場合、ロボットがうまく走らなくなってしまうのだ。これの改善点としては、前輪を取っ払い、中輪と後輪の間を広げることで安定感を獲得しつつ、誤作動や作動しないなどといったことをなくすことができる。
そこで、急遽書いた代替プログラムがこちら&#9759;

*プログラム本編 [#na372cba]
 task main() { MODOSU; RemotePlayTone(1,440,1000);Wait(1500); //最初に音を鳴らす
 
 OnFwd(OUT_BC,30); Wait(4000); Off(OUT_BC);
 
 KUZUSU; //缶を崩す
 
 OnFwd(OUT_BC,15);Wait(200);Off(OUT_BC); OnRev(OUT_BC,15);Wait(200);Off(OUT_BC); 
 OnFwd(OUT_C,15);OnRev(OUT_B,30);Wait(200);Off(OUT_BC); 
 OnFwd(OUT_B,15);OnRev(OUT_C,15);Wait(200);Off(OUT_BC); //ぐちゃぐちゃやって整える
 
 SAGERU;TUKAMU; //引きずるために掴む
 
 OnFwd(OUT_B,30); OnFwd(OUT_C,35); Wait(4000); Off(OUT_BC);
 
 OnFwd(OUT_C,30); Wait(500); Off(OUT_C);
 
 HANASU; MODOSU; }
#ref(課題3neo.png)
赤矢印通った後、3缶を同じ種類の2缶に入れ替え、緑矢印を通り、X円内の3缶を蹴散らすというプログラムである。しかし、これはライントレースや超音波センサーを使っておらず、プログラムに確実性ない。ロボットとは「ある程度の工程なり手順なりを自動的かつ連続的に(かつ効率的に)行うもの」と定義(https://ja.wikipedia.org/wiki/ロボット)されており、このプログラムでは当てはまらない。

*課題3を終えて [#z3efffdd]
**苦労した点、ダメだった点 [#u46d98d3]
ロボットにアームを上下させる機構を搭載したことや、アームに高さをだしたことでロボット全体が不安定になってしまい、それを制御するのが難しかった。また、上にも書いたように動きが不安定になってしまったことの原因に気づけず、同じところで右往左往していたことがダメだった。
**良かった点 [#m5623a12]
RISやEV3にあるキャタピラみたいな部品がないことに屈せず、アームを上下させる機構を作ることに挑戦したことがよかった。

*ロボティクス入門を終えて [#ye8ffd02]
元々、ロボットなどといったものを製作することが好きでこの講義をとり、プログラムを書くことに関しては初めてで心配でしたが基本的なところから教えていただいてそこそこのプログラムなら書けるようになった。また、複数人と話し合って意思疎通し1つのものを作り上げることもいい経験になった。この講義をとって良かったと思う。

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