Здравствуйте, столкнулся с проблемой большего количества ломаных битов и медленной передачей между модулями NRF24L01+PA+LNA. Заказал их естественно с Тэму, ибо в стране нет нормальных или такие же с Китая по завышенной цене. Итак, два модуля стоят на стабилизаторе YL-105, одни подключен к Уно, а другой к Про Микро(5 B, видимо тоже китайский аналог, потому что распознается как Arduino Leonardo и часто глючит). Оба модуля выдают информацию о себе в монитор, оба отлично сканируют сеть, но при попытке передать между ними конкретное слово происходят беды.
Код на Уно:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8);
const byte address[6] = "00001";
unsigned long lastStatsTime = 0;
unsigned int packetsReceived = 0;
char getMostFrequentChar(char* chunk) {
int counts[256] = {0};
int maxCount = 0;
char bestChar = '?';
for (int i = 0; i < 5; i++) {
char c = chunk[i];
counts[(unsigned char)c]++;
if (counts[(unsigned char)c] > maxCount) {
maxCount = counts[(unsigned char)c];
bestChar = c;
}
}
return bestChar;
}
void setup() {
Serial.begin(9600);
if (!radio.begin()) {
Serial.println("Радиомодуль не отвечает!");
while (1) {}
}
radio.openReadingPipe(0, address);
radio.setChannel(108);
radio.setPALevel(RF24_PA_MIN);
radio.setDataRate(RF24_1MBPS);
radio.setAutoAck(false);
radio.disableCRC();
radio.startListening();
Serial.println("RX (Uno) запущен. Ожидаю данные...");
lastStatsTime = millis();
}
void loop() {
if (radio.available()) {
char receivedData[21] = {0};
radio.read(&receivedData, 20);
receivedData[20] = '\0';
char decodedWord[5];
for (int i = 0; i < 4; i++) {
decodedWord[i] = getMostFrequentChar(&receivedData[i * 5]);
}
decodedWord[4] = '\0';
Serial.print("Получено: ");
Serial.print(receivedData);
Serial.print(" | Расшифровано: ");
Serial.println(decodedWord);
packetsReceived++;
}
if (millis() - lastStatsTime >= 1000) {
Serial.print("=========================================\n");
Serial.print(">>> СТАТИСТИКА: Принято пакетов за сек: ");
Serial.println(packetsReceived);
Serial.print("=========================================\n");
packetsReceived = 0;
lastStatsTime = millis();
}
}
Код на про микро:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8);
const byte address[6] = "00001";
char payload[21] = "PPPPPIIIIINNNNNGGGGG";
void setup() {
Serial.begin(9600);
delay(2000);
if (!radio.begin()) {
Serial.println("Радиомодуль не отвечает!");
while (1) {}
}
radio.openWritingPipe(address);
radio.setChannel(108);
radio.setPALevel(RF24_PA_MIN);
radio.setDataRate(RF24_1MBPS);
radio.setAutoAck(false);
radio.disableCRC();
radio.stopListening();
Serial.println("TX (Pro Micro) запущен. Начинаю отправку...");
}
void loop() {
radio.write(&payload, 20);
Serial.print("Отправлено: ");
Serial.println(payload);
delay(50);
}
Вывод от Уно:(про микро не интересует, он спокойно отправляет)
=========================================
>>> СТАТИСТИКА: Принято пакетов за сек: 7
=========================================
Получено: ��PPIIIIHa�NNNGGGGF | Расшифровано: PING
Получено: a��PPIIIIH�NNNGGGGD | Расшифровано: PING
Получено: @�PPIIIII@�NNGGGGG | Расшифровано: PING
Получено: a�PPPIIIIH�NNNGGGGD | Расшифровано: PING
Получено: P_�PPIIIII@_�NNGGGGG | Расшифровано: PING
Получено: P@��PIIIIIN��NGGGGG | Расшифровано: PING
Получено: @_�PPIIIIIH�NNGGGGG | Расшифровано: PING
Получено: Pa��PIIIIIN@_�NGGGGG | Расшифровано: PING
В среднем приходят за секунду 4-7 пакетов, дай бог выдаст 11 ну и умудряется получить всего 2. Так как я хочу собрать радиоуправляемый самолетик, то мне нужна скорость передачи и чтобы не было часто такого мусора. Оно хоть и расшифровывает это как PING, но когда я попытался таким методом запустить удаленно бесколлекторный движок, то он принял мусор как максимальное значение и успешно намотал шторы.
Чтобы избавиться от этого я пытался экранировать, подключал через BEC(5V/3A) от ESC, но все напрасно, такой же мусор.
Вопрос: Как можно избежать этого мусора и сделать быстрее передачу пакетов? Может стоит поменять вообще модуль и взяться за другой?
P.S. готовые летные контроллеры не предлагать, не интересно.