Arduino+NRF24 无线控制舵机和无刷电机

前段时间刷到了许多航模大佬的视频,航模飞上天的那一刻真的感觉很牛,立马激发了我的兴趣。有简单了解,航模主要配件就是接收机和遥控器还有无刷电机舵机等,遥控器的价格真的会让我死心。后来我又去了解无刷电机和电调原理,无刷电机的原理和舵机的原理没多大差别,都是使用一定频率的pwm通过调节占空比来控制舵机和电机。关于pwm(脉宽调制)感兴趣的可以去了解一下,用途还是非常广的。

**遥控端:

材料:Arduino nano x1;NRF2401 x1;16x16摇杆(按键可有可无) x2;CD42充电升压一体模块 x1;锂电池 x1;排母若干,拨动开关一个;

原理图:

a3588172d8ac45dca655260502860428.png

PCB3D仿真图:

c776126e56df465ca902a2141c88f1ac.png

4990f1f5ed7d43868314c30832c2dbb3.png

遥控端程序:

/*航模遥控端代码
 *written by Han
 *仅供参考禁止商用
 */

//引入所需库文件
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const uint64_t pipeOut = 0x89E8F0F0E1LL;   //遥控端通信地址
RF24 radio(7, 8); // CE、CSN对应引脚

struct creat  //定义结构体变量用来存储摇杆数据
{
  uint8_t lx;  //左摇杆X轴
  uint8_t ly;  //左摇杆Y轴
  uint8_t rx;  //右摇杆X轴
  uint8_t ry;  //右摇杆Y轴
};

creat data;  //创建结构体并命名为data

void Data_Init()  //初始化数据函数
{
  data.lx=90;
  data.ly=90;
  data.rx=90;
  data.ry=90;
}

void setup() 
{
  Data_Init();
  Serial.begin(9600);
  radio.begin();  //初始化
  radio.setPALevel(RF24_PA_MAX);  //功率选择
  radio.openWritingPipe(pipeOut);  //通信地址
  radio.stopListening();  //停止接受(发射模式)
}

void loop() 
{
  delay(50);  //延迟
  data.lx=map(analogRead(A0),0,1023,0,180);  //将摇杆获取的ADC数据按比例转换为0~180范围内的数据并赋给对应变量
  data.ly=map(analogRead(A1),0,1023,0,180);
  data.rx=map(analogRead(A2),0,1023,0,180);
  data.ry=map(analogRead(A3),0,1023,0,180);
  radio.write(&data, sizeof(data));  //将数据发送
  
}

**接收端

材料:Arduino nano x1;NRF2401模块 x1;排针、排母若干;

原理图:

9592f7a11eaf4e9b9ab076fe26052dcf.png

PCB3D仿真图:
0062af24132e4033900bd1903dba6c41.png

1a96a40892a2467e9b42e86e26b9f55b.png

接收端代码:

/*航模接收端代码
 *written by Han
 */

//引入所需库文件
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

//通道0~4共五个
Servo ch0;
Servo ch1;
Servo ch2;
Servo ch3;
Servo ch4;

const uint64_t pipeIn = 0x89E8F0F0E1LL;  //通信地址
RF24 radio(7, 8);  //CE、CSN对应引脚

struct creat  //定义结构体变量用于存储摇杆数据
{
  uint8_t lx;  //左摇杆X轴
  uint8_t ly;  //左摇杆Y轴
  uint8_t rx;  //右摇杆X轴
  uint8_t ry;  //右摇杆Y轴
};

creat data;  //创建结构体命名为data

void Data_Init()  //数据初始化函数
{
  data.lx=90;
  data.ly=90;
  data.rx=0;
  data.ry=90;
}

void Servo_Init()  //通道初始化函数
{
  ch0.write(0);
  ch1.write(90);
  ch2.write(90);
  ch3.write(90);
  ch4.write(90);
}

void setup() 
{
  ch0.attach(3);
  ch1.attach(5);
  ch2.attach(6);
  ch3.attach(9);
  ch4.attach(10);
  radio.begin();  //初始化
  Serial.begin(9600);
  radio.openReadingPipe(1,pipeIn);  //接收地址
  radio.startListening();  //开始接收(接收模式)
  Data_Init();  //数据初始化
  Servo_Init();  //通道初始化
}

void loop() 
{
  while ( radio.available() ) 
  {
    radio.read(&data, sizeof(data));  //接收数据传给data
    //执行
    ch0.write(180-data.rx);
    ch1.write(data.ry);
    ch2.write(data.lx);
    ch3.write(data.ly);
    
  }
  delay(50);
}

以上代码我都对其写了详细注释(我觉得挺详细的了,其实我平时不怎么写注释的)如果摇杆数据反了进行简单修改就行啦,本人航模小白,只会点单片机,请大佬指点。对应的PCB我会在开源之后发出来

以下是实物图:

c4fc03cd41964b69ad6493e1f9444415.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值