Перейти к содержанию

Рекомендуемые сообщения

Коллеги, доброго времени суток! Помогите пожалуйста разобраться в вопросе. Есть уже готовый исправно работающий передатчик, который автор сего устройства собрал на базе Arduino Mega 2560, передатчик работает в паре с микросхемой NRF24L01. Единственное, на что я могу повлиять - попросить автора прошивки поменять настройки вещания передатчика. Для примера, простейший код передатчика на ардуине выглядит так:

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

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

char counter;

void setup() {
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(0xAABBCCDD11LL); // 0xAABBCCDD11LL
 

  radio.setChannel(0x00);  //выбираем канал (в котором нет шумов!)
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS  
  radio.setPALevel(RF24_PA_MIN);

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}

void loop() {
  radio.write(&counter, sizeof(counter));
  counter++;
  
  delay(500);
}

Пример простейшего приёмника на NRF24L01 (ардуина):

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

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно

void setup() {
  Serial.begin(9600);
  Serial.println("ready!!!!!");

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0,15);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах
  radio.openReadingPipe(1, 0xAABBCCDD11LL); // 0xAABBCCDD11LL

  radio.setChannel(0x00);  //выбираем канал (в котором нет шумов!)
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS  
  radio.setPALevel(RF24_PA_MIN);

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
    char pipeNo, gotByte;                          
    while(radio.available(&pipeNo)) {    // слушаем эфир со всех труб
      radio.read(&gotByte, sizeof(gotByte));         // чиатем входящий сигнал
      if(gotByte!=0) Serial.println(gotByte);      
   }
}

Между собой ардуины отлично работают, но, принимать и обрабатывать данные должен STM32-чип (передавать данные обратно в данный момент не требуется). Что я только не пытался сделать - STM32 не видит входящий сигнал, либо же видит, но не хочет его обрабатывать... На просторах сети нашел библиотеку и простейший пример для работы с чипами NRF32L01, немного доработал его под себя, вот что получилось:

#include <mbed.h>
#include "nRF24L01P.h"

#define TRANSFER_SIZE 32

int main() {
  nRF24L01P my_nrf24l01p(A7, A6, A5, A4, B0, A10);    // mosi, miso, sck, csn, ce, irq
  Serial serial(A2, A3);
  int count = 0;
  int frequency = 2400;
  char rxData[TRANSFER_SIZE];
  char data = 0;
  
  my_nrf24l01p.powerUp();
  
  my_nrf24l01p.setTransferSize(TRANSFER_SIZE); 
  my_nrf24l01p.setReceiveMode();
  my_nrf24l01p.setRxAddress(0xAABBCCDD11LL);
  my_nrf24l01p.setRfFrequency(2400);
  my_nrf24l01p.enable();

  // Display the (default) setup of the nRF24L01+ chip
  serial.printf("nRF24L01+ Frequency    : %d MHz\r\n",  my_nrf24l01p.getRfFrequency());
  serial.printf("nRF24L01+ Output power : %d dBm\r\n",  my_nrf24l01p.getRfOutputPower());
  serial.printf("nRF24L01+ Data Rate    : %d kbps\r\n", my_nrf24l01p.getAirDataRate());
  serial.printf("nRF24L01+ TX Address   : 0x%010llX\r\n", my_nrf24l01p.getTxAddress());
  serial.printf("nRF24L01+ RX Address   : 0x%010llX\r\n", my_nrf24l01p.getRxAddress());

    while(true) {      
    for(int j = 0; j < 200000; j++) {
      if (my_nrf24l01p.readable(0) || my_nrf24l01p.readable(1) || my_nrf24l01p.readable(2) || my_nrf24l01p.readable(3) || my_nrf24l01p.readable(4) || my_nrf24l01p.readable(5)) {
        serial.printf("DATA ACCEPTED!!\r\n");       
      }
    }

    if(frequency < 2525) {
      frequency++;
    } else {
      frequency = 2400;
    }

    my_nrf24l01p.setRfFrequency(frequency);
    serial.printf("CHANGE CHANNEL: %d\n\r", my_nrf24l01p.getRfFrequency());
  }
}

Вариант того, что чип не правильно припаян, не работоспособен или нечто подобное - мало вероятен, так как при малейших ошибках и даже плохом контакте - я получал кучу ошибок о том, что NRF24L01 - "не завелась". Перепробовал всё что смогу придумать, в том числе изменял/отключал CRC. Раз в пару часов могут придти несколько мусорных пакетов данных (подряд), после чего опять "радио молчание", при этом лежащий рядом тестовый приёмник собранный на базе ардуины, любезно предоставленный автором исходной прошивки - принимает данные исправно. Пробовал менять NFR'ки местами -- результат всегда один и тот же.

Среди прочего, я заметил, что прёмник собранный на ардуине - стабильно может принимать в том числе и различный мусор из эфира, например, помехи от роутера. Собранный же мой приёмник 99.9% времени не принимает вообще ничего. Подозреваю, что проблема в коде который писал я, только не могу понять, куда бы могла закрасться ошибка...

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...