13:18:31)追加された行はこの色です。削除された行はこの色です。[#f656a6ff]課題2で作成したコースを使用してC地点,D地点に置かれた紙コップをQ地点の円の中に置き、その数や重ねた個数を競う。[#sab8a077]機体の性能上、紙コップをすべて重ねることができ、最高得点を狙うことが出来ましたがコップが倒れたり置いてある場所がずれてしまうのが原因で失敗する可能性が高かったため、すべての紙コップを重ねるのをあきらめました。紙コップ4つまではほぼ確実に回収できていたので紙コップを4つまで重ね、残り2つは放置する作戦にしました。[#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/06.png,50%,01);アームを上げて回収済み紙コップのストッパーとしての機能もあります。基本的にはアームを上げた状態で移動します。[#yaaaca9a]#ref(2016a/Member/kurokouchi/Mission3/10.png,50%,01);アームを回転させる為のギア部分に余計な力が掛からないように空回りするようにしました。#ref(2016a/Member/kurokouchi/Mission3/11.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に置いたコップを正確に取るために、ラインを使い機体の姿勢をまっすぐにするプログラムを作成しました。C,D地点に置いた紙コップを正確に取るために、ラインを使い機体の姿勢をまっすぐにするプログラムを作成しました。光センサーが境界部分の判定をしている時にカウントをして、タイマーがBALANCE_TIME以上になったら機体の姿勢をまっすぐとして判別する。境界部分以外の時はClearTimer(0)でFastTimer(0)を初期化する。ライントレースをする時間を指定しなければ、姿勢がまっすぐにならない場合ライントレースをし続けてしまい、C,Dに置いてあるコップをとることが出来なくなってしまうので追加しました。姿勢制御プログラム開始時にClearTimer(1)でFastTimer(1)を初期化する。ライントレースをする時間を指定しなければ、姿勢がまっすぐにならない場合ライントレースをし続けてしまい、C,D地点に置いてある紙コップをとることが出来なくなってしまうので追加しました。姿勢制御プログラム開始時にClearTimer(1)でFastTimer(1)を初期化する。[#g5f4ea3c]#ref(2016a/Member/kurokouchi/Mission3/01.gif,nolink,left,around);姿勢制御プログラムは、交差点判別プログラムを応用して作成しました。交差点判別プログラムとの違いは、黒部分の判定ではなく境界部分の判定であることです。ラインの長さは限られているので、一定時間が経過しても姿勢がまっすぐにならなければ、一度処理を止めて後退してからまた姿勢制御プログラムを開始するようにしました。このプログラムにより、C,D地点にますっぐ侵入することが出来るようになりました。[#o0a89cab]今回の課題で最も重要であるコップの取得プログラムです。[#i9445880]上記の姿勢制御プログラム内の姿勢判別部分について詳しく説明する。}このプログラムでは、境界部分が長く続いた時に機体がますっぐであると判別するようにした。そこでタイマーを使い境界部分以外の時は以下の関数でタイマーを初期化するようにした。機体がますっぐであると判別したことが分かるように、判別したら音を鳴らすようにした。ClearTimer(0);タイマーがBALANCE_TIME(0.4秒)より長い時間が経過した時に機体がますっぐであると判別する。if(FastTimer(0)>BALANCE_TIME)また、機体が一定時間(2秒)経過してもまっすぐにならない場合、一度後退してから姿勢制御プログラムを再開する。//姿勢がまっすぐと判別された場合は後退しない。[#o0a89cab]今回の課題で最も重要である紙コップの取得プログラムです。[#cd850069]#ref(2016a/Member/kurokouchi/Mission3/02.gif);コップを二つのアームの間に挟んでからアームを上げることによって紙コップを持ち上げて機体の手前に置くことが出来ます。同じ動作で最大8つまでの紙コップを重ねることが出来ます。[#u348530d]#ref(2016a/Member/kurokouchi/Mission3/05.png,50%,01);光センサーを使い紙コップを認識したら前進を停止します。紙コップを二つのアームの間に入れなくてはいけないので、上記の姿勢制御プログラムが重要です。//光センサーがコップを感知するまで前進する。[#v23d196e]ゴール地点の四角の中に入るために、最後の交差点を判別したら以下の処理を実行する。C地点の紙コップを取得後、左回転し右境界部分で姿勢制御を開始する。[#y048567e]D地点の紙コップを取得後、後退をし交差点を超えてから左回転し右境界部分で姿勢制御を開始する。#ref(2016a/Member/kurokouchi/Mission3/04.gif,nolink,left,around);赤い点:光センサー#clearまた右回転ではなく左回転をする理由は、左側にはアームだけしかストッパーがなく紙コップが転倒する可能性が上がるたので、左回転にした。}光センサーで判別して回転するので、電池の消費による回転不足をなくすことができた。[#c03fa70a]設置場所の輪の中へ紙コップを置くために、最後の交差点を判別したら以下の処理を実行する。姿勢を戻さずにそのまま前進する。2:前進停止後、アームを下して左側のストッパーをなくす。3:右回転させ、紙コップを外に出す。4:後進させ、紙コップが機体に触れないようにする。#ref(2016a/Member/kurokouchi/Mission2/05.png,100%,01)紙コップ認識用光センサーの不具合が原因C地点からA地点までのタイムは1分10秒でした。[#r20a3973]20点中5.2点でした。1回目の挑戦の基本点が0点だったことと他のチームに比べて機体の機構がシンプルすぎたのが理由として考えられます。[#zc5d6188]2回目の挑戦で基本点が30点になったことで、合計点数が35.2点になりロボコン優勝という良い結果で終わることが出来ました。[#af5aefdb]C地点からA地点までのタイムは1分10秒で到達タイムが1分切れなかったことが残念でした。到達率がほぼ10割で、安定性のあるプログラムが書けたことはよかったです。今回の課題では課題1、課題2に比べてロボット本体に工夫することが出来ました。チームメイトと考えて何回か作り直しを行い意見を出し合いながら今回のロボットを完成させることが出来ました。今回の課題から光センサーを使い始めたので一つ一つの動作を時間指定しなくてよくなった部分があり電池の残量などによる動作の不安定さがなくなった分、プログラムが複雑になったと感じました。今回のプログラムは、課題1のマクロや課題2のサブルーチン、ライントレースを応用した姿勢制御など今までに学んできたものの集大成となりました。この授業で一番大変であったのは、スケジュール管理でした。課題3は一人ではできないので、自分だけではなくチームメイトの予定も考慮しながら作業しなくてはいけなく、授業終わりから夜遅くまで残ることが多かったです。少ない時間を有効に使い最後のロボコンでは優勝という良い結果で終わることができとてもよかったです。機体の都合で増やした処理もあったのでロボット本体にもう少し工夫した方が良かったと思いました。次回の課題ではプログラムだけではなくロボットにも工夫したいです。