ライントレースロボットで、床に描かれたラインを検出するための赤外線センサーを3つ(右、中央、左)持ち、操舵輪の方向を制御する事で右左折するものであろうと推測して回答します。
赤外線センサーは、
・ロボットの中央にラインがある時には、中央のセンサーがラインを検知。
・ロボットがラインから左に外れた時には、右のセンサーがラインを検知。
・ロボットがラインから右に外れた時には、左のセンサーがラインを検知。
というように動作する。(途中で、どのセンサーもラインを検知しない事もありうる)
操舵輪の方向はサーボモーターで制御。駆動輪が回っている(ロボットは動いている)とすれば、
・サーボモータを右に回すと、タイヤが右に曲がってロボットは右方向にカーブする。
・サーボモータを左に回すと、タイヤが左に曲がってロボットは左方向にカーブする。
・サーボモータを中央に回すと、タイヤが真っすぐを向いてロボットは直進する。
(ゆるやかにカーブするか、きつくカーブするかは、タイヤの向き(サーボモーターの向き)次第で変わる)
整理すると、入力は3つの赤外線センサーの検知結果、出力はサーボモータの向き。
そうすると、プログラムは、以下のような感じになると思われます。
# サーボ
Servo myservo;
# 赤外線センサで調べた結果(センサは3個あるので、その検知結果を入れる変数も3つ)
int senseRight;
int senseCenter;
int senseLeft;
void setup() {
#サーボモータの準備
myservo.attach(9);
}
void loop() {
#赤外線センサの出力を取得 (ラインを検知したら1,それ以外は0が出力されると仮定)
senseRight = digitalRead(sensePin_R);
senseCenter = digitalRead(sensePin_C);
senseLeft = digitalRead(sensePin_L);
if (senseCenter=1){ #中央のセンサの下にラインがあるのだから、ロボットはライン上にある。
myservo.write(90); #操舵輪をまっすぐ
} elseif (senseRight=1) { #右のセンサがラインをとらえたのだから、ロボットは左にずれている
myservo.write(45); #操舵輪を右45度に曲げる
} elseif (senseLeft=1) { #左のセンサがラインをとらえたのだから、ロボットは右にずれている
myservo.write(135); #操舵輪を左45度に曲げる
} else { # どのセンサもラインを検知していない場合
# 何もしない
}
delay(200);
}
質問のプログラムにある
「val = analogRead(potpin); 」以降の3行は、ロボットから可変抵抗(ポテンショメータ)に電線が伸びていて、ポテンショメータを変化させることで操舵輪を動かすものだと思われます。
人がロボットを見ながらポテンショメータで操作するのであれば、センサなんて要りませんよね。
滑らかにロボットを走らせるには、ロボットの慣性とかを考えて、操舵輪の操作もスムーズなものにする等の工夫が必要です。
上に書いたプログラムでも動くかもしれませんが、そうとうギクシャクした動きになるだろうと思います(急に45度曲げるなんてことしてますから)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/25 13:38
2019/12/25 23:48
2019/12/26 00:19
2019/12/26 23:47