极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 127559|回复: 29

Arduino 从模型遥控接收机获取PPM控制信号

  [复制链接]
发表于 2012-11-6 20:57:34 | 显示全部楼层 |阅读模式
本帖最后由 johnsonzzd 于 2012-11-7 21:53 编辑

无线遥控就是利用高频无线电波实现对模型的控制。如天地飞的的6通道2.4 GHz遥控器,一套200多块,具有自动跳频抗干扰能力,从理论上讲可以让上百人在同一场地同时遥控自己的模型而不会相互干扰。而且在遥控距离方面也颇具优势,2.4 GHz遥控系统的功率仅仅在100 mW以下,而它的遥控距离可以达到1km以上。



遥控器发射机、接收机原理

每个通道信号脉宽0~2ms,变化范围为1~2ms之间。1帧PPM信号长度为20ms,理论上最多可以有10个通道,但是同步脉冲也需要时间,模型遥控器最多9个通道。



PPM格式


只连接了通道3(油门)


arduino要测量脉宽时间很简单。有专门的库函数pulseIn( )。问题在于这个库函数使用查询方式,程序在测量期间一直陷在这里,CPU利用率太低。因此下面代码采用中断方式,效率很高。
代码参考:http://arduino.cc/forum/index.php/topic,42286.0.html
  1. //read PPM signals from 2 channels of an RC reciever
  2. //http://arduino.cc/forum/index.php/topic,42286.0.html

  3. //接收机两个通道分别接arduino的数字口2、3脚
  4. //Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3).
  5. //The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).
  6. int ppm1 = 2;  
  7. int ppm2 = 3;

  8. unsigned long rc1_PulseStartTicks,rc2_PulseStartTicks;       
  9. volatile int rc1_val, rc2_val;  

  10. void setup() {

  11.         Serial.begin(9600);  

  12.         //PPM inputs from RC receiver
  13.         pinMode(ppm1, INPUT);
  14.         pinMode(ppm2, INPUT);

  15.         // 电平变化即触发中断
  16.         attachInterrupt(0, rc1, CHANGE);   
  17.         attachInterrupt(1, rc2, CHANGE);   
  18. }

  19. void rc1()
  20. {
  21.         // did the pin change to high or low?
  22.         if (digitalRead( ppm1 ) == HIGH)
  23.                 rc1_PulseStartTicks = micros();    // store the current micros() value
  24.         else
  25.                 rc1_val = micros() - rc1_PulseStartTicks;
  26. }

  27. void rc2()
  28. {
  29.         // did the pin change to high or low?
  30.         if (digitalRead( ppm2 ) == HIGH)
  31.                 rc2_PulseStartTicks = micros();   
  32.         else
  33.                 rc2_val = micros() - rc2_PulseStartTicks;
  34. }

  35. void loop() {

  36.         //print values
  37.         Serial.print("channel 1:  ");
  38.         Serial.print(rc1_val);  
  39.         Serial.print("        ");
  40.         Serial.print("channel 2:  ");   
  41.         Serial.println(rc2_val);  
  42. }
复制代码


上述代码每个通道都要占用一个中断口。但是一般的Arduino只有数字口2、3具有中断功能,也就是说只能接两个通道。如果想使用更多的通道,就需要用mega了,mega有5个外部中断源。其实,还有一种简单办法可以用一个中断接收所有通道。这就是绕过接收机的解码电路,使用arduino直接对PPM信号解码。这种方式麻烦的地方是需要拆开接收机,把解码前的PPM信号引出来。




参考:http://diydrones.com/profiles/blogs/705844:BlogPost:38393
打开接收机后,寻找PPM信号接口有几种办法:

1.        查芯片资料,如Futaba接收机使用BU4015BF移位寄存器芯片,管脚1或9焊一根线引出即可。
2.        使用示波器
3.        使用arduino,写入测量脉宽的程序,在电路板上找吧,直到出现一些随机数估计就是了。
找到以后使用下面代码进行解码。此段代码使用查询方式,效率较低。更有效率的办法是使用两个中断。一个中断检测同步信号,另一个中断处理PPM信号。




  1. //http://diydrones.com/profiles/blogs/705844:BlogPost:38393
  2. #define channumber 4 //How many channels have your radio?
  3. int value[channumber];

  4. void setup()
  5. {
  6.         Serial.begin(57600); //Serial Begin
  7.         pinMode(3, INPUT); //Pin 3 as input
  8. }
  9. void loop()
  10. {
  11.         while(pulseIn(3, LOW) < 5000){} //Wait for the beginning of the frame
  12.         for(int x=0; x<=channumber-1; x++)//Loop to store all the channel position
  13.         {
  14.                 value[x]=pulseIn(3, LOW);
  15.         }
  16.         for(int x=0; x<=channumber-1; x++)//Loop to print and clear all the channel readings
  17.         {
  18.                 Serial.print(value[x]); //Print the value
  19.                 Serial.print(" ");
  20.                 value[x]=0; //Clear the value afeter is printed
  21.         }
  22.         Serial.println(""); //Start a new line
  23. }

复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-11-7 07:33:33 | 显示全部楼层
支持下!!最近正好需要!
回复 支持 反对

使用道具 举报

发表于 2012-11-7 09:06:55 | 显示全部楼层
很强大,收下了
回复 支持 反对

使用道具 举报

发表于 2012-11-7 19:38:24 | 显示全部楼层
这个,好啊!
回复 支持 反对

使用道具 举报

发表于 2013-2-25 13:06:03 | 显示全部楼层
支持下!!
回复 支持 反对

使用道具 举报

发表于 2013-2-28 09:43:28 | 显示全部楼层
记录下。。学习。
回复 支持 反对

使用道具 举报

发表于 2013-3-7 01:05:18 | 显示全部楼层
谢谢楼主,这正是我想要的,想用ARDUINO控制遥控车。
回复 支持 反对

使用道具 举报

发表于 2013-3-27 14:34:34 | 显示全部楼层
学习············
回复 支持 反对

使用道具 举报

发表于 2013-3-28 13:05:29 | 显示全部楼层
请问有没简单的方法 ,实现同时读6路PWM波呢?
回复 支持 反对

使用道具 举报

发表于 2013-8-13 21:15:23 | 显示全部楼层
正在找方面 学习了
回复 支持 反对

使用道具 举报

发表于 2013-8-30 12:15:53 | 显示全部楼层
楼主是否了解mwc是怎么做的呢
回复 支持 反对

使用道具 举报

发表于 2013-8-30 13:26:44 | 显示全部楼层
有没有这种库,输入ppm信号解码
回复 支持 反对

使用道具 举报

发表于 2014-2-27 21:10:55 | 显示全部楼层
请问楼主,如何将获取到的信号输出控制电机呢?
回复 支持 反对

使用道具 举报

发表于 2014-5-23 14:52:08 | 显示全部楼层
好东西,学习学习。。。
回复 支持 反对

使用道具 举报

发表于 2014-5-23 15:27:51 | 显示全部楼层
很好的内容
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 02:29 , Processed in 0.046966 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表