[[2016a/Member]] 目次 #contents *はじめに [#e2420186] 今回の課題は課題2で作成したコースを使って紙コップを積み上げる課題です。 私は採点の報告係を担当しました。 *ロボットの紹介 [#lc1cff07] **ロボットの説明 [#fd2bca38] 当初の計画では、私達の班がライントレスをして紙コップを中央へ持って行き、もうひとつの機体で紙コップを積み上げる計画でしたが、通信を取りやめ、ひとつの機体で光センサーを2つ利用して、ライントレスと紙コップの認識を行えるようにしました。 そこでまず私達の班が作った機体と実際に使用した機体の2つを紹介したいと思います。 **当初予定していた機体について [#v012c0da] こちらの機体は写真を撮っていなかったので少しわかりにくいですが仕組みは単純で、課題2で使用した機体にモーターを一つつけ囲いを作り、その囲いが上下することで紙コップを取ったり離したりできる仕組みです。 この機体については、紙コップを取る離す動作、紙コップをライントレスして持っていく動作は出来ましたが、光センサーを一つしか使用できず、紙コップの認識ができなかったのでこの方法は、ボツになりました。 他にも紙コップを認識する方法としてタッチセンサーを使って実験してみましたが紙コップがかるすぎて反応できませんでした。 **実際に使用した機体について [#s97d349f] こっちの機体は本体の中央付近にライントレス用の光センサー、機体の先端に白い紙コップを認識する光センサーを装着しました。 紙コップを積み上げるために用いた機体の方法は、飲み口の凸を有効に使った手段です。 本体から2つの角がありその幅は約7センチほどにし、紙コップがあるところまで深く刺さるようにセットし、それをモーターで回し180度回転させます。 その繰り返しで積み上がります。 角が回転するように先端に光センサーを用いて、先端まで動力を送るために歯車をつなげました。 これが実際の写真です。 &ref(2016a/Member/kosi/Mission3/1470853893715.jpg,30%,); *プログラム [#eb1a9e9e] **defineについて [#c75b3f16] #define CROSS_TIME 40 #define BALANCE_TIME 40 #define roll_left OnRev(OUT_A); OnFwd(OUT_C); //左回転 #define turn_left OnFwd(OUT_C); Off(OUT_A); //左旋回 #define go OnFwd(OUT_A); OnFwd(OUT_C); //前進 #define turn_right OnFwd(OUT_A); Off(OUT_C); //右旋回 #define roll_right OnFwd(OUT_A); OnRev(OUT_C); //右回転 #define back OnRev(OUT_A); OnRev(OUT_C); Wait(100); Off(OUT_AC); //後進 #define top OnRev(OUT_C); OnFwd(OUT_A); Wait(CROSS_TIME); OnFwd(OUT_AC); Wait(10); #define left OnRev(OUT_A); OnFwd(OUT_C); Wait(20); #define right OnRev(OUT_C); OnFwd(OUT_A); Wait(80); OnFwd(OUT_AC); Wait(20); 基本的な動作の定義です。 **subの説明 [#i68f30b1] sub line_l(){ int ch=0; //ループ脱出用変数 ClearTimer(0); //交差点判別用のタイマー初期化 ClearTimer(1); //交差点誤判別防止用のタイマー初期化 while(ch==0) //chが0の時はループを続ける { if(SENSOR_2 > 53) //白部分 右回転 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 roll_right; } else if(SENSOR_2 > 52) //弱白部分 右旋回 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 turn_right; } else if(SENSOR_2 > 44) //境界部分 直進 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 go; } else if(SENSOR_2 > 41) //弱黒部分 左旋回 { ClearTimer(0); //黒部分ではないので交差点判別用のタイマーを初期化 turn_left; } else{ //黒部分 左回転 roll_left; } if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time){ //交差点判別 Off(OUT_AC); //車輪を止める PlaySound(SOUND_UP); //音を鳴らす Wait(100); //1秒待つ ch=1; //ループ脱出の為にchを1にする } Wait(1); //0.01秒待つ } このsubはライントレスをするsubです。 黒の線の左境界面をトレースします。 sub balance_l(){ int ch=0; //ループ脱出用変数 ClearTimer(0); //姿勢判別用のタイマー初期化 while(ch==0) //chが0の時はループを続ける { ClearTimer(1); //ライントレース時間判別用のタイマー初期化 while(FastTimer(1)<200&&ch==0) //FastTimer(1)が2秒未満かつchが0の時はループを続ける { if(SENSOR_2 > 53) //白部分 右回転 { ClearTimer(0); //境界部分ではないので姿勢判別用のタイマーを初期化 roll_right; } else if(SENSOR_2 > 52) //弱白部分 右旋回 { ClearTimer(0); //境界部分ではないので姿勢判別用のタイマーを初期化 turn_right; } else if(SENSOR_2 > 44) //境界部分 直進 { go; } else if(SENSOR_2 > 41) //弱黒部分 左旋回 { ClearTimer(0); //境界部分ではないので姿勢判別用のタイマーを初期化 turn_left; } else{ //黒部分 左回転 ClearTimer(0); //境界部分ではないので姿勢判別用のタイマーを初期化 roll_left; } if(FastTimer(0)>BALANCE_TIME) //姿勢判別 { Off(OUT_AC); //車輪を止める PlaySound(SOUND_UP); //音を鳴らす Wait(100); //1秒待つ ch=1; //ループ脱出の為にchを1にする } Wait(1); //0.01秒待つ } if(ch==0) { back; //約2秒分の後退 back; } } このsubは、左側境界面の機体の制御用プログラムです。 どうしてもライントレスからすぐに直線させると毎回違った方向へ進むのを防ぐプログラムです。 sub balance_r(){ int ch=0; //ループ脱出用変数 ClearTimer(0); //姿勢判別用のタイマー初期化 while(ch==0) //chが0の時はループを続ける { ClearTimer(1); //ライントレース時間判別用のタイマー初期化 while(FastTimer(1)<200&&ch==0)//FastTimer(1)が2秒未満かつchが0の時はループを続ける { if(SENSOR_2 > 53) //白部分 左回転 { ClearTimer(0); //境界部分ではないので姿勢判別用のタイマーを初期化 roll_left; } else if(SENSOR_2 > 52) //弱白部分 左旋回 { ClearTimer(0); //境界部分ではないので姿勢判別用のタイマーを初期化 turn_left; } else if(SENSOR_2 > 44) //境界部分 直進 { go; } else if(SENSOR_2 > 41) //弱黒部分 右旋回 { ClearTimer(0); //境界部分ではないので姿勢判別用のタイマーを初期化 turn_right; } else{ //黒部分 右回転 ClearTimer(0); //境界部分ではないので姿勢判別用のタイマーを初期化 roll_right; } if(FastTimer(0)>BALANCE_TIME) //姿勢判別 { Off(OUT_AC); //車輪を止める PlaySound(SOUND_UP); //音を鳴らす Wait(100); //1秒待つ ch=1; //ループ脱出の為にchを1にする } Wait(1); //0.01秒待つ } if(ch==0) { back; //約2秒分の後退 back; } } このsubはひとつ上の右側境界面用のプログラムです。 sub cup(){ OnRev(OUT_B); //アームを下す Wait(50); Off(OUT_B); OnFwd(OUT_AC); //前進 while(SENSOR_1<42); //光センサーが紙コップを認識するまで前進する Off(OUT_AC); //停止 OnFwd(OUT_B); //アームを上げる Wait(50); Off(OUT_B); } このsubは紙コップを取るための動作です。 sub turn(){ OnFwd(OUT_C); //左回転 OnRev(OUT_A); Wait(100); //黒部分から白部分に出るための時間(D地点からC地点への移動時に特に必要) while(SENSOR_2>41); //白部分である場合は回転し続ける Off(OUT_AC); //停止 } 交差点を左に曲がるためのsubです。 sub last(){ OnFwd(OUT_AC); //前進 Wait(50); //約0.5秒待つ Off(OUT_AC); OnRev(OUT_B); //アームを下す Wait(50); //約0.5秒待つ Off(OUT_B); OnFwd(OUT_A); //右回転 OnRev(OUT_C); Wait(100); //約1秒待つ back; //約2秒間後進する(1秒ではアームが紙コップに触れている時があるため) back; } 最後に積み上げた紙コップを指定された場所へ設置するためのsubです。 **メインプログラム [#y291d4d1] task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー1の初期設定(紙コップ認識用) SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサー2の初期設定(ライントレース用) OnFwd(OUT_AC); //スタート地点の枠から脱出 Wait(60); //C地点までの移動 line_l(); //左側境界部分をトレース left; //P地点を左折 l_time=400; //次の交差点までの秒数を4秒に設定 line_l(); //左側境界部分をトレース right; //S地点を右折 balance_l(); //左境界部分での姿勢制御 //紙コップ回収作業 cup(); //1つ目の紙コップ取得 back; //後進 //D地点までの移動 turn(); //左回転 balance_r(); //右境界部分での姿勢制御 //紙コップ回収作業 cup(); //2つ目の紙コップ取得 back; //後進 //C地点までの移動 turn(); //左回転 OnFwd(OUT_AC); //前進 Wait(20); balance_r(); //右境界部分での姿勢制御 //紙コップ回収作業 cup(); //3つ目の紙コップ取得 back; //後進 //D地点までの移動 turn(); //左回転 OnFwd(OUT_AC); //前進 Wait(20); balance_r(); //右境界部分での姿勢制御 //紙コップ回収作業 cup(); //4つ目の紙コップ取得 back; //約4秒間後進 back; back; back; l_time=200; //次の交差点までの秒数を2秒に設定 //左境界部分へ移動 OnFwd(OUT_C); //左回転 OnRev(OUT_A); Wait(50); OnFwd(OUT_AC); //前進 Wait(30); //Q地点までの移動 line_l(); //左側境界部分をトレース left; //S地点を左折 line_l(); //左側境界部分をトレース left; //P地点を左折 line_l(); //左側境界部分をトレース //紙コップの設置 last(); } これがメインプログラムです。 *感想 [#u9303ff4] **課題3の結果 [#ic362b2c] 2回目のやり直しが成功し優勝となりました。 **全体として [#sf1f4d25] 結果は合計点数35.2点で晴れて優勝することが出来ました。 しかし、班での活動中は班員皆レベルが高く話し合いについていくのもやっとな状態でした。 機体に関しても当初の2体使う計画ではなくなったので結果優勝した機体についてはあまり関与できませんでしたが、班員と協力しながら自分のできる範囲でのサポートはできたと思います。 今回の課題3は機体づくり、作戦等、課題1,2では比較的優しかったところからつまずいてしまい、授業外での活動、班員との協力がより必要になり、特に毎回変わる機体の動きの修正が一番苦労しました。 自分は工学部でこれからもたくさんプログラムに関与していくと思うのでロボティクスで習った技術を有効に使えたらいいなと思います。