#contents
*メンバー紹介 [#cbcf1856]
-藪 直希・・・パソコン苦手、LEGO得意な元気な男の子
-栗原 裕貴・・・パソコン得意、LEGOが苦手な青年(彼女募集中)
*ロボット説明 [#u519e46e]
我々はロボットを2度組み直した。それぞれを『初代』『弐代目』『参代目』と名付けよう。初代、弐代目から改良して最終的に参代目を採用することにした。
**初代 [#n2e2ab0a]
&ref(1-z.jpg);&ref(1-x.jpg);
アームを左右から出すことで缶をつかみやすくなっている。だが、アームの機構が大きくなってしまったため必然的にボディが大きくなってしまった。歯車の数が多いためうまくかみ合わない時の多々あった。さらにNXTを上部に設置してしまったため、重心が高くバランスの悪いロボットとなってしまった。いうなれば、ハウルの動く城のようなバランスだ。
そして、無駄なパーツが多いため重くなってしまった。そのため自身の重みとバランスの悪さゆえに前進できない時があるという致命的な弱点を持っていた。
ここで初代の問題点をあげてみよう。
�.◆璽爐竜々修�大きい。
�∋�車がうまくかみ合わない時がある。
��重い
�ぅ丱薀鵐垢�悪い。
�タ覆泙覆あ�致命的
**弐代目 [#h6aaf102]
&ref(2-b.JPG);&ref(2-d.JPG);
なんと、苦労して作った初代のできが悪かったため思い切ってハウルの動く城を崩壊させた。
初代よりもバランスをよくするためにNXTの位置を低くし、埋め込む形にした。これによってハウルの動く城の状態は脱した。ボディ自体のバランスはよくなった。だが、アームを片腕にして缶をしっかりつかめるようにたらそれで全体のバランスが崩れてしまった。手が大きくなりすぎたのだ。重みで止まることはなくなったが、たまにアームが地面につき動きが鈍くなるという、機動力の弱点がまたまた見つかってしまったのだ。
アームが重いため大きく揺れてしまい、さらに音波センサーが斜め下を向いていたため、缶より前に揺れたアームに反応してしまうことがあった。
一応この弐代目で課題をクリアすることができた。だが、まだまだ改良の余地があったため作りかえた。
ここで弐代目の問題点をあげよう。
�.◆璽爐力咾�大きく、重い
��音波センサーが斜め下を向いている
�M省�な部分が多い
**参代目 [#u6ffb35b]
&ref(3-a.JPG);&ref(3-d.JPG);
この参代目は極力使用するパーツを減らし、究極の軽さを実現したロボットである。我々的にはどこのチームのロボットよりも無駄が少ないと思えるほどの出来栄えだ。
弐代目とアームをに比べていただきたい‼アームの機構が異常に簡単になっていて小型化されている。缶がjustで入る大きさなのだ。だが、アームが斜めを向いていて、缶をつかんだ時に倒れてしまうと思うだろう。そこでアームの真ん中についているタイヤを見ていただきたい。これによって缶が倒れず、さらにタイヤのゴムがストッパーになっている。
音波センサーは相変わらず斜め下を向いているがアームがコンパクトになり、揺れなくなったためアームを読み取ることがなくなり、うまく作動するようになった。
参代目は行うべき動作を最低限のパーツで作り上げられた、我々の最高傑作だ。
**まとめ [#bac350bd]
こうして我々のロボットは進化していった。
初代ではハウルの動く城という異名も付いたが、問題点を見つけ、改良することでコンパクトで仕事を完ぺきに遂行する参代目にたどり着けたのだ。
*プログラミング [#d1959d63]
&ref(course.png);
カウンターについて2人とも知識が足りなかったため、タイマーに逃げた.........ここで相方を擁護しておこうと思う。栗ちゃん(栗原)はなかなかの知識はあったのだが、私の知識が少なすぎたため断念したのだ。そして、タイマーの方がプログラムが簡単で、わかりやすいという案が出たので、タイマーにしたのであった。
タイマーにするにあたって、コースを写真のように3つの区間にわけてそれぞれの区間を進む時間を計って設定した。
**定義 [#u2f5a89b]
#define right_spin OnFwd(OUT_C,35);OnRev(OUT_B,35);//右旋回
#define left_spin OnFwd(OUT_B,35);OnRev(OUT_C,35);//左旋回
#define turn_right OnFwd(OUT_B,30);OnRev(OUT_C,30);//右へ(区間1)
#define turn_left OnRev(OUT_B,30);OnFwd(OUT_C,30);//左へ(区間1)
#define T_right OnFwd(OUT_B,40);OnRev(OUT_C,0);//右へ(区間2)
#define T_left OnRev(OUT_B,0);OnFwd(OUT_C,40);//左へ(区間2)
#define T_R OnFwd(OUT_B,40);OnRev(OUT_C,40);//右へ(区間3)
#define T_L OnRev(OUT_B,40);OnFwd(OUT_C,40);//左へ(区間3)
#define SHIKI 50//しきい値
**ライントレース [#h930dc07]
音を出して、区間ごとにライントレースのプログラミングが切り替わっているかをわかりやすくした。
task line()
{
long t0=CurrentTick();
PlaySound(SOUND_DOWN);
Wait(500);
***区間1 [#b0794ba7]
区間1では、直角の曲がり角が2つあるのでそこを曲がれてさらに、滑らかなライントレースができるように調節した。
while(CurrentTick()-t0<=13500)
{
if(SENSOR_2<SHIKI-12){
turn_left;
}else if(SENSOR_2<SHIKI){
OnFwd(OUT_BC,30);
}else{
turn_right;
}
Wait(1);
}
PlaySound(SOUND_CLICK);
***区間2 [#pfcb0141]
区間2では、円になっているラインと交差点があった。進み方を滑らかにしたかったため、旋回を緩やかに行うライントレースにした。そしてなぜか、光センサーの位置とライントレースのプログラミングで交差点がうまくいったので、採用することにした。
これはちょっとした奇跡といってもいいだろう‼おかげで、カウンターやタイマーを余分に使うことなく区間2を走りきれた。
while(CurrentTick()-t0<50000)
{
if(SENSOR_2<SHIKI-12){
T_left;
}else if(SENSOR_2<SHIKI){
OnFwd(OUT_BC,40);
}else{
T_right;
}
Wait(1);
}
PlaySound(SOUND_CLICK);
***区間3 [#p1eb27d1]
while(CurrentTick()-t0<1000000)
{
if(SENSOR_2<SHIKI-12){
T_L;
}else if(SENSOR_2<SHIKI){
OnFwd(OUT_BC,25);
}else{
T_R;
}
Wait(1);
}
PlaySound(SOUND_CLICK);
}
**アーム [#f5af50b2]
アームのプログラミングは、はじめはtaskで行っていたのだが他のtaskと混線してしまい、うまくいかなかった。そこで先生にアドバイスをいただき、サブルーチンで行うことにした。すると、うまくいった。
アームを開いたまま走るのはカッコ悪いと思ったのた。なのでアームを閉じた状態で走り、缶が近づいたら開いて、もう一度進んでから缶をつかむ形をとった。
アームを開閉するとき、はじめは時間を決めて開閉していたが、電池の残量などが原因で微調整をしなければいけなかった。それに悩んでいるとき、栗原が「角度を指定すればいいじゃん!」と言い出して、私は意味が分からなかった。なので、任せてみると、なんと!90°しかアームが開閉しなかったのです!これは素晴らしい!と採用。
sub arm()
{
Off(OUT_BC);
PlaySound(SOUND_UP);
Wait(2000);
RotateMotor(OUT_A,-75,90); //アーム開く
Off(OUT_A);
OnFwdSync(OUT_BC,30,0);Wait(1600); //ちょい進む
Off(OUT_BC);
RotateMotor(OUT_A,75,90); //アームでつかむ
Off(OUT_A);
right_spin;Wait(2800); //右旋回
Off(OUT_BC);
OnRevSync(OUT_BC,35,0);Wait(2700); //持ったままちょい下がる
Off(OUT_BC);
RotateMotor(OUT_A,-75,90); //アーム開く
OnRevSync(OUT_BC,30,0);Wait(1500); //離すためにちょい下がる
Off(OUT_BC);
left_spin;Wait(2800); //左旋回
Off(OUT_BC);
RotateMotor(OUT_A,75,90); //アームを閉じる
OnRevSync(OUT_BC,40,0);Wait(700); //もとの位置に戻る
}
**音波センサー [#v6158b1a]
音波センサーは缶まで残り20cmに成ったら、反応するようにした。これだけ遠い理由としては、缶に近づいたら1回アームを開かないといけないからである。
task sonic()
{
while(true){
if(SensorUS(S1)<20){
stop line;
arm();
start line;
}
}
}
**メイン [#oe321e79]
mainはご覧のようにここまで簡単だ。
task main()
{
SetSensorLowspeed(S1);
SetSensorLight(S2);
start sonic;
start line;
}
*感想 [#y8dbb9b0]
私はパソコンを使うのが苦手で知識もないため、プログラミングの面では栗原の力を大いに借りた。その代わりといってはなんだが、私はレゴが得意なのでこっちで力を発揮できるようがんばった。ロボットの組み立ては大体私がやったのだが、先生にパーツを減らすように言われるまで、減らそうと考えなかったところは製作者としていけなかったと思う。次のロボットでは、最初から無駄なパーツを付けずに、最軽量で最高率の仕事をするロボットを作りたい。