用nrf24L01做玩具遥控器
本帖最后由 tom_hsh 于 2015-11-6 10:14 编辑近来心血来潮想做一个玩具遥控器,本来想用esp8266-12做,后来考虑到esp的遥控距离比较近,所以用了nrf24l01来做
材料有:
arduino nona 2块(遥控器和接收器各一块)
nrf24l01 2块
hg7881 1块
ps摇杆 1个
自制电路板 2块
自作过程
1.电路板的自作
用激光打印机打印电路图,显卡散热片,铜复板
用电烙铁来热转印电路图到板上
弄好后
放在腐蚀液里腐蚀电路板
腐蚀完了
用砂纸清理并焊上焊脚
电路板完工
遥控器和接收器其实都是同一块板,只是程序不同,接的东西不同而已
2.程序代码
需要用到的自己写两个类,ps2类和HG7881类,以前在论坛上发过,不多说了,他们在ps2.h,ps2.cpp,HG7881class.h,HG7881class.cpp中
一下代码为遥控器端代码
#include "SPI.h" //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
#include "ps2.h"
ps2 ps_L;
ps2 ps_R;
char aaa;
int SendData;
void setup(){
Serial.begin(9600);
//---------24L01的设置-------------------------------
Mirf.spi = &MirfHardwareSpi;//加载24L01SPI
Mirf.init(); //开始
Mirf.setTADDR((byte *)"serv1");//发送到"接收地址"
Mirf.payload = sizeof(int);
Mirf.config();
//-------------------ps摇杆的设置------------------------
ps_L.init(A0,A1,A2); //左边ps摇杆的x,y,k脚
ps_R.init(A5,A6,A7); //右边ps摇杆的x,y,k脚
//函数指针赋值
ps_L.Up=Up_L;
ps_L.Middle=Middle_L;
ps_L.Dwon=Down_L;
ps_L.Left=Left_L;
ps_L.Right=Right_L;
ps_L.LeftUp=LeftUp_L;
ps_L.RightUp=RightUp_L;
ps_L.LeftDwon=LeftDwon_L;
ps_L.RightDwon=RightDwon_L;
ps_R.Up=Up_R;
ps_R.Middle=Middle_R;
ps_R.Dwon=Down_R;
ps_R.Left=Left_R;
ps_R.Right=Right_R;
ps_R.LeftUp=LeftUp_R;
ps_R.RightUp=RightUp_R;
ps_R.LeftDwon=LeftDwon_R;
ps_R.RightDwon=RightDwon_R;
}
void loop(){
ps_L.setXYvalue(495,519); //设置ps摇杆中间值
ps_L.run();
ps_R.setXYvalue(495,519); //设置ps摇杆中间值
ps_R.run();
}
//----------------用24L01向接收端发送整型数据-----------
void SendPsCmd(int i)
{
Mirf.send((byte *)&i);
while(Mirf.isSending())
{ }
delay(100);
}
//---------------------------------------左边的PS摇杆接口----------------------------------
//-------------ps摇杆向上推时执行程序------------------
void Up_L()
{
Serial.println("up_L");
if(SendData!=3)
SendPsCmd(3);
SendData=3;
}
//-------------ps摇杆在中间位置时执行程序------------------
void Middle_L()
{
Serial.println("Middle_L");
if(SendData!=-1)
SendPsCmd(-1);
SendData=-1;
}
//-------------ps摇杆向下推时执行程序------------------
void Down_L()
{
Serial.println("Down_L");
if(SendData!=6)
SendPsCmd(6);
SendData=6;
}
//-------------ps摇杆向左推时执行程序------------------
void Left_L()
{
Serial.println("Left_L");
if(SendData!=2)
SendPsCmd(2);
SendData=2;
}
//-------------ps摇杆向右推时执行程序------------------
void Right_L()
{
Serial.println("Right_L");
if(SendData!=1)
SendPsCmd(1);
SendData=1;
}
//-------------ps摇杆向左上推时执行程序------------------
void LeftUp_L()
{
Serial.println("LeftUp_L");
if(SendData!=5)
SendPsCmd(5);
SendData=5;
}
//-------------ps摇杆向右上推时执行程序------------------
void RightUp_L()
{
Serial.println("RightUp_L");
if(SendData!=4)
SendPsCmd(4);
SendData=4;
}
//-------------ps摇杆向左下推时执行程序------------------
void LeftDwon_L()
{
Serial.println("LeftDwon_L");
if(SendData!=8)
SendPsCmd(8);
SendData=8;
}
//-------------ps摇杆向右下推时执行程序------------------
void RightDwon_L()
{
Serial.println("RightDwon_L");
if(SendData!=7)
SendPsCmd(7);
SendData=7;
}
//---------------------------------------右边的PS摇杆接口----------------------------------
//-------------ps摇杆向上推时执行程序------------------
void Up_R()
{
Serial.println("up_R");
}
//-------------ps摇杆在中间位置时执行程序------------------
void Middle_R()
{
Serial.println("Middle_R");
}
//-------------ps摇杆向下推时执行程序------------------
void Down_R()
{
Serial.println("Down_R");
}
//-------------ps摇杆向左推时执行程序------------------
void Left_R()
{
Serial.println("Left_R");
}
//-------------ps摇杆向右推时执行程序------------------
void Right_R()
{
Serial.println("Right_R");
}
//-------------ps摇杆向左上推时执行程序------------------
void LeftUp_R()
{
Serial.println("LeftUp_R");
}
//-------------ps摇杆向右上推时执行程序------------------
void RightUp_R()
{
Serial.println("RightUp_R");
}
//-------------ps摇杆向左下推时执行程序------------------
void LeftDwon_R()
{
Serial.println("LeftDwon_R");
}
//-------------ps摇杆向右下下推时执行程序------------------
void RightDwon_R()
{
Serial.println("RightDwon_R");
}
以下为接收端代码
#include "SPI.h" //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"
#include "HG7881Class.h"
HG7881 MotorL;
HG7881 MotorR;
int data;
int aaa;
void setup(){
Serial.begin(9600);
MotorL.setPin(A0,A1);
MotorR.setPin(A2,A5);
Mirf.spi = &MirfHardwareSpi; //加载24L01SPI
Mirf.init();
Mirf.setRADDR((byte *)"serv1"); //接收地址" "
Mirf.payload = sizeof(int); //数据类型(整数)
Mirf.config();
}
void loop(){
aaa=-2;
if(Mirf.dataReady())
{
//如果接收到数据则执行
Mirf.getData((byte *)&data); //接收数据
aaa=data;
Mirf.rxFifoEmpty(); //清理24L01援存??
// Serial.println(aaa);//显示X向 1至1024
}
switch (aaa){
case -1: // 横/竖,中间
Serial.println("Middle");
MotorL.Brake();
MotorR.Brake();
break;
case 1: // 右
Serial.println("Right");
MotorL.Forward();
MotorR.Backward();
break;
case 2: // 左
Serial.println("Left");
MotorR.Forward();
MotorL.Backward();
break;
case 3: // 上
Serial.println("Up");
MotorL.Forward();
MotorR.Forward();
break;
case 4: // 右上
Serial.println("RightUp");
break;
case 5: // 左上
Serial.println("LeftUp");
break;
case 6: // 下
Serial.println("Down");
MotorR.Backward();
MotorL.Backward();
break;
case 7: // 右下
Serial.println("RightDown");
break;
case 8: // 左下
Serial.println("LeftDown");
break;
}
}
以下为程序代码
{:soso_e179:} 8266用sta模式加入路由器,遥控距离应该会更远,穿墙都没问题
nrf24l01就不好说了,通常转两个弯就没了 带功放的nrf24l01可以传比较远,8266的问题是有点费电 我也觉得esp8266比较费电
不过用esp来做就可以少用一块arduino板了,因为接收esp8266-12有很多数字口,驱动hg7881没问题
如果esp8266可以多几个ad就好了
其实用arduino ide for esp8266 来开发程序还是挺容易的,比官方网的说软件容易多了 如此全面的知识水平和动手能力,向LZ学的东西很多,问简单的激光打印机打印在什么上了,用电烙铁来热转印电路图到复铜板上,在复铜板上留下什么就可以直接腐蚀了。 马克,有空学习下。 好玩。热转印做的不错啊 感谢8楼的热转印的提示,谢楼主的帖子,网上查到了。 学习学习学习学习 进来玩模型做个遥控,学习一下 很棒的思路,学习了,多谢 想知道这里为什么要设置一个循环 楼主能解释一下嘛
while(Mirf.isSending())
{ } 必须顶起来
页:
[1]