我是Arduino和这个论坛的新手,除了教程之外,这是我的第一个Arduino项目。
我正在尝试使用rc发射器/接收器和Arudino来控制伺服。我之所以使用Arduino而不是将伺服直接连接到RC接收器,是因为RC只能产生1000µs到2000µs的PWM,而我需要600µs到2400µs的PWM才能获得伺服的完整运动范围。我尝试做的是从pulseIn()中读取值,然后将这个值映射到0到180度,如下面的代码所示(它利用了伺服库)。
然而,在此代码中,运动行为是奇怪的。当我移动无线电发射器控制杆通过其运动范围时,马达从0度旋转到45度,从45度旋转到0度,从0度旋转到45度,再从0度旋转到45度,而不是从0度旋转到180度。有没有人能提供一些帮助或建议?
非常感谢
#include <Servo.h>
Servo myservo;
int ch1;
int ch2;
int ch3;
int degree;
void setup() {
pinMode(7, INPUT);
myservo.attach(9);
Serial.begin(9600);
}
void loop() {
ch3 = pulseIn(7, HIGH, 25000);
degree = ((ch3-1250)* 180)/700;
Serial.print("Channel 3:");
Serial.println(ch3);
myservo.write(degree);
delay(5); // waits 5ms for the servo to reach the position
}发布于 2013-02-12 16:12:11
您正在溢出int数据类型。有符号的值只能是-32768到+32767。请参阅int docs
你的公式都是的,编译器不会猜到你可能需要一个更大的中间值。
要理解数学,请将公式分解为单独的操作,如下面的测试程序所示。这实际上就是编译器为您做的事情。
运行下面的程序,您将看到失败。就在out值达到45之后,中间值溢出,公式崩溃。
in: 1040 out: 39 t0: -210 t1: 27736 t2: 39
in: 1048 out: 41 t0: -202 t1: 29176 t2: 41
in: 1056 out: 43 t0: -194 t1: 30616 t2: 43
in: 1064 out: 45 t0: -186 t1: 32056 t2: 45
in: 1072 out: -45 t0: -178 t1: -32040 t2: -45
in: 1080 out: -43 t0: -170 t1: -30600 t2: -43 使用下面的程序作为测试夹具。修改数据类型以使用unsigned int,您将能够使输出按您需要的方式运行。
int ch3;
int degree;
void setup() {
ch3 = 1000;
Serial.begin(9600);
}
void loop() {
int t0, t1, t2;
degree = ((ch3-1250)* 180)/700;
t0 = ch3 - 1250;
t1 = t0 * 180;
t2 = t1 / 700;
Serial.print("in: ");
Serial.print(ch3);
Serial.print(" out: ");
Serial.print(degree);
Serial.print(" t0: ");
Serial.print(t0);
Serial.print(" t1: ");
Serial.print(t1);
Serial.print(" t2: ");
Serial.println(t2);
ch3 += 8;
if(ch3 > 2400) {
ch3 = 1000;
}
delay(100);
}发布于 2013-02-12 09:17:14
需要注意的是,你可能在https://robotics.stackexchange.com/上有更多的Arduino/伺服运气。
您在串行输出上看到了什么?ch3是从0循环到45,还是从0循环到180?不要忘记,map()是为您在这里手动完成的工作而设计的。
我的第一个怀疑是,您偶尔会从pulseIn返回0,这可能是因为您正在超时,或者您在脉冲中间开始读取(这可能导致脉冲比您预期的更短)。
https://stackoverflow.com/questions/14807546
复制相似问题