极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 28076|回复: 13

用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.电路板的自作
   用激光打印机打印电路图,显卡散热片,铜复板

   用电烙铁来热转印电路图到板上


弄好后

放在腐蚀液里腐蚀电路板

腐蚀完了

用砂纸清理并焊上焊脚


电路板完工



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

以下为程序代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 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 | 显示全部楼层
学习学习学习学习
回复 支持 反对

使用道具 举报

发表于 2017-8-13 06:20:43 | 显示全部楼层
进来玩模型做个遥控,学习一下
回复 支持 反对

使用道具 举报

发表于 2017-10-24 19:26:27 | 显示全部楼层
很棒的思路,学习了,多谢
回复 支持 反对

使用道具 举报

发表于 2018-4-14 17:10:15 | 显示全部楼层
想知道这里为什么要设置一个循环    楼主能解释一下嘛   
     while(Mirf.isSending())
     { }
回复 支持 反对

使用道具 举报

发表于 2018-4-16 10:16:06 | 显示全部楼层
必须顶起来
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 13:36 , Processed in 0.063915 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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