百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Arduino接收航模遥控器RC接收机的PWM数据

liuian 2024-12-08 16:24 61 浏览

本文将介绍如何使用Arduino读取RC接收机的PWM数据

支持ESP系列与Atmega系列等使用Arduino框架的MCU

当我们手里拥有一个Arduino设备例如(Arduino Nano、Uno或者ESP8266系列)任何可以使用Arduino进行开发的开发板,我们想让它接收到航模遥控器数据的时候该怎么办呢?本文将介绍如何使用硬件连接与软件编程教您学习它的实现步骤。

硬件准备

  1. 一台航模遥控器+接收器



  1. 使用Arduino Nano开发板


硬件连接

将Arduino Nano的引脚 D8~D11 接到接收机的1~4通道,接收机上的电源正极和负极连接到Arduino上的GND 和 +5V即可。可见下图我的连接方式。



软件编程

这里我们将使用Vscode平台PlatformIO框架环境进行编写程序。

原理

接收机与arduino通讯将通过pwm的形式与我们的mcu进行数据通信,一般来说此类遥控器的pwm范围最低和最高在 1000 ~ 1500 ~ 2000之间。

例如油门摇杆推在中间为1500,油门放到最低则是1000,油门推到最高为2000。

我们可以采用外部中断来检测引脚的高低电平的变化的持续时间可以计算出pwm值。

由于大部分的arduino有两个外部中断,分别在digital 2和digital 3引脚,中断可由电平的改变触发。

明显这个不能适合我们的使用。

使用引脚电平变化中断 Pin Change Interrupts

这个方法有两种方式第一种不用第三方库 实现起来比较麻烦需要自己写原生的寄存器控制代码

#define LED A3;
byte state = HIGH;
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
 
  PCICR |= (1 << PCIE0);                                                    //Set PCIE0 to enable PCMSK0 scan.
  PCMSK0 |= (1 << PCINT0);                                                  //Set PCINT0 (digital input 8) to trigger an interrupt on state change.
  PCMSK0 |= (1 << PCINT1);                                                  //Set PCINT1 (digital input 9)to trigger an interrupt on state change.
  PCMSK0 |= (1 << PCINT2);                                                  //Set PCINT2 (digital input 10)to trigger an interrupt on state change.
  PCMSK0 |= (1 << PCINT3);    
}
 
void loop() {
  // put your main code here, to run repeatedly:
     digitalWrite(A3,state);
}
 
ISR(PCINT0_vect){
  Serial.print("触发中断\t");
  Serial.print(micros());
  Serial.print("\t");
  Serial.println(SPDR,BIN);
  state = ~state;
}

CIE0 代表的是D8 ~ D13的引脚变化,配合 ISR(PCINT0_vect);
这个解释和使用比较麻烦感兴趣可以看下这篇文章:
http://gammon.com.au/interrupts


EnableInterrupt库

我们主要介绍第二种方式采用第三方库:EnableInterrupt

/*
 * @Description:
 * @Author: chenzedeng
 * @Date: 2022-10-27 19:14:34
 * @LastEditTime: 2022-11-05 13:27:13
 */
#define EI_ARDUINO_INTERRUPTED_PIN
#include <EnableInterrupt.h>
 
byte receiver_pins[4] = {8, 9, 10, 11};
volatile int receiver_input[4];
unsigned long timer_1, timer_2, timer_3, timer_4;
 
void pwmReceive();
 
void setup() {
    Serial.begin(115200);
 
    for (int i = 0; i < 4; i++) {
        pinMode(receiver_pins[i], INPUT_PULLUP);
        enableInterrupt(receiver_pins[i], pwmReceive, CHANGE);
    }
    //开启中断
    sei();
}
 
void loop() {
    delay(500);
    Serial.print("---PWM---\n");
    for (int i = 0; i < 4; i++) {
        Serial.print(receiver_input[i]);
        Serial.print("\t");
    }
    Serial.print("---END---\n");
}
 
/**
 * 中断函数
 */
void pwmReceive() {
    //获取当前的PIN触发的引脚
    int currPin = arduinoInterruptedPin;
    //获取当前的微秒
    unsigned long currTime = micros();
 
    //拿到的是当前的引脚的高低电平。 0是从高到低电平,>0 代表是从低到高电平
    int pinLevel = arduinoPinState;
 
    if (currPin == 8 && pinLevel > 0) {
        //为高电平
        timer_1 = currTime;
    } else if (currPin == 8 && pinLevel == 0) {
        //低电平
        receiver_input[0] = currTime - timer_1;
    }
 
    if (currPin == 9 && pinLevel > 0) {
        //为高电平
        timer_2 = currTime;
    } else if (currPin == 9 && pinLevel == 0) {
        //低电平
        receiver_input[1] = currTime - timer_2;
    }
 
    if (currPin == 10 && pinLevel > 0) {
        //为高电平
        timer_3 = currTime;
    } else if (currPin == 10 && pinLevel == 0) {
        //低电平
        receiver_input[2] = currTime - timer_3;
    }
 
    if (currPin == 11 && pinLevel > 0) {
        //为高电平
        timer_4 = currTime;
    } else if (currPin == 11 && pinLevel == 0) {
        //低电平
        receiver_input[3] = currTime - timer_4;
    }
}

将上面的代码烧录到你的arduino中,然后航模遥控器和接收机进行配对,在之后你遥控摇杆就可以发现控制台上的打印数字发生了变化。

注意如果您使用了软串口SoftwareSerial 可能会导致一些不兼容的问题,因为此库实现了ISR( )的方法,请在实际项目中调试做调整。

相关推荐

怎么把电脑c盘格式化(怎么把c盘格式化吗)

1.在进行c盘格式化之前,必须备份重要的数据,以免数据丢失。2.在格式化c盘之前,确保所有的应用程序和系统文件都已经备份。否则,在进行格式化之后,将需要重新安装操作系统和所有的应用程序。3.如果...

中国移动赠送的wifi6路由器(192.168.10.1中国移动路由器)

移动tclwifi6路由器很好的。WiFi6路由器远强于WiFi5路由器,值得购买性价比不错。家庭生活中网速慢最主要的原因并非速率,而是穿墙效果。坐在离路由器很近的地方,手机网速一般不会有问题。...

office2010如何激活免费使用
  • office2010如何激活免费使用
  • office2010如何激活免费使用
  • office2010如何激活免费使用
  • office2010如何激活免费使用
win官网网址(win官方网站)

具体方法如下:打开电脑,在浏览器地址栏输入window,就会进入win中文官网,然后再寻找自己需要的软件,升级包等就可以了。下面是windows官网网址:1http://www.microsoft.c...

电脑的任务栏不见了怎么恢复
  • 电脑的任务栏不见了怎么恢复
  • 电脑的任务栏不见了怎么恢复
  • 电脑的任务栏不见了怎么恢复
  • 电脑的任务栏不见了怎么恢复
wifi网址登录入口(wifi网址登录入口有哪些)

wifi网页登录入口是网关地址192.168.1.1.1.首先检查路由器线路连接(参考前面手机设置路由器部分)2.将电脑Tnternet协议(TCP/IP)属性设置为“自动获取IP地址”和“自...

没有驱动程序怎么安装打印机

(1)启动电脑进入Windows操作系统,在桌面上单击开始-设置-打印机。(2)用鼠标右单击安装好的打印机图标,在弹出的右键菜单中选择属性,然后单击打印测试页按钮。(3)此时打印机会打出一页信息,从这...

u盘怎么取消写保护状态(u盘如何解除写保护状态)

如果您的U盘被设置为写保护,您可以尝试以下方法来关闭写保护:1.检查U盘上的物理开关:一些U盘上可能有一个物理开关,用于启用或禁用写保护。请检查U盘的外壳,看看是否有这样的开关,并将其切换到未锁定的...

压缩文件查看器(压缩文件查看器密码是多少)

1,打开手机上面的文件管理器,找到要压缩的WPS文件。2,长按一下WPS文件,然后选择要压缩的文件。3,点击右下角的【更多】,选择【压缩】。4,对压缩文件进行保存,压缩完成。扩展资料:wps产品特点1...

键盘哪个是截图键(键盘中的截图键是哪一个)

1、按Prtsc键截图这样获取的是整个电脑屏幕的内容,按Prtsc键后,可以直接打开画图工具,接粘贴使用。也可以粘贴在QQ聊天框或者Word文档中,之后再选择保存即可。2、按Ctrl+Prtsc键截图...

flash插件电脑版下载(flash插件下载安装)

可以不安装,不安装对电脑也不会有什么影响。友情提示,最好安装,这个也不会占用你多少内存,它是用来播放网页中的flash文件的。如果你不安装,网页中的flash动画就不能正常播放。浏览器也会提示你安装!...

如何打开注册表管理器(如何打开注册表管理器权限)
  • 如何打开注册表管理器(如何打开注册表管理器权限)
  • 如何打开注册表管理器(如何打开注册表管理器权限)
  • 如何打开注册表管理器(如何打开注册表管理器权限)
  • 如何打开注册表管理器(如何打开注册表管理器权限)
foxmail邮箱怎么设置(foxmail邮箱设置成功后点完成没反应)

操作步骤/方法1.打开新建界面:2.打开foxmail,在上方导航栏处找到“邮箱(B)”点开此功能,会看到一个下拉菜单,在下拉菜单中找到“新建邮箱账户(N)”。3.建立账户信息:4.点击“新建邮箱账...

电脑自动关机解决办法(电脑自动关机,原来是这里出了问题)

电脑自动关机的原因一、系统文件损坏一个完整的系统受到袭击之后,电脑就不能进行初始化,从而引起自动关机,这也是一个常见的原因。可以选择重装系统的方法来解决问题。电脑自动关机的原因二、CPU太热这是电脑自...

m2固态硬盘安装系统教程(m2固态如何装系统)

加装m.2固态硬盘后,重装系统的操作步骤如下:1、下载U盘启动盘制作工具,下载一个GHOST版最新的WIN7,准备一个足够大的U盘(16G足够了),用U盘启动盘制作工具将其制作成启动U盘;2、插入新电...