*ロボットの紹介 [#e59065c9]
車のベースとなる部分は説明書通りに作り、缶をつかむためのアームはできるだけ軽く作るようにしました。アームはどうしても本体の最前に付けなければいけなかったので、重すぎると光センサーの感度に影響が出てしまいます。これがアーム軽量化の理由です。また、アームの形にも工夫を施しました。まずは、アームを四本取り付けたのですが、あえてそれぞれがずれるように設置し、缶を運ぶときに振動で傾かないようにしました。以上でロボットの紹介を終わります。
*コース攻略 [#yb2b1471]
**最初に悩んだポイント [#b1ef538c]
プログラムを作り(後に解説します)、ロボットを走らせてまずうまくいかなかったのは、やはり交差点でした。みんなも相当苦労したと思います。今回の課題用の道には、直角に交わる交差点がありませんでした。自分は左回りを担当しました。初めに作ったプログラムはスタートしてからゴールまでずっと道の右側をたどっていくものでした。これだと、交差点を渡るときに鈍角、鋭角の二つを渡らなければいけません。だからどうしても鈍角のところは真っ直ぐに進むことができず、曲がってしまいました。光センサーの値をいじったり、スピードを変えたりといろいろ試しましたがどれもうまくいかなかったです。苦悩した結果思いついたのが「全ての交差点を鋭角で渡らせよう」ということです。プログラムを時間で区切り、交差点に差し掛かるたびに道のたどる場所を右側から左側、左側から右側というように強制的にチェンジし、鈍角を避けるようにしました。そうすることで、やっとコースを一周することができました。時間はそのつど計りながら変えていきました。
**缶を運ぶには [#ycb51cdf]
缶は全てタイマーを使ってやりました。挟むところまで何秒、離すところまで何秒といった感じです。離すときには、ロボットを180度反転させて、缶を置いてから少し後退させてもう一度反転させるという方法を使いました。
以上でコース攻略を終わります。
*プログラムの説明 [#d23b0dc2]
#define THRESHOLD 48 //しき値
#define HIPOWER 7 //モーターの強さ
#define LOWPOWER 2 //モーターの強さ
#define set_power_H SetPower(OUT_AC,HIPOWER); //モーターACの強さ
#define set_power_L SetPower(OUT_AC,LOWPOWER); //モーターACの強さ
#define set_power_N SetPower(OUT_B,LOWPOWER); //モーターBの強さ
#define go_forward set_power_H; OnFwd(OUT_AC); //前に進むときのパワー
#define turn_left1 set_power_L ;\ //左に曲がる時のパワー
OnFwd(OUT_C);OnRev(OUT_A);
#define turn_left0 set_power_L ;\ //左に曲がる時のパワー
OnFwd(OUT_C);Off(OUT_A);
#define turn_right0 set_power_L ;\ //右に曲がる時のパワー
OnFwd(OUT_A);Off(OUT_C);
#define turn_right1 set_power_L ;\ //右に曲がる時のパワー
OnFwd(OUT_A);OnRev(OUT_C);
#define STEP 1
#define nMAX 300
#define short_break Off(OUT_AC); Wait(100); //休憩
#define CROSS_TIME 20
#define cross_line set_power_L;\
OnFwd(OUT_A);OnRev(OUT_C);\
Wait(CROSS_TIME);short_break;
#define arm_forward set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B); //モーターBの動き
#define arm_backward set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B);
task main ()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int nOnline=0;
ClearTimer(0); //タイマーをリセット
while(FastTimer(0)<=400){
while(FastTimer(0)<=400){ //四秒まで
while(nOnline < nMAX && FastTimer(0)<=400){
if(SENSOR_2< THRESHOLD -8) {
turn_right1;
if(SENSOR_2< THRESHOLD -8) { //センサーの値が-8より低かったら
turn_right1; //右に曲がる
nOnline++;
}else{
if(SENSOR_2< THRESHOLD -3){
turn_right0;
}else if(SENSOR_2< THRESHOLD +3){
go_forward;
}else if(SENSOR_2< THRESHOLD +8){
turn_left0;
if(SENSOR_2< THRESHOLD -3){ //センサーの値が-3より低かったら
turn_right0; //右に曲がる
}else if(SENSOR_2< THRESHOLD +3){ //センサーの値が+3より低かったら
go_forward; //直進する
}else if(SENSOR_2< THRESHOLD +8){ //センサーの値が+8より低かったら
turn_left0; //左に曲がる
}else{
turn_left1;
turn_left1; //左に曲がる
}
nOnline=0;
}
Wait(STEP);
}
}
Off(OUT_AC);
OnRev(OUT_B);
Off(OUT_AC); //モーターAC停止
OnRev(OUT_B); //モーターB逆回転
Wait(10);
arm_forward;
PlaySound(SOUND_UP);
ここから時間で区切り、右、左どちらをたどるのかやしき値を調整しました。
while(FastTimer(0)<=800){
while(nOnline < nMAX && FastTimer(0)<=800){
if(SENSOR_2< THRESHOLD -8) {
turn_right1;
nOnline++;
}else{
if(SENSOR_2< THRESHOLD -3){
turn_right0;
}else if(SENSOR_2< THRESHOLD +3){
go_forward;
}else if(SENSOR_2< THRESHOLD +8){
turn_left0;
}else{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
}
}
PlaySound(SOUND_UP);
arm_forward;
while(FastTimer(0)<=1700){
while(nOnline < nMAX && FastTimer(0)<=1700){
if(SENSOR_2< THRESHOLD -10) {
turn_right1;
nOnline++;
}else{
if(SENSOR_2< THRESHOLD -4){
turn_right0;
}else if(SENSOR_2< THRESHOLD +4){
go_forward;
}else if(SENSOR_2< THRESHOLD +10){
turn_left0;
}else{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
}
}
PlaySound(SOUND_UP);
turn_left1;
Wait(10);
arm_forward;
while(FastTimer(0)<=2600){
while(nOnline < nMAX && FastTimer(0)<=2600){
if(SENSOR_2< THRESHOLD -10) {
turn_left1;
nOnline++;
}else{
if(SENSOR_2< THRESHOLD -4){
turn_left0;
}else if(SENSOR_2< THRESHOLD +4){
go_forward;
}else if(SENSOR_2< THRESHOLD +10){
turn_right0;
}else{
turn_right1;
}
nOnline=0;
}
Wait(STEP);
}
}
PlaySound(SOUND_UP);
arm_forward;
while(FastTimer(0)<=4000){
while(nOnline < nMAX && FastTimer(0)<=4000){
if(SENSOR_2< THRESHOLD -10) {
turn_right1;
nOnline++;
}else{
if(SENSOR_2< THRESHOLD -4){
turn_right0;
}else if(SENSOR_2< THRESHOLD +3){
go_forward;
}else if(SENSOR_2< THRESHOLD +10){
turn_left0;
}else{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
}
}
PlaySound(SOUND_UP);
arm_forward;
while(FastTimer(0)<=4800)
while(nOnline < nMAX && FastTimer(0)<=4800){
if(SENSOR_2< THRESHOLD -8) {
turn_right1;
nOnline++;
}else{
if(SENSOR_2< THRESHOLD -3){
turn_right0;
}else if(SENSOR_2< THRESHOLD +3){
go_forward;
}else if(SENSOR_2< THRESHOLD +8){
turn_left0;
}else{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
}
}
PlaySound(SOUND_UP);
turn_left1;
Wait(300);
arm_backward;
OnRev(OUT_AC);
Wait(100);
turn_left1;
Wait(200);
while(FastTimer(0)<=6500){
while(nOnline < nMAX && FastTimer(0)<=6500){
if(SENSOR_2< THRESHOLD -8) {
turn_right1;
nOnline++;
}else{
if(SENSOR_2< THRESHOLD -4){
turn_right0;
}else if(SENSOR_2< THRESHOLD +3){
go_forward;
}else if(SENSOR_2< THRESHOLD +8){
turn_left0;
}else{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
}
}
}
*まとめ [#f80064a1]
初めはプログラムで使う「言語」が全く理解できず、お手本のプログラムをそのまま写すだけでした。ですが、時間をじっくりかけて取り組んでいるうちにだんだんと理解でき、自分でプログラムすることの楽しさを味わうことができました。この気持ちを忘れずに、どんどん新しいことにチャレンジしていこうと思います。