Arduino教程——NRF24L01模块的使用-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 82854|回复: 42

Arduino教程——NRF24L01模块的使用

  [复制链接]
发表于 2014-12-17 15:49 | 显示全部楼层 |阅读模式
草稿,还未写完

arduino-nrf24l01

arduino-nrf24l01


测试可以通信,但非常不稳定,具体原因不详。
库下载: RF24.zip (202.94 KB, 下载次数: 3279)
原地址:https://github.com/maniacbug/RF24

常用函数:

RF24 (uint8_t _cepin, uint8_t _cspin)

构造函数
void
begin (void)

初始化
void

开始监听指定的通道
void

停止监听
bool
write (const void *buf, uint8_t len)

向指定通道发送数据
bool
available (void)

检查是否有接收到数据
bool
read (void *buf, uint8_t len)

Read the payload.
void
openWritingPipe (uint64_t address)

打开数据发送通道.
void
openReadingPipe (uint8_t number, uint64_t address)

打开数据接收通道.

硬件连接方法:(图)
将NRF24L01的SPI引脚与Arduino的SPI引脚相连,模块CE和CSN引脚可以连接到Arduino任意引脚,模块的VCC需要连接到arduino的3.3V引脚上,在MOSI和CSK引脚和arduino引脚间,最好分别串联一个100欧电阻。

使用NRF24L01需要先包含以下头文件:[mw_shl_code=cpp,true]#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"[/mw_shl_code]

并建立一个radio对象
[mw_shl_code=c,true]RF24 radio(9,10);[/mw_shl_code]
两个参数分别为Arduino连接CE和CSN的引脚


发送端:
[mw_shl_code=cpp,true]
/*

*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(void){
  Serial.begin(57600);
  radio.begin();
  radio.openWritingPipe(pipe);
  radio.printDetails();
  pinMode(2,INPUT_PULLUP);
}

char command[6]="hello";

void loop(void)
{
  uint8_t state = ! digitalRead(2);
  if (digitalRead(2)==LOW){
        Serial.print("Sending...");
        bool ok = radio.write(command,5);
        if(ok)
          Serial.println("successed");
        else
          Serial.println("failed");
      }
     delay(500);  
}

[/mw_shl_code]


接收端:
[mw_shl_code=cpp,true]
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(void){
  Serial.begin(57600);
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  radio.printDetails();
}

void loop(void){
    char command[6];
    if (radio.available()){
      radio.read( command, 5 );      Serial.println(command[0]);
      delay(500);
    }
}
[/mw_shl_code]

通常以上程序就可以完成简单的点对点传输了,当然,RF24库还提供了其他可选配置:
void
setRetries (uint8_t delay, uint8_t count)

Set the number and delay of retries upon failed submit.
void
setChannel (uint8_t channel)

Set RF communication channel.
void
setPayloadSize (uint8_t size)

Set Static Payload Size.
uint8_t

Get Static Payload Size.
uint8_t

Get Dynamic Payload Size.
void

Enable custom payloads on the acknowledge packets.
void

Enable dynamically-sized payloads.
bool
isPVariant (void)

Determine whether the hardware is an nRF24L01+ or not.
void
setAutoAck (bool enable)

Enable or disable auto-acknowlede packets.
void
setAutoAck (uint8_t pipe, bool enable)

Enable or disable auto-acknowlede packets on a per pipeline basis.
void

Set Power Amplifier (PA) level to one of four levels.
getPALevel (void)

Fetches the current PA level.
bool

Set the transmission data rate.

Fetches the transmission data rate.
void

Set the CRC length.

Get the CRC length.
void
disableCRC (void)

Disable CRC validation.








发表于 2015-1-24 13:04 | 显示全部楼层
只输出一个乱码啊
发表于 2014-12-24 11:32 | 显示全部楼层
{:soso_e179:}
发表于 2014-12-23 16:05 | 显示全部楼层
真是太棒了,好好学习,肯定涨姿势啊
发表于 2014-12-22 09:39 | 显示全部楼层
正在研究这个,多谢分享!
 楼主| 发表于 2014-12-18 22:05 | 显示全部楼层
mayaan2014 发表于 2014-12-18 22:01
想做个无线收发控制的,而且发射端可以通过接收端的返回信息显示设备当前的开关状态,这样的程序应该怎么做 ...

可行,发送完成后,发送端变接收端,接收端变发送端,再发一次就行,如果只是点对点,也不用啥IP
发表于 2014-12-18 22:01 | 显示全部楼层
想做个无线收发控制的,而且发射端可以通过接收端的返回信息显示设备当前的开关状态,这样的程序应该怎么做,我的想法是在发射端的程序里加个接收的ip,然后每次发射时,接收端处理完操作,再发射相关代码给发射端ip,请问这样想法可行吗,或者给个更加好的方法,最近比较忙也没时间写程序,请会的兄弟给些建议

点评

可行,发送完成后,发送端变接收端,接收端变发送端,再发一次就行,如果只是点对点,也不用啥IP  详情 回复 发表于 2014-12-18 22:05
发表于 2014-12-18 21:53 | 显示全部楼层
多谢奈何,赶紧发接收端的程序吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:55 , Processed in 0.488936 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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