1

我正在阅读红外夏普距离传感器:

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

通过阅读,我正在命令伺服系统将机器人引导到墙壁上,这是一个非常简单的地图并编写代码。

我遇到的问题是传感器读数偏离了方向,没有表现出线性...我知道其他人使用这些传感器很好,我知道它们的接线很好。

我的问题是如何消除发送到伺服的任何振荡?机器人在距离墙壁固定距离处静止不动,我得到 1 到 3 度的振动。

下面你有我的代码:

#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);
 }

请注意,双重映射是必要的,否则变化会更糟。

感谢任何愿意花时间回答这个问题并帮助我的人......

LE:我已经考虑过滞后,但我想要一些不会因不必要的读数和计算而浪费时间的东西。

4

1 回答 1

4

这是一个经典的控制问题。我建议研究 PID 控制器。

编辑:对不起,误读了这个问题。我以为你有一个想要的方向,并且正在使用 IR 距离传感器来读取你当前的方向。我将以上内容作为背景,但不,它不适用于此。

新答案:

传感器波动是完全正常的。你必须考虑到他们。在这种情况下,我会使用一个简单的移动平均线过滤器。(您在任意 1 次与墙壁的距离是您最后一次 X 传感器读数的平均值)。使 x 太大会引入延迟,太小会产生相同的噪声输出。

回应您的 LE 注释:我认为您在处理嘈杂的输入时无法避免某种形式的滞后。您是否真的有性能问题,但又不想在计算上浪费时间?不要预先优化。

编辑2:以上将平滑您的输入信号(当前距离)。您如何将其转换为您的输出信号(伺服设定点)以达到您想要的距离(假设您想与墙壁保持固定距离)?这是 PID 控制器可能提供帮助的地方。

于 2012-05-06T00:27:05.877 回答