2005/C1/練習問題4
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*4.光を追うロボット [#v8ee75a7]
&ref(2005/C1/練習問題4/2006_0113画像0035.JPG,50%,がるーだDX);&ref(2005/C1/練習問題4/2006_0113画像0038.JPG,50%);
-センサーがまっすぐ前を向いていると光を感知しにくいため,斜め上をむかせた。
また、小回りが利くように車体をコンパクトにした。
**プログラム1 [#tf0ad3af]
#define straight OnFwd(OUT_A+OUT_C);
#define left OnFwd(OUT_A);OnRev(OUT_C);
#define right OnFwd(OUT_C);OnRev(OUT_A);
#define minous 15
int light_max=0;
int i=0,i_max;
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
for(i=0;i<35;i++){
right //右に1秒旋回して0.5秒止まる動作をする度に、iに1プラスしてiが35になるまで繰り返す。
Wait(10);Off(OUT_C+OUT_A);Wait(5);
if(SENSOR_1>light_max){
light_max=SENSOR_1; //センサー1の値を明るさの最大値にする。
i_max=i; //その時のiの値を最大値にする。
PlaySound(0); //確認のため音を出させる。
}
}
while(SENSOR_1<light_max){left} 明かりのあるところまで左旋回する。
while(true)
{
if((SENSOR_1>=light_max-minous)==(SENSOR_3>=light_max-minous))
{
straight //光が両方のセンサーに当たっていれば、直進。
}
if(SENSOR_1<(light_max-minous))
{
left //右のセンサーに当たる光が弱くなると光が当たるところまで左に回る。
until(SENSOR_1>=(light_max-minous));
}
if(SENSOR_3<(light_max-minous))
{
right //左のセンサーに当たる光が弱くなると光が当たるところまで右に回る。
until(SENSOR_3>=(light_max-minous));
}
}
}
-はじめの方のプログラムは前に作った「1周して1番明るかった所に戻って止まるロボット」のプログラムをそのまま使った。light_maxをそのまま使うと少しでも暗くなると
すぐ左右に動くので、minousの値分引いて少し条件を緩めるとうまくいった。
**プログラム2 [#fa5a3720]
#define straight OnFwd(OUT_A+OUT_C);
#define left OnFwd(OUT_A);OnRev(OUT_C);
#define right OnFwd(OUT_C);OnRev(OUT_A);
#define minous 20
int light_max=0;
int i=0,i_max;
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
for(i=0;i<35;i++){
right
Wait(10);Off(OUT_C+OUT_A);Wait(5);
if(SENSOR_2>light_max){
light_max=SENSOR_2;
i_max=i;
PlaySound(0);
}
}
left
start go_straight;
start turn_right;
start turn_left;
}
task go_straight()
{
while(true)
{
if((SENSOR_1>=light_max-minous)==(SENSOR_3>=light_max-minous))
{
straight
}
}
}
task turn_left()
{
while(true)
{
if(SENSOR_1<(light_max-minous))
{
left
until(SENSOR_1>=(light_max-minous));
}
}
}
task turn_right()
{
while(true)
{
if(SENSOR_3<(light_max-minous))
{
right
until(SENSOR_3>=(light_max-minous));
}
}
}
-プログラム1はうまくいったはずだが、プログラム2は使ってやった記憶もない。ただ、直進、左旋回、右旋回を別のタスクに分けただけでほぼプログラム1と同じです。
コメントどうぞ
#comment
終了行:
*4.光を追うロボット [#v8ee75a7]
&ref(2005/C1/練習問題4/2006_0113画像0035.JPG,50%,がるーだDX);&ref(2005/C1/練習問題4/2006_0113画像0038.JPG,50%);
-センサーがまっすぐ前を向いていると光を感知しにくいため,斜め上をむかせた。
また、小回りが利くように車体をコンパクトにした。
**プログラム1 [#tf0ad3af]
#define straight OnFwd(OUT_A+OUT_C);
#define left OnFwd(OUT_A);OnRev(OUT_C);
#define right OnFwd(OUT_C);OnRev(OUT_A);
#define minous 15
int light_max=0;
int i=0,i_max;
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
for(i=0;i<35;i++){
right //右に1秒旋回して0.5秒止まる動作をする度に、iに1プラスしてiが35になるまで繰り返す。
Wait(10);Off(OUT_C+OUT_A);Wait(5);
if(SENSOR_1>light_max){
light_max=SENSOR_1; //センサー1の値を明るさの最大値にする。
i_max=i; //その時のiの値を最大値にする。
PlaySound(0); //確認のため音を出させる。
}
}
while(SENSOR_1<light_max){left} 明かりのあるところまで左旋回する。
while(true)
{
if((SENSOR_1>=light_max-minous)==(SENSOR_3>=light_max-minous))
{
straight //光が両方のセンサーに当たっていれば、直進。
}
if(SENSOR_1<(light_max-minous))
{
left //右のセンサーに当たる光が弱くなると光が当たるところまで左に回る。
until(SENSOR_1>=(light_max-minous));
}
if(SENSOR_3<(light_max-minous))
{
right //左のセンサーに当たる光が弱くなると光が当たるところまで右に回る。
until(SENSOR_3>=(light_max-minous));
}
}
}
-はじめの方のプログラムは前に作った「1周して1番明るかった所に戻って止まるロボット」のプログラムをそのまま使った。light_maxをそのまま使うと少しでも暗くなると
すぐ左右に動くので、minousの値分引いて少し条件を緩めるとうまくいった。
**プログラム2 [#fa5a3720]
#define straight OnFwd(OUT_A+OUT_C);
#define left OnFwd(OUT_A);OnRev(OUT_C);
#define right OnFwd(OUT_C);OnRev(OUT_A);
#define minous 20
int light_max=0;
int i=0,i_max;
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
for(i=0;i<35;i++){
right
Wait(10);Off(OUT_C+OUT_A);Wait(5);
if(SENSOR_2>light_max){
light_max=SENSOR_2;
i_max=i;
PlaySound(0);
}
}
left
start go_straight;
start turn_right;
start turn_left;
}
task go_straight()
{
while(true)
{
if((SENSOR_1>=light_max-minous)==(SENSOR_3>=light_max-minous))
{
straight
}
}
}
task turn_left()
{
while(true)
{
if(SENSOR_1<(light_max-minous))
{
left
until(SENSOR_1>=(light_max-minous));
}
}
}
task turn_right()
{
while(true)
{
if(SENSOR_3<(light_max-minous))
{
right
until(SENSOR_3>=(light_max-minous));
}
}
}
-プログラム1はうまくいったはずだが、プログラム2は使ってやった記憶もない。ただ、直進、左旋回、右旋回を別のタスクに分けただけでほぼプログラム1と同じです。
コメントどうぞ
#comment
ページ名: