Прроблемы с nrf24l01 по передаче данных

Нет ответов
AndroidLife
Offline
Зарегистрирован: 07.03.2015

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

Есть две ардуины Mega и Uno. 

Есть соответственно два модуля nrf24l01. Подключил модули к ардуинам. Предварительно поставив конденсатор по питанию, так как писали, что из-за плохого питания часто проблемы возникают. Залил на ардуины тестовый скетч из примеров библиотеки Getting Started. Естественно на ардуине Мега указал пины 40 и 53, а на Уно 9 и 10. Запустил. 

Пытаюсь отправить данные на уно, то есть перевел мегу в режим отправителя, не хочет передавать пакеты, Еще раз пытаюсь передавать, опять ничего. Вообще не хочет из меги на уно передавать. Включаю передачу из уно на мегу. Все данные пошли отлично, все работает. Теперь пробую с меги отправить, теперь тоже работает. Все теперь нормально передает. 

Взял начал отправлять с уно сначала, тоже самое, не доходят данные. Сколько бы не пробовал. Теперь пробую отправить с меги работает. 

То есть ситуация такая. Для того чтобы модули смогли общаться нужно сначало отправить с какого-то пакеты, они все не пройдут, а потом с того на который отправляли уже отправить и они пройдут, после этого работает. 

И так всегда надо. 

Может это так и надо. я просто новичок. В протокол работы и электронику самого передатчика не вдавался пока что не вникал, так как смотрел что должно по идее и так работать.

Написал простенькие программы для приемника и получателя, но они не работают. 

Может так и должно работать, но я догадываюсь что нет. 

Собственно задача, считать по ИК каналу кнопки с пульта и передать их по радиоканалу на другую дуину, а там зажечь индикатор. Помогите пожалуйста, день сижу уже не могу понять, что не так. 

Спасибо заранее.

Вот для отправителя код. 

#include <RF24_config.h>
#include <nRF24L01.h>
#include "printf.h"
#include <IRremote.h> // use the library
#include <SPI.h>
#include <RF24.h>
#define LOG_ONE 0
#define LOG_ZERO 1
const uint64_t pipe = 0xF0F0F0F0D2LL;
RF24 radio(9,10);
int receiver = 8; // pin 8 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
const unsigned long ONE = 0x61D6807F;
const unsigned long TWO = 0x61D6D02F;
const unsigned long THREE = 0x61D6D827;
const unsigned long FOUR = 0x61D6A05F;
const unsigned long FIVE = 0x61D6906F;
const unsigned long SIX = 0x61D6A857;
const unsigned long SEVEN = 0x61D6609F;
const unsigned long EIGHT = 0x61D650AF;
const unsigned long NINE = 0x61D648B7;
const unsigned long ZERO = 0x61D640BF;
const unsigned long PLAY = 0x61D68877;
const unsigned long STOP = 0x61D610EF;
const unsigned long RECORD = 0x61D600FF;
bool ok = false;


void setup() {
  irrecv.enableIRIn(); // Start the receiver
  Serial.begin(57600);
  printf_begin();
  printf("\n\rRF24/examples/GettingStarted/\n\r");
  radio.begin();
  radio.openWritingPipe(pipe);
  radio.printDetails();
}
void loop()
{
   if (irrecv.decode(&results)) {
    long int decCode = results.value;
    Serial.println(decCode);
    switch (results.value) {
      case ZERO:
        Serial.println("Zero");
       ok = radio.write(0,sizeof(int));
       //ok = radio.write( &ZERO, sizeof(ZERO) );
        break;
      case ONE:
        Serial.println("ONE");
         ok = radio.write( &ONE, sizeof(ONE) );
        break;
      case TWO:
     Serial.println("TWO");
   ok = radio.write( &TWO, sizeof(TWO) );
        break;
        case THREE:
        Serial.println("THREE");
     ok = radio.write( &THREE, sizeof(THREE) );
        break;
        case FOUR:
        Serial.println("FOUR");
        ok = radio.write( &FOUR, sizeof(FOUR) );
        break;
        case FIVE:
        Serial.println("FIVE");
     ok = radio.write( &FIVE, sizeof(FIVE) );
        break;
          case SIX:
        Serial.println("SIX");
   ok = radio.write( &SIX, sizeof(SIX) );
        break;
          case SEVEN:
        Serial.println("SEVEN");
   ok = radio.write(&SEVEN, sizeof(SEVEN) );
        break;
          case EIGHT:
        Serial.println("EIGHT");
   ok = radio.write( &EIGHT, sizeof(EIGHT) );
        break;
          case NINE:
          Serial.println("NINE");
     ok = radio.write( &NINE, sizeof(NINE) );
        break;
           case PLAY:
          Serial.println("PLAY");
    ok = radio.write( &PLAY, sizeof(PLAY) );
        break;
           case STOP:
          Serial.println("STOP");
      ok = radio.write( &STOP, sizeof(STOP) );
        break;
           case RECORD:
          Serial.println("RECORD");
        ok = radio.write( &RECORD, sizeof(RECORD) );
        break;

      default: 
        Serial.println("Waiting ...");
    }
     if (ok)
      printf("ok...");
    else
      printf("failed.\n\r");
    delay(1000);
    irrecv.resume(); // Receive the next value
  }
}

 

И получатель 

#include <IRremote.h> // use the library
#include <SPI.h>
#include <RF24.h>
#include "printf.h"
#define LOG_ONE 0
#define LOG_ZERO 1
const uint64_t pipe = 0xF0F0F0F0D2LL;
RF24 radio (40, 53);
const unsigned long ONE = 0x61D6807F;
const unsigned long TWO = 0x61D6D02F;
const unsigned long THREE = 0x61D6D827;
const unsigned long FOUR = 0x61D6A05F;
const unsigned long FIVE = 0x61D6906F;
const unsigned long SIX = 0x61D6A857;
const unsigned long SEVEN = 0x61D6609F;
const unsigned long EIGHT = 0x61D650AF;
const unsigned long NINE = 0x61D648B7;
const unsigned long ZERO = 0x61D640BF;
const unsigned long PLAY = 0x61D68877;
const unsigned long STOP = 0x61D610EF;
const unsigned long RECORD = 0x61D600FF;
const int A = 7;
const int B = 8;
const int C = 10;
const int D = 3;
const int E = 2;
const int F = 5;
const int G = 4;
const int DOT = 9;
const int POWER = 6;
long int inData = 0;
unsigned int dataInt = 0;
void setup() {
  Serial.begin(57600);
  printf_begin();
  printf("\n\Remote LED Controller/\n\r");
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DOT, OUTPUT);
pinMode(POWER, OUTPUT);
digitalWrite(POWER, HIGH);
digitalWrite(DOT,LOG_ZERO);
digitalWrite(A,LOG_ZERO);
digitalWrite(B, LOG_ZERO);
digitalWrite(C, LOG_ZERO);
digitalWrite(D, LOG_ZERO);
digitalWrite(E, LOG_ZERO);
digitalWrite(F, LOG_ZERO);
digitalWrite(G, LOG_ZERO);
//
// Setup and configure r
//

radio.begin();

// optionally, increase 
radio.setRetries(15,15);
  {
    //radio.openWritingPipe(pipes[0]);
    radio.openReadingPipe(1,pipe);
  }
  //
  // Start listening
  //

  radio.startListening();

  //
  // Dump the configuration of the rf unit for debugging
  //
   radio.printDetails();

}
void loop()
{
   if (radio.available()){
    bool done = false;  

    Serial.println("Data Available");
    while (!done){
      done = radio.read(&dataInt,sizeof(unsigned long)); 
    Serial.println(dataInt);
    switch (inData) {
      case ZERO:
        Serial.println("Zero");
        digit0();
        break;
      case ONE:
        Serial.println("ONE");
        digit1();   // sets the LED on
        break;
      case TWO:
     Serial.println("TWO");
        digit2();   // sets the LED on
        break;
        case THREE:
        Serial.println("THREE");
        digit3();   // sets the LED on
        break;
        case FOUR:
        Serial.println("FOUR");
        digit4();   // sets the LED on
        break;
        case FIVE:
        Serial.println("FIVE");
        digit5();   // sets the LED on
        break;
          case SIX:
        Serial.println("SIX");
        digit6();   // sets the LED on
        break;
          case SEVEN:
        Serial.println("SEVEN");
        digit7();   // sets the LED on
        break;
          case EIGHT:
        Serial.println("EIGHT");
        digit8();   // sets the LED on
        break;
          case NINE:
          Serial.println("NINE");
        digit9();   // sets the LED on
        break;
           case PLAY:
          Serial.println("PLAY");
        letterA();   // sets the LED on
        break;
           case STOP:
          Serial.println("STOP");
        letterS();   // sets the LED on
        break;
           case RECORD:
          Serial.println("RECORD");
        letterC();   // sets the LED on
        break;

      default: 
        Serial.println("Waiting ...");
    }
delay(100);
    }    
   } 
}

Подскажите пожалуйста, что неправильно делаю и как заставить работать это устройство.