- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#edaaf49e]
#contents
*課題3 懐中電灯に向かってブロックを投げるロボットの製作 [#bf1993b2]
以下の動きをするロボットとプログラムを作成した。
-全方向から懐中電灯の方向を探し出し、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
-懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
-懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。~
1.全方向から懐中電灯の方向を探し出し、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。~
2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。~
3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。~
※ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用してもよい。
**ロボット製作 [#h46cb510]
#ref(2008a/A1/課題3左/ギヤ.jpg,70%,ギア);
#ref(2008a/A1/課題3左/02.jpg,70%,ギア);
ディフェレンシャル・ギアとギア~
今回はタイヤを回すためのモータを1つしか使うことができないので、このギアを使った。~
1つのモータで2つのタイヤを動かしているので、曲がれるようにするためにストッパーをタイヤにつけることで、曲がれるようにした。
モータの回転を変えると片方のストッパーがタイヤにひっかかり、もう片方のタイヤだけを動かすことが可能になった。
また、左右のタイヤにつけるギアの数を変え、動くようにした。
#ref(2008a/A1/課題3左/全体3.jpg,70%,全体);
全体を撮った写真~
#ref(2008a/A1/課題3左/横3.jpg,70%,横);
前輪が自由に動く三輪タイプにすることで、スムーズな動きをできるようにした。
#ref(2008a/A1/課題3左/01.jpg,70%,横);
横からの写真~
バランスを考えた形にした。
#ref(2008a/A1/課題3左/前3.jpg,70%,前);
前からの写真~
センサを車体の隙間に入れることでスッキリとした形になった。
#ref(2008a/A1/課題3左/投げ3.jpg,70%,投げ);
#ref(2008a/A1/課題3左/投げ2.jpg,70%,投げ);
投げる部分の写真~
ストッパーをつけてホイールが地面につかないようにした。
**プログラム作成 [#je38350b]
#define THRESHOLD 40
**プログラム[#vbc8b6d4]
部屋の明るさが25〜35だったため電灯との境の値を40とした。
***1.全方向から懐中電灯の方向を探し出し、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。 [#y00c984b]
#define THRESHOLD 40//光の強さを定義
sub throw()//ホイールを投げる動作
{
OnFwd(OUT_C);
Wait(100);
Off(OUT_C);
}
task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット
while(true)
{
while((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //光センサー1,3が共に光を感知しなかったとき
if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //光センサー1、3が共に光を感知しないとき
{
OnFwd(OUT_A);//右回り
Wait(100);
Off(OUT_A);
OnFwd(OUT_A);//左回り
}
while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知したが、3 は感知しなっかったとき
if else((SENSOR_1 >= THRESHOLD) && (SENSOR_3 < THRESHOLD))//光センサー1は光を感知するが、3は感知しないとき
{
OnFwd(OUT_A);//右回り
Wait(100);
Off(OUT_A);
}
while((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知したが、1は感知しなかったとき
OnFwd(OUT_A);//左回り
}
if else((SENSOR_1 < THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー3は光を感知するが、1は感知しないとき
{
OnRev(OUT_A);//左回り
Wait(30);
Off(OUT_A);
OnRev(OUT_A);//右回り
}
while((SENSOR_1 >= THRESHOLD) && (SENSOR_3 >= THRESHOLD))//光センサー1、3共に光を感知したとき
if else((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD))//光センサー1、3共に光を感知するとき
{
throw();//ホイールを投げる
Off(OUT_A);
throw();//ホイールを投げる
}
}
}
(作成者:ツチヤ)
#define THRESHOLD 40
sub throw()//ホイールを投げる動作
***2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。 [#r04b6cd9]
電灯に近づくと光は強くなるので、「#define THRESHOLD2 45」を使い、電灯が止まったということを認識させた。
#define THRESHOLD1 40//光の強さを定義
#define THRESHOLD2 45//光の強さを定義
sub throw()//ホイールを投げる動作
{
OnFwd(OUT_C);
Wait(100);
Off(OUT_C);
}
task main()
task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
SetSensor(SENSOR_3,SENSOR_LIGHT);//
while (true)
{
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //光センサー1、3共に光を感知していない場合。
{
OnFwd(OUT_B); //右回りに進む。
Wait(30);
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット
while(true)
{
while((SENSOR_1 < THRESHOLD1) && (SENSOR_3 < THRESHOLD1)) //光センサー1、3が共に光を感知しないとき
{
OnFwd(OUT_A);//左回り
Wait(100);
Off(OUT_A);
}
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //光センサ−1のみ光を感知した場合。
while((SENSOR_1 >= THRESHOLD1) && (SENSOR_3 < THRESHOLD1))//光センサー1は光を感知するが、3は感知しないとき
{
OnFwd(OUT_B); //右回りに進む。
Wait(30);
OnFwd(OUT_A);//左回り
Wait(100);
Off(OUT_A);
}
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //光センサー3のみ光を感知した場合。
{
OnRev(OUT_B); //左回りに進む。
Wait(6);
}
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //光センサー1、3共に光を感知した場合。
{
throw();
}
}
]
while((SENSOR_1 < THRESHOLD1) && (SENSOR_3 >= THRESHOLD1))//光センサー3は光を感知するが、1は感知しないとき
{
OnRev(OUT_A);//右回り
Wait(30);
Off(OUT_A);
}
while((THRESHOLD1 <= SENSOR_1 <= THRESHOLD2) && (THRESHOLD1 <= SENSOR_3 <= THRESHOLD2))//光センサー1、3共に光を感知するとき
{
OnFwd(OUT_A);
Wait(10);
OnRev(OUT_A);
Wait(10);
Off(OUT_A);
}
while((SENSOR_1 >= THRESHOLD2) && (SENSOR_3 >= THRESHOLD2))//光センサー1、3共に光を強く感知するとき
{
throw();//ホイールを投げる
}
}
}
#define THRESHOLD 40
sub throw()//ホイールを投げる動作
(作成者:キリハラ)
***3.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。 [#p5afae6b]
電灯から50cmのところで光の強さを計測すると48だった。したがって、「#define THRESHOLD2 48」を使った。
#define THRESHOLD1 40//光の強さを定義
#define THRESHOLD2 48//光の強さを定義
sub throw()//ホイールを投げる動作
{
OnFwd(OUT_C);
Wait(100);
Off(OUT_C);
}
task main()
task main ()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
SetSensor(SENSOR_3,SENSOR_LIGHT);//
while (true)
{
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //光センサー1、3共に光を感知していない場合。
{
OnFwd(OUT_B); //右回りに進む。
Wait(30);
SetSensor(SENSOR_1,SENSOR_LIGHT);//光センサーを1にセット
SetSensor(SENSOR_3,SENSOR_LIGHT);//光センサーを3にセット
while(true)
{
while((SENSOR_1 < THRESHOLD1) && (SENSOR_3 < THRESHOLD1)) //光センサー1、3が共に光を感知しないとき
{
OnFwd(OUT_A);//左回り
Wait(100);
Off(OUT_A);
}
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 < THRESHOLD)) //光センサ−1のみ光を感知した場合。
while((SENSOR_1 >= THRESHOLD1) && (SENSOR_3 < THRESHOLD1))//光センサー1は光を感知するが、3は感知しないとき
{
OnFwd(OUT_B); //右回りに進む。
Wait(30);
OnFwd(OUT_A);//左回り
Wait(100);
Off(OUT_A);
}
if((SENSOR_1 < THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //光センサー3のみ光を感知した場合。
{
OnRev(OUT_B); //左回りに進む。
Wait(6);
}
if((SENSOR_1 > THRESHOLD)&&(SENSOR_3 > THRESHOLD)) //光センサー1、3共に光を感知した場合。
{
throw();
}
}
]
while((SENSOR_1 < THRESHOLD1) && (SENSOR_3 >= THRESHOLD1))//光センサー3は光を感知するが、1は感知しないとき
{
OnRev(OUT_A);//右回り
Wait(30);
Off(OUT_A);
}
while((THRESHOLD1 <= SENSOR_1 <= THRESHOLD2) && (THRESHOLD1 <= SENSOR_3 <= THRESHOLD2))//光センサー1、3共に光を感知するとき
{
OnFwd(OUT_A);
Wait(10);
OnRev(OUT_A);
Wait(10);
Off(OUT_A);
}
while((SENSOR_1 >= THRESHOLD2) && (SENSOR_3 >= THRESHOLD2))//光センサー1、3共に光を48以上感知するとき
{
throw();//ホイールを投げる
}
}
}
(作成者:ツチヤ)
**苦労・工夫した点 [#q5c103dd]
-モータと本体をつなぐ線の接触が悪くて大変だった。ブロックをうまく使い何とか動いた。
-はじめはディフェレンシャル・ギアを使ったロボットの仕組みを理解するのが難しかったが、何度もロボットやプログラムを改良し使いこなすことができた。
-光センサーを二つ付けたのを活かし光をより精度良く探せるようにした。
-補助輪をつけたことで車体のバランスもとれ、動きがスムーズになった。
**感想 [#y8b23b5c]
-今回は時間が少なくてとても大変だった。
-最初モーターを二つしか使えないという条件は難しすぎると思っていたが、色々と工夫をして何とかなったと思う。
-ロボコンでは今まで学んだ事を活かしてロボットを作っていきたい。
**未解決問題 [#jc651ea9]
-今回のプログラムでもそれなりの動きをしたが、光源の方向を探す場合に、絶対的な明るさを基準にするのではなく各方向の明るさを相対的に比べるようなプログラムに改良すればもっと正確な動きをさせることができたかもしれない。~
-光センサを駆動輪側につけて、前後反対にしてみる。
**コメントをお願いします [#n08a6ee6]
- 光源の方向を探す場合には、絶対的な明るさを基準にするのではなくて各方向の明るさを相対的に比べるようなプログラムにしましょう。 -- [[松本]] &new{2008-07-08 (火) 08:49:53};
- 光センサを駆動輪側につけて、前後反対にしてもよいかもしれません。 -- [[松本]] &new{2008-07-08 (火) 08:51:24};
#comment
課題1のプログラムでは、光の強さが最大でなくともある程度以上強い方向を初めて向いたときにも投げてしまうおそれがあります。~
変数を使ったバージョンも作ってみてください。他のページも参考になります。 F.I.