[#f4876158]#ref(2016a/Member/kurokouchi/Mission3/01.png,50%,01);マイコンは1つだけを使用しました。[#zda4b7ac]#ref(2016a/Member/kurokouchi/Mission3/07.png,50%,01);ライントレース用の光センサーをマイコンの真下に設置しました。(赤丸部分)これにより、前方に紙コップを置くスペースを確保することができました。#ref(2016a/Member/kurokouchi/Mission3/08.png,50%,01);紙コップ認識用の光センサーです。(赤丸部分)紙コップの色(白色)を判別します。[#b574b5fc]#ref(2016a/Member/kurokouchi/Mission3/02.png,50%,01);前方の2本の棒(赤丸部分)で紙コップを挟んで回収します。#ref(2016a/Member/kurokouchi/Mission3/09.png,50%,01);↓#ref(2016a/Member/kurokouchi/Mission3/06.png,50%,01);アームを上げて回収済み紙コップのストッパーとしての機能もあります。基本的にはアームを上げた状態で移動します。黒部分がCROSS_TIMEより続いたら交差点として判別する。境界部分がBALANCE_TIMEより続いたら機体がまっすぐとして判別する。[#ca9f59fc]基本動作のマクロです。top:前進#ref(2016a/Member/kurokouchi/Mission2/08.png,100%,01)角度を戻してそのまま直進する。left:左折#ref(2016a/Member/kurokouchi/Mission2/07.png,100%,01)角度を戻してそのままライントレースさせる。right:右折#ref(2016a/Member/kurokouchi/Mission2/09.png,100%,01)角度を右寄りにして外側の線に機体を移動する。[#y54b4306]今回の課題では正確に各地点へ移動するために、左の境界部分のライントレースプログラムを作成した。光センサーが黒部分の判定をしている時にカウントをして、0.4秒以上続いたら交差点として判別する。黒部分以外の時はClearTimer(0)でFastTimer(0)を初期化する。ここで、指定秒数を変数としてl_timeをグローバル変数として定義する。ライントレース開始時にClearTimer(1)でFastTimer(1)を初期化する。[#s1bbda60]上記のライントレース用プログラム内の交差点判別部分について詳しく説明する。}交差点は黒部分が長く続いた時に交差点として判別するようにした。そこでタイマーを使い黒部分以外の時は以下の関数でタイマーを初期化するようにした。交差点と判別したことが分かるように、判別したら音を鳴らすようにした。ClearTimer(0);タイマーがCROSS_TIMEより長い時間が経過した時に交差点として判別する。CROSS_TIMEは40とする。if(FastTimer(0)>CROSS_TIME)しかし、上記のプログラムではカーブを交差点として誤判別してしまう事があるので、それを防ぐためにタイマーをもう一つ追加して次の指定秒数をカウントしなければ交差点と判別しないようにした。if(FastTimer(0)>CROSS_TIME&&FastTimer(1)>l_time)l_timeを上記の指定秒数として、メインプログラムで指定する。[#a7ef2032]C,Dに置いたコップを正確に取るために、ラインを使い機体の姿勢をまっすぐにするプログラムを作成しました。光センサーが境界部分の判定をしている時にカウントをして、タイマーがBALANCE_TIME以上になったら機体の姿勢をまっすぐとして判別する。境界部分以外の時はClearTimer(0)でFastTimer(0)を初期化する。ライントレースをする時間を指定しなければ、姿勢がまっすぐにならない場合ライントレースをし続けてしまい、C,D地点に置いてあるコップをとることが出来なくなってしまうので追加しました。姿勢制御プログラム開始時にClearTimer(1)でFastTimer(1)を初期化する。[#g5f4ea3c]#ref(2016a/Member/kurokouchi/Mission3/01.gif,nolink,left,around);姿勢制御プログラムは、交差点判別プログラムを応用して作成しました。交差点判別プログラムとの違いは、黒部分の判定ではなく境界部分の判定であることです。ラインの長さは限られているので、一定時間が経過しても姿勢がまっすぐにならなければ、一度処理を止めて後退してからまた姿勢制御プログラムを開始するようにしました。このプログラムにより、C,D地点にますっぐ侵入することが出来るようになりました。[#i9445880]上記の姿勢制御プログラム内の姿勢判別部分について詳しく説明する。}このプログラムでは、境界部分が長く続いた時に機体がますっぐであると判別するようにした。そこでタイマーを使い境界部分以外の時は以下の関数でタイマーを初期化するようにした。機体がますっぐであると判別したことが分かるように、判別したら音を鳴らすようにした。ClearTimer(0);タイマーがBALANCE_TIME(0.4秒)より長い時間が経過した時に機体がますっぐであると判別する。if(FastTimer(0)>BALANCE_TIME)また、機体が一定時間(2秒)経過してもまっすぐにならない場合、一度後退してから姿勢制御プログラムを再開する。//姿勢がまっすぐと判別された場合は後退しない。[#o0a89cab]今回の課題で最も重要であるコップの取得プログラムです。[#cd850069]コップを二つのアームの間に挟んでからアームを上げることによってコップを持ち上げて機体の手前に置くことが出来ます。同じ動作で最大8つまでのコップを重ねることが出来ます。光センサーを使いコップを認識したら前進を停止します。コップを二つのアームの間に入れなくてはいけないので、上記の姿勢制御プログラムが重要です。[#mabbd401]C地点のコップを取得後、左回転し右境界部分で姿勢制御を開始する。[#y048567e]D地点のコップを取得後、後退をし交差点を超えてから左回転し右境界部分で姿勢制御を開始する。#ref(2016a/Member/kurokouchi/Mission3/04.gif,nolink,left,around);赤い点:光センサー#clearまた右回転ではなく左回転をする理由は、左側にはアームだけしかストッパーがなくコップが転倒する可能性が上がるたので、左回転にした。}光センサーで判別して回転するので、電池の消費による回転不足をなくすことができた。[#c03fa70a]設置場所の輪の中へコップを置くために、最後の交差点を判別したら以下の処理を実行する。姿勢を戻さずにそのまま前進する。2:前進停止後、アームを下して左側のストッパーをなくす。3:右回転させ、コップを外に出す。4:後進させ、コップが機体に触れないようにする。