出来るだけ多くの空き缶を集めて、ゴールへと運ぶという内容の課題であった。最初は中身ありの缶を土台にする作戦であったが、僕らの班は発表日には出席できないので政策期限が短かったので、E,G,Hの缶を三段に積み、運ぶのみにし、手堅く点数をを取ることにした。
限度の力を超えると空回りするギアを噛ませることでモーターに負担をかけずに掴むことができる。上に付いているチューブは二段目の缶を支えるために付いている。アームの一番下に付いているギアの部品は缶の底にひっかかるようになっており、毎回同じような形で缶を掴むことを可能にしている。試作機と比べ、とてもアーム部分がシンプルかつ軽くなった。
//A アーム上下 //C アーム開閉 #define kan_hanbetu 26 //光センサーが缶を判別する値
缶の判別の値は26となっている。
void arm_close(int time) { OnRev(OUT_C); //アームを閉じる Wait(time); OnRev(OUT_A); //上に上がる Wait(280); Off(OUT_A); }
アームを閉じ一番上まであがるというプログラムである。アームを閉じている時間は状況によって変わるのでvoidを使っている。
sub arm_open() { Wait(300); OnFwd(OUT_A); //下に下がる Wait(20); Off(OUT_A); OnFwd(OUT_C); //アームを開く Wait(20); Off(OUT_AC); OnFwd(OUT_A); //下に下がる Wait(250); Off(OUT_A); }
缶を上に持ち上げた状態から、缶を重ねアームを下に降ろすまでのプログラムである。
task main () { while (true) { if (SENSOR_2 <= kan_hanbetu) { Wait(300); arm_close(300); Wait(100); OnRev(OUT_A); //上に上がる Wait(500); while (true) { if (SENSOR_2 <= kan_hanbetu) { arm_open(); Wait(80); arm_close(30); OnRev(OUT_A); //上に上がる Wait(500); while (true) { if (SENSOR_2 <= kan_hanbetu) { OnFwd(OUT_A); //下に下がる Wait(200); Off(OUT_A); Wait(200); OnFwd(OUT_C); //アームを開く Wait(30); Off(OUT_C); } } } } } } }
光センサーを二つ使ったライントレースのプログラムを組んでおり、より正確になっているようだ。
#define senkai_left OnRev(OUT_C);OnFwd(OUT_A);//左旋回 #define senkai_right OnFwd(OUT_C);OnRev(OUT_A); //右旋回 #define turn_left Off(OUT_C);OnFwd(OUT_A);//左折 #define turn_right OnFwd(OUT_C);Off(OUT_A);//右折 #define fwd OnFwd(OUT_AC);//直進 void go_fwd(int time) { fwd; Wait(time); Off(OUT_AC); } sub usetu() { turn_right; Wait(230); Off(OUT_C); senkai_right; Wait(50); Off(OUT_AC); OnRev(OUT_AC); Wait(30); Off(OUT_AC); } sub sasetu() { turn_left; Wait(190); Off(OUT_A); senkai_left; Wait(40); Off(OUT_AC); } sub naname_usetu() { OnFwd(OUT_C); Off(OUT_A); Wait(200); Off(OUT_C); OnRev(OUT_AC); Wait(40); Off(OUT_AC); } sub owari() { turn_right; Wait(70); Off(OUT_AC); Wait(450); OnRev(OUT_AC); Wait(200); Off(OUT_AC); } sub line_trace() { SetSensor(SENSOR_1, SENSOR_LIGHT); //右 SetSensor(SENSOR_3, SENSOR_LIGHT); //左 ClearTimer(0); PlaySound(SOUND_CLICK); while(FastTimer(0)<11){ if(SENSOR_1>=49&&SENSOR_3>=55){ fwd; ClearTimer(0); }else if(SENSOR_3>=50){ turn_right; ClearTimer(0); }else if(SENSOR_1>=40){ turn_left; ClearTimer(0); }else if(SENSOR_3>=48){ senkai_right; ClearTimer(0); }else if(SENSOR_1>=38){ senkai_left; ClearTimer(0); }else if(SENSOR_1>=30){ Off(OUT_AC); PlaySound(SOUND_LOW_BEEP); }else if(SENSOR_3>=30){ Off(OUT_AC); PlaySound(SOUND_LOW_BEEP); }else{ fwd; Wait(30); Off(OUT_AC); } } Off(OUT_AC); PlaySound(SOUND_CLICK); } void line_trace_2(int time) { SetSensor(SENSOR_1, SENSOR_LIGHT); //右 SetSensor(SENSOR_3, SENSOR_LIGHT); //左 ClearTimer(0); ClearTimer(1); PlaySound(SOUND_CLICK); while(FastTimer(0)<11&&FastTimer(1)<time){ if(SENSOR_1>=49&&SENSOR_3>=55){ fwd; ClearTimer(0); }else if(SENSOR_3>=50){ turn_right; ClearTimer(0); }else if(SENSOR_1>=40){ turn_left; ClearTimer(0); }else if(SENSOR_3>=48){ senkai_right; ClearTimer(0); }else if(SENSOR_1>=38){ senkai_left; ClearTimer(0); }else if(SENSOR_1>=30){ Off(OUT_AC); PlaySound(SOUND_LOW_BEEP); }else if(SENSOR_3>=30){ Off(OUT_AC); PlaySound(SOUND_LOW_BEEP); }else{ fwd; Wait(30); Off(OUT_AC); } } Off(OUT_AC); } task main() { go_fwd(50); line_trace(); usetu(); repeat(2){ line_trace(); Wait(50); naname_usetu(); Wait(50); } line_trace_2(230); Wait(500); senkai_left; Wait(200); Off(OUT_AC); go_fwd(30); line_trace(); Wait(450); sasetu(); line_trace(); owari(); }
最初は缶の色を統一するために缶に直接、黒マーカーを塗っていたが、缶の光沢により光を反射してしまっていた。先生の助言により、紙を黒く塗り、それを缶に貼ることにより光センサーの値を26にすることができた。
中身の無い缶を3個積み上げることができ、計18点を取ることができた。
制作の序盤、熱を出していたので、出席できず、次に行ったらロボットが完成しており、プログラムも途中まで進んでいて、とても焦りを感じた。プログラムもさわってはみたが、他に良いプログラミングできてしまい採用されることはなかった。余り役にたてず本当に申し訳ないことをしてしまった。そんな僕をチームとして受け入れてくれ、休んでいた分の説明をしてくれたチームのメンバーに、とても感謝している。