为什么我的伺服电机在尝试前进时不会停止旋转?
Why won't my servo motors stop spinning when trying to go forward?
我需要让这个物体跟随机器人,它使用 2 个伺服电机移动,并使用超声波传感器检测物体的位置以及 Arduino 应该告诉伺服系统移动的位置。但是,问题似乎在于,每当伺服电机试图向前或向后移动时,它们只会一直旋转。我已尝试检查是否有松动的电线,但电线似乎没有松动,我已尝试更改我编写代码的方式,但似乎还没有任何效果...
还有一些相关代码(不是全部):
void forward() {
for (pos = 0; pos <= 180; pos++)
{
for (pos2 = 0; pos2 <= 180; pos2++)
{
myServo1.write(pos);
myServo2.write(pos2);
delay(15);
}
}
}
int Distance_thing() {
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(20);
digitalWrite(Trig, LOW);
float Fdistance = pulseIn(Echo, HIGH);
Fdistance= Fdistance / 58;
return (int)Fdistance;
}
void loop() {
rightDistance = Distance_thing();
leftDistance = Distance_thing();
if ((rightDistance > 70) && (leftDistance > 70)) {
stop();
delay(500);
}
else if ((rightDistance >= 20) && (leftDistance >= 20)) {
forward();
delay(500);
}
else if ((rightDistance <= 10) && (leftDistance <= 10)) {
back();
delay(500);
}
else if (rightDistance - 3 > leftDistance) {
left();
delay(500);
}
else if (rightDistance + 3 < leftDistance) {
right();
delay(500);
}
else {
stop();
delay(500);
}
}
paddy 已经指出你的动作需要很长时间。
嵌套的 for 循环将调用 delay(15)
181*181 次。那是 32716 乘以 15 毫秒。共8.2分钟。
您的代码的另一个问题是您希望伺服系统在 15 毫秒内从 180° 到 0° return,这是不会发生的。
也不需要在内循环中调用 myServo1.write(pos)
,因为 pos
仅在外循环中更新。总共有 32580 次不必要的函数调用。
您应该学习如何编写非阻塞代码。有大量可用资源。
您可能还会养成检查数学的习惯。不要只是拖延。想想延迟 181*181*15ms
!
到底意味着什么
我需要让这个物体跟随机器人,它使用 2 个伺服电机移动,并使用超声波传感器检测物体的位置以及 Arduino 应该告诉伺服系统移动的位置。但是,问题似乎在于,每当伺服电机试图向前或向后移动时,它们只会一直旋转。我已尝试检查是否有松动的电线,但电线似乎没有松动,我已尝试更改我编写代码的方式,但似乎还没有任何效果...
还有一些相关代码(不是全部):
void forward() {
for (pos = 0; pos <= 180; pos++)
{
for (pos2 = 0; pos2 <= 180; pos2++)
{
myServo1.write(pos);
myServo2.write(pos2);
delay(15);
}
}
}
int Distance_thing() {
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(20);
digitalWrite(Trig, LOW);
float Fdistance = pulseIn(Echo, HIGH);
Fdistance= Fdistance / 58;
return (int)Fdistance;
}
void loop() {
rightDistance = Distance_thing();
leftDistance = Distance_thing();
if ((rightDistance > 70) && (leftDistance > 70)) {
stop();
delay(500);
}
else if ((rightDistance >= 20) && (leftDistance >= 20)) {
forward();
delay(500);
}
else if ((rightDistance <= 10) && (leftDistance <= 10)) {
back();
delay(500);
}
else if (rightDistance - 3 > leftDistance) {
left();
delay(500);
}
else if (rightDistance + 3 < leftDistance) {
right();
delay(500);
}
else {
stop();
delay(500);
}
}
paddy 已经指出你的动作需要很长时间。
嵌套的 for 循环将调用 delay(15)
181*181 次。那是 32716 乘以 15 毫秒。共8.2分钟。
您的代码的另一个问题是您希望伺服系统在 15 毫秒内从 180° 到 0° return,这是不会发生的。
也不需要在内循环中调用 myServo1.write(pos)
,因为 pos
仅在外循环中更新。总共有 32580 次不必要的函数调用。
您应该学习如何编写非阻塞代码。有大量可用资源。
您可能还会养成检查数学的习惯。不要只是拖延。想想延迟 181*181*15ms
!