- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*課題 黒い線をトレースするプログラム [#y4bccc89]
**ロボットの構造の工夫 [#ufd8c21e]
このロボットの雛形は、マインドストームの四輪駆動型ロボットです。
このロボットの雛形は、マインドストームの四輪駆動型ロボットです
#ref(2009a/A9/課題2右/200906191624000.jpg)
・黒線を太くすることで、センサーの感度を実質的に引き上げました。
・また、前輪と後輪を入れ替えることで機動力を得ます。
・両端にある光センサーの幅を狭くすることで、左右にぶれることを少なくしました。
#ref(2009a/A9/課題2右/200906191624001.jpg)
#ref(2009a/A9/課題2右/200906191625000.jpg)
これが我が『ザ宅配』が行く道です。
**ロボットの基本的なプログラム [#t078adcd]
・光センサーを利用してライントレースのプログラムを書く。
・タッチセンサーを利用した牛乳パックの回避。牛乳パックを運ぶためのプログラムを作る。
・完成。
**それぞれのプログラム [#ob93befe]
***これがハるのプログラムです。 [#q46756d2]
#define THRESHOLD 40
#define RUN_TIME 1800
task main() {
まずは基本のライントレースを。
task main() {
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
ClearTimer(0);
まず、ちゃんと三周で止まるように、起動時間を三分に設定しました。
while(Timer(0)<=RUN_TIME){
while(Timer(0)<=RUN_TIME){
if(SENSOR_1>THRESHOLD){
if(SENSOR_3>THRESHOLD){
OnFwd(OUT_A+OUT_C);
}
else{
OnFwd(OUT_A);
Off(OUT_C);
}
}
else{
if(SENSOR_3>THRESHOLD){
OnFwd(OUT_C);
Off(OUT_A);
}
}
ここまでは、ライントレースのプログラム。
if (SENSOR_2 == 1)
センサーが反応すると・・
if (SENSOR_2 == 1)
{
OnRev(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C); いったん後退。
Wait(50);
Off(OUT_A+OUT_C);
OnRev(OUT_B);
OnRev(OUT_B); アームを下します。
Wait(50);
Off(OUT_B);
OnFwd(OUT_A+OUT_C);
Wait(300);
OnFwd(OUT_A+OUT_C); 定位置まで進んだら・・
Wait(220);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);
OnFwd(OUT_A); 180度旋回し、
OnRev(OUT_C);
Wait(250);
Wait(150);
Off(OUT_A+OUT_C);
OnFwd(OUT_B);
OnFwd(OUT_B); アームを揚げ、牛乳パックをパージ。
Wait(50);
Off(OUT_B);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(250);
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(100);
Off(OUT_A+OUT_C); 180度のある位置まで旋回したら、
OnRev(OUT_A); ラインをサーチするためにその場で旋回。
OnFwd(OUT_C);
until ((SENSOR_1 <= THRESHOLD) || (SENSOR_3 <= THRESHOLD));
Off(OUT_A+OUT_C);
} } Off(OUT_A+OUT_C);
} }
}
最後に、牛乳パックを感知>ホールド>進んでから反転>パージして復帰
このプログラムを付け加え、完了です。
***これがカヲルのプログラムです。 [#q848c14c]
#define THRESHOLD 40
void turn_left() 左に向きを変えることを定義する
{
***これがかおりんのプログラムです。 [#q848c14c]
牛乳パックを避けて線に沿って走るプログラム
#define THRESHOLD 40
void turn_left() 左に曲がることを定義する
{
OnRev(OUT_A);
OnFwd(OUT_C);
Wait(100);
}
void turn_right() 右に向きを変えることを定義する
{
}
void turn_right() 右に曲がることを定義する
{
OnRev(OUT_C);
OnFwd(OUT_A);
Wait(95);
}
task main()
{
Wait(90);
}
int tomaru; タッチセンサーに当たったら止まるこ
とを定義する
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
while(true){
if(SENSOR_1>THRESHOLD){ 左の光センサーが白紙上
if(SENSOR_3>THRESHOLD){ かつ右の光センサーが白線上
OnFwd(OUT_A+OUT_C); 直進する
tomaru=0;
while(tomaru<3){ 3回タッチセンサーが反応したら止まるよ
うに定義します
if(SENSOR_1>THRESHOLD){ 左の光センサーが白紙上
if(SENSOR_3>THRESHOLD){ 右の光センサーが白紙上の時
OnFwd(OUT_A+OUT_C); 直進
}
else{ かつ右の光センサーが黒線上
OnFwd(OUT_A); 右へ曲がる
else{ 右の光センサーが黒線上の時
OnFwd(OUT_A); 右に曲がる
Off(OUT_C);
}
}
else{ 左の光センサーが黒戦上
if(SENSOR_3>THRESHOLD){ かつ右の光センサーが白線上
OnFwd(OUT_C); 左へ曲がる
else{ 左の光センサーが黒線上
if(SENSOR_3>THRESHOLD){ 右の光センサーが白線上の時
OnFwd(OUT_C); 左に曲がる
Off(OUT_A);
}
}
if (SENSOR_2 == 1) タッチセンサーが反応する
if (SENSOR_2 == 1) タッチセンサーが反応する時
{
OnRev(OUT_A+OUT_C); バックする
OnRev(OUT_A+OUT_C); バックする
Wait(50);
turn_left(); 牛乳パックを避けるため左へ曲がる
OnFwd(OUT_A); 直進する
turn_left(); 牛乳パックを避けるため左に曲がる
OnFwd(OUT_A); 直進する
Wait(130);
turn_right(); 牛乳パックを避けるため右へ曲がる
OnFwd(OUT_C); 直進する
Wait(280);
turn_right(); 牛乳パックを避けるため右へ曲がる
OnFwd(OUT_C); 直進する
turn_right(); 牛乳パックを避けるため右に曲がる
OnFwd(OUT_C); 直進する
Wait(320);
turn_right(); 牛乳パックを避けるため右に曲がる
OnFwd(OUT_C); 直進する
Wait(130);
turn_left(); 左へ曲がる
OnRev(OUT_A+OUT_C); バックする
Wait(90);
turn_left(); 牛乳パックを避けるため左に曲がる
OnRev(OUT_A+OUT_C); 線に戻るようにするためバックする
Wait(80);
tomaru=tomaru+1;
}
}
}
Off(OUT_A+OUT_C);
}
**感想 [#h9aa55d6]
***ハる [#od7fa6db]
家に持って帰ったのは今回が初めてでした。牛乳パックをホールドするアームの設計は、かなり考えた末に現在のような形になりました。
また、集会を記録するプログラミングは、変数を記録するプログラムがまだわからなかったので断念し、タイマーを利用することになりました。
また、周回を記録するプログラミングは、変数を記録するプログラムがまだわからなかったので断念し、タイマーを利用することになりました。
今回、NQCを自分のパソコンでも使えるようになったので、今後の課題はもっと楽になると思います。
***カヲル [#yd028789]
発表中の電源落ちにより、大変不本意な結果になってしまいました。電池を交換することによる挙動の変化を防ぐためにあえて電池を交換しなかったのですが、よりによってテスト中に落ちてしまいました。
次回からは、常に電圧を一定に保てるように努力しようと思います。
また、高電圧タイプのプログラムに更新してありますのでよろしくお願いします。
***かおりん [#yd028789]
今回は本当に苦労しました。工夫したところは上記にもありますが、光センサーの幅を狭くしてどの角度から牛乳パックに当たっても正面で当たるようにしたところです。プログラミングに関しては牛乳パックを避けるにあたって、移動距離を最小限に収めたところです。プログラミングの最後のバックする動作は交差後の黒線がすぐに曲がっているため、バックして黒線上に光センサーがくるようにしたところです。
はじめは、1周が60秒だったので、タイマーをセットして、60秒後に止まるようにしたのですが、多少の誤差が進むと同時に生じてきてしまうのでタッチセンサーのふれた回数を使ってロボットを止まるように工夫しました。
- ホームページ完成しました。見てください -- [[カヲル]] &new{2009-06-19 (金) 17:38:45};
- 電池切れにより前のような挙動ができなくなりましたが、電力MAXの時用のプログラムに調整しました。 完成したので見てください。 -- [[ハる]] &new{2009-06-26 (金) 17:25:35};
- 名前をカヲルから元のかおりんに戻します -- [[かおりん]] &new{2009-06-26 (金) 17:37:51};
- プログラムの説明が詳しくて良いです(ただ、レイアウトが崩れてしまっているので直してください)。 -- [[こさか]] &new{2009-07-02 (木) 22:53:04};
- また、プログラムについて、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- [[こさか]] &new{2009-07-02 (木) 22:53:29};
- シンプルですがポイントを押さえてまとめてあります。あとは、ページの整形を直して、内容を充実させてください -- [[FI]] &new{2009-07-03 (金) 05:57:21};
#comment