上から見た全体。写真の右へと進む。
ロボットの裏側。写真の上の丸いパーツと2つのタイヤの3点で床と接する。前をタイヤにしたときコップを掴む部分が高くなってしまいスムーズに掴めなかったので、できるだけロボットの前方が低くなるようにこのパーツを使った。
正面。写真に見られる光センサでコップを判別する。コップに近づくことでより確実に判別できる。#ref(2017b/Member/ryok/Mission3/1518393483610[1].jpg,20%,コップを掴み持ち上げる部分(裏側)) 1つのモーターでコップを掴み、持ち上げる。左手前のギアを伝ってコップを掴み、それ以上ギアが回らなくなったらギアと一緒にコップも持ち上がる。
コップを掴んだ次の瞬間には↓
コップが持ち上がる
コップに直接あたる部分。写真のようなつくりにすることで、コップを持ち上げるのにもっとも適した高さに微調整しやすい。
写真のように右のタイヤの内側に角度センサを取り付けた。
#define cup_getup OnFwd(OUT_B);Wait(15);Off(OUT_B);//紙コップをつかむ #define cup_putdown OnRev(OUT_B);Wait(30);Off(OUT_B);//紙コップをはなす #define turn_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC);//右旋回 #define turn_left(s) OnFwd(OUT_C);OnRev(OUT_A);Wait(s);Off(OUT_AC);//左旋回
sub search_cup() { SetSensor(SENSOR_1,SENSOR_ROTATION); SetSensor(SENSOR_2,SENSOR_LIGHT); int sun_MAX = 100;//明るさの値であり、のちに値を下げるものなので最初は少し高めに設定している int sensor_MAX = 0;//回転の値であり、のちに上がっていくものなので最初は0としてある ClearSensor(SENSOR_1); while(SENSOR_1 < 4)//回転センサーが4となるまで繰り返し { SetPower(OUT_AC,2); OnFwd(OUT_A); OnRev(OUT_C); if(SENSOR_2 < sun_MAX)//もし明るさがそれまでに記録した値より低くなった時以下のことをする { sun_MAX = SENSOR_2;//最低の明るさを更新 sensor_MAX = SENSOR_1;//最低の明るさを記録した時の回転センサーの値を更新 } } Off(OUT_AC); Wait(100); SetPower(OUT_AC,2); OnRev(OUT_A); OnFwd(OUT_C); until(SENSOR_1 < sensor_MAX);//先ほど最低の明るさを記録したところまで待つ Off(OUT_AC); Wait(100); OnFwd(OUT_AC);//紙コップがある方向に近づく Wait(40); Off(OUT_AC); }
task main() { OnFwd(OUT_AC);//A地点から1つ目の紙コップ付近まで近づく Wait(140); Off(OUT_AC); int A; for (A=1; A<=2; A++)//以下のことを2回繰り返し { SetPower(OUT_AC,2); OnFwd(OUT_C);//紙コップを見つけるために一時的に左旋回 OnRev(OUT_A); Wait(20); Off(OUT_AC); Wait(100); search_cup();//紙コップを見つけて紙コップに近づく Wait(100); } cup_getup;//紙コップをつかむ turn_right(185);//紙コップをつかんだ地点で右旋回し、X地点の方向を向く Wait(100); OnFwd(OUT_AC);//X地点に近づく Wait(50); Off(OUT_AC); OnFwd(OUT_B);//紙コップを持ち上げる OnRev(OUT_AC);//紙コップを持ち上げながら下がり、紙コップからピンポン玉を出す Wait(100); Off(OUT_ABC); Wait(100); turn_left(150);//持っている紙コップを移動の邪魔にならない位置におくため左旋回 Wait(100); cup_putdown;//紙コップをはなす turn_right(155);//2つ目の紙コップの方向を向くために右旋回 OnFwd(OUT_AC);//紙コップに近づく Wait(140); Off(OUT_AC); turn_right(40);//紙コップがある方向を向くため右旋回 OnFwd(OUT_AC);//更に紙コップに近づく Wait(40); Off(OUT_AC); int B; for (B=1; B<=2; B++)//以下のことを2回繰り返し { SetPower(OUT_AC,2); turn_left(20);//紙コップを見つけるために一時的に左旋回 Wait(100); search_cup();//紙コップを見つけて紙コップに近づく Wait(100); } cup_getup;//紙コップをつかむ Off(OUT_AC); Wait(100); turn_right(160);//紙コップをつかんだ地点で右旋回し、X地点の方向を向く OnFwd(OUT_B);//紙コップを持ち上げる OnRev(OUT_AC);//紙コップを持ち上げながら下がり、紙コップからピンポン玉を出す Wait(100); Off(OUT_ABC); turn_left(85);//X地点の方向を向いてる状態からY地点の方向をを向くため左旋回 OnFwd(OUT_AC);//Y地点に近づき、紙コップをY地点に置く Wait(160); Off(OUT_AC); }
ロボットは自分たちが予想した動きと異なる動きをすることが多かった。その解決のために、プログラムであったり、ロボットの作りであったり、またセンサや光の加減、フィールドの問題など多くのことを考えなければならず、とても苦労した。同じプログラムでも少しづつ異なる動きをすることもあり、より確実に動くロボットにするには、何度も何度も動かすことが大事だと感じた。