极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2690|回复: 10

用nrf24L01做玩具遥控器

[复制链接]
发表于 2015-11-6 10:14:39 | 显示全部楼层 |阅读模式
本帖最后由 tom_hsh 于 2015-11-6 10:14 编辑

近来心血来潮想做一个玩具遥控器,本来想用esp8266-12做,后来考虑到esp的遥控距离比较近,所以用了nrf24l01来做
材料有:
arduino nona      2块(遥控器和接收器各一块)
nrf24l01             2块
hg7881              1块
ps摇杆                1个
自制电路板          2块

自作过程
1.电路板的自作
   用激光打印机打印电路图,显卡散热片,铜复板
1.png
   用电烙铁来热转印电路图到板上
2.png
3.png
弄好后
4.png
放在腐蚀液里腐蚀电路板
5.png
腐蚀完了
6.png
用砂纸清理并焊上焊脚
7.png
8.png
电路板完工
10.png
11.png

遥控器和接收器其实都是同一块板,只是程序不同,接的东西不同而已
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]


以下为接收端代码
  1. #include "SPI.h"                              //24L01库文件
  2. #include "Mirf.h"
  3. #include "nRF24L01.h"
  4. #include "MirfHardwareSpiDriver.h"

  5. #include "HG7881Class.h"

  6. HG7881 MotorL;
  7. HG7881 MotorR;

  8. int data;
  9. int aaa;


  10. void setup(){   
  11.   Serial.begin(9600);
  12.   
  13.   MotorL.setPin(A0,A1);
  14.   MotorR.setPin(A2,A5);


  15.   Mirf.spi = &MirfHardwareSpi;          //加载24L01  SPI
  16.   Mirf.init();
  17.   Mirf.setRADDR((byte *)"serv1"); //接收地址" "
  18.   Mirf.payload = sizeof(int);            //数据类型(整数)
  19.       Mirf.config();
  20.      
  21. }

  22. void loop(){
  23.   aaa=-2;
  24.   if(Mirf.dataReady())
  25.   {   
  26.       //如果接收到数据则执行
  27.      Mirf.getData((byte *)&data);   //接收数据
  28.      aaa=data;
  29.       Mirf.rxFifoEmpty();   //清理24L01援存??
  30.      // Serial.println(aaa);  //显示X向 1至1024
  31.       
  32.   }
  33.     switch (aaa){
  34.     case -1: // 横/竖,中间
  35.            Serial.println("Middle");  
  36.            MotorL.Brake();
  37.            MotorR.Brake();
  38.       break;
  39.     case 1: // 右
  40.           Serial.println("Right");
  41.           MotorL.Forward();
  42.            MotorR.Backward();      
  43.       break;
  44.     case 2: // 左
  45.           Serial.println("Left");
  46.           MotorR.Forward();
  47.            MotorL.Backward();  
  48.       break;
  49.     case 3: // 上
  50.                Serial.println("Up");
  51.            MotorL.Forward();
  52.            MotorR.Forward();  
  53.       break;
  54.     case 4: // 右上
  55.                 Serial.println("RightUp");
  56.       break;
  57.     case 5: // 左上
  58.                 Serial.println("LeftUp");
  59.       break;
  60.     case 6: // 下
  61.                 Serial.println("Down");
  62.            MotorR.Backward();
  63.            MotorL.Backward();  
  64.       break;
  65.     case 7: // 右下
  66.                 Serial.println("RightDown");
  67.       break;
  68.     case 8: // 左下
  69.                 Serial.println("LeftDown");
  70.       break;
  71.   }
  72. }
复制代码

以下为程序代码
nrf24l01.zip (4.92 KB, 下载次数: 57)
9.png
回复

使用道具 举报

发表于 2015-11-6 10:44:33 | 显示全部楼层
{:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2015-11-6 14:33:51 | 显示全部楼层
8266用sta模式加入路由器,遥控距离应该会更远,穿墙都没问题
nrf24l01就不好说了,通常转两个弯就没了
回复 支持 反对

使用道具 举报

发表于 2015-11-6 14:51:00 | 显示全部楼层
带功放的nrf24l01可以传比较远,8266的问题是有点费电
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-6 15:50:13 | 显示全部楼层
我也觉得esp8266比较费电
不过用esp来做就可以少用一块arduino板了,因为接收esp8266-12有很多数字口,驱动hg7881没问题
如果esp8266可以多几个ad就好了
其实用arduino ide for esp8266 来开发程序还是挺容易的,比官方网的说软件容易多了
回复 支持 反对

使用道具 举报

发表于 2015-11-7 09:48:30 | 显示全部楼层
如此全面的知识水平和动手能力,向LZ学的东西很多,问简单的激光打印机打印在什么上了,用电烙铁来热转印电路图到复铜板上,在复铜板上留下什么就可以直接腐蚀了。
回复 支持 反对

使用道具 举报

发表于 2015-11-7 14:53:26 | 显示全部楼层
马克,有空学习下。
回复 支持 反对

使用道具 举报

发表于 2015-11-7 22:35:37 | 显示全部楼层
好玩。热转印做的不错啊
回复 支持 反对

使用道具 举报

发表于 2015-11-9 11:42:43 | 显示全部楼层
感谢8楼的热转印的提示,谢楼主的帖子,网上查到了。
回复 支持 反对

使用道具 举报

发表于 2016-5-18 19:52:54 | 显示全部楼层
学习学习学习学习
回复 支持 反对

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2017-10-18 04:30 , Processed in 0.157325 second(s), 6 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表