今回の課題は、紙に書かれた黒い線の上をなぞって進み、途中置かれている紙コップをつかみ指定の場所まで移動させゴールするという課題である。†このコースを使ってライントレースする。3つの経路のうち私は第1コースとなった。D地点へ(ゴール)また、コースを作りで線を黒く塗るときに真ん中が一番黒くなるようにした。今回は、前回の課題1のときより動く距離が長いためできるだけ小さくする方がよいと考えた。動作に問題がなければ細かいところでしっかり固定したりはしないようにした。最初センサーの値の計測をしたときに少し角度がつくようにして計測したためそのままセンサーは地面に対して少し角度がつくように取り付けた。試しに地面に垂直に取り付けてみたが、値が角度をつけたときと大きく変わって低くなり、変化する幅も小さくなったため難しそうだと判断した。紙コップを取るには紙コップを取れる位置まで移動しないといけないが、その調整が大変そうだったので紙コップの方を移動させることにした。†コースの色の大体の値は一番黒いところが30%、その次に黒いところが40%、白いところが70%である。基本的に40%のところをまっすぐ走るようにし、黒いところ、白いところに行くと右側を走っているか、左側を走っているかによるが、それに応じて右に曲がる、左に曲がるプログラムにしいている。今回作ったライントレースのプログラムはカウンター方式で、一番黒いところ、次に黒いところ、白いところの3つ、あるいはそれぞれの場所の値の間にもう1ヶ所増やし5ヶ所を判別するプログラムを作り、それぞれの場所でする行動(前進、右に曲がる、左に大きく曲がる、など...)に付け加えてカウンターを増やすプログラムとカウンターをリセットするプログラムを追加する。そのカウンターに上限の値を設定してき、値を超えるとプログラムを終了するようにしている。このプログラムは交差点だけ反応してほしいのに緩やかなカーブでも反応してしまうときなどは、上限の値を変えるもしくは、モーターのパワーを小さくし遅くすることで誤反応をなくすことができる。今からの説明は右側を走っている場合である。交差点に行くと一番黒い線にぶつかる。プログラムによって右のタイヤを支点として右に曲がるが、しばらくは黒いところが続くのでカウンターがたまっていく。すると、カウンターが設定していた値を超え実行していたプログラムが終了し次のプログラムに移行する。次のプログラムは、交差点から抜け出すもので光センサーが白いところを読み取るまで左タイヤを支点に左に曲がるというものである。白いところまで行くとカウンターをカウントし始める。この時のカウンターの設定値を小さくしておくことで一瞬でも読み取るとプログラムが終わるようになっている。交差点を抜けたら、最初に説明したプログラムを実行する。すると、黒いところまで左に曲がりライントレースを再開する。この時、プログラムのカウンターは白いところにあるので0となりプログラムが途中で終了することはない。†カーブに入ってくる直進用のプログラムも少し変えている。緩やかなところでは、ライントレースを続ける。カーブがきつくなると白いところから抜け出すのが遅くなる。カウンターを白いところでカウントするようにしておき値を調整すると、図のようなところでカウンターが設定した値となり、プログラムが終了する。カーブ用のプログラムが実行される。このプログラムは直進用とほとんど同じで、違うのは白い所に出たときに起動する左に曲がるプログラムを左のタイヤを止めて曲げるのではなく、左は逆回転して曲がるものにする。すると急なカーブを曲がることができる。このカーブのプログラムにもカウンターをつけており、2番目に黒いところでカウンターがカウントされるようにしておく。することで、直進になった時にカウントが設定した値になり、うろグラムが終了するようになる。(このとき、誤作動しないように設定する値は少し大きめにしておく。関数の引数であるx,yに数値を入れるとその分だけスピードを遅くすることができるようにしてある。//音が鳴る}センサーが指定された値を読み取るまで動くようにすることで黒いラインまで、また、白いラインまで動くようにした。動作が終わると音が鳴る。(この音は動作の確認のものである。//音が鳴る}カーブのプログラムで、行う動作に付け加えてカウンターを増やすものと、リセットするプログラムを付け加えている。この付け加えている場所は、なるべく少なくしており、すべてにつけるともっと正確になるかもしれないが、塗っている線の色の濃さがすべて均一ではないので、センサーの読み取る値が変わってしまうことを考えた。することで、プログラムを作る時も簡単に考えることができた。実際に動かしてみて、問題がなかったものはそのままつかい、うまくいかなかったものはプログラムを付け加えたり、速さを変えたりした。//音が鳴る}左側を直進するプログラムで、4つつくった。これらの違いとしては、黒い部分にいったときに行われる右に曲がるプログラムが、片方のタイヤを回すものと、両方回すものとで違いさらに、カウンターを増やすものとリセットするものでもわけており4つとなった。これらは違う場所で使われるのでその場所で調整し設定したカウンターの上限値となっている。//音が鳴る}右側を直進するプログラムで、基本左側と同じ理由で分けられている。1と4はカウンターの上限値が違うだけである。これは、引数を一つ増やして、1つにまとめることもできたが、作成中は気が付かなかった。//音が鳴る}これは、ずっと左に回転し、白い部分の値を読み取るとカウンターを増やし上限値になると止まるプログラムである。これは、左への回転の仕方が違うものと、カウンターの上限値が違うものでわけてあり、これも、引数を使うと1つ減らすことができた。カウンターを50にしているのは、白と黒の境界線上ではなく白い値を読み取るところで止まってほしかったからである。カウンターの上限値を変えたのは、50にしても、次のプログラムに安定して行けない箇所があったからである。速度は遅めにして値をしっかり読めるようにしている。//音が鳴る}これは、白くなるまでずっと右回転するバージョンである。これは、黒い部分での回転の違いで分けてある。//音が鳴る}上のプログラムを黒くなるまで右にしたものである。これも、白い部分での回転方法の違いで分けている。//音が鳴る}同じように、黒くなるまで左に行くプログラムである。Off(OUT_C);}紙コップをつかむのと放すプログラムである。時間で調整したため電池の消耗で誤差が大きく出てしまった。ここは、角度指定の方が向いていた。今回プログラムを作成するのに、ベースとしてはカウンターを使う方法で作成したが、途中でうまくいかないときに改良したサブルーチンをどんどん追加していっていると数がとても多くなった。引数を入力するだけでうまくいくようなサブルーチンを1つ作れたらよかったが、いいアイデアが思い浮かばず、また、時間があまりなかった。すると、もうできているプログラムで進めるしかなくなってしまった。うまくいかないところは直せばしっかり動くので簡単なプログラムではあったと思う。最初は枠の内側の右寄りに置いてスタートする。↑枠からでた後のトレースは右側を通っていきBのまがり角を認識するとプログラムが終わり、もとに戻るプログラムが始まり、コースに戻るとまたトレースを再開する。r_b();↑カーブは外側のラインをトレースしたかったので1つ目のカーブを曲がったあとに左側に車線変更している。(車線変更は反対側の白いところまで行くプログラムを使っている。)この左に曲がるプログラムは40%のところをまっすぐ走っているときにカウンターが増えるようにしている。Eの角を曲がるのにサブルーチンを何個も使わないといけなかったためわかりやすくするためにwhile文で一定の時間はライントレースさせ続けるようにした。//コースに戻る↑これは、紙コップを回収するプログラムで、機体を回転させ棒で紙コップをよせてから回収している。安定して紙コップを取るために期待を停止させてから回収している。r_straight4(0,0);↑途中のwhile文はそこの部分の色の塗り方の問題でうまく反応しなかったため一定の時間トレースするようにしている。カーブをトレースするプログラムがうまくいかなかったので直進用に作ったプログラムを入れてみるとうまくいったのでそのまま使っている。go_left2(0,0);Wait(1800);↑紙コップを放すプログラム。棒を取り付けた影響で紙コップを置いた後決まった方にしか回ることができなかったため、余分な移動が増えてしまった。//ゴール}↑最後に枠の中にゴールするまでのプログラム。ここではライントレースをしてゴールするだけなのでこれまでと違ったところはなかったが、1ヶ所安定しないところがあったので速度を遅くした。最後に枠の中に入れるところは時間で動かした。本番では、電池の消耗でプログラムがうまく動かず最初はダメだったが2回目ではうまく動いてくれた。電池が消耗しても速さを変えることで完璧にする予定だったが直前でうまく調整できなかったのが残念だった。今回の課題ではカーブを曲がるところが難しく自分たちで作ったコースの色の塗り方が雑だったためカーブを上手く曲がれないことがあり苦戦した。丁寧にコースを作るべきだったと後悔した。トレースのプログラム自体を途中で変えたので無駄な作業時間が多くとても時間がかかった。作業をしているときはそれほど時間を感じず楽しくできたし、達成感も大きかった。次の課題は期間が短くまた忙しい時期ではあるけれど、最後までしっかりやりきりたいと思う。