Проблема NRF24L01

andreyu
Offline
Зарегистрирован: 31.08.2017

Здравствуйте! 



Подскажите пожалуйста! 



Использую стандартную библеотеку для nRF24L01 

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

если дополнительно подключить библиотеку #include <Wire.h>, то данные не передаются! 

В чем может быть проблема? SPI конфликтует с I2C?

Arduino Pro mini 

 

andreyu
Offline
Зарегистрирован: 31.08.2017

Arduino Nano

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скорее всего SPI не при чём, а конфликтуют какие-нибудь библиотеки по таймерам или что-то в этом роде. Но пока Вы не дадите ссылки на те сымае версии библиотек, которые используются и не выложите скетч - ничего сказать нельзя.

andreyu
Offline
Зарегистрирован: 31.08.2017

ЕвгенийП пишет:

Скорее всего SPI не при чём, а конфликтуют какие-нибудь библиотеки по таймерам или что-то в этом роде. Но пока Вы не дадите ссылки на те сымае версии библиотек, которые используются и не выложите скетч - ничего сказать нельзя.

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

#include <Wire.h> // если закоментить то все ок, связь есть


// Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8
RF24 radio(9, 10);


// Для работы с модулем гироскопа MPU-6050
const int MPU_addr = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;


// Vars
const uint64_t pipes[2] = {"1Node", "2Node"};

byte dataOut[3];
byte dataIn[1];


long sendCount = 0;
long sendSuccessCount = 0;
long sendErrorCount = 0;

int sendRate = 0;
long sendRatePrevSuccessCount = 0;
#define sendRateDoEach 50

long prevMillis = 0;


void setup() {
  Serial.begin(115200);
  printf_begin();


  // Setup and configure rf radio
  radio.begin();
  //radio.setAutoAck(1);                    // Ensure autoACK is enabled
  //radio.enableAckPayload();               // Allow optional ack payloads
  //radio.setRetries(0, 15);                // Smallest time between retries, max no. of retries
  radio.setChannel(122);
  radio.openWritingPipe(pipes[0]);        // Both radios listen on the same pipes by default, and switch when writing
  radio.openReadingPipe(1, pipes[1]);
  radio.startListening();                 // Start listening
  //radio.printDetails();                   // Dump the configuration of the rf unit for debugging


  // MPU-6050
  /*
    Wire.begin();
    Wire.beginTransmission(MPU_addr);
    Wire.write(0x6B);  // PWR_MGMT_1 register
    Wire.write(0);     // set to zero (wakes up the MPU-6050)
    Wire.endTransmission(true);
  */


  pinMode(4, INPUT_PULLUP);
}


void loop(void) {
  /* DATA PART */
  /*
    Wire.beginTransmission(MPU_addr);
    Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
    Wire.endTransmission(false);
    Wire.requestFrom(MPU_addr, 14, true); // request a total of 14 registers
    AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
    AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
    AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
    Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
    GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
    GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
    GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

    dataOut[0] = 200;
    dataOut[1] = constrain(map(AcX, 13000, -13000, 0, 180), 0, 180);
    dataOut[2] = constrain(map(AcY, 13000, -13000, 0, 180), 0, 180);
  */


  dataOut[0] = analogRead(4);
  dataOut[1] = 300;
  dataOut[2] = 400;


  /* RADIO PART */
  radio.stopListening();

  sendCount++;
  bool isSend = radio.write(&dataOut, sizeof(dataOut));
  if (isSend) {
    sendSuccessCount++;
  } else {
    sendErrorCount++;
  }

  if (!(sendCount % sendRateDoEach)) {
    sendRate = ((float)(sendSuccessCount - sendRatePrevSuccessCount) / sendRateDoEach) * 100;
    sendRatePrevSuccessCount = sendSuccessCount;
  }

  if (isSend) {
    radio.startListening();
    unsigned long started_waiting_at = millis();
    bool timeout = false;
    while (!radio.available() && !timeout )
      if (millis() - started_waiting_at > 300)
        timeout = true;

    if (!timeout) {
      while (radio.available()) {
        radio.read(&dataIn, sizeof(dataIn));
      }

    } else {
      Serial.println("Failed, response timed out.");
    }
  }


  /* LSD PART */
  if (millis() - prevMillis > 500) {
    Serial.print("Total: ");
    Serial.print(sendCount);

    Serial.print(" | Success: ");
    Serial.print(sendSuccessCount);

    Serial.print(" | Error: ");
    Serial.print(sendErrorCount);

    Serial.print(" | Rate: ");
    Serial.print(sendRate);
    Serial.print("%");

    Serial.println();

    prevMillis = millis();
  }
}

Версии библеотек самые последние, ставил через IDE

Arduino Nano

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не знаю что такое самые последние Вот на это

#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
Давайте ссылки "где брали".
 
Что касается Wire.h - Вы её из IDE берёте? Какая версия IDE?
andreyu
Offline
Зарегистрирован: 31.08.2017

Версия IDE 1.8.3

RF24 by tmrh20 1.3.0 - ставил через IDE

Wire by Arduino 1.0.0

 

Уже попробовал на другой плате arduino, и пробывал скачивать RF24 непосредственно с github, всеравно такой косяк, при подключение #include <Wire.h>

bool isSend = radio.write(&dataOut, sizeof(dataOut));

данные не уходят!

Тоже самое и при подключение например #include <LiquidCrystal_I2C.h>

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Переместите #include <Wire.h> в самое начало файла, чтобы это было первой строкой. Всплывала похожая проблема с часами 1307.