今回の課題では、前回の課題で得られたすべての機構はロボットの進行方向と同一にしたほうが正確性が高いというのをもとに、アーム、レーン、センサーのすべてを進行方向に設置した。コントロールユニットは2つ使用しており、片方がライントレース用、もう片方がボールの確保と設置用となっている。お互いに通信させている。†これが今回ボールを確保する機構である。今回の課題では空き缶の上においてあるボールを確保する必要があった。そこで出る問題は、空き缶の軽さである。これによって、ボールを水平方向から確保するには抑えのような機構が必要になる。それでは必要になる機構が多くなってしまうので結果としてボールに対して鉛直方向からの力での確保が必須と考えたのでこの形となった。この機構は、レーンの下に輪ゴムを使ってボールを支えることで、ボールの自重では下に落ちず、ロボットの力で落とすことができるようになっている。†ボールをキャッチする機構をそのまま缶の上に押さえつけ、、その上にある機構の出っ張りによりボールが一つずつ出てくるようになっている。このアームには、直接ボールを掴むなどの機構などはなく先ほど説明したレーンとの組み合わせによりボールを缶の上に置くようになっている。具体的には、レーンの上のボールの下に缶があればアームでボールを上から押さえつけ、その状態でレーンを上げることによってボールを設置するという輪ゴムの性質を活かした機構となっている。今回のライントレースでは、光センサーを2つ使用して首振りによる確保したボールの落下を防いで、正確性を向上させた。前々から薄々きづいていたのだがこの超音波センサーの精度はお世辞にも良いものとは言えない。そこで今回は缶とボールに対して鉛直方向から観測することで、缶とボールがそこに存在するかどうかについての判断をさせた。今回、自分はプログラムの作成が本番に間に合わなかった。そこで、本番に使用したプログラミングをを載せておく。今回の課題では2つのコントロールユニットを使用するので完全に通信してしているかや、正確性(超音波センサー、アームやレーンの初期位置など)の確保のためのプログラムを作成した。これはマスター側のプログラムで、これを押してスレイブからの反応があれば音がなるようになっている。s_con(){//接続SendResponseNumber(MAILBOX1,con);PlayTone(700,200);}返す番号は4でこれをマスターの1のメールボックスにかえす。これにより接続が完了しているか否かについて知ることができる。reset(){//初期位置ResetTachoCount(OUT_BC);OnFwd(OUT_B,20);Wait(800);OnFwd(OUT_C,45);Wait(1200);RotateMotor(OUT_B,-20,10);OnFwd(OUT_C,-20);Wait(1700);OnFwd(OUT_B,-20);Wait(400);Off(OUT_BC);}これによって、アームやレーンのセッティングのし忘れが起きたときのリスクをなくしている。アーム、レーンをともに最初に目一杯後ろにそらしたあと、その療法を適切な位置に前方方向に倒している。//traceこれが本番で使用したライントレースである。これは自分が作成しようとしていた比例制御を用いたものではなく、課題2のときに培われたノウハウを用いて作成している。課題2のときとは違い、センサーが2つあることによりさらに細かな判断を行うようになっている。右のセンサーに対して3つの、更に左のセンサーに対しても3つの合計3✕3の9つの判断を行うようにしている。交差点前の時間計測を無視するために引数としてt_minを用いている。これはスレイブ側のプログラムなので、マスターからのgoの指示で動き、stopの指示で停止するようにしている。a;SendRemoteNumber(1,MAILBOX1,go);//go命令SetSensorLowspeed(S4);while(c!=10){sum=sum+SensorUS(S4);c=c+1;}a=sum/10;//十回平均while(SensorUS(S4)>0.5*a){}//whileSendRemoteNumber(1,MAILBOX1,st);//stop命令}//void今回は、超音波センサーの仕様にあたって一つの懸念があった。それはセンサーの制度の問題である。そこで今回は、超音波センサーの値は平均をとり、それを利用してレーン上のボールがあるかどうかの判断を行うようにしている。先ほど説明した、スレイブにgoとstopのコマンドを送るかどうかの判断はここで行っており、アームとレーンの初期位置ついての準備が完了すれば、goの1を、超音波センサーの地面との距離が計測し続けていた値の半分付近に達すると、空き缶上のボール、または空き缶を発見したとして、stopの2を送るようにしている。waiting(){while(y!=go){ReceiveRemoteNumber(MAILBOX1,true,y);}}スレイブ側がマスターからのgoの指示が来るまで待つためのものである。move_can(){OnFwdSync(OUT_BC,sp,0);Wait(3500);OnFwdSync(OUT_BC,-sp,0);Wait(2900);}ボールをとった以降にコース上にある缶ははっきり言って邪魔である。そこで、ライントレースをする前にその邪魔な缶を排除するためのプログラムがこれである。†これがマスター側のメインプログラムである。Wait(10000);//少し待つobserve();//F’地点の缶を観測したらstop指示put_ball();//F’地点の缶にボールを置くobserve();//E’地点の缶を観測したらstop指示put_ball();//E’地点の缶にボールを置くobserve();//C’地点の缶を観測したらstop指示put_ball();//C’地点の缶にボールを置く}これはスレイブ側のプログラミングである。今回の課題ではまず、ロボットをコンパクトにしすぎたことがあげられる。これにより、ロボットの作成途中でパーツに負荷がかかりすぎたことによる破損やモーターの回転が何らかの障害により阻害されるなどの問題が発生した。そのほかにもボールを同時に3つ運ぼうと欲張ったことで、プログラミングの難化、設計にボールをためておく場所の工夫など考慮しなければいけない問題が増えた気がした。ボールを1つづつ運べば、コース取りや正確性に気を使う必要はなかったかもしれない。†この講義を通して、いかにロボットの制御や設計が難しいか学ぶことができ、それと同時に班員と協力し、一つの大きな課題に向き合うことの楽しさを味わうことができた。紆余曲折はあったが非常に有意義な授業であったと思う。