ESP32 и nrf24l01

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

Недавно в моём глупом доме на esp8266 накрылась эта самая esp8266, решил, чтож, к лучшему, пора на ESP32 переходить, заодно отказавшись от 2х расширителей PCF, и упростив код. Но оказалось не всё так радужно, NRF не хочет принимать ничего по радиоканалу, вернее из примеров RF24 работает сканер, выдаёт вполне реалистичную картинку, но вот от устройств принимать ничего не желает. Расключение проверил, да и не работал бы сканер иначе.

Что можно ещё попробовать?

Приёмник (Плата DOIT ESP32 Devkit V1, NRF24L01 PA+LNA - ce-17, cs-5, sck-18, miso-19, mosi-23)

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
char msg[6];
RF24 radio(17, 5);
const uint64_t pipe = 0xE8E8F0F0E1LL;
void setup(void){
 Serial.begin(115200);
 radio.begin();
 radio.setChannel(2);
 radio.setPayloadSize(7);
 radio.setDataRate(RF24_250KBPS);
 radio.openReadingPipe(1,pipe);
 radio.startListening();
}

void loop(void){
 if (radio.available()){  
     radio.read(msg, 6);      
     Serial.println(msg);
     delay(10);
 }
}

Передатчик (Arduino pro mini)

#include  <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
char msg[6] = "hello";
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(void) {
  Serial.begin(115200);
  radio.begin();
  radio.setChannel(2);
  radio.setPayloadSize(7);
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipe);
}
void loop(void) {
  Serial.println("send ...");
  radio.write(msg, 6);
  delay(3000);
}

 

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

строка 20 приемника ?

b707
Offline
Зарегистрирован: 26.05.2017

а зачем PayloadSize(7). если длина данных 6 ?

IVAN222
Offline
Зарегистрирован: 19.04.2017

В приемнике 4 строка для меги. RF24 radio(9,53);

В передатчике , укажите что это передатчик. radio.stopListening();  после 14 строки

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

Valera19701 - что строка 20 приёмника? просто выводит в порт, что пришло.

b707 - Да это пример из инета, загрузил его в железяки, для проверки. У меня просто код переплетён сильно, но при этом он перестал работать при замене 8266 на esp32. Ну оттого, что payload больше, вроде казусов не должно быть, у меня на базе приёмник всегда payload 16, при этом устройства передают по разному, кто 4, кто 8, всё работало, я просто считывал те значения, которые отдаются конкретным прибором.

IVAN222 - в смысле пятая? почему для меги? У меня реально СЕ и CS на этих пинах, причём на ардуине и на 8266 CS надо было обозначать, а в ESP32 он и так на D5, как и sck, miso и mosi. Вот тут у меня думка, что тут что-то не так, но по схеме, именно на этих местах вышеозначенные пины. Да, остановить прослушку на передатчике наверное надо, хотя я ему тубу для прослушки не объявлял, но завтра попробую, хотя сомневаюсь. Ещё качал RF24 переделанный, у которого можно назначать все пины, улучшений не наблюдалось, хотя примеры именно из той статьи, ща попробую найти.

 

 

 

 

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Добрый вечер!

Для меня эта тема очень актуальна т. к. сейчас занимаюсь похожим проектом. 

На данный момент при попытке компилирования кода - выдает ошибку.

 В чем может быть проблемма? 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

udavst пишет:

Что можно ещё попробовать?

- Сменить канал nRF

- Если ESP32 работает в режиме SoftAP, задать ей номер канала  в верхней части диапазона, а nRF оставить в нижней

- Отпилить кусок печатной платы под антенной ESP32. Антенна должна висеть в воздухе. На совместимость это не повлияет, зато ток потребления при передаче уменьшится раза в полтора.

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

Насчёт этого можно подумать, когда это заработает, сейчас эти 2 устройства на расстоянии 50 см.

До смены 8266 на esp32, NRF и ESP располагались на одной плате, антенны их рядом, WIFI работал на 9 канале, ESP на 42 (DEC), всё это из прихожей с бетонными стенами перекрывало всю квартиру (перпендикулярно этаж дома). Т.е. с физикой радиоволн тут проблем нет, проблема с библиотекой ESP и ESP32, IMHO.

Просто интересно, у кого-то заработало?, хотя понимаю, что это нужно очень мало кому. Если не получится, скорее всего на ESP8266 сделаю конвертер NRF->MQTT, а ESP23 уже по MQTT будет ловить в другой части квартиры.

 

vi.markevych - была такая беда, удалил старую бибилиотеку, установил из ардуино через менеджер библиотек последнюю версию RF24.

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Спасибо. сегодня попробую. 

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

Вот, отсюда я взял примеры (в первом сообщении) и библиотеку SoftSPI, но с ней у меня так же не работает.

PS Всё, заработало. Оказался неисправен NRF-модуль с антенной, хотя сканер на нём работал, и отображал он тоже, что и обычная nrfка без антенны, только показания больше были, ну оно и понятно, и использовал я его на приём, так что мне непонятно почему он не работал, заменил на обычную - всё пошло.

 
 
 

 

 

a5021
Offline
Зарегистрирован: 07.07.2013

На модули с усилителем многие жалуются, что он сам себя глушит.

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

Ну к стати да, на сканере, где помеха есть - всегда FF, т.е. перегруз (ну наверное это WiFi был), на обычной, со встроенной антенной - это именно помеха в этом месте, с гуляющими цифрами. Видимо такой модуль надо именно на большие расстояния использовать, выбирая пустую частоту.

ЗЫ Забыл написать в 1 сообщении, что модуль NRF я тоже сменил, но исправить его нельзя, а потом и забыл.

SLBLI
Offline
Зарегистрирован: 17.04.2020

Добрый день. Использую почти такую же связку.

Приёмник (Плата DOIT ESP32 Devkit V1, NRF24L01 - ce-17, cs-5, sck-18, miso-19, mosi-23)

Передатчик (ARDUINO NANO, NRF24L01).

Код приёмника


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

RF24 radio(17, 5);

int recieved_data[2];
//float recieved_data[2];
//char recieved_data[6];
//int recieved_data;

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

void setup() {
  Serial.begin(115200); 
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, address[0]);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);
  radio.powerUp();
  radio.startListening();
}

void loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {
    radio.read( &recieved_data, sizeof(recieved_data) );
  //  Serial.println(recieved_data);
    Serial.println(recieved_data[0]);
    Serial.println(recieved_data[1]);
    Serial.println("..............");   
  }
}

Код передатчика

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

RF24 radio(9, 10);

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

int transmit_data[2] = {-155,222};
//float transmit_data[2] = {-155,2.22};
//char transmit_data[6] = "hello";
//int transmit_data = -222;

void setup() {  
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openWritingPipe(address[0]);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);
  radio.powerUp();
  radio.stopListening();
}
void loop() {
    radio.powerUp();
    radio.write(&transmit_data, sizeof(transmit_data));
    radio.powerDown();
}

В порте приёмника вижу следующее

14614373
0
..............

Если пересылать одиночный int, массивы float, byte,  char всё нормально.

Если пересылать с (ARDUINO NANO, NRF24L01) на (ARDUINO NANO, NRF24L01) тоже всё нормально.

Буду использовать float, но хотелось int, с учетом ограничения в 32 байта.

Может кто сталкивался с подобным?

Или я где то не прав.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вы учитываете, что на nano тип int имеет длину 2 байта, а на ESP32 - 4 байта?

Замените int на long или на short, тогда на любой архитектуре длина будет одна и та же.