- 追加された行はこの色です。
- 削除された行はこの色です。
[[2016a/Member]]
目次
#contents
*はじめに [#zf01f81e]
今回の課題は、課題2で使ったコースを使い、紙コップを重ねるミニロボコンを行うものだった。
ルールはこちら→[[2016年度前期 課題3:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3]]
*ロボットの説明 [#y7972c6d]
今回は、紙コップ運搬用と積み重ねる用の2つのロボットを作った。
#ref(s_DSC_0239 (1).JPG)
**紙コップ運搬ロボ [#b1588ff0]
&ref(s_1470408939269.jpg);&ref(s_DSC_0242.JPG);&ref(s_DSC_0243.JPG);&ref(s_DSC_0244.JPG);
ドライブベースは小回りのきくように3輪にし、ライントレースしやすくした。
紙コップを捕まえる腕は、空回りするギアを使い、腕がとれないようにした。
**紙コップ積み重ねロボ [#ob27ccd2]
&ref(s_DSC_0246.JPG);
&ref(s_DSC_0247.JPG);
&ref(s_DSC_0245.JPG);
&ref(s_DSC_0249.JPG);
複雑で説明するのが難しいが、出力Aのモーターでアームを開閉し、出力Cのモーターでアームを上下している。
下の方に光センサーがついていて、光センサーに紙コップが触れると、アームが動き出す。光センサーの真上にアームが来るように調整し、紙コップがつかめるようにした。
*プログラム [#eea129c6]
*運搬ロボ用プログラム [#wc81d06a]
**運搬ロボ用プログラム [#wc81d06a]
#define THRESHOLD 42 //閾値
#define gofw OnFwd(OUT_AC);Wait(5); //直進
#define turn_left Off(OUT_A); OnFwd(OUT_C); //左折
#define senkai_left OnFwd(OUT_C);OnRev(OUT_A);Wait(63); //交差点左旋回
#define turn_right OnFwd(OUT_A); Off(OUT_C); //右折
#define senkai_right OnFwd(OUT_A);OnRev(OUT_C);Wait(60); //交差点右旋回
#define senkai OnFwd(OUT_A);OnRev(OUT_C);Wait(90); //180度旋回
#define STEP 1 //一回の判定で進む時間
#define B_up OnFwd(OUT_B);Wait(80);Off(OUT_B); //出力Bの腕を上げる
#define B_down OnRev(OUT_B);Wait(80);Off(OUT_B); //出力Bの腕を下げる
#define back OnRev(OUT_AC);Wait(move_time);Off(OUT_AC); //後退
#define tyousei_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t); //角度調整のための左旋回
#define tyousei_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t); //角度調整のための右旋回
#define watasu OnFwd(OUT_AC);Wait(120);Off(OUT_AC);\
OnRev(OUT_AC);Wait(50);Off(OUT_AC);Wait(2000); //積み重ねロボとの接触調整
int move_time; //後退の時間
void line_follow(int t)
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
ClearTimer(0);
while (Timer(0)<t) {
if (SENSOR_2 < THRESHOLD){
turn_left;
} else {
turn_right;
}
Wait(STEP);
}Off(OUT_AC);
}
sub crossing_fwd()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int n=0;
while(n<10){
if (SENSOR_2 < THRESHOLD){
turn_left;n++;
} else {
turn_right;n=0;
}
Wait(STEP);
}Off(OUT_AC);Wait(100);gofw;
}
sub crossing_stop()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int n=0;
while(n<10){
if (SENSOR_2 < THRESHOLD){
turn_left;n++;
} else {
turn_right;n=0;
}
Wait(STEP);
}Off(OUT_AC);Wait(100);
}
sub crossing_right()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int n=0;
while(n<10){
if (SENSOR_2 < THRESHOLD){
turn_left;n++;
} else {
turn_right;n=0;
}
Wait(STEP);
}Off(OUT_AC);Wait(100);senkai_right;OnFwd(OUT_AC);Wait(30);
}
sub crossing_left()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int n=0;
while(n<10){
if (SENSOR_2 < THRESHOLD){
turn_left;n++;
} else {
turn_right;n=0;
}
Wait(STEP);
}Off(OUT_AC);Wait(100);senkai_left;
}
task main()
{
move_time=50; //後退の時間を0.5秒に設定
line_follow(105);
tyousei_l(30); //急カーブ手前の角度調整
crossing_left(); //Pを左折
line_follow(50);
crossing_right(); //Sを右折
crossing_stop(); //Cで停止
tyousei_r(20); //紙コップを取るための角度調整
back; //1つ目の紙コップを取るための後退
B_down;
senkai;
line_follow(50);
crossing_left(); //Sを左折
line_follow(50);
crossing_fwd(); //Pを直進
line_follow(25);
tyousei_l(40); //急カーブ手前の角度調整
crossing_fwd(); //Rを直進
tyousei_r(15); //紙コップを渡す場所の調整
watasu;
tyousei_l(25); //旋回前の調整
senkai;
B_up;
repeat(2)
{
OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
line_follow(50);
crossing_fwd(); //Pを直進
crossing_left(); //Sで左折
crossing_stop(); //Dで停止
tyousei_r(20); //紙コップを取るための角度調整
back; //1つ目の紙コップを取るための後退
B_down;
senkai;
crossing_right(); //Sを右折
crossing_fwd(); //Pを直進
line_follow(25);
tyousei_l(40); //急カーブ手前の角度調整
crossing_fwd(); //Rを直進
tyousei_r(15); //紙コップを渡す場所の調整
watasu;
tyousei_l(25); //旋回前の調整
senkai;
B_up;
OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
line_follow(20);
crossing_fwd(); //Pを直進
crossing_right(); //Sを右折
crossing_stop(); //Cで停止
tyousei_r(20); //紙コップを取るための角度調整
back;move_time=move_time-25; //3つ目、5つ目の紙コップを取るとき後退時間を-0.25秒している
B_down;
senkai;
line_follow(50);
crossing_left(); //Sを左折
line_follow(50);
crossing_fwd(); //Pを直進
line_follow(25);
tyousei_l(40); //急カーブ手前の角度調整
crossing_fwd(); //Rを直進
tyousei_r(15); //紙コップを渡す場所の調整
watasu;
tyousei_l(25); //旋回前の調整
senkai;
B_up;
}
OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
line_follow(50);
crossing_fwd(); //Pを直進
crossing_left(); //Sを左折
crossing_stop(); //Dで停止
tyousei_r(20); //紙コップを取るための角度調整
back;
B_down;
senkai;
crossing_right(); //Sを右折
crossing_fwd(); //Pを直進
line_follow(25);
tyousei_l(40); //急カーブ手前の角度調整
crossing_fwd(); //Rを直進
tyousei_r(15); //紙コップを渡す場所の調整
watasu;
senkai;
line_follow(15);
crossing_right(); //Rを右折
OnFwd(OUT_AC);Wait(200);Off(OUT_AC); //円に向かう
}
紙コップ運搬ロボは、Aからスタートし、C→B→D→Bを3回行い、6つの紙コップをBにおいてある紙コップ積み重ねロボへ運ぶようにプログラムを書いた。
サブールーチンとインライン関数は前回の課題と基本的に同じだが、ロボットの電池を変えたら、元気になり、nの値をn<15からn<10に変えたらちょうど良くなった。
前回の課題のレポート→[[2016年度前期 課題2レポート:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fkefusuke%2FMission2]]
本番はrepeatの回数を1回にして、4つの紙コップを運ぶ作戦にした。
本番はrepeatの回数を1回にして、4つねらいの作戦にした。
*積み重ねロボ用プログラム [#rc40ad43]
**積み重ねロボ用プログラム [#rc40ad43]
#define nigiru OnFwd(OUT_A);Wait(move_timeA);Off(OUT_A); //アームを閉じる
#define hanasu OnRev(OUT_A);Wait(350);Off(OUT_A); //アームを開く
#define arm_up OnFwd(OUT_C);Wait(move_timeB);Off(OUT_C); //アームを下げる
#define arm_down OnRev(OUT_C);Wait(500);Off(OUT_C); //アームを上げる
#define s_arm_down OnRev(OUT_C);Wait(200);Off(OUT_C); //アームを少し下げる
int move_timeA; //アームを閉じる時間
int move_timeB; //アームを上げる時間
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
int n=0; //紙コップを持ち上げた回数を数えるカウンター
move_timeA=400; //アームを閉じる時間を4秒に設定
move_timeB=800; //アームを上げる時間を8秒に設定
while(n<=4){
if(SENSOR_1>50){
s_arm_down;hanasu;arm_down; //紙コップを重ねる
nigiru;move_timeB=move_timeB+80; //アームを閉じる(1回ごとに+0.8秒する)
arm_up;move_timeA=move_timeA+1; //紙コップを持ち上げる(1回ごとに+0.01秒する)
n++; //カウンターを+1する
}
}
s_arm_down;hanasu;arm_up;Off(OUT_A); //6つ目の紙コップを重ねる
}
紙コップ積み重ねロボは常にBにいるようにした。
紙コップは白で、光センサーと接触すると光センサーの値が50を超える。
なので、SENSOR_1>50になったら、動作するようにプログラムを書いた。
紙コップを持ち上げる個数が増えると、アームが持ち上げる高さと握りの強さが変わってしまうので、
回数ごとのに時間を伸ばした。
本番ではn<=2にし、4つねらいの作戦にした。
*結果 [#i11e7fe9]
基本得点 0点
技術点 10.2点
___________________
合計 10.2点
*反省・感想 [#xe450717]
自分たちのグループは、ハードを作る方に時間をかけてしまい、あまりきれいなプログラムが作れなかった。もう少しきれいにまとめることが出来たと思った。
テスト週間ということもあり、人があまり集まらないときが多かったけれど、本番までにある程度は形に出来て良かった。
紙コップの接触など少し博打要素があった。そのため、電池を換えた後の誤差に、ひどく悩まされた。
調整が楽なプログラムを書いておけば良かったと思った。