首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino和RC发射器

Arduino和RC发射器
EN

Stack Overflow用户
提问于 2013-02-11 15:19:20
回答 2查看 2.1K关注 0票数 4

我是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度。有没有人能提供一些帮助或建议?

非常感谢

代码语言:javascript
复制
#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 
}
EN

回答 2

Stack Overflow用户

发布于 2013-02-12 16:12:11

您正在溢出int数据类型。有符号的值只能是-32768到+32767。请参阅int docs

你的公式都是的,编译器不会猜到你可能需要一个更大的中间值。

要理解数学,请将公式分解为单独的操作,如下面的测试程序所示。这实际上就是编译器为您做的事情。

运行下面的程序,您将看到失败。就在out值达到45之后,中间值溢出,公式崩溃。

代码语言:javascript
复制
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,您将能够使输出按您需要的方式运行。

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2013-02-12 09:17:14

需要注意的是,你可能在https://robotics.stackexchange.com/上有更多的Arduino/伺服运气。

您在串行输出上看到了什么?ch3是从0循环到45,还是从0循环到180?不要忘记,map()是为您在这里手动完成的工作而设计的。

我的第一个怀疑是,您偶尔会从pulseIn返回0,这可能是因为您正在超时,或者您在脉冲中间开始读取(这可能导致脉冲比您预期的更短)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14807546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档