Arduino+2.4G模块做航模遥控器

萌新第一次发文,多多关照~
玩航模估计有七八年了,玩arduino和各类单片机也有一两年啦,今年回家以后因为疫情被困在家里回不去,就寻思着用arduino做个2.4g的遥控和接收。闲话不多说,开始正文。

2.4G模块

接线还有其他的基础介绍可以参考凌顺实验室的介绍和示意,我感觉很不错
Arduino 2.4G通信实验 nRF24L01模块的简单例子
我用的是两块Nano来做主板,接线与Uno基本相同。
库下载地址: https://github.com/nRF24/RF24

或者在Arduino IDE 的库管理器中搜索nrf24,作者为TMRh20
接线大致如下

然后就是上程序。

发送部分

#include "SPI.h"      //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
int a;        //定义一个变量储存前一次通道参数;
int aa;       //改变后的通道参数;
int b;
int bb;
int c;
int cc;
int d;
int dd;
int e;
int ee;
int x=2; //开关通道;
int y=3;
int z=4;
int f=4001;
int g=4002;
int h=4003;
int i = 4005;
int data;
void setup(){Mirf.spi = &MirfHardwareSpi;  //加载24L01  SPIMirf.init();                                 //开始Mirf.setTADDR((byte *)"serv1");//发送到"接收地址"Mirf.payload = sizeof(int);          //将数据类型定义为整型;Mirf.config();  Serial.begin(9600);pinMode(x,INPUT);pinMode(y,INPUT);pinMode(z,INPUT);}
void loop(){ a=analogRead(A7);            //读取电位器电平(0至1023),一定要是模拟接口才可以。b=analogRead(A6);      c=analogRead(A2);            d=analogRead(A3);e=analogRead(A1);
a=map(a,0,1023,0,999) ;            //map函数将读取到的数据转换成不同区间的数,加以区分;
b=map(b,0,1023,1000,1999) ;
c=map(c,0,1023,2000,2999) ;
d=map(d,0,1023,3000,3999) ;
e=map(e,0,1023,5000,5999) ;
Mirf.send((byte *)&a); //向接收机发送数据;while(Mirf.isSending()){     //等待发送完毕;}
Mirf.send((byte *)&b); while(Mirf.isSending()){     }
Mirf.send((byte *)&c); while(Mirf.isSending()){     }
Mirf.send((byte *)&d); while(Mirf.isSending()){     }
Mirf.send((byte *)&e); while(Mirf.isSending()){     } if (a !=aa) {        //如果数值改变,则参数发生改变,aa是一个中间变量;aa=a;}if (b !=bb) {bb=b;}if (c !=cc) {cc=c;}if (d !=dd) {dd=d;}if (e !=ee) {ee=e;}int x_1 = digitalRead(x);     //读取开关通道的电平;if (x_1==0){Mirf.send((byte *)&f);    //若开关通道为低电平,则发送数据;开关通道我接了个1k的上拉电阻(连接5v),不接有干扰;while(Mirf.isSending()){    }}int y_1 = digitalRead(y);Serial.println(y_1);if (y_1==0){Mirf.send((byte *)&g);while(Mirf.isSending()){     }}if (y_1==1){Mirf.send((byte *)&i);while(Mirf.isSending()){     }}int z_1 = digitalRead(z);if (z_1==0){Mirf.send((byte *)&h);while(Mirf.isSending()){    }}delay(10);                        // 等待0.01秒,等待接收部分清理缓存;
}

接收部分

#include "SPI.h"                              //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
#include <Servo.h>
Servo myservo1;  // 定义舵机,使用舵机库;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
Servo myservo6;
int data;
int a;
int b;
int c;
int d;
int e;
int h = 1000;
int pin3=3;
int pin4=4;
int pin5=5;
int pin6=6;
int pin10=10;
int pin2=2;
int pin9=9;
void setup(){
myservo1.attach(pin3,1000,2000);  // 定义舵机通道,还有转动角度;
myservo2.attach(pin4,1000,2000);
myservo3.attach(pin5,1000,2000);
myservo4.attach(pin6,1000,2000);
myservo5.attach(pin9,1000,2000);
myservo6.attach(pin2,1000,2000);Mirf.spi = &MirfHardwareSpi;          //加载24L01  SPIMirf.init();Mirf.setRADDR((byte *)"serv1"); //接收地址" ",一定要与发送端地址相同;Mirf.payload = sizeof(int);            //定义数据类型为整型;Mirf.config(); Serial.begin(9600);pinMode(pin10,OUTPUT);   //开关通道定为输出通道,要接一个继电器用于点燃拉烟器。
}
void loop(){digitalWrite(pin10,LOW);analogWrite(A1,0);  //数字IO口不足,用模拟接口代替;analogWrite(A2,0);analogWrite(A3,0);if(Mirf.dataReady()){                          //如果接收到数据则执行Mirf.getData((byte *)&data);   //接收数据 if (data>=0&&data<=999)    //如果数据处于此区间,则说明数据是发送部分的a;             {a=map(data,0,999,2000,1000);  //将a的数据转变为舵机转动的角度;myservo1.writeMicroseconds(a);  //舵机转动;因为输出的是pwm信号,所以也可以直接接电调;}if (data>=1000&&data<=1999)            { b=map(data,1000,1999,1000,2000);myservo2.writeMicroseconds(b);}if (data>=2000&&data<=2999)               {c=map(data,2000,2999,1200,1800);   //这个通道被我拿来当升降舵通道,我觉得舵量太高就改小了,方法是将1000,2000同时减去一个数,如果要通道反向就将两个数位置调换即可;myservo3.writeMicroseconds(c);}if (data>=3000&&data<=3999)         { d=map(data,3000,3999,1200,1800);myservo4.writeMicroseconds(d);}if (data>=5000&&data<=5999)         { e=map(data,5000,5999,1314,1800);myservo5.writeMicroseconds(e);}if(data==4001){digitalWrite(pin10,HIGH);  //开关通道为高电平;}if(data==4002){myservo6.writeMicroseconds(1000);}if(data==4005){myservo6.writeMicroseconds(1500);}if(data==4006){myservo6.writeMicroseconds(2000);   //我做的三段开关;}if(data==4003){analogWrite(A1,1023);  //模拟通道高电平;}if(data==4004){analogWrite(A2,1023);}Mirf.rxFifoEmpty();            //清理24L01援存} }

总结

这样做出来的遥控器大概是八通道,对于航模来说已经绰绰有余了,因为我买的是半双工的2.4g,所以无法实现数据回传,或者说数据回传会造成很高的数据延迟,就没有加到程序里。如果要拓展通道的话直接增加区间减小区间就可以了,理论上可以做无数个通道只要io口足够,不过并不推荐,够用就行,否则延迟增高。前几天买了个曼塔K3的遥控器,看着挺高级的才花了八十,上面有一个大功率的2.4g和5.8g模块,接下来准备写几块板子做个好点的遥控器,就酱。

Arduino+2.4G模块做航模遥控器相关推荐

  1. 单片机 + 4G模块7S1上有人云平台自己添加变量进行温度采集,将数据发送有人云平台

    目录 前言 一.有人云平台添加设备及变量 二.有人云数据通讯协议:modbus rtu 1.首先是单片机接收主机报文 2.单片机发送modbus rtu报文 总结 前言 想记录一些我在工作和学习过程中 ...

  2. 开源自制6通道航模遥控器,Arduino Pro Mini NRF24L01模块

    前言 前段时间跟着LOLI大神的教程制作了LOLI三代控,效果很好.但是,由于LOLI三代控的接收机带有数据回传功能,也就是接收机的无线模块也承担了发射数据功能,所以接收机也要使用带有功率放大芯片的N ...

  3. 开源自制的6通道航模遥控器(二)-Arduino接收机增加SBUS输出

    前言 前几天开源了自制的6通道航模遥控器(开源自制的6通道航模遥控器,超简单不超过100行代码),受到许多粉丝的关注,美中不足的是只实现了6个通道的PWM输出,没有SBUS输出,接线太复杂.经过一段时 ...

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

    本文将介绍如何使用Arduino读取RC接收机的PWM数据 1. 硬件部分 我的设备: 接收机 遥控器发射机 将Arduino Nano的引脚 D8~D11 接到接收机的1~4通道,接收机上的电源正极 ...

  5. 开源自制的6通道航模遥控器(一) 超简单不超过100行代码

    前言 前段时间跟着LOLI大神的教程制作了LOLI三代控,效果很好.但是,由于LOLI三代控的接收机带有数据回传功能,也就是接收机的无线模块也承担了发射数据功能,所以接收机也要使用带有功率放大芯片的N ...

  6. DIY基于树莓派的OpenTX航模遥控器(一)

    [前言] 在正式讨论OpenTX遥控器之前,先罗列一下自己以往DIY遥控器的经历,正是通过这些不断摸索逐步积累了DIY的经验,以及大部分的驱动代码.基于对Python的热爱,所有制作都是基于Pytho ...

  7. 建军节献礼!J20航模遥控器开源项目系列教程(一)制作教程 | 基础版V1.0发布,从0到1

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  8. 嵌入式Linux利用ppp实现4G模块联网

    https://blog.csdn.net/qq361294382/article/details/52136126 https://blog.csdn.net/qq361294382/article ...

  9. 4g模块注册上网 移远_Openwrt支持移远4G模块过程记录

    参考了不少教程,也做了不少尝试,最后记录下整个过程以便自己和坛友们参考 我所用的4G模块是Quectel EC20 R2.0,对于这个型号以下的操作前半部分修改USB Serial驱动应该是不需要的, ...

最新文章

  1. 《预训练周刊》第28期:M6-10T:高效多万亿参数预训练的共享去链接范式、大模型自然语言处理的最新进展综述...
  2. 【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第二步)(4)...
  3. java中的浮点计算
  4. 一起学android之怎样设置TextView中不同字段的字体颜色(22)
  5. 【Android 属性动画】属性动画 Property Animation 与 视图动画 View Animation 区别
  6. 成功解决python\ops\seq2seq.py TypeError: ms_error() got an unexpected keyword argument 'labels'
  7. arm 指令1(转)
  8. ROS在类中发布和接受消息(标准消息)
  9. puppet3.5源码包安装和配置
  10. iphone 如何成功的把three20成功的添加到xcode中去。
  11. ubuntu解决网易云无法打开
  12. Unity 中 Png转Texture2D再转Sprite
  13. 快速对表的某字段赋递增的数值
  14. IDEA中 GIT与SVN版本控制插件的切换
  15. 工业机器人大赛技术培训方案
  16. drozer安全评估框架基础使用技法
  17. 统计闰年2月29日天数
  18. 【重构学习】02 何处重构?
  19. MySQL中的文本处理函数整理,收藏速查
  20. leetcode 810. Chalkboard XOR Game

热门文章

  1. C#调用TSC条码打印机打印二维码
  2. 谁是三鹿奶粉事件的真凶
  3. javascript面向对象(三):class语法详解
  4. c++打印心形_C语言控制台打印3D爱心图案
  5. Termux安装Kali(详细版)
  6. C语言高考志愿填报管理系统,高考志愿智能填报系统
  7. 1709 ltsb 内存占用_腾讯游戏学院专家分析:Unity在移动设备的GPU内存机制
  8. Unity Android Icons 配置
  9. 必学框架新版SpringBoot教程(下集)
  10. 小米扫地机器人划区清扫定时_小米机器人怎么设定扫地区域 小米机器人设定扫地区域的方法...