2007b/A2 課題3 懐中電灯に向かってブロックを投げるロボット
1 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。
2 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。
3 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
但し、モーター、タッチセンサー、光センサーは2個まで使用可。
課題にもあるように、モーターは、二つしか使えない。ブロックを投げるのに一つ使うので、タイヤを起動
させるのに一つしか使えない。ここが今回の課題のキーポイントである。ディファレンシャルギアという
左右のギア比を変え、正負のモーターの回転で、左右のタイヤを動かす方法でそれが可能になる。
またタイヤの逆回転を防ぐ為に、ストッパーがつけられている。
参考をもとに、ロボットを作成した。
しかし、ギアのかみ合いが悪く、変な音が鳴ってしまったのでモーターに接続するギアの部分に
改良を加えた。そして完成したのが、上の図である。
アームは単純な構造で作成した。アームの下にあるのは、初期位置を固定するものである。
また、光センサーも前に単純に置いた。
そして、全体としてはこのようなロボットになった。
しかし、うまく光をキャッチできなかったので、左右の光センさーにしきりをつけることで
うまく動くようになった。
#define THRESHOLD 70 // 光の強さを定義 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); // センサー1は光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); // センサー2は光センサー while ( true ) { if ( ( SENSOR_1 < THRESHOLD ) || ( SENSOR_3 < THRESHOLD ) ) { // 1,3の光のどちらかが弱い場合 OnFwd ( OUT_C ) ; // ロボット回転 Off ( OUT_A ) ; // アームは停止 } else { // 1,3の光がどちらとも強い場合 Off ( OUT_C ) ; // ロボット回転ストップ OnFwd ( OUT_A ) ; // アーム回転 Wait ( 45 ) ; OnRev ( OUT_A ) ; // アーム逆回転 Wait ( 45 ) ; Off ( OUT_A ) ; // アーム停止 } } }
#define THRESHOLD 60 // 光の強さを定義 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while ( true ) { if ( SENSOR_1 < THRESHOLD ) { if ( SENSOR_3 < THRESHOLD ) { // 光センサー1,3がともに弱いとき OnFwd ( OUT_C ) ; // ロボット回転,開始 Wait ( 30 ) ; Off ( OUT_C ) ; // ロボット回転,終了 } else { // 光センサー3が強いとき OnRev ( OUT_C ) ; // 右に回転 Wait ( 30 ) ; Off ( OUT_C ) ; // 回転ストップ } } else { if ( SENSOR_3 < THRESHOLD ) { // 光センサー1が強いとき OnRev ( OUT_C ) ; // 左に回転 Wait ( 30 ) ; Off ( OUT_C ) ; // 回転ストップ } else { // 光センサー1,3が強いとき OnFwd ( OUT_C ) ; // 左に回転 Wait ( 20 ) ; OnRev ( OUT_C ) ; // 右に回転 Wait ( 20 ) ; Off ( OUT_C ) ; // 回転ストップ } } } }
#define THRESHOLD 60 // 光の強さを定義 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); while ( true ) { if ( SENSOR_1 < THRESHOLD ) { if ( SENSOR_3 < THRESHOLD ) { // 光センサー1,3が弱いとき OnFwd ( OUT_C ) ; // 光を探し回転 Wait ( 30 ) ; Off ( OUT_C ) ; // 回転ストップ } else { // 光センサー3が強いとき OnRev ( OUT_C ) ; // 右に回転 Wait ( 30 ) ; Off ( OUT_C ) ; // 回転ストップ } } else { if ( SENSOR_3 < THRESHOLD ) { // 光センサー1が強いとき OnRev ( OUT_C ) ; // 左に回転 Wait ( 30 ) ; Off ( OUT_C ) ; // 回転ストップ } else { OnFwd ( OUT_A ) ; // アーム回転 Wait ( 20 ) ; OnRev ( OUT_A ) ; // アーム逆回転 Wait ( 20 ) ; } } } }
結果的に課題2と課題3のプログラムがよく似ているようになった。
最も苦労したところは、ブロックを投げる構造でいろいろ工夫を凝らしたが結局はシンプルなものが1番よかっ た。 投げる場所にモーターを1つ使うので、タイヤの部分では1つしか使うことができず苦労した。ギヤのところが 上手くいかずスムーズに進むことが困難だった。だが少し変えるだけでスムーズに進むことができるようになっ た。光センサーの反応にも苦労したが、しきりを作ることでうまく反応するようになった。
プログラミングを理解するのに戸惑ってしまい、多くの時間を費やした。前の課題などとは全く違い、 ギアの噛み合わせなどがとても困難だったけど、なんとか完成することができよかった。 次のロボコンのときは効率良くできるように心がけたい。