#contents ホーム[[2017b/Member]] *1課題 [#hfe78483] 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。 ** コース [#o4d47308] 黒線の幅は20mmでなるべく均等な濃さにすること。なお図の中の寸法の単位はcmで、黒線についてはその真ん中からの距離である。 #ref(2017b/Mission2/2017b-mission2.png,80%,課題2のコース) ** ミッション [#g924da6d] 次のいずれかのコースで黒い線に沿って動き、紙コップを移動させるロボットを製作せよ。 (相棒と違うコースを選ぶこと。ただし第3コースは3名チーム用とする。) **選択したコース [#g232e8c2] 第1コースを選びました。 *** 第1コースの内容 [#x04ca08e] + Aをスタート + Bを直進 + Cを右折 + Fを直進 + Rを左折(一時停止) + Pを直進 + X地点の紙コップを取得してコースに戻る + Qを左折 + Sを直進(一時停止) + Y地点に紙コップを置いてコースに戻る + Sを直進(一時停止) + Fを左折(一時停止) + Cを右折(一時停止) + D地点へ(ゴール) *2ロボットの紹介 [#hfe78483] 基本のロボットに光センサーとアーム、起動スイッチを付けた構造になっています。 **ロボットの形 [#n402669d] &ref(2017b/Member/Yoshi/Mission2/rosoku.JPG,60%,ロボの全体像1); &ref(2017b/Member/Yoshi/Mission2/rozennpou.JPG,60%,ロボ全体像2); *3ロボット作成で工夫した点 [#r3f47f32] &ref(2017b/Member/Yoshi/Mission2/rozenn.JPG,60%,ロボの全体像(前方から)3); 光センサーと紙との距離を適切に設定することで取得する数値の安定化を図りました。 またロボットの左側に接触センサーを取り付け、起動ボタンとして活用しました。 アームは軽量化の為にシンプルな構造にしました。 *4プログラム [#t1f283c1] **定義した定数 [#o1329b1a] プログラムを簡略化し、開発しやすくするためにいくつか定数を定義しました。 以下はその抜粋です #define Apower 37 #define Bpower 34 //直進するのに必要な出力 #define ttime 950 //90度曲がるのに必要な時間 #define kanndo 30 //感度、ライントレースの反応の度合い 解説が必要なのは少ないでしょうが、まず上二つが移動用モーターの出力です。数値を左右で変えてまっすぐ先進するようにしました。 3つめは旋回時に90°回転するための待ち時間です。 最後の『kanndo』はライントレースの感度です。 **定義したサブ関数 [#m9587eea] 定数と同様にいくつかサブ関数を定義しました。これにより可読性を高め、他人が見てもわかりやすくなります。 サブ関数の中には中にサブ関数を使用しているところがあるので分けて説明します。 ***サブ関数その1 (基本動作)[#n49e72fe] sub go_for() { OnFwd(OUT_A,Apower); OnFwd(OUT_B,Bpower); } sub go_back() { OnFwd(OUT_A,-Apower); OnFwd(OUT_B,-Bpower); } sub turnL(float c) { OnFwd(OUT_A,Apower);OnFwd(OUT_B,-Bpower); Wait(c*ttime); Float(OUT_AB); //左に曲がる(c×90)度 } sub turnR(float c) { OnFwd(OUT_A,-Apower);OnFwd(OUT_B,Bpower); Wait(c*ttime); Float(OUT_AB); //右に曲がる(c×90)度 } ここで上げたサブ関数はロボットを動かす基本動作です。先進、後進、左旋回、右旋回のためのサブ関数です。前進、後進は開始のみ、旋回は回転する角度を指定して旋回します。 ***サブ関数その2(ライントレース用) [#zb1341d5] sub turnR2(float d) { OnFwd(OUT_A,Apower-d*kanndo);OnFwd(OUT_B,Bpower+d*kanndo); } sub turnL2(float d) { OnFwd(OUT_A,Apower+d*kanndo);OnFwd(OUT_B,Bpower-d*kanndo); } sub turnR1(float d) { OnFwd(OUT_A,-d*kanndo);OnFwd(OUT_B,Bpower+d*kanndo); } sub turnL1(float d) { OnFwd(OUT_A,Apower+d*kanndo);OnFwd(OUT_B,-d*kanndo); } ここで上げたサブ関数はライントレースをする際に使います。黒線と白線の境界からのずれの度合いを『d』としてずれに応じて左右のタイヤの出力を調節しています。 関数が4つあるのは、黒線の右側を走るときと左側を走る為に必要だからです。 ***サブ関数その3(右折、左折用関数) [#n4b63b7c] sub sennkaiL(int t) { Off(OUT_AB); go_for(); Wait(t); turnL(1); } sub sennkaiR(int t) { Off(OUT_AB); go_for(); Wait(t); turnR(1); } **実行するプログラム [#t144e1c4] ここまでで定義したものを使って「埼玉」と書くために以下のようにtask mainを作りました task main () { ResetTachoCount(OUT_C); penup(); go_backY(0.9); //調整1 pendown(); go_backX(0.5); //よこ(土) penup(); go_forY(0.3); pendown(); go_forX(0.5); //よこ penup(); go_backX(0.25); //よこ pendown(); go_backY(0.5); //縦 penup(); go_backX(0.6);//移動to大 go_backY(0.4); pendown(); go_forY(0.2); //たて()大 go_XY(0.25); //斜め1 pendown(); go_XY2(0.25); //斜め2 go_forX(0.25); pendown(); go_backX(0.5); //横(大) penup(); go_forY(0.5); //移動to可 go_forX(0.4); pendown(); go_backX(0.5); //可はじめ go_forY(0.5); penup(); go_forX(0.4); go_backY(0.1); pendown(); go_backY(0.3); //口 go_backX(0.3); go_forY(0.3); go_forX(0.3); penup(); go_backX(0.9); //移動to(玉) go_forY(0.5); go_backY(0.3); pendown(); go_backY(1.2);// | penup(); go_forX(0.3); pendown(); go_backX(0.6);// -- penup(); go_forY(0.6); pendown(); go_forX(0.6);// -- penup(); go_forY(1); go_backY(0.3); pendown(); go_backX(0.6);// -- penup(); go_forX(0.2); go_backY(0.4); pendown(); go_XY2(0.25);//斜め(玉) penup(); } 特出して書くことはないと思いますが、「埼」から「玉」に移動する際にY軸の位置をレールの端に合わせてずれにくいようにしています *5実行結果 [#yce51899] こうして作ったロボットとプログラムを動かしてみた。まず倍率を0.8倍にして動かした。 &br; その結果 &ref(2017b/Member/Yoshi/Mission1/kekka1.jpg,87%,埼玉1); &br; のように最後の一画が少しはみ出た。なので今度は倍率を0.5倍にして動かした。 &br; その結果 &ref(2017b/Member/Yoshi/Mission1/kekka2.jpg,87%,埼玉1); &br; となりはみ出ずに書くことができた。