【雕爷学编程】Arduino动手做(112)---2.4G24L01无线模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百一十二: NRF24L01+ 无线模块 功率加强版 2.4G无线收发通信模块 黑金刚
NRF24L01
是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设置可以通过SPI 接口进行设置。几乎可以连接到各种单片机芯片,并完成无线数据传送工作。极低的电流消耗:当工作在发射模式下发射功率为0dBm 时电流消耗为11.3mA ,接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。
NRF24L01无线模块接口说明
(1) VCC 脚接电压范围为 1.9V~3.6V 之间,不能在这个区间之外,超过 3.6V 将会烧毁模块。推荐电压 3.3V 左右。
(2) 除电源 VCC 和接地端,其余脚都可以直接和普通的 5V 单片机 IO口直接相连,无需电平转换。当然对 3V 左右的单片机更加适用了。
(3) 硬件上面没有 SPI 的单片机也可以控制本模块,用普通单片机 IO口模拟 SPI 不需要单片机真正的串口介入,只需要普通的单片机 IO 口就可以了,当然用串口也可以了。
NRF24L01无线模块的特点
低应用成本:NRF24L01集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等,NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。
便于开发:由于链路层完全集成在模块上,非常便于开发。自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制自动存储未收到应答信号的数据包自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程载波检测—固定频率检测内置硬件CRC检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用于跳频设置可同时设置六路接收通道地址,可有选择性的打开接收通道标准插针Dip2.54MM间距接口,便于嵌入式应用。
实验一百一十二: NRF24L01+ 无线模块 功率加强版 2.4G无线收发通信模块 黑金刚
接线示意图
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百一十二: NRF24L01+ 无线模块 功率加强版 2.4G无线收发通信模块 黑金刚 1、安装“Mirf”库(下载链接 https://github.com/aaronds/arduino-nrf24l01) 安装“rf24”库(下载链接 https://github.com/nRF24/RF24) 2、项目测试 :NRF24L01最简单测试之Client 示例代码 3、模块接线 Arduino uno --- nRF24L01 3.3V --- VCC:模块供电引脚 GND --- GND:模块接地引脚 D7 --- CSN:接收端选择引脚 D8 --- CE:发射/接受状态选择引脚 D11 --- MOSI :控制端输出,接收端输入引脚 D13 --- SCK:时钟信号 D12 --- MISO:控制端输入,接收端输出引脚 *IRQ引脚在本例中不需要接 */ #include <SPI.h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h> void setup(){ Serial.begin(9600); /* * Setup pins / SPI. */ /* To change CE / CSN Pins: * * Mirf.csnPin = 9; * Mirf.cePin = 7; */ /* Mirf.cePin = 7; Mirf.csnPin = 8; */ Mirf.spi = &MirfHardwareSpi; Mirf.init(); /* * Configure reciving address. */ Mirf.setRADDR((byte *)"clie1"); /* * Set the payload length to sizeof(unsigned long) the * return type of millis(). * * NB: payload on client and server must be the same. */ Mirf.payload = sizeof(unsigned long); /* * Write channel and payload config then power up reciver. */ /* * To change channel: * * Mirf.channel = 10; * * NB: Make sure channel is legal in your area. */ Mirf.config(); Serial.println("Beginning ... "); } void loop(){ unsigned long time = millis(); Mirf.setTADDR((byte *)"serv1"); Mirf.send((byte *)&time); while(Mirf.isSending()){ } Serial.println("Finished sending"); delay(10); while(!Mirf.dataReady()){ //Serial.println("Waiting"); if ( ( millis() - time ) > 1000 ) { Serial.println("Timeout on response from server!"); return; } } Mirf.getData((byte *) &time); Serial.print("Ping: "); Serial.println((millis() - time)); delay(1000); }
实验串口返回情况
Arduino实验开源代码之二
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百一十二: NRF24L01+ 无线模块 功率加强版 2.4G无线收发通信模块 黑金刚 1、安装“Mirf”库(下载链接 https://github.com/aaronds/arduino-nrf24l01) 安装“rf24”库(下载链接 https://github.com/nRF24/RF24) 2、项目测试 :NRF24L01最简单测试之Server示例代码 3、模块接线 Arduino uno --- nRF24L01 3.3V --- VCC:模块供电引脚 GND --- GND:模块接地引脚 D7 --- CSN:接收端选择引脚 D8 --- CE:发射/接受状态选择引脚 D11 --- MOSI :控制端输出,接收端输入引脚 D13 --- SCK:时钟信号 D12 --- MISO:控制端输入,接收端输出引脚 *IRQ引脚在本例中不需要接 */ #include <SPI.h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h> void setup(){ Serial.begin(9600); /* * Set the SPI Driver. */ Mirf.spi = &MirfHardwareSpi; /* * Setup pins / SPI. */ Mirf.init(); /* * Configure reciving address. */ Mirf.setRADDR((byte *)"serv1"); /* * Set the payload length to sizeof(unsigned long) the * return type of millis(). * * NB: payload on client and server must be the same. */ Mirf.payload = sizeof(unsigned long); /* * Write channel and payload config then power up reciver. */ Mirf.config(); Serial.println("Listening..."); } void loop(){ /* * A buffer to store the data. */ byte data[Mirf.payload]; /* * If a packet has been recived. * * isSending also restores listening mode when it * transitions from true to false. */ if(!Mirf.isSending() && Mirf.dataReady()){ Serial.println("Got packet"); /* * Get load the packet into the buffer. */ Mirf.getData(data); /* * Set the send address. */ Mirf.setTADDR((byte *)"clie1"); /* * Send the data back to the client. */ Mirf.send(data); /* * Wait untill sending has finished * * NB: isSending returns the chip to receving after returning true. */ Serial.println("Reply sent."); } }
实验串口返回情况
实验场景图
实验开源仿真编程(Linkboy V4.62)