課題1 ☆タッチセンサー&ライントレースロボ ☆

ロボ

制作者♪

Utsumi
ちぃ

ライントレースをするロボット♪

第一ぷろぐらむ(失敗 >△<,)
==============================

#define THRESHOLD 40
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);/センサー1をライトセンサーと宣言                      
SetSensor(SENSOR_2, SENSOR_LIGHT);/センサー2をライトセンサーと宣言
SetSensor(SENSOR_3, SENSOR_TOUCH);/センサー3をタッチセンサーと宣言  
while (true) {
if (SENSOR_1 < THRESHOLD) {
OnFwd(OUT_A);
Off(OUT_C);/Aを動かしてCを止める
} else {                                                                       
Off(OUT_A);Cを動かしてAを止める
OnFwd(OUT_C);
}{
if (SENSOR_2 < THRESHOLD) { 
OnFwd(OUT_C);/Cを動かしてAを止める
Off(OUT_A);
} else {                      
Off(OUT_C);/Aを動かしてCを止める
OnFwd(OUT_A);    
}
}
}
}

失敗の理由は、マシンの動きが速すぎるからでした。黒線を認識してモーターが動く前に動いてしまうので認識しないまま直進してしまいました。

第二ぷろぐらむ
==============================
#define THRESHOLD 40
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);/センサー1をライトセンサーと宣言
SetSensor(SENSOR_2, SENSOR_LIGHT);/センサー2をライトセンサーと宣言
SetSensor(SENSOR_3, SENSOR_TOUCH);/センサー3をタッチセンサーと宣言  
OnFwd(OUT_A+OUT_C);
while (true) {
if (SENSOR_1 < 40) {
Off(OUT_A);
OnFwd(OUT_C);
}                                                                       
if (SENSOR_2 < 40) { 
OnFwd(OUT_A);
Off(OUT_C);
}
} 
}

上のプログラムからelseを消しより簡単にすることでラインからはみ出る問題を解決しました。

課題2-1 ライントレース中に障害物にあたると反転する

プログラム

==============================
#define THRESHOLD 40
task main ()
{ 
SetSensor(SENSOR_1, SENSOR_LIGHT);/センサー1をライトセンサーと宣言
SetSensor(SENSOR_2, SENSOR_LIGHT);/センサー2をライトセンサーと宣言
SetSensor(SENSOR_3, SENSOR_TOUCH);/センサー3をタッチセンサーと宣言  
OnFwd(OUT_A+OUT_C);
while (true) {
if (SENSOR_3 == 1) {
OnRev(OUT_A+OUT_C) ; Wait(50);/タッチセンサーが押されたら0.5秒後退する 
OnFwd(OUT_A) ; Wait(221);/その後2.21秒右回転      
OnFwd(OUT_C);
} else {
if (SENSOR_1 < 40) {
Off(OUT_A);
OnFwd(OUT_C);/センサー1に黒線が入ると左回転
}                                                                       
if (SENSOR_2 < 40) { 
OnFwd(OUT_A);
Off(OUT_C);/センサー2に黒線が入ると右回転
}
}
}
}

課題2-2 他のロボットに当たると右に避ける

プログラム

==============================
#define THRESHOLD 40
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);/センサー1をライトセンサーと宣言
SetSensor(SENSOR_2, SENSOR_LIGHT);/センサー2をライトセンサーと宣言
SetSensor(SENSOR_3, SENSOR_TOUCH);/センサー3をタッチセンサーと宣言    
OnFwd(OUT_A+OUT_C);
while (true) {
if (SENSOR_3 == 1) {
OnRev(OUT_A+OUT_C) ; Wait(50);0.5秒後退する
Off(OUT_A+OUT_C);
OnRev(OUT_C);
Wait(150);/モーターCを1.5秒逆回転
OnFwd(OUT_A+OUT_C);
Wait(150);/1.5秒進む
Off(OUT_A);
Wait(150);1.5秒左回転させる
OnFwd(OUT_A);
Wait(150);
Off(OUT_A);
Wait(150);
OnFwd(OUT_A);/モーターAを動かし元のコースに戻る
} else {
if (SENSOR_1 < 40) {
Off(OUT_A);
OnFwd(OUT_C);センサー1に黒線が入ると左回転
}                                                                       
if (SENSOR_2 < 40) { 
OnFwd(OUT_A);
Off(OUT_C);センサー2に黒線が入ると右回転
}
}
}
} 

工夫した点

パーツはなるべく少なくしてシンプルにしました。ライトセンサーは一つだと黒線を認識しないことがあったのでを二つ付けました。タッチセンサーとライトセンサーは共にタイヤより前に付けすぐに反応できるようにしました。

右に避ける際、いきなり避けてしまうとセンサー同士で衝突してしまう恐れがあったので、数秒後退するようプログラムしました。

苦労した点

どのようにタッチセンサーとライトセンサーを前に持ってくるかでまずつまずきました。試行錯誤の末どうにか持っては来れましたがいくつか問題も残りました。 小回りを利きやすくするため、タイヤは小さいサイズのものを使ってみましたが、スピードが速くなってしまいセンサーが反応しきれず失敗してしまいました。

ライトセンサーがどうしてもうまく反応してくれなかったのですが、上でも書いたようにelseを消し、センサーを二つにすることでうまくいきうました。反転の時間がなかなかあわず何度も時間調整を繰り返しました。が、うまくいきませんでした。

残っている問題点

タッチセンサーの位置が高くなってしまい低いロボットと当たりずらくなってしまいまいした。まだ改良の余地があります。ロボットの横幅が広いので、動きが大きくなってしまいあまりスムーズに動きません。

右に避けたあとコースによっては戻らずそのまま直進してしまいます。

反省

とても単純なプログラムになってしまったのが反省点です。また、ライトセンサーが一つでもうまくライントレースをしてくれるようなプログラムが作れればよかったです。


添付ファイル: file20060615185446.jpg 264件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-06-15 (木) 19:12:42