- 追加された行はこの色です。
- 削除された行はこの色です。
[[2013b/MemberOnly/進行状況]]
#contents
*課題について [#h089b76b]
**コース [#o1980176]
#ref(2013b/Member/Redcicudu/Mission2/robocon2013b (1).png,17.4KB,今回のコース)
コースは前回の課題1において使用したコースを向かい合わせてつなげたものとなっている。そこに黄色い丸で示した位置に空き缶を9個配置し、それらを回収して積み上げて高く積み上げれば積み上げるほど点数が加算されていくというものである。なお、空き缶は「GOAL」と書かれた輪っかの中で積み上げなければ得点が加算されない。
**攻略方針 [#j8a3743e]
今回の課題は空き缶を積めば積むほど得点が高くなってゆく。詳しくは課題2の項目を参照していただきたい。
しかし、空き缶を積むうえでいくつかの問題点が出てくる、大まかに示すと以下の通りである。
+空き缶を高く積みすぎると不安定になる
+空き缶はコース上に点在しており、必ずしもライン上にあるわけではない
+ゴールの小さな輪っかの中、もしくはライン上に空き缶を置かなければならない
そこでこれらの問題点に対して以下のような方法で我々は対処した。
+空き缶を高く積んでも安定して保持できるようなハンド、崩さないように持ち上げるアーム、静かに運搬可能な車体の開発
+超音波センサーを用いてどの方向に空き缶があるのか検出するプログラムを製作する
+サーボモーターとしての機能を生かし置く位置の微調整を行う
2に関しては我々のチームの一員であるpianoman氏がプログラムを組んでくれた。残念ながら私は構造をしっかり理解しきれていないので詳しくは彼のページを参照してほしい。
私は主にロボットの製作の方に携わったのでロボット本体について解説を行う。
*ロボットについて [#wa039a17]
**ボツ案 [#ge64f99a]
**ドライブベース [#k33deb4d]
**アーム [#m2da0dde]
**ハンド [#sc19a7ef]
まずハンドに関してである。我々は「空き缶を四個積み上げたタワーを二つ作る」という方針を大まかにだが決めていた。そこで空き缶を掴むハンドは四個分の重みに耐えてしっかりと保持し続けることができるような構造にしなくてはならない。そこでハンド自体はいくつか作りかえてのだが、まずは最終決定番について解説する。
#ref(2013b/Member/Redcicudu/Mission2/DVC00019 (2).JPG,42.9KB,ハンドの全体像)
見ての通り非常に大きなハンドであり、このロボットの外見上の特徴ともなっている。これだけ大きなものしたのは空き缶を縦に伸びた棒で支え、横に伸びた部品で空き缶を抑え込むためである。
このハンドは複数個の空き缶を持ち上げるとしても、実際にしっかり摩擦力をかけるのは一番下の空き缶だけである。なぜそのようにしたのかといえば、複数の空き缶に摩擦力を分散させてる構造にしてしまうと、空き缶を複数個ならば固定できるものの一個や二個程度だとむしろ摩擦力が足りなくなってしまうのである。おかげで運搬中に落下するということが頻繁に起きたので、いっそ一番下の空き缶にだけ一極集中させたのだ。
また、ハンドに輪ゴムを使用したことも工夫の一つである。輪ゴムは柔軟性が高く、空き缶にぴったりと接するので摩擦力を高くすることができたのだ。そのおかげもあって空き缶が落下するということは無くなった。
#ref(2013b/Member/Redcicudu/Mission2/・「。シ・猖?ホタオフフ.jpg,96.0KB,旧ハンドの全体像)
初期のハンドは摩擦力をかけるためにタイヤを使用していたが、タイヤのゴムは固く柔軟性に欠けていた。さらに円形であるために接する面積が非常に小さく、十分な摩擦を得ることができなかった。何度か作りなおした末に行きついた形が上記で説明したハンドである。画像を見てのとおり、このころは複数の空き缶にタイヤのゴムが当たるように設計されている、しかし結果として摩擦力の分散によりしっかりと機能しなかった。
**アーム [#m2da0dde]
アームを製作するのにあたって最も注意したことは「パワー」と「慎重さ」である。
どのような工夫を行ったのか下の画像を見てほしい。
#ref(2013b/Member/Redcicudu/Mission2/DVC00021 (2).JPG,48.7KB,アームの全体像)
大小のギアが組み込まれているが、これはアームの可動部である。ギアを使用することで同じ出力であっても大きな力を生み出せるようにしたのだ。恐らくご存じの方も多いと思われるが、大きなギアで小さなギアを回すと回転数は多くなるがパワーが小さくなり、小さなギアで大きなギアを回すと回転数は小さくなるがパワーは大きくなるのだ。アームの機構は後者を利用しており、今回の用途ならばアーム自体はゆっくりと大きな力で動かしたいのでうってつけともいえるだろう。また、アームとハンドを取り付ける際に平行四辺形になるように組んでいるので、ハンドが傾いて空き缶を落としてしまうということも無いようにした。
**ドライブベース [#k33deb4d]
*プログラムについて [#xe5d81a7]
**缶の探知 [#p1f9ffc3]
**缶の積み上げ [#jfe2a74d]
**ライントレース [#ybe867ea]
三缶積んだあとにゴールまでライントレースするプログラム
//↓缶の発見及び積み上げのための定義↓//
#define CONN 1
#define SIGNAL_A 11
#define SIGNAL_B 12
#define SIGNAL_C 13
#define SIGNAL_D 14
#define SIGNAL_E 15
#define SIGNAL_F 16
#define SIGNAL_G 17
#define go_forward OnFwd(OUT_AB,50);//出力50%で前進
#include "koushin.nxc"
#define tr OnFwdSync(OUT_AB,60,100);
#define tl OnFwdSync(OUT_AB,60,-100);
#define go OnFwdSync(OUT_AB,75,0)
#define unko 60
#define direction 13
#define measure_time 10
//↓ライントレース用の定義↓//
#define BB 37 //閾値
#define BW 47
#define WB 53
#define WW 60
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_B,speedL);
#define FWD OnRL(40,40); //前進
#define T_LEFT OnRL(40,0); //左折
#define T_RIGHT OnRL(0,40); //右折
#define Q_LEFT OnRL(30,-30); //左旋回
#define Q_RIGHT OnRL(-30,30); //右旋回
#define STEP 5 //一回の判断で行う動作の長さ
#define nMAX 20 //カウンタの最大値
#define SB Off(OUT_AB);Wait(500); //小休止
#define cross_line RotateMotorEx(OUT_AB,40,500,0,true,true); //交差点通過
int Online1=0; //交差点通過ためのカウントの変数
int Next=0; //動作変更のための変数
sub CROSS_1() //黒線の右の縁に沿って動き、ゴールを目指す。
{
while(Online1<nMAX){
if(SENSOR_1<BB){
Q_RIGHT;
Online1++;
} else {
if(SENSOR_1<BW){
T_RIGHT;
} else if(SENSOR_1<WB){
FWD;
} else if(SENSOR_1<WW){
T_LEFT;
} else {
Q_LEFT;
}
Online1=0;
}
Wait(STEP);
}
Next++; //T字路と交差点を通過した回数を追加(それぞれ一回ずつ)
SB;
cross_line;
Online1=0; //カウンタをリセット
}
sub can_tsumu()
{//缶を積み、持ち上げるサブルーチン
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_B);
/*Sのメールボックス1にSIGNAL_Bを送信(缶を載せ、離し、アームを最上部へ)*/
Off(OUT_AB);//モータAB停止
receive(MAILBOX2,"SIGNAL_F");
/*Sからメールボックス2にSIGNAL_Fを受信*/
OnRev(OUT_AB,50);Wait(1500);//1.5秒後退
Off(OUT_AB);//モータAB停止
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_A);
/*Sのメールボックス1にSIGNAL_Aを送信(再び缶を掴み、上部へ)*/
Off(OUT_AB);//モータAB停止
receive(MAILBOX2,"SIGNAL_C");
/*Sからメールボックス2にSIGNAL_Cを受信*/
OnFwd(OUT_AB,40);Wait(1000);//1秒前進
Off(OUT_AB);Wait(3000);//3秒停止
sendmsg(CONN,MAILBOX1,MAILBOX2,"SIGNAL_D","SIGNAL_E");
/*Sのメールボックス1にSIGNALDを送信*/
}
task main()
{
SetSensorLight(S1); //光センサーを設定
SetSensorLowspeed(S4); //超音波センサーを設定
while(Next<1){ //T字路を渡ったら缶の積み上げに入る
CROSS_1();
}
while(Next==1){
OnFwdSync(OUT_AB,40,0); //缶を見つけるまで前進
if(SensorUS(S4)<=12){
TextOut(0,LCD_LINE2,"while(hakken==1)");
can_tsumu();
Next++;
}
}
while(Next==2){ //交差点についたら缶を置く
CROSS_1();
}
while(Next==3){
RotateMotorEx(OUT_AB,40,580,100,true,true); //向きをゴールの方へ向ける
SB; //小休止(連続して動作させると変な動きをするので)
RotateMotorEx(OUT_AB,-40,800,0,true,true); //ゴール内に缶を置けるように後退
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_G); //缶を下ろす
Next++;
}
}