Нестабильная работа NRF24L01
- Войдите на сайт для отправки комментариев
Ср, 06/11/2013 - 16:22
Загрузил учебный пример в два UNO (один TX, а другой RX с выводом А4 на GND) и пытаюсь запустить связь через 24L01. Наблюдаю через монитор порта за TX. В логе ошибки связи, но если на время передачи касаться корпуса кварцевого резонатора на NRF24L01 TX, то в порт вместо Now sending...failed выдает Now sending...ok
"Хорошиие" у меня емкость и индуктивность:-))
PS: длину проводников SPI на TX укоротил до 10 см, и прямо к платам RX TX модулей припаял танталовые конденсаторы 10,0х16в, но это не повлияло. Как устранить сбой ?
Сейчасс стоят 8-пиновые RX-TX модули, а еще есть 10-пиновые...
скетч:
/*
Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
*/
/**
* Example LED Remote
*
* This is an example of how to use the RF24 class to control a remote
* bank of LED's using buttons on a remote control.
*
* On the 'remote', connect any number of buttons or switches from
* an arduino pin to ground. Update 'button_pins' to reflect the
* pins used.
*
* On the 'led' board, connect the same number of LED's from an
* arduino pin to a resistor to ground. Update 'led_pins' to reflect
* the pins used. Also connect a separate pin to ground and change
* the 'role_pin'. This tells the sketch it's running on the LED board.
*
* Every time the buttons change on the remote, the entire state of
* buttons is send to the led board, which displays the state.
*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
//
// Hardware configuration
//
// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
RF24 radio(9,10);
// sets the role of this unit in hardware. Connect to GND to be the 'led' board receiver
// Leave open to be the 'remote' transmitter
const int role_pin = A4;
// Pins on the remote for buttons
const uint8_t button_pins[] = { 2,3 };
const uint8_t num_button_pins = sizeof(button_pins);
// Pins on the LED board for LED's
const uint8_t led_pins[] = { 6,7 };
const uint8_t num_led_pins = sizeof(led_pins);
//
// Topology
//
// Single radio pipe address for the 2 nodes to communicate.
//const uint64_t pipe = 0xE8E8F0F0E1LL;
const uint64_t pipe = 0xE7E8F0F0E1LL; // изменил адрес канала
//
// Role management
//
// Set up role. This sketch uses the same software for all the nodes in this
// system. Doing so greatly simplifies testing. The hardware itself specifies
// which node it is.
//
// This is done through the role_pin
//
// The various roles supported by this sketch
typedef enum { role_remote = 1, role_led } role_e;
// The debug-friendly names of those roles
const char* role_friendly_name[] = { "invalid", "Remote", "LED Board"};
// The role of the current running sketch
role_e role;
//
// Payload
//
uint8_t button_states[num_button_pins];
uint8_t led_states[num_led_pins];
//
// Setup
//
void setup(void)
{
//
// Role
//
// set up the role pin
pinMode(role_pin, INPUT);
digitalWrite(role_pin,HIGH);
delay(20); // Just to get a solid reading on the role pin
// read the address pin, establish our role
if ( digitalRead(role_pin) )
role = role_remote;
else
role = role_led;
//
// Print preamble
//
Serial.begin(57600);
printf_begin();
printf("\n\rRF24/examples/led_remote/\n\r");
printf("ROLE: %s\n\r",role_friendly_name[role]);
//
// Setup and configure rf radio
//
radio.begin();
//
// Open pipes to other nodes for communication
//
// This simple sketch opens a single pipes for these two nodes to communicate
// back and forth. One listens on it, the other talks to it.
if ( role == role_remote )
{
radio.openWritingPipe(pipe);
}
else
{
radio.openReadingPipe(1,pipe);
}
//
// Start listening
//
if ( role == role_led )
radio.startListening();
//
// Dump the configuration of the rf unit for debugging
//
radio.printDetails();
//
// Set up buttons / LED's
//
// Set pull-up resistors for all buttons
if ( role == role_remote )
{
int i = num_button_pins;
while(i--)
{
pinMode(button_pins[i],INPUT);
digitalWrite(button_pins[i],HIGH);
}
}
// Turn LED's ON until we start getting keys
if ( role == role_led )
{
int i = num_led_pins;
while(i--)
{
pinMode(button_pins[i],OUTPUT);
led_states[i] = HIGH;
digitalWrite(led_pins[i],led_states[i]);
}
}
}
//
// Loop
//
void loop(void)
{
//
// Remote role. If the state of any button has changed, send the whole state of
// all buttons.
//
if ( role == role_remote )
{
// Get the current state of buttons, and
// Test if the current state is different from the last state we sent
int i = num_button_pins;
bool different = false;
while(i--)
{
uint8_t state = ! digitalRead(button_pins[i]);
if ( state != button_states[i] )
{
different = true;
button_states[i] = state;
}
}
// Send the state of the buttons to the LED board
if ( different )
{
printf("Now sending...");
bool ok = radio.write( button_states, num_button_pins );
if (ok)
printf("ok\n\r");
else
printf("failed\n\r");
}
// Try again in a short while
delay(20);
}
//
// LED role. Receive the state of all buttons, and reflect that in the LEDs
//
if ( role == role_led )
{
// if there is data ready
if ( radio.available() )
{
// Dump the payloads until we've gotten everything
bool done = false;
while (!done)
{
// Fetch the payload, and see if this was the last one.
done = radio.read( button_states, num_button_pins );
// Spew it
printf("Got buttons\n\r");
// For each button, if the button now on, then toggle the LED
int i = num_led_pins;
while(i--)
{
if ( button_states[i] )
{
led_states[i] ^= HIGH;
digitalWrite(led_pins[i],led_states[i]);
}
}
}
}
}
}
// vim:ai:cin:sts=2 sw=2 ft=cpp
лог для TX:
/* лог со стороны TX RF24/examples/led_remote/ ROLE: Remote STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0 RX_ADDR_P0-1 = 0xe8e8f0f0e1 0xc2c2c2c2c2 RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6 TX_ADDR = 0xe8e8f0f0e1 RX_PW_P0-6 = 0x20 0x00 0x00 0x00 0x00 0x00 EN_AA = 0x3f EN_RXADDR = 0x03 RF_CH = 0x4c RF_SETUP = 0x07 CONFIG = 0x0c DYNPD/FEATURE = 0x00 0x00 Data Rate = 1MBPS Model = nRF24L01+ CRC Length = 16 bits PA Power = PA_HIGH Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...failed Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...ok Now sending...ok Now sending...failed Now sending...failed Now sending...ok Now sending...ok Now sending...failed Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed RF24/examples/led_remote/ ROLE: Remote STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0 RX_ADDR_P0-1 = 0xe7e8f0f0e1 0xc2c2c2c2c2 RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6 TX_ADDR = 0xe7e8f0f0e1 RX_PW_P0-6 = 0x20 0x00 0x00 0x00 0x00 0x00 EN_AA = 0x3f EN_RXADDR = 0x03 RF_CH = 0x4c RF_SETUP = 0x07 CONFIG = 0x0c DYNPD/FEATURE = 0x00 0x00 Data Rate = 1MBPS Model = nRF24L01+ CRC Length = 16 bits PA Power = PA_HIGH Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...failed Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok Now sending...ok */
Может быть проблема в занятости конкретного частотного канала соседскими wi-fi роутерами ?
Как проверить какие есть свободные и занятые каналы ?
смотри пример scanner в библиотеке rf24
nRF24L01 достаточно много жрут. попробуйте с отдельным питанием использовать.
посмотрел, а где и какой функцией задается номер канала в изначальном скетче-примере темы?
до 12 мА много для стабилизатора UNO ?
nRF24L01 достаточно много жрут.
Member, посмотрите метод setChannel
http://maniacbug.github.io/RF24/classRF24.html
Там написано альтернативная версия библиотеки, то есть не та что на arduino.cc ?
у меня тоже такая же история держиш кварц потерь намного меньше, чем вылечил в итоге ?