- 追加された行はこの色です。
- 削除された行はこの色です。
[[2009a]]へ戻る
目次
#contents
*課題 [#f8f9a8d8]
黒い線上を進むロボットの製作。~
詳細は[[2009a/練習問題]]、課題2の項を参照。
課題2−1のプログラムをdaikiが担当、課題2−2のプログラムを俺が担当
*メンバー [#o372f62e]
-daiki
-俺
*ロボット [#zbea3a80]
**外観 [#jd6c3733]
全体
#ref(2009a/A5/課題2右/robo01.jpg,100%,全体)
-[http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA5%2F%B2%DD%C2%EA%A3%B1%BA%B8 前回使用した機体]の腕を挿げ替えてタッチセンサーを付けただけ
~
#ref(2009a/A5/課題2右/robo02.jpg,100%,腕)
-この鎌のような腕で牛乳パックを捕らえ、引きずっていく
-発想は[http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA10%2F%B2%DD%C2%EA%A3%B2%BA%B8 この班]のものを拝借しました
-違う点は、右の腕に誤って牛乳パックが触れてしまわないよう、腕をひっこめてある点と、コースの関係上タッチセンサー回りがより簡単な構造になっていることです。
-このことで、機体の重心が前に傾き過ぎず、滑らかに走ることができます。
~
#ref(2009a/A5/課題2右/robo03.jpg,150%,タッチセンサー)
-牛乳パックとの当たり判定をするタッチセンサーは、機体の上の方(赤の丸で囲われている部分)についています。これは腕と連動しています。
-牛乳パックが機体の下の方(青い丸で囲われている部分に)や腕に接触すると、タッチセンサーが反応する構造になっています。
*コース [#e97bcc63]
概要図
#ref(2009a/A5/課題2右/rosen.JPG,100%,コース)
-交差点は3つ
-3つの交差点をもつものの中では、最も簡単な形
-簡単な形ですので、機体の揺れなどは殆どなく、タッチセンサーが誤って反応してしまうようなことはありません。そのため、機体も簡単な構造にすることができました。
*プログラム [#y1cf4393]
**daikiのプログラム [#sb789298]
int SYOU;
#define STOP_TIME 1500;//三周するまでの時間
task main()
{ SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
{ SetSensor(SENSOR_2,SENSOR_TOUCH);//タッチセンサー2
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサー1
SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサー3
SYOU = 0;
while (true){
ClearTimer(0);
while (Timer(0)<STOP_TIME){//三周するまで続ける
if(SENSOR_2==0){
if(SENSOR_1>40){
if(SENSOR_3>40){
OnFwd(OUT_A+OUT_C);
} else{
OnFwd(OUT_A);
Off(OUT_C);
}
}else{
OnFwd(OUT_C);
Off(OUT_A);
}
if(SENSOR_1<40){
if(SENSOR_3<40){
OnFwd(OUT_A+OUT_C);
}
}
}
}//センサー1と3で線を挟んで進むプログラム
if(SENSOR_2==1){
if(SYOU==0){
OnRev(OUT_A+OUT_C);
Wait(70);
Wait(70);//パックから遠ざかる
OnFwd(OUT_A);
Wait(70);
OnFwd(OUT_C);
Wait(110);
Wait(110);//パックを避けるため脱線
OnRev(OUT_A);
Wait(70);
OnFwd(OUT_A);
Wait(250);
OnRev(OUT_A);
Wait(70);
OnFwd(OUT_A);
Wait(100);
OnRev(OUT_C);
Wait(85);
Wait(85);//線路に戻る
Off(OUT_A+OUT_C);
}
}//1回目の衝突
if(SYOU==1){
OnRev(OUT_A+OUT_C);
Wait(65);
Wait(65);//パックから遠ざかる
OnFwd(OUT_A);
Wait(80);
OnFwd(OUT_C);
Wait(110);
Wait(110);//パックを避けるため脱線
OnRev(OUT_A);
Wait(75);
OnFwd(OUT_A);
Wait(250);
OnRev(OUT_A);
Wait(80);
OnFwd(OUT_A);
Wait(50);
OnRev(OUT_C);
Wait(85);
Wait(85);//線路に戻る
Off(OUT_A+OUT_C);
}
}//2回目の衝突
if(SYOU==0){
SYOU = 1;
}else{
SYOU = 0;
}
}
}
}
Off(OUT_A+OUT_C);//三周したら停止する
}
~
~
**俺のプログラム [#c0008c96]
[http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA5%2F%B2%DD%C2%EA%A3%B2%B1%A6%2F%A5%D7%A5%ED%A5%B0%A5%E9%A5%E002 俺のプログラム](別ページに飛びます)
//[[2009a/A5/課題1左/プログラム02]]へのリンク
*コメントをどうぞ [#m8eee5ef]
- コースが面白いですね。プログラムは改善の余地ありです。RUN_TIMEはプログラム内で数値が変わるので「変数」である必要がありますが、RUN_TIME_JやRUN_TIME_Fは変わらない数ですから、「定数」(define)の方が適当かと思います。また、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- [[こさか]] &new{2009-07-02 (木) 22:20:37};
- 追記:動画すごくわかりやすいです! -- [[こさか]] &new{2009-07-02 (木) 22:21:08};
- プログラムにいろいろ工夫しているのがよいと思いますが、まだ改善点があります。何よりも、3周したら止まるようにしましょう。できれば、ロボットの説明も増やしましょう。-- [[FI]] &new{2009-07-03 (金) 03:05:12};
- 3周したら止まるというのを判断するのに、秒数を使っていると、モーターの具合やパックの摩擦などの条件で微妙に3周にならないことがあるかもしれません。もっと確実に3周を数える方法がないか考えてみてください! -- [[こさか]] &new{2009-07-10 (金) 12:10:50};
#comment
#ls2(,link,ページ一覧)