вопрос трубы nRF24L01


9

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

Спасибо.


1
Вы смотрели таблицу данных для радио IC? Это, безусловно, имеет больше информации об адресах канала.

1
Обратитесь к документации по API RF24 openReadingPipe()здесь: maniacbug.github.io/RF24/… там упоминается, что вы можете использовать любые значения для последнего байта адреса.
jfpoilpret

Поэтому я просмотрел документацию, но там не упоминается, как выбирается адрес канала. Это просто сказать, что они должны разделить первые 32 бита. Например, 0xF0F0F0F0 (XX), 0x считается байтом? Или F0F0F0F0 32 бита, которые имеют значение? Кроме того, имеет ли значение, что это не F0F0F0F0, если каналы разделяют эти 32 бита? Как насчет двух последних значащих байтов (XX)? Это тоже произвольно?
Алекс Х

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

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

Ответы:


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 указывает на то, что выбор адреса не является полностью произвольным:

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


Не могли бы вы также упомянуть, что эти каналы относятся только к функции «6 мульти-приемников данных» (с. Nordic Datasheet, p39-40). по умолчанию включены только каналы данных 0 и 1.

@bersch - это актуально? ОП спрашивал, как выбираются значения канала, например where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?, а не как используются каналы.
PhillyNJ

Чтобы выбрать значения, вам нужно знать, что по умолчанию есть канал записи и канал чтения. В режиме нескольких приемников есть запись и до 5 каналов чтения. Вы описываете только читающие трубы. До сих пор я не проверял это, но я верю, что если выбрать канал чтения и записи, разделяющий первые 32 бита, произойдет сбой.

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

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

2

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

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

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

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

RF24 использования

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

1

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

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

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); //if set should be the same at the both sides
    radio.setPALevel(RF24_PA_LOW);  // "LOW" is more stable mode
    radio.enableAckPayload(); //for autoanswers
    radio.openWritingPipe(pipe01); //for sending
    //link pipe numbers to the pipe addresses
    //radio.openReadingPipe(1, pipe01); // I use pipe01 for sending
    radio.openReadingPipe(2, pipe02);
    radio.openReadingPipe(3, pipe03);
    radio.openReadingPipe(4, pipe04);
    radio.openReadingPipe(5, pipe05);
    radio.enableDynamicPayloads(); //must have for multi pipe receiving
    radio.startListening();  //start listening

Удачи...


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

1
Я отредактировал код. Вы можете использовать любой из этих «каналов» для отправки, но не забудьте (как и я) исключить этот канал из чтения.
Фэйг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.