tom_hsh 发表于 2015-11-6 10:14:39

用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;
}
}

以下为程序代码

Paderboy 发表于 2015-11-6 10:44:33

{:soso_e179:}

tempchar 发表于 2015-11-6 14:33:51

8266用sta模式加入路由器,遥控距离应该会更远,穿墙都没问题
nrf24l01就不好说了,通常转两个弯就没了

nick_zm 发表于 2015-11-6 14:51:00

带功放的nrf24l01可以传比较远,8266的问题是有点费电

tom_hsh 发表于 2015-11-6 15:50:13

我也觉得esp8266比较费电
不过用esp来做就可以少用一块arduino板了,因为接收esp8266-12有很多数字口,驱动hg7881没问题
如果esp8266可以多几个ad就好了
其实用arduino ide for esp8266 来开发程序还是挺容易的,比官方网的说软件容易多了

XIEDQGEWELL 发表于 2015-11-7 09:48:30

如此全面的知识水平和动手能力,向LZ学的东西很多,问简单的激光打印机打印在什么上了,用电烙铁来热转印电路图到复铜板上,在复铜板上留下什么就可以直接腐蚀了。

老胖熊 发表于 2015-11-7 14:53:26

马克,有空学习下。

li23108 发表于 2015-11-7 22:35:37

好玩。热转印做的不错啊

XIEDQGEWELL 发表于 2015-11-9 11:42:43

感谢8楼的热转印的提示,谢楼主的帖子,网上查到了。

原野动力 发表于 2016-5-18 19:52:54

学习学习学习学习

太行摄狼 发表于 2017-8-13 06:20:43

进来玩模型做个遥控,学习一下

haigd 发表于 2017-10-24 19:26:27

很棒的思路,学习了,多谢

x1179047899 发表于 2018-4-14 17:10:15

想知道这里为什么要设置一个循环    楼主能解释一下嘛   
   while(Mirf.isSending())
   { }

zzp1374 发表于 2018-4-16 10:16:06

必须顶起来
页: [1]
查看完整版本: 用nrf24L01做玩具遥控器