|
本帖最后由 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中
一下代码为遥控器端代码
[pre lang="arduino" line="1" file="send.ino"]#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; //加载24L01 SPI
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");
}
[/code]
以下为接收端代码 - #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; //加载24L01 SPI
- 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;
- }
- }
复制代码
以下为程序代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|