Проверка работоспособности nrf24l01+

VOS
Offline
Зарегистрирован: 07.08.2015

Добрый день.

Прошу помочь понять, что происходит. Ситуация такая: была отличная пара из двух нрф с усилителем, но во время отладки регулятора напряжения по-глупости сжег одну из них вместе с ардуинкой. Заказал в другом месте, чтоб быстрее было, а оно что-то не то.

Взял в сети скетч для проверки нрф. Мы слушаем эфир:

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

RF24 radio(9,10); // инициализировать модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53);// Для Меги

const uint8_t num_channels = 128;
uint8_t values[num_channels];
void setup(void)
{
  Serial.begin(9600);
  printf_begin();
  radio.begin();
  radio.setAutoAck(false);
  radio.startListening();

  radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
  delay(5000);              // И посмотрим на это пять секунд.

  radio.stopListening();
  int i = 0;    // А это напечатает нам заголовки всех 127 каналов
  while ( i < num_channels )  {
    printf("%x",i>>4);
    ++i;
  }
  printf("\n\r");
  i = 0;
  while ( i < num_channels ) {
    printf("%x",i&0xf);
    ++i;
  }
  printf("\n\r");
}
const int num_reps = 100;

void loop(void)
{
  memset(values,0,sizeof(values));
  int rep_counter = num_reps;
  while (rep_counter--) {
    int i = num_channels;
    while (i--) {
      radio.setChannel(i);
      radio.startListening();
      delayMicroseconds(128);
      radio.stopListening();
      if ( radio.testCarrier() )
        ++values[i];
    }
  }
  int i = 0;
  while ( i < num_channels ) {
    printf("%x",min(0xf,values[i]&0xf));
    ++i;
  }
  printf("\n\r");
}
int serial_putc( char c, FILE * ) {
  Serial.write( c );
  return c;
}

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
} 

Вот что в сериалмониторе у старой рабочей нрф-ки:

рабочая

А вот, что пишет новая (нерабочая):

не рабочая

Все пропаяно проводами МГТФ. Питание 3,3 В от LT1084 (на фото черная сборка возле нрф) плюс электролит 2мкФ на нрфке . На всякий случай, фото сборки новой проблемной нрф-ки:

сборкаСам я не спец в ардуино, это хобби.

Буду рад, если кто-то сможет помочь разобраться.

access
Offline
Зарегистрирован: 10.05.2017

конденсатор не забыли напоять? и проверьте еще раз правльность подключения, чип точно нрф или аналог ?

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

VOS пишет:

Буду рад, если кто-то сможет помочь разобраться.

У меня было в точности так же, как у вас со второй. Оказалось просто неправильно подключил к ардуине. Внимательно проверьте соединение

ну и пс ... я отказался от этой библиотеки и стал использовать софт spi, т.к. к ардуине у меня много еще чего подключено

VOS
Offline
Зарегистрирован: 07.08.2015

access пишет:

конденсатор не забыли напоять? и проверьте еще раз правльность подключения, чип точно нрф или аналог ?

Конденсатор на месте. Прозвонил все соединения. А вот, касательно аналога как раз большой вопрос. Как я писал выше, брал у другого продавца и вполне возможен такой вариант. В сети встречал предупреждения, что такое возможно, но как отличить их и что делать, если это аналог, не знаю.

Еще смутило, что у рабочего нрф в сериалмониторе пишет Model nrf24L01+, а у нерабочего - nrf24L01.

 

Condensator
Offline
Зарегистрирован: 02.06.2017

VOS пишет:
Конденсатор на месте.
керамический 0,01 мкф непосредственно на контактах VCC GND  платы NRF

VOS пишет:
Прозвонил все соединения.
У Вас паяные неразъемные судя по фото ? По возможности, применяйте для соединения проводники минимальной длины.

Тест для частичной проверки TX на одной плате, когда второй нет.  В коде нужно убрать delay(1000);


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

const uint64_t pipe = 'ABCDEFG';
uint8_t  B_32bytes[32];

// для Mega2560:
RF24 ModuleToTest(49,53); // CE_PIN,SS_PIN

//для Uno другие CE_PIN,SS_PIN:
// RF24 ModuleToTest(8,10); 


// для Mega2560:
#define GR_LED 14     // Tx Ok 
#define RED_LED 16    // Tx fail 


// для UNO другие номера выводов LED:
//#define GR_LED  2
//#define RED_LED 4

void setup(void)
{  
  ModuleToTest.begin();
                          //ModuleToTest.setAutoAck(true);
  ModuleToTest.setAutoAck(false);
  ModuleToTest.setDataRate(RF24_1MBPS);
  ModuleToTest.setCRCLength(RF24_CRC_16);
  ModuleToTest.setChannel(66);
  ModuleToTest.openWritingPipe(pipe);
  //ModuleToTest.printDetails();
  pinMode(RED_LED, OUTPUT);  
  pinMode(GR_LED, OUTPUT);   
} 

void loop(void)
{
  switch(ModuleToTest.write(B_32bytes,32))
     { case false: digitalWrite(GR_LED,HIGH); digitalWrite(RED_LED,LOW); break;
       case true:  digitalWrite(RED_LED,HIGH); digitalWrite(GR_LED,LOW); break;
     }
delay(1000);
}

 

VOS
Offline
Зарегистрирован: 07.08.2015

Condensator пишет:

Тест для частичной 

Спасибо большое. В понедельник проверю.

Condensator
Offline
Зарегистрирован: 02.06.2017

VOS пишет:
Спасибо большое. В понедельник проверю.

Если возникнет вопрос "почему убрать delay(1000)" - ответ на него надеюсь найти здесь: http://arduino.ru/forum/apparatnye-voprosy/nrf-ne-peredaet-redkie-pakety

SavvaAliance
Offline
Зарегистрирован: 02.06.2017

VOS пишет:
Буду рад, если кто-то сможет помочь разобраться.

Встречаются нрф, которые криво ведут себя в режиме "R". Обычно они  сохраняют работоспособность в  режиме  "T" и могут автоматически переключаться в "R" для принятия подтверждения отправки.

Метод лечения нрф помогает не всегда, но аппаратно ничего не повредит:

1) отсоединить нрф-овский вход CE от ардуино и соединить его через резистор 1 ком с любым  свободным выводом ардуино PINXX и программно подать на PINXX высокий уровень:

pinMode(PINXX, OUTPUT);  digitalWrite(PINXX,HIGH);

2) Или  просто отсоединить CE от ардуино и подать на него +5...+3 V через резистор 1 ком.

Condensator
Offline
Зарегистрирован: 02.06.2017

VOS пишет:
Спасибо большое. В понедельник проверю.
посмотрите пожалуйста заодно работоспособность программы при "редкой" передаче пакетов   http://arduino.ru/forum/apparatnye-voprosy/nrf-ne-peredaet-redkie-pakety

 

 

SavvaAliance
Offline
Зарегистрирован: 02.06.2017

VOS пишет:
Добрый день.

Прошу помочь понять, что происходит. Ситуация такая: была отличная пара из двух нрф с усилителем, но во время отладки регулятора напряжения по-глупости сжег одну из них вместе с ардуинкой. Заказал в другом месте, чтоб быстрее было, а оно что-то не то.

 

Какими  бывают модули:

http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/page-25#post-54029

    - подлинный скандинавский nRF24L01 +
    - подлинный скандинавский nRF24L01 (без ESB, без скорости 250 Кбит/с) - возможно маркированный как +
    - качественный клон также, возможно даже выигрывая у скандинава в некотором случае (у некоторых есть более высокая выходная  ВЧ-мощность)
    -  клон с инверсией OTA bit  (ESB хорошо между тем же самым, несовместимым со скандинавом)
    - клон с уменьшенной чувствительностью и/или увеличенным энергопотреблением
    -  любое вышеупомянутое с отсутствующими пассивными компонентами по сравнению со скандинавским справочным дизайном печатной платы

Между тем:
 

  • We cannot count on visual inspection (Nordic is fabless, some genuine chips may differ over time) or date codes.
  • We do not know of register tests to distinguish differences (except L01 vs L01+)
  • The inverted NoAck bit could be easily tested OTA using ESB mode to a known-good module.

 

http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/

 

http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Скажите а как можно проверить через скетч статус nrF???? В моем проекте надо быть увереным что она отвечает и работает. ну типа можно как то опросить чтобы она вернула какое то значения true там и т.д. Ниче не могу найти((( если можно строчку кода или ссылку а я почитаю. Спасибо

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016
/*
 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 RF Radio Ping Pair
 *
 * This is an example of how to use the RF24 class.  Write this sketch to two different nodes,
 * connect the role_pin to ground on one.  The ping node sends the current time to the pong node,
 * which responds by sending the value back.  The ping node can then see how long the whole cycle
 * took.
 */

#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 'pong' receiver
// Leave open to be the 'ping' transmitter
const int role_pin = 7;

//
// Topology
//

// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

//
// 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_ping_out = 1, role_pong_back } role_e;

// The debug-friendly names of those roles
const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"};

// The role of the current running sketch
role_e role;

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_ping_out;
  else
    role = role_pong_back;

  //
  // Print preamble
  //

  Serial.begin(57600);
  printf_begin();
  printf("\n\rRF24/examples/pingpair/\n\r");
  printf("ROLE: %s\n\r",role_friendly_name[role]);

  //
  // Setup and configure rf radio
  //

  radio.begin();

  // optionally, increase the delay between retries & # of retries
  radio.setRetries(15,15);

  // optionally, reduce the payload size.  seems to
  // improve reliability
  radio.setPayloadSize(8);

  //
  // Open pipes to other nodes for communication
  //

  // This simple sketch opens two pipes for these two nodes to communicate
  // back and forth.
  // Open 'our' pipe for writing
  // Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)

  if ( role == role_ping_out )
  {
    radio.openWritingPipe(pipes[0]);
    radio.openReadingPipe(1,pipes[1]);
  }
  else
  {
    radio.openWritingPipe(pipes[1]);
    radio.openReadingPipe(1,pipes[0]);
  }

  //
  // Start listening
  //

  radio.startListening();

  //
  // Dump the configuration of the rf unit for debugging
  //

  radio.printDetails();
}

void loop(void)
{
  //
  // Ping out role.  Repeatedly send the current time
  //

  if (role == role_ping_out)
  {
    // First, stop listening so we can talk.
    radio.stopListening();

    // Take the time, and send it.  This will block until complete
    unsigned long time = millis();
    printf("Now sending %lu...",time);
    bool ok = radio.write( &time, sizeof(unsigned long) );
    
    if (ok)
      printf("ok...");
    else
      printf("failed.\n\r");

    // Now, continue listening
    radio.startListening();

    // Wait here until we get a response, or timeout (250ms)
    unsigned long started_waiting_at = millis();
    bool timeout = false;
    while ( ! radio.available() && ! timeout )
      if (millis() - started_waiting_at > 200 )
        timeout = true;

    // Describe the results
    if ( timeout )
    {
      printf("Failed, response timed out.\n\r");
    }
    else
    {
      // Grab the response, compare, and send to debugging spew
      unsigned long got_time;
      radio.read( &got_time, sizeof(unsigned long) );

      // Spew it
      printf("Got response %lu, round-trip delay: %lu\n\r",got_time,millis()-got_time);
    }

    // Try again 1s later
    delay(1000);
  }

  //
  // Pong back role.  Receive each packet, dump it out, and send it back
  //

  if ( role == role_pong_back )
  {
    // if there is data ready
    if ( radio.available() )
    {
      // Dump the payloads until we've gotten everything
      unsigned long got_time;
      bool done = false;
      while (!done)
      {
        // Fetch the payload, and see if this was the last one.
        done = radio.read( &got_time, sizeof(unsigned long) );

        // Spew it
        printf("Got payload %lu...",got_time);

	// Delay just a little bit to let the other unit
	// make the transition to receiver
	delay(20);
      }

      // First, stop listening so we can talk
      radio.stopListening();

      // Send the final one back.
      radio.write( &got_time, sizeof(unsigned long) );
      printf("Sent response.\n\r");

      // Now, resume listening so we catch the next packets.
      radio.startListening();
    }
  }
}