NRF24L01 与 ATtiny 和 Uno 未连接

Posted

技术标签:

【中文标题】NRF24L01 与 ATtiny 和 Uno 未连接【英文标题】:NRF24L01 with ATTiny and Uno not connecting 【发布时间】:2016-04-15 00:27:28 【问题描述】:

我有一个 ATtiny85 使用此接线图连接到 NRF24L01+ 模块:diagram。 ATtiny85 会定期进出睡眠,以向接收器 Arduino Uno 发送一些值。如果 ATTiny 使用 Arduino 电源 (3.3v),一切正常。当我从提供大约 3v 的单独 CR2032 纽扣电池上运行 ATTiny 时,Arduino 永远不会收到任何数据。我有一个连接到 ATTiny 的状态 LED,以确保 ATTiny 正确唤醒,就是这样。这是两者的代码:

编辑: 将其连接到不是来自 Uno 的外部 3.3v 即可使一切正常 - 为什么纽扣电池的电压不起作用?我认为所有东西的额定电压都低于 2.8v,即 CR2032 的最小值。

ATTiny 代码

#include <avr/sleep.h>
#include <avr/interrupt.h>

// Routines to set and claer bits (used in the sleep code)
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define CE_PIN 3
#define CSN_PIN 3 //Since we are using 3 pin configuration we will use same pin for both CE and CSN

#include "RF24.h"

RF24 radio(CE_PIN, CSN_PIN);

byte address[11] = "SimpleNode";
unsigned long payload = 0;

void setup() 
  radio.begin(); // Start up the radio
  radio.setAutoAck(1); // Ensure autoACK is enabled
  radio.setRetries(15,15); // Max delay between retries & number of retries
  radio.openWritingPipe(address); // Write to device address 'SimpleNode'
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  delay(500);
  digitalWrite(4, LOW);
  delay(500);
  digitalWrite(4, HIGH);
  delay(500);
  digitalWrite(4, LOW);
  delay(500);
  digitalWrite(4, HIGH);
  delay(500);
  digitalWrite(4, LOW);
  delay(1000);
  setup_watchdog(6);


volatile int watchdog_counter = 0;

ISR(WDT_vect) 
  watchdog_counter++;


void loop() 

  sleep_mode(); //Go to sleep!

  if(watchdog_counter >= 5)
  
    digitalWrite(4, HIGH);
    watchdog_counter = 0;
    payload = 123456;
    radio.write( &payload, sizeof(unsigned long) ); //Send data to 'Receiver' ever second
    delay(1000);
    digitalWrite(4, LOW);
  




//Sleep ATTiny85

void system_sleep() 

  cbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter OFF

  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
  sleep_enable();

  sleep_mode();                        // System actually sleeps here

  sleep_disable();                     // System continues execution here when watchdog timed out 

  sbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter ON



// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) 

  byte bb;
  int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  ww=bb;

  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCR = bb;
  WDTCR |= _BV(WDIE);

接收方代码

#define CE_PIN 7
#define CSN_PIN 8

#include <SPI.h>
#include "RF24.h"

RF24 radio(CE_PIN, CSN_PIN);

byte address[11] = "SimpleNode";
unsigned long payload = 0;

void setup() 
  while (!Serial);
  Serial.begin(115200);
  radio.begin(); // Start up the radio
  radio.setAutoAck(1); // Ensure autoACK is enabled
  radio.setRetries(15,15); // Max delay between retries & number of retries
  radio.openReadingPipe(1, address); // Write to device address 'SimpleNode'
  radio.startListening();
  Serial.println("Did Setup");



void loop(void)
  if (radio.available()) 

    radio.read( &payload, sizeof(unsigned long) );
    if(payload != 0)
        Serial.print("Got Payload ");
        Serial.println(payload);
    
  

这里的问题是需要同时打开ATTiny和Uno才能建立连接,还是与电池有关,或者完全是其他原因?任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我在使用电池运行 Arduino Nano 时遇到了同样的问题。 Nano 有一个 3.3V 引脚,我用它来为 NRF24L01+ 模块供电。

当我的电池组的电压降至 3.3V 以下时,3.3V 引脚电压也会下降。几分钟后,RF 模块不再发送任何消息。

我通过一个 12V 升压稳压器来临时解决问题,该稳压器是我之前为另一个项目购买的。然后这些 12V 进入 Nano 上接受 6-20V 的“UN”引脚。这种设置效果很好,但绝对不是最佳的。

因此,我计划使用 3.3V 升压稳压器,例如 Pololu 3.3V 升压稳压器 U1V11F3,据供应商称,它可以有效地从输入电压产生 3.3V低至 0.5V。

我认为这也可能对您的项目有所帮助。

【讨论】:

以上是关于NRF24L01 与 ATtiny 和 Uno 未连接的主要内容,如果未能解决你的问题,请参考以下文章

NRF24L01无线模块的使用

惊呆了!SI24R1可以替代NRF24L01P 而且性能比NRF24L01P还好

基于FPGA的nrf24l01与ds18b20温度采集与发送接收

NRF24L01双向无线通信

NRF24L01

关于nRF24L01地址问题