課題2で作成したコースを用いてタイムレースを行う。
これが今回使ったロボットの機体である。
2台のロボットを1台にまとめ、Bluetoothを使って通信している。
センサは光センサと超音波センサを搭載した。
超音波センサが光センサを認識しないように気を付けた。
このロボットの一番工夫した点はアームの機構である。
以下の画像のように、タイヤを2個使ってモーターで紙コップを巻き上げるような機構にした。
ロボットの位置さえ気を付ければ6個全ての紙コップを巻き上げられた。
もう1つのモーターで掴む部分を回転させ、アームの上下を可能とした。
最初は、アームが紙コップを全て重ねて運べるので、スタート地点(A地点)からライントレースを始め、P、Sの交差点を通りC地点へ行き紙コップを掴み半回転してD地点へライントレースをし紙コップを掴み半回転をし、またC地点へ…と繰り返し、全ての紙コップを掴みSからQへ行きゴールする、というのを目標としていた。しかし、車体の幅が広く、前回の課題(課題2)で使ったライントレースでは交差点でうまく曲がれなかった。そして一番問題だったのがロボットの重さである。機体を安定させようとしたせいなのか上部分が重くなってしまい、タイヤに負荷がかかってしまった。そのせいで、カーブになると動かなくなってしまった。
最終的に紙コップを1個運ぶことを目標とし、ライントレースをあきらめた。
よって、B地点からC地点に向けて直進し、紙コップを持ちQへ向かうように変更した。
以下が今回使用した最終的なプログラムの全体である。
#define SPEED 50 //スピード50 #define go_forward OnFwd(OUT_BC,SPEED); //前進 #define CONN 1 //スレーブを表している #define SIGNALON 21 //腕を動かすためにマスターがスレーブに送る信号 #define SIGNALOFF 22 //腕を動かし終わったことをスレーブがマスターに送る信号 #define SIGNALON2 31 #define SIGNALOFF2 32 #define turn_leftC OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); //左旋回 #define turn_rightC OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED); //右折 task main() { int msg //MAILBOXに来る信号をmsgと定義する SetSensorLowspeed(S1); //端子1に超音波センサ go_forward; //前進 until(SensorUS(S1) <= 9); //センサの半径9cmに紙コップが入ったら停止 Off(OUT_BC); SendRemoteNumber(CONN,MAILBOX1,SIGNALON ); //信号を送る while (true){ ReceiveRemoteNumber(MAILBOX2,true,msg); //msgを受け取っている間 if (msg == SIGNALOFF ){ //信号を受け取ったら左旋回する turn_leftC; Wait(1600); Off(OUT_BC); go_forward; //前進 Wait(1000); Off(OUT_BC); SendRemoteNumber(CONN,MAILBOX1,SIGNALON2 ); //腕を動かすために信号を送る } if (msg == SIGNALOFF2 ){ //信号を受け取ったら左旋回し、停止 turn_leftC; Wait(1000); Off(OUT_BC); } else { //それ以外では停止したまま Off(OUT_BC); } } }
マスター側は移動とセンサが中心のプログラムになっている。
ライントレースはあきらめたので光センサは使用していない。
超音波センサは今回初めて使用したが、距離がずれるので調整が大変だった。
#define SIGNALON 21 //腕を動かすためにマスターがスレーブに送る信号 #define SIGNALOFF 22 //腕を動かし終わったことをスレーブがマスターに送る信号 #define LIFT_up OnRev(OUT_C,35);Wait(520);Off(OUT_BC); //腕を上げる #define LIFT_down OnFwd(OUT_C,20);Wait(550);Off(OUT_BC); //腕を下ろす #define CATCH OnFwd(OUT_B,60);Wait(2000);Off(OUT_B); //紙コップを持つ #define RELEASE OnFwd(OUT_B,50);Wait(1500);Off(OUT_B); //紙コップを離す #define CONN 0 //マスターとつながっている #define SIGNALON2 31 #define SIGNALOFF2 32 void ude() //サブルーチン { LIFT_down; CATCH; LIFT_up; CATCH; Off(OUT_B); } task main () { int msg; while (true) { ReceiveRemoteNumber(MAILBOX1,true,msg); //msgを受けている間 if (msg == SIGNALON) { //信号を受け取ったら紙コップを持ち上げる ude(); SendResponseNumber(MAILBOX2,SIGNALOFF); //本体に次の行動をするように信号を送る } if (msg == SIGNALON2) { //信号を受け取ったら紙コップを離す RELEASE; SendResponseNumber(MAILBOX2,SIGNALOFF2); //本体に次の行動をするように信号を送る } else { //どちらでもなかったら動かない Off(OUT_BC); } } }
スレーブはアーム専用だがプログラムは割と早い段階でできていたので良かった。
紙コップは1個も運べなかった。
基本点は0点、技術点は2点で合計2点だった。
機体が重くなってしまい、また幅がかなり広くなってしまっていたのでライントレースがまともにできなくなってしまった。うまく機体の軽量化と幅の改善をするか、それでも動くようなライントレースのプログラムを書ければよかったのだが、時間と技術力が足りず最初の構想から大きく変更せざるを得なくなってしまった。アームの機構は他のグループには無くオリジナリティがあり、その上6個の紙コップを全て運べるポテンシャルがあったにもかかわらず、それが活かせなかったのが残念だった。
人数が多い上テスト前ということもあり、なかなか時間を作るのが大変だった。今更だが、この課題は役割分担が重要だということを痛感した。紙コップは運べず目標は達成できなかったが、試行錯誤ができて楽しかったと思う。今までの3つの課題を通じてプログラミングの基礎的なことを学ぶことができ、大変だったがこの経験を活かし今後の学習に役立てていきたい。