Arduino UNO 可视化GT-24工业级无线透传

news2024/12/26 23:25:40

Arduino UNO 可视化GT-24工业级无线透传

    • 一、前言
    • 二、硬件要求
    • 三、参数基础
    • 四、原理剖析
    • 五、透传思路
    • 六、程序概要
    • 七、arduino使用接线
    • 八、成果展示

一、前言

无线透传市面上较为常见的是基于蓝牙、esp的多种透传模块,今天介绍的则是用NRF24L01芯片构成的电路。(nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片)

整个模块的使用更加专业,传输的距离也更加远,工业级的水准要求,更是保证了数据传输的稳定和信息的抗干扰能力。

二、硬件要求

GT-24模块是一款2.4GHz,100mW,高速(最高空中速率可达到2Mbps),高稳定性,工业级的无线收发一体数传模块。模块自带高性能PCB天线,精确阻抗匹配。

此外还内置RFX2401功放芯片,内建LNA,接收灵敏度提高10dBm,工作2.4GHz~2.5GHz的ISM频段。该模块发射功率足,频谱特性好,谐波小,频道串扰小,体积超小,全部村田原装料,工业级标准的典范。
请添加图片描述
OLED属于一种电流型的有机发光器件,这里作为试验显示作用。因为其显示的特殊性,对于arduino更多的是U8g2库文件的编写以及调用。
请添加图片描述

三、参数基础

GT-24
射频方案 nRF24L01P
模块尺寸 30.3×14.5mm
工作频段 2.4GHz ~ 2.525GHz
生产工艺 无铅环保工艺
接口方式 181.27mm/242.54mm
供电电压 2.0-3.6VDC
通信电平 0.7VCC ~3.3V
实测距离 1000m
发射功率 4 级可调 最大20dBm
空中速率 250k ~ 2Mbps
关断电流 约 30uA
发射电流 约 90mA
接收电流 约20mA
天线形式 PCB 天线/ipex 座子天线
通信接口 SPI
发射长度 单个数据包 1~32 字节
接收长度 单个数据包 1~32 字节
RSSI支持 不支持
接收灵敏度 -94dBm@250kbp
工作温度 -40 ~ +85℃
工作湿度 10% ~ 90%
储存温度 -40 ~ +125℃

oled显示屏
大小: 0.96寸
分辨率:12864
宽电压:3.3-5v
体积:27mm
27mm*2mm
温度范围:-30℃-70℃
使用寿命:≥16000小时
支持协议:iic

四、原理剖析

主芯片nRF24L01内置基带协议引擎 (增强型ShockBurst),设计用于超低功耗无线应用。MCU(微控制器)和 利用nRF24L01设计无线电系统只需极少的外部无源元件。nRF24L01通过串行外设接口(SPI)进行配置和操作。)通过该接口,寄存器映射是可用的。寄存器映射包含nRF24L01中的所有配置寄存器 并且在芯片的所有操作模式下都是可访问的。
在这里插入图片描述
模块为 nRF24L01P+PA+LNA,其驱动方式完全等同于 nRF24L01P,可以完全遵照 nRF24L01P 芯片手册进行操作。
①CE 引脚和LNA 使能引脚相连接,当 CE=1 时,LNA 被打开,当 CE=0 时,LNA 被关闭。 此操作个 nRF24L01 的收发模式是完全吻合的,完全不用去管LNA。
②CE 可以长期接高电平,但是模块写寄存器时必须首先设置为 POWER DOWN 掉电模式,建议连接 CE 到单片机 IO 口。IRQ 可不接,可采用 SPI 查询方式来获取中断状态。但是建议使用单片机外部中断。
③模块的 CE 引脚时序操作可采用 nRF24L01 的手册要求,高电平时间大于 10us 就行。
在这里插入图片描述
oled使用相关的U8g2库,选择合适的分辨率和尺寸,进行显示字符。
请添加图片描述

五、透传思路

通过两块同样的模块进行收发,由开发板进行编码程序和解码程序,期间注意几个要点:
①发射、接收,都需要在视野开阔和尽量少干扰、甚至无干扰的环境状态下,这样信号才能传输的更稳定、完整和远。
②通道一致,编解码的时候,需要注意的是发射和接收地址区分开,但是所使用的通道必须一致,频段一致,才能正常收发。
在这里插入图片描述

六、程序概要

下面展示本次所需要的程序代码,首先是tx,发送使用:

#include  <U8glib.h>
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//引用库文件,128✖64就是对oled的分辨率进行设置
char str1[]="youxindianzi";
char str2[]="Send of number:";
uint8_t convert[6]={0}; //定义所占用的字节数
uint8_t all,one;

uint32_t oled_liang(uint8_t a,uint8_t b)
{
  uint32_t m=1;  
  while(b--)m*=a;    
  return m;          //递归函数调用
}
void show_liang(uint8_t* Tx_str,uint8_t lon,uint8_t rw)   
{           
  uint8_t c,type;
  uint8_t EN=0;    
  for(c=0;c<rw;c++)
  {
    type=(lon/oled_liang(10,rw-c-1))%10;
    
    *Tx_str =  type+0x30;
    Tx_str++; 
  } 
}             //把16进制数组转换为字符
void u8g_transfer(void) {
  u8g.setFont(u8g_font_6x10);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop();
}                           //调用库函数指令
void setup()
{
 u8g_transfer();//初始化字体,屏幕参数
  u8g.firstPage();  
    do {
      u8g.drawStr(30,0,(char *)str1);    //调用行列,屏幕显示字体 
      u8g.drawStr(0,10,(char *)str2);      //调用行列,屏幕显示字体 
   } 
    while( u8g.nextPage() );       //循环空格填补
    
    Mirf.spi = &MirfHardwareSpi;  //调用spi协议
    Mirf.init();                 //初始化
    Mirf.setRADDR((byte *)"ABCDE"); //设置自己的地址(发送端地址),使用5个字符
    Mirf.payload = sizeof(one);      //返回上面的定义变量的字节数
    Mirf.channel = 90;              //设置所用信道
    Mirf.config();
}
 
void loop()
{
   Mirf.setTADDR((byte *)"ABCDE");           //设置接收端地址
 one = random(255);                      //0-255的随机数
  Mirf.send((byte *)&one);                //发送指令,发送随机数value
  while(Mirf.isSending()) delay(1);         //直到发送成功,退出循环
  
   show_liang(convert,all,3);
   u8g.firstPage();                     
    do {
      u8g.drawStr(30,0,(char *)str1);        //继续调用行列,屏幕显示字体 
      u8g.drawStr(0,10,(char *)str2);         //继续调用行列,屏幕显示字体 
      u8g.drawStr(100,10,convert);           //增加显示上面定义的字节数
      } 
    while( u8g.nextPage() );
    all++;
    delay(1000);
}
 

然后是rx,接收使用:

#include <U8glib.h>
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);        
char str1[]="youxindianzi";
char str2[]="accepting of data:";
uint8_t convert[6]={0};  //定义所占用的字节数
uint8_t all,one;


uint32_t oled_liang(uint8_t a,uint8_t b)
{
  uint32_t m=1;  
  while(b--)m*=a;    
  return m;
}           //递归函数调用
void show_liang(uint8_t* Tx_str,uint8_t lon,uint8_t rw)   
{           
  uint8_t c,type;
  uint8_t EN=0;    
  for(c=0;c<rw;c++)
  {
    type=(lon/oled_liang(10,rw-c-1))%10;
    
    *Tx_str =  type+0x30;
    Tx_str++;
  }
}                  //把16进制数组转换为字符
                           
void u8g_prepare(void) {
  u8g.setFont(u8g_font_6x10);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop();
}                               //调用库函数指令

void setup()
{
  u8g_prepare();//初始化字体,屏幕参数
  u8g.firstPage();  
    do {
      u8g.drawStr(30,0,(char *)str1);      //调用行列,屏幕显示字体 
      u8g.drawStr(0,10,(char *)str2);       //调用行列,屏幕显示字体   
   } 
    while( u8g.nextPage() );      //循环空格填补
    
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();
    Mirf.setRADDR((byte *)"ABCDE"); //设置自己的地址(发送端地址),使用5个字符
    Mirf.payload = sizeof(one);         //返回上面的定义变量的字节数
    Mirf.channel = 90;              //设置所用信道
    Mirf.config();
}
 
void loop()
{
   if(Mirf.dataReady()) { 
    Mirf.getData((byte *) &one);
     show_liang(convert,one,3); //当接收到信息,便从oled显示输出接收到的数据
     Serial.begin(9600);               
      Serial.println("arrive");//当接收到信息,便从串口显示arrive,表示响应
    u8g.firstPage();  
    do {
          u8g.drawStr(100,10,convert);
       } 
    while( u8g.nextPage() );
 }
}

七、arduino使用接线

线路连接:
RF24L01: VCC 3.3V
GND GND
CE D8
IRQ –
CSN D7
SCK D13
MOSI D11
MISO D12

  OLED显示(IIC):  VCC        3.3V
                GND        GND
                SCL        A5
                SDA        A4

在这里插入图片描述

八、成果展示

请添加图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ5.0 Broker主备自动切换模式消息不丢失部署方案

RocketMQ5.0主备自动切换模式下消息的不丢失方案如何进行部署&#xff1f;下面就来看一下 1. 下载RocketMQ5.0 首先我们去官网将RocketMQ5.0的版本下载下来。 $ wget https://dlcdn.apache.org/rocketmq/5.0.0/rocketmq-all-5.0.0-bin-release.zip 复制代码 下载完成后解压到…

Spring常用注解——@Autowired自动装配的作用和原理

一. 认识Autowired 当我们在Spring框架中配置Bean时&#xff0c;常见的有三种办法&#xff1a;①使用xml ②使用注解 ③使用javeconfig。由于第一种方法需要在application.xml配置文件中使用大量<bean>标签来进行注入&#xff0c;就衍生了注解&#xff0c;我们只要使用A…

Paper写作开头部分怎么具体分析?

Paper的组成部分包括了正文以及结尾&#xff0c;不过Paper整体印象很大程度上是由Paper开头段决定的。然而&#xff0c;写好Paper开头并不是一件不费吹灰之力的事。那么&#xff0c;Paper开头怎么写&#xff1f;接下来就让小编来给大家讲解几个写Paper开头的方法&#xff0c;希…

【python】之字典及其操作

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 特别标注&#xff1a;仅为自己的学习记录笔记&#xff0c;方便复习和加深记忆&#xff0c;仅供借鉴参考&#xff01; 目录 前言 字典的创建 格式 字典名{key1:value1,key2:value2......} 字典名di…

大前端进阶:vue

目录 1.vue概述与前端知识体系 1.vue概述 2.前端三要素 2.前端发展史 1.三端统一 2.后端技术 3.了解前后分离的演变史 1.后端为主的MVC时代 2.基于AJAX带来的SPA时代 3.前端为主的MV*时代 4.Node JS带来的全栈时代 5.总结 4.第一个Vue程序 1.什么是MVVM 2.为什么…

每天一个小细节:UDP协议特点与报文结构

在上一期的《每天应该小细节》中&#xff0c;外面介绍了协议这个概念&#xff0c;那么在我们的传输层有两个非常重要的协议&#xff0c;那便是TCP/IP和UDP协议&#xff0c;那么今天就来详细介绍一下UDP协议的主要内容。 上期每天一个小细节指路&#x1f432;&#x1f432;&…

【马里奥数据结构吃“金币”】时间复杂度和空间复杂度

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《数据结构》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 时间复杂度&#xff1a; 大O渐进表示法&#xff1a; 空间复杂度&#x…

文件操作学不会?快进来,带你深入理解->C语言文件操作

你将收获&#xff1a; 进一步理解缓冲区&#xff0c;以及引申出getchar(),scanf("%c",&c)接收数据时&#xff0c;易踩坑的地方&#xff0c;并对其解释。 w,r,a打开文件后如何正确使用读、写函数。 还有其它收获… 文件为什么存在什么是文件文件的唯一标识符缓冲文…

【FLASH存储器系列一】非易失性存储器基本原理之EPROM

1非易失性器件的存储原理 1.1最小存储单元-浮栅晶体管 我们当前使用的非易失性存储器的基本存储单元基本都是浮栅晶体管。技术在发展&#xff0c;浮栅晶体管的结构也在调整演进&#xff0c;接下来将用系列文章中的三篇分享EPROM、EEPROM、FLASH这三种非易失存储器件的基本存储…

麒麟系统开发笔记(九):在国产麒麟系统上搭建宇视摄像头SDK基础环境Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/127532255 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

链路状态路由协议 OSPF (二)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.Router ID 1.什么是Router ID 2.获得Router ID方法 二.DR和…

每日一题(day9)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录俩到经典题目一、走方格的方案数题目描述解题分析代码演示二.另类加法题目描述&#xff1a;解题分析常见的位运算代码演示总结俩到经典题目 一、走方格的方案数 题目…

【小嘟陪你刷题14】二叉树的最小深度、二叉树的所有路径、翻转二叉树

目录一、二叉树的最小深度思路一&#xff1a;深度优先搜索代码实现思路二&#xff1a;广度优先搜索代码实现二、二叉树的所有路径思路一&#xff1a;递归法代码实现思路二&#xff1a;迭代法三、翻转二叉树思路一&#xff1a;递归法代码实现思路二&#xff1a;迭代法代码实现一…

controller传输from-data数据格式的内容,取出传入数据为from-data格式的值

传输from-data数据格式的内容 postman里面的格式如下 接下来&#xff0c;便将上面的内容转换为代码 第一步&#xff1a;将File转为MultipartFile格式 首先&#xff0c;我们只能将File转为改格式才能进行网络传输&#xff0c;转换方式请看这篇博客&#xff1a;https://blog.…

推动行业数字化转型,亚马逊云科技自身就是“好把式”

&#xff08;亚马逊全球副总裁、亚马逊云科技大中华区执行董事张文翊&#xff09; 在2022年10月的亚马逊云科技中国峰会上&#xff0c;亚马逊云科技宣布了四大战略举措——“连中外、襄百业、携伙伴、促绿色“&#xff0c;进一步为中国本地客户赋能数字化探索与创新&#xff0…

顺序表实现—数据结构

文章目录一、顺序表概念及结构二、动态顺序表和静态顺序表的选择三、动态顺序表的实现逻辑&#xff08;1&#xff09;创建结构体&#xff08;2&#xff09;具体函数实现&#xff08;*&#xff09;顺序表初始化&#xff08;*&#xff09;释放顺序表&#xff08;*&#xff09;打印…

青少年python系列 21.turtle库绘制一个8

#绘制一个8import turtle#上方的小圆&#xff0c;圆心在左turtle.circle(80)#下方的大圆&#xff0c;圆心在右turtle.circle(-100)turtle.done() 青少年python教学视频ppt源码 青少年python系列目录_老程序员115的博客-CSDN博客 csdn文章推荐受影响解决办法10个字10行 csdn文…

梦开始的地方—— C语言指针入门

文章目录指针入门1.指针概念2. 指针和指针类型3. 野指针造成野指针的原因如何避免野指针4. 指针的运算指针加减整数指针的运算关系指针的关系运算5.指针和数组6. 二级指针7. 指针数组指针入门 1.指针概念 指针(Pointer) 是编程语言中的一个对象&#xff0c;利用地址&#xff…

31、Java——JDBC实现账号密码登录

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;乐趣国学的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

Kong自动注册kong-spring-boot-stater

前言 kong-spring-boot-stater框架是为了解决SpringBoot项目和kong网关的自动注册&#xff0c;虽然Kong网关有提供可视化管理后台的操作界面&#xff0c;但是在多服务、多环境的时候在管理后台挨个配置每个服务节点是比较麻烦的&#xff0c;所以这也是kong-spring-boot-stater…