自制遥控小车,遥控距离可达2000米? (nrf24l01射频数块+Arduino nano+L297N)

Posted 弓长于水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自制遥控小车,遥控距离可达2000米? (nrf24l01射频数块+Arduino nano+L297N)相关的知识,希望对你有一定的参考价值。

之前介绍了用esp8266做了一个用手机app控制的WiFi小车,只要实现给小车的不断供网,基本实现了小车的无视距离范围的测试

没有看过的朋友可以去看看,传送门在下面:
不受距离限制的无线小车

但是做出来的小车也许不难发现控制的延迟度比较高,今天博主就给大家带来一个几乎0延迟的遥控小车,控制距离按照射频模块来说是有2000米距离,但是博主测试隔着墙体貌似只有50米到100米的控制距离

遥控小车

不多说直接进入正题


首先做我们这次的遥控小车需要什么呢

材料元件:
  1. 小车机身(包括4个轮子,4个电机)
  2. 2个nrf24l01射频模块
  3. 2个Arduino nano开发板
  4. 若干杜邦线(最好三种都有)
  5. 若干两脚立式按钮
  6. 1块小的面包板
  7. l298n(红板)
  8. 电源(可以使用充电宝,博主就是用的充电宝)
编程环境:arduino IDE

1、Arduino IDE根据自己的系统安装合适的版本

Arduino IDE的版本博主推荐1.8.9以上的版本,比较容易下载库

这次的项目用到的库有

#include “SPI.h”
#include “Mirf.h”
#include “nRF24L01.h”
#include “MirfHardwareSpiDriver.h”

在软件里面直接搜索添加下载即可


2,小车基本动作的实现方法以及L298N的原理

这里上篇文章也说过了,没有看过的朋友建议去上篇文章了解一下,当然,如果你只是想做出来,不用了解也能做出来

传送门:不受距离限制的无线小车


3,接线图

小车接线图

遥控器接线图

面包板上面的4个按钮就是前进后退左转右转,遥控器可以直接充电宝供电哦

这次的有点复杂而且博主画的不是很好看,大家见谅


4,遥控器以及小车代码

Arduino的烧录过程就不用我多说了吧,不知道的朋友可以去看我以前的文章

小车代码:

#include "SPI.h"                              //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"

int Y;

void setup(){  
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  Mirf.cePin = 9;                   //设置CE引脚为D9
  Mirf.csnPin = 10;                 //设置CSN引脚为D10
  Mirf.spi = &MirfHardwareSpi;      //加载24L01  SPI
  Mirf.init();
  Mirf.setRADDR((byte *)"serv1");   //接收地址" "
  Mirf.payload = sizeof(int);       //数据类型(整数)
  Mirf.channel = 6;                 //数据通道 3
  Mirf.config(); 
  Serial.begin(9600);              //比特率 9600
}

void forward(){
     digitalWrite(2,HIGH); 
     digitalWrite(3,LOW); 
     digitalWrite(4,HIGH); 
     digitalWrite(5,LOW);
     delay(30);
}


void back(){
     digitalWrite(2,LOW); 
     digitalWrite(3,HIGH); 
     digitalWrite(4,LOW); 
     digitalWrite(5,HIGH);
     delay(30);
}


void Turnleft(){
     digitalWrite(2,LOW); 
     digitalWrite(3,HIGH); 
     digitalWrite(4,HIGH); 
     digitalWrite(5,LOW);
     delay(30);
}

void Turnright(){
     digitalWrite(2,HIGH); 
     digitalWrite(3,LOW); 
     digitalWrite(4,LOW); 
     digitalWrite(5,HIGH);
     delay(30);
}


void stop_run(){
     digitalWrite(2,LOW); 
     digitalWrite(3,LOW); 
     digitalWrite(4,LOW); 
     digitalWrite(5,LOW); 
  
}

void loop(){
  if(Mirf.dataReady()){                          //如果接收到数据则执行
    Mirf.getData((byte *)&Y);   //接收数据
    if(Y==5){
      forward();
      Turnleft();  
    }
    else if(Y==6){
      forward();
      Turnright();
    }
    else if(Y==7){
      back();
      Turnleft();  
    }
    else if(Y==8){
      back();
      Turnright();  
    }
    else if(Y==1){ 
      forward();
     }
    else if(Y==2){
      back();
     }
    else if(Y==3){
      Turnright();
     }
    else if(Y==4){
      Turnleft();
     }
    else{
      stop_run();
     }
    Serial.print("Y=");
    Serial.println(Y);
    Mirf.rxFifoEmpty();            //清理24L01缓存
    } 
    
}

遥控器代码

#include "SPI.h"      //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"

int X;
int A;
int B;
int C;
int D;

void setup(){  
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(4,INPUT_PULLUP);
  pinMode(5,INPUT_PULLUP);
  Mirf.cePin = 9;                   //设置CE引脚为D9
  Mirf.csnPin = 10;                 //设置CSN引脚为D10
  Mirf.spi = &MirfHardwareSpi;      //加载24L01  SPI
  Mirf.init();                      //开始
  Mirf.setTADDR((byte *)"serv1");   //发送到"接收地址"
  Mirf.payload = sizeof(int);       //数据类型(整数)
  Mirf.channel = 6;
  Mirf.config(); 
  Serial.begin(9600);
}
void loop(){
  A = digitalRead(2);
  B = digitalRead(3);
  C = digitalRead(4);
  D = digitalRead(5);
  if(A==LOW && D==LOW){
    X=5;
  }
  else if(A==LOW && C==LOW){
    X=6;  
  }
  else if(B==LOW && D==LOW){
    X=7;  
  }
  else if(B==LOW && C==LOW){
    X=8;  
  }
  else if(A==LOW){ 
    X=1;
  }
  else if(B==LOW){
    X=2;
  }
  else if(C==LOW){
    X=3;  
  }
  else if(D==LOW){
    X=4;  
  }
  else{
    X=0;  
  }
   Serial.print("X=");
   Serial.println(X);
   Mirf.send((byte *)&X);           //发送
   while(Mirf.isSending()){         //等待或继续发送
   }
   delay(100);                      // 等待20ms
}

烧录进去就可以控制小车了


遇到什么困难的地方可以联系博主,感谢您的浏览,不嫌弃的话点个收藏点赞,关注博主持续更新好玩的嵌入式项目

以上是关于自制遥控小车,遥控距离可达2000米? (nrf24l01射频数块+Arduino nano+L297N)的主要内容,如果未能解决你的问题,请参考以下文章

使用arduino ps2无线遥控手柄实现 遥控小车

FFHOpenHarmony设备开发-基于TCP遥控小车

怎么利用单片机 红外遥控 实现小车向左转和向右转

TurnipBit之DIY无线遥控智能小车

[树莓派] 轻松制作一个遥控小车(C++,Socket)

[树莓派] 轻松制作一个遥控小车(C++,Socket)