- 追加された行はこの色です。
- 削除された行はこの色です。
[[2016a/Member]]
にゃー
*目次 [#i0d6b39b]
#contents
*はじめに [#xf9492f0]
今回の課題はかなり試行錯誤したため使わなくなった機体システムが多く存在する&br;
それらも紹介しなければ、せっかく作ったのにかわいそうなので別ページにてそれらを紹介する。&br;
&size(30){[[過去の遺産:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Frin331%2FMission3%2Fold_idea]]};
*課題と自分チームの考え [#ae5afe92]
今回の課題3は模擬的なロボコンということで2つのマイコンを用いての課題だったが、
自分たちのチームは
&color(red){1つのロボットのみ};
でほぼ全体の処理を行う。&br;
%%のこりの1つは音楽でも流せればよかったなぁ。%%
今回このような形になった理由には2つ理由が存在する。&br;
1つ目 センサーが1つに集結させることができ、より正確な動作ができる&br;
2つ目 3つのモータで処理全体がカバーできた&br;
これらの理由から一体型でなくても処理できると判断したため、重さを考慮して1台のみで行うこととした。
*機体の説明 [#b380836f]
説明が細分化するため分けて記述する。
**全体像 [#t48321e5]
全体像としてこんな感じになっている。
先ほど書いたがマイコンは1つだ。&br;
&ref(./機体01.jpg,45%,機体画像 全体);
**パーツ [#kff1a7ff]
パーツとしては&br;
・車体&br;
・紙コップ処理部分&br;
・マイコン &br;
&ref(./機体02.jpg,45%,機体画像 パーツ);&br;
の3つとなる。
**タイヤ [#y3831b02]
タイヤの幅はライントレースをするため、できる限り狭くなっている。&br;
また、前回先生にアドバイスをもらった通りタイヤは薄いものを使用した。&br;
&ref(./機体03.jpg,45%,機体画像 タイヤ);
**センサ [#rbf386e7]
センサに関しては&br;
1.光センサ (ラントレース)&br;
2.光センサ (紙コップがあるのかの判定)&br;
3.タッチセンサ (上下にどこまで上がっているのかの判別)&br;
の3つを使用していた。&br;
画像はよいモノがなかったのでなし。
&color(red){しかしこのうち2は本番では目標が一個だったためしようしていない。&br;そして3に関しては途中で使用理由が消えてしまった。([[過去の産物:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Frin331%2FMission3%2Fold_idea]]で説明)};
ちなみに最終的には使わなかった2だが、&br;
書いてある通り紙コップが手前にあるかを判定しているが最初に自分の考えで紙コップを黒くして&br;
判別しようとした。だが実際はなにもない空間だと黒に近い値になり白で判別したほうがよかったためこれはミスといえる。&br;
%%コップは買いなおした。(140円)%%
**上下の動作と掴む動作を1つのモータで行うシステム [#b7a97bc6]
今回の機体の一番大変だった部分である。&br;
なお正直自分のみで説明が十分できる自信がないと思うので制作者のURLを載せておく。&br;
製作者:「[[RaikouRK:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FRaikouRK%2FMission3]]&br;
簡単な概要としては画像のように&br;
&ref(./機体04.jpg,45%,機体画像 掴むシステム);&br;
青が動力でそのまま赤Aへと繋がっている。&br;
その後、BCと繋がっているがCは開く、閉じるが限界までいくとCは動かなくなる。&br;
そうするとBのみが動き今度は上昇、下降するという動きに変化するのだ。&br;
*プログラムの仕組みについて [#c50d9608]
今回のプログラムは過去最大のためもちろん分けて話す。&br;
また今回はプログラムをパーツ化し、分担し作ろうということでメンバーで分担して作った。&br;
そのためそのプログラムはだれが作ったのかも記述する。
**レース用プログラム [#md0edf53]
製作者:「[[RaikouRK:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FRaikouRK%2FMission3]]」
彼には悪いが省略 読みたきゃ過去の自分のを見てほしい。
**紙コップを保持を(上げる,)下げる、保持するプログラム[#lc6bd548]
製作者:「自分」と「[[jake57:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fjake57%2FMission3]]」
sub down()
//下に下げる動作
{
OnRev(OUT_B);
Wait(200);
}
task keep()
//上でキープしておくただし、ラインとレースと並列動作させるためtaskで定義
{
while(1)
{
OnRev(OUT_B);
Wait(1);
OnFwd(OUT_B);
Wait(3);
}
}
後述するといった紙コップをどう維持するかというプログラムだ。&br;
コメント文でも定義しているが、これはtask定義でライントレースなどをするときに並列動作させている。&br;
これによって遠心力などで紙コップが外れることはなく安心だ。&br;
またプログラム全体像で見ればわかるがup()というサブルーチンは存在しない。&br;
これは制作時subの製作限界数を超えたからだ。&br;
ちなみにWait()の1:3は手作業で求めた。
**180度回転するプログラム [#x12ea7d4]
製作者:「[[Yamada:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FYamada%2FMission3]]」
sub TURN_180()
//180ど回転
{
OnFwd(OUT_AC);
Wait(70);
Off(OUT_AC);
OnRev(OUT_A);
Wait(125);
while(SENSOR_1>40)
{
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_AC);
}
説明として180度回転と書いているが実際にしていることは少し違う。&br;
まず3行で後ろに後退する。&br;
その後Aのモータのみ一定時間動かし回転し、その後センサが一定になるまでもう一度回転を行う。&br;
一見して簡単なプログラムだがこのプログラムの凝っている点は&br;
一回目と二回目で回転の半径が違うという点だ!&br;
これによって大きな回転でだいたいの位置を決め、&br;
小さな回転で正確な位置を決めるということを可能にしている。
*プログラムの全体 [#wf4f2eaf]
前日まで機体の改良をしたため、最終目標は1個だけになってしまった。&br;
(しかもそれすらできなかった。)
#define Middle 45 //ライントレース用 (中央値)
task main()
{
setting();//初期設定(センサ、モータ)
//////////////////////////////////////Cへ移動
STARTING_OPERATION();//四角い枠から脱出
repeat(2)
{
TRACE();
zensin();
}
//交差点からCへ向かう
TRACE();
OnRev(OUT_C);
Wait(25);
TRACE();
//誤差修正
OnRev(OUT_A);
Wait(95);
Off(OUT_AC);
////////////////////////////////////////Cに到着
OnFwd(OUT_B);//コップつかむ
Wait(250);//上に上げる
start keep;//紙コップの保持
TURN_180();//反転
OnFwd(OUT_A);//Qの方向を向く
OnRev(OUT_C);
Wait(200);
Off(OUT_AC);
OnRev(OUT_AC);//進む
Wait(100);
Off(OUT_AC);
//センサー使って進む
while(SENSOR_1 > Middle-4)
OnRev(OUT_AC);
stop keep;
//放す
Off(OUT_AC);
down();
}
sub setting()
{
//初期設定(パワー、センサー)
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);//モータB止める用
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetPower(OUT_AC,4);//タイヤ
SetPower(OUT_B,7);//上下、開き
}
sub zensin()
//プログラム名は前進だがライントレース終了後右にずれるためAのみ稼働
{
OnRev(OUT_A);
Wait(106);
Off(OUT_A);
}
sub copjugde()//*使ってない
//コップが前にくるまで前進(過去の遺産で説明)
{
while(SENSOR_3 < 46)
OnRev(OUT_AC);
Off(OUT_AC);
Wait(100);
}
task keep()
//上でキープしておくただし、ラインとレースと並列動作させるためtaskで定義
{
while(1)
{
OnRev(OUT_B);
Wait(1);
OnFwd(OUT_B);
Wait(1);
}
}
sub TRACE()
//トレース用メソッド
{
ClearTimer(0);
while(FastTimer(0)<=42){
if(SENSOR_1>Middle+4)//白 左旋回
{
OnFwd(OUT_C);
OnRev(OUT_A);
ClearTimer(0);
}
else if(SENSOR_1>Middle+2)//やや白 左折
{
Off(OUT_C);
OnRev(OUT_A);
ClearTimer(0);
}
else if(SENSOR_1>Middle)//直進
{
OnRev(OUT_AC);
ClearTimer(0);
}
else if(SENSOR_1>Middle-2)//やや黒 右折
{
Off(OUT_A);
OnRev(OUT_C);
}
else //黒 右旋回
{
OnFwd(OUT_A);
OnRev(OUT_C);
}
}
Off(OUT_AC);
PlaySound(SOUND_FAST_UP);//トレース終了、交差点認識
}
sub down()
//下に下げる動作
{
OnRev(OUT_B);
Wait(200);
}
sub STARTING_OPERATION()
//スタート地点の四角から脱出する
{
while(SENSOR_1<Middle)
{
OnRev(OUT_AC);
}
while(SENSOR_1>Middle)
{
OnRev(OUT_AC);
}
OnRev(OUT_AC);
Wait(50);
Off(OUT_C);
OnRev(OUT_A);
Wait(40);
while(SENSOR_1<Middle)
{
OnRev(OUT_AC);
}
Off(OUT_AC);
}
sub TURN_180()
{
OnFwd(OUT_AC);
Wait(80);
Off(OUT_AC);
OnRev(OUT_A);
Wait(130);
while(SENSOR_1>40)
{
OnFwd(OUT_C);
OnRev(OUT_A);
}
Off(OUT_AC);
}
*3と全体の反省 [#z129e537]
**課題3 [#uea947e5]
やはり人数6人でやるということで規模も大きい、大変な期間だった。だが逆に言えばルールがロボコンに近く考えさせられる内容だったと言える。&br;
また、とりあえず作ってみようと言う形で、最初から6個を目標にしてしまったのが失敗だったのかもしれない。最初は1個を目標でやっていれば&br;
結果はかわったかもしれない。&br;
ほかのチームを見ると、やはりシンプルな作りが高得点になっているように見える。&br;
これはシンプルにすればするほど機体自体のミスが減るとともに、プログラムでの誤差が少なくなるということを示しているだろう。&br;
そう考えると、自分たちのマイコン1つでやるという考えも間違えではなかったのではないだろうか?&br;
(完成できなかったのだからそれ以上は何もいえないが...)&br;
**全体の感想 [#kd8780fa]
とにかくつらいゼミだったというのが最初の感想。&br;
もちろん、それをわかった上で自分の意思でやったので自己責任だろう。&br;
だがこのゼミでは自分は機体の改善の大切さを知ることができたと思う。&br;
プログラムでは改善が難しいモノでも、タイヤやセンサの角度を少し変えるだけで&br;
かえることができる。つまりは別の視点で改善ができないか考えることが重要なのだろう。&br;
また、もう一つこのゼミで重要だと思ったのが、チームワークだ。&br;
プログラムはもちろん一人で書かなければいけないが、みんなにわかりやすいように書けば、その後書き直すときに別の人間がやれるかもしれない。&br;
機体は一人では出ないアイデアでもみんなで考えればいいアイデアが出るかもしれない。&br;
まとめると、今回のゼミでは自分が思っていた力とは別の力が必要だった。&br;
そのため大変だったが、楽しくもあったと思う。