1

I'm reading infrared Sharp distance sensors:

http://www.robofun.ro/senzori/infrarosu/senzor_sharp_%20GP2D120XJ00F

With the reading I'm commanding a servo to direct the robot along a wall, a pretty simple map and write code.

The problem I'm having is that the sensor readings are way off, not behaving liniar... I know other people use these sensors just fine and I know they're wired just fine.

My question is how can I eliminate any oscillations sent to the servo? I'm getting 1 to 3 degrees of oscillations with the robot standing still at a fixed distance from the wall.

Below you have my code:

#include <Servo.h>

Servo myservo;
int val; 
int val1;

int IRpin = A7;
 // analog pin for reading the IR sensor
void setup() {
 myservo.attach(3);

 Serial.begin(9600); // start the serial port
}
void loop() {
 float volts = analogRead(IRpin);

delay(100); 
val1 = map(volts, 230,500, 0 ,100);
 val = map(val1, 0, 100, 100, 80);
 myservo.write(val);
 Serial.println(val);
 }

Please note that double-mapping is necessary because, otherwise variations would be MUCH worse.

Thanks to anyone who will take the time to answer this and help me out...

LE: I've already considered hysteresis, but I want something that will not lose time with unnecessary readings and calculations.

4

1 に答える 1

4

これは古典的な制御問題です。PIDコントローラーを調べることをお勧めします。

編集:申し訳ありませんが、質問を読み違えました。目的の方向があると思い、赤外線距離センサーを使用して現在の方向を読み取っていました。上記は背景として残しますが、これには当てはまりません。

新しい答え:

センサーの変動は完全に正常です。それらを説明する必要があります。この場合、単純な移動平均フィルターを使用します。(任意の時点での壁からの距離は、最後の X センサーの読み取り値の平均です)。x を大きくしすぎると遅延が発生し、小さすぎると同じノイズの多い出力になります。

LE ノートへの回答: ノイズの多い入力を扱う場合、何らかの形のヒステリシスを避けることはできないと思います。計算に時間を浪費したくないというパフォーマンスの問題がまだ実際にありますか? 事前に最適化しないでください。

編集2:上記は入力信号(現在の距離)を滑らかにします。これをどのように出力信号 (サーボ セットポイント) に変換して、目的の距離を達成していますか (壁から一定の距離を保ちたいと仮定します)。これは、PID コントローラーが役立つ場合があります。

于 2012-05-06T00:27:05.877 に答える