вопрос по трубке nRF24L01

Я просматриваю пример кода, найденный здесь. Я знаю, что есть 6 каналов, которые может использовать модуль nRF24L01, но я искал в Интернете обозначения адресов и ничего не смог найти. Точнее, есть ли в строке 37 ссылка на то, где автор получает 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?

Спасибо.

, 👍9

Обсуждение

Проверьте документацию RF24 API для openReadingPipe() здесь: http://maniacbug.github.io/RF24/classRF24.html#aa7e8523f86f9f8f20c274e0c89a5fd45 там упоминается, что вы можете использовать любые значения для последнего байта адреса., @jfpoilpret

Итак, я просмотрел документацию, но там не упоминается, как выбирается адрес канала. Там просто говорится, что они должны совместно использовать первые 32 бита. Например, 0xF0F0F0F0(XX), считается ли 0x байтом? Или F0F0F0F0 — это те 32 бита, которые имеют значение? Также, имеет ли значение, если это не F0F0F0F0, если каналы совместно используют эти 32 бита? Как насчет последних двух значимых байтов (XX)? Они тоже произвольны?, @Alex H

Префикс 0x... просто указывает, что значение в шестнадцатеричном формате. Это потому, что 99 в десятичном формате отличается от 99 в шестнадцатеричном, хотя они выглядят одинаково. Поэтому вместо этого мы используем 0x99., @Gerben

Код, который вы используете, поддерживает только 1 канал. nRF24L01 имеет 2 уникальных канала (0 и 1). Он также имеет 4 дополнительных канала (2, 3, 4 и 5), где вы можете установить только младший байт. Остальные байты будут такими же, как и во втором канале (1)., @Gerben

Спасибо за ответ, я думаю, я просто все еще не понимаю, есть ли процесс установки наименее значимого байта. Например, как E1 или D2 в каналах, перечисленных выше..., @Alex H


3 ответа


Лучший ответ:

5

Как пишет большинство людей, значения для канала произвольны, но должны соответствовать правилам API:

Каналы 1–5 должны совместно использовать первые 32 бита. Только наименее значимое байт должен быть уникальным, например

Прежде чем я отвечу на ваш вопрос, я думаю, необходимо объяснить шестнадцатеричные и десятичные значения.

40-битное шестнадцатеричное число представляет собой представление числа по основанию 16. Десятичное число имеет основание 10. Таким образом, вы можете преобразовать шестнадцатеричное значение в десятичное. Поскольку это выходит за рамки вопроса, вы можете погуглить, как конвертировать из одного в другое. Есть несколько онлайн-конвертеров:

Преобразователь шестнадцатеричных чисел в десятичные

Когда вы преобразуете шестнадцатеричное значение в десятичное, вы увидите, что это всего лишь числовое представление. При преобразовании вы удаляете 0x и LL. Как уже говорилось, 0x указывает, что значение является шестнадцатеричным, а LL означает тип Long Long.

Чтобы ответить на ваш вопрос, воспользуйтесь конвертером, чтобы найти шестнадцатеричное число, например:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Просто измените последние 2 цифры (младший бит):

Pipes 1-5 should share the first 32 bits. Only the least significant byte should be unique, e.g.
   openReadingPipe(1,0xF0F0F0F0AA);
   openReadingPipe(2,0xF0F0F0F066);

Добавьте 0x и LL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Все должно работать.

Я не являюсь экспертом в гексагонах, поскольку я учусь, поэтому, если я ошибаюсь, пожалуйста, кто-нибудь меня поправит.

Наконец, в таблице данных nRF24L01 отмечается, что выбор адреса не является полностью произвольным:

Примечание. Адреса, уровень которых меняется только один раз (то есть 000FFFFFFFF), часто могут быть обнаружены в шуме и могут дать ложное обнаружение, что может привести к увеличению частоты ошибок пакетов. Адреса как продолжение преамбулы (переключение между высоким и низким) также повышают частоту ошибок пакетов.

,

@bersch - Это имеет значение? Автор вопроса спрашивал, как выбираются значения каналов, например, «откуда автор берет 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?», а не как используются каналы., @PhillyNJ

По результатам моего тестирования значения являются произвольными, если только ваши трубы 0 и 1 одинаковы на передатчике и приемнике., @PhillyNJ

Я работаю над своим. У меня будет 1 передатчик и 4 приемника., @PhillyNJ


2

Значения 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL являются произвольными значениями и определяют адреса отправителей и получателей, с которыми нужно общаться.

Если вы используете библиотеку Mirf

Mirf.setRADDR((byte *)"serv1");

они также могут быть строками типа serv1.

RF24 использует

write_register(RX_ADDR_P0, &value, 5);
write_register(TX_ADDR, &value, 5);
,

2

Есть кое-что, о чем все забывают вам сказать:

Трубы на приемнике должны быть укорочены после первой

const uint64_t pipe01 = 0xE8E8F0F0A1LL;
const uint64_t pipe02 = 0xA2LL;  
const uint64_t pipe03 = 0xA3LL;
const uint64_t pipe04 = 0xA4LL;
const uint64_t pipe05 = 0xA5LL;
const uint64_t pipe06 = 0xA6LL;

radio.openReadingPipe(1, pipe01);  
radio.openReadingPipe(2, pipe02);
radio.openReadingPipe(3, pipe03);
radio.openReadingPipe(4, pipe04);
radio.openReadingPipe(5, pipe05);

Трубы на передатчике должны быть

const uint64_t pipe01 = 0xE8E8F0F0A1LL;
const uint64_t pipe02 = 0xE8E8F0F0A2LL;  
const uint64_t pipe03 = 0xE8E8F0F0A3LL;
const uint64_t pipe04 = 0xE8E8F0F0A4LL;
const uint64_t pipe05 = 0xE8E8F0F0A5LL;
const uint64_t pipe06 = 0xE8E8F0F0A6LL;

uint64_t setPipeToSend = pipe01; // or pipe02 or pipe03 or pipe04 or pipe05
radio.openWritingPipe(setPipeToSend );

Если вы хотите узнать, сообщение какого канала пришло, используйте

  uint8_t someVariable;
    if (radio.available(&someVariable))
    {
       Serial.print("pipe number ");
       Serial.printLn(someVariable);
    }

Также канал 6 используется для получения сообщений подтверждения.

Кроме того, код инициализации должен иметь radio.enableDynamicPayloads(); Мне этот вариант подходит:

    radio.begin();
    //radio.setChannel(0x57); //если набор должен быть одинаковым с обеих сторон
    radio.setPALevel(RF24_PA_LOW);  // «LOW» — более стабильный режим
    radio.enableAckPayload(); //для автоответов
    radio.openWritingPipe(pipe01); //для отправки
    //связываем номера каналов с адресами каналов
    //radio.openReadingPipe(1, Pipe01); // Я использую Pipe01 для отправки
    radio.openReadingPipe(2, pipe02);
    radio.openReadingPipe(3, pipe03);
    radio.openReadingPipe(4, pipe04);
    radio.openReadingPipe(5, pipe05);
    radio.enableDynamicPayloads(); //необходимо для приема по нескольким каналам
    radio.startListening();  //начинаем слушать

Удачи...

,

как определено pipe в вашем примере?, @x29a

Я отредактировал код. Вы можете использовать любой из этих "каналов" для отправки, но не забудьте (как я) исключить этот канал из чтения., @Faig