nRF24L01 трубне питання


9

Я переглядав приклад коду знайдений тут . Я знаю, що 6 модулів можуть використовувати модуль nRF24L01, але я шукав в Інтернеті позначення адрес і нічого не зміг знайти. Більш конкретно, у рядку 37, чи є посилання на те, де автор отримує 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?

Дякую.


1
Ви подивилися на таблицю даних для ІС радіо? Це, безумовно, має більше інформації про адреси труб.

1
Перевірте тут документ RF24 API doc 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 біти. Тільки найменш значущий байт повинен бути унікальним, наприклад

Перш ніж відповісти на ваше запитання, я думаю, що потрібне пояснення щодо значень Hex і Decimal.

40-бітний шістнадцятковий - це числове представлення бази 16. Десяткова частина - основа 10. Отже, ви можете перетворити шістнадцяткове значення в десяткове. Оскільки це питання не стосується питання, ви можете переглядати, як перетворитись з одного в інший. Є кілька онлайн-перетворювачів:

Шестнадцятковий в десятковий перетворювач

Ви побачите, коли перетворите значення Hex в десяткове, що це просто представлення числа. Коли ви конвертуєте, ви скидаєте 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), часто можна виявити в шумі і може дати помилкове виявлення, що може призвести до підвищеної частоти помилок пакету. Адреси як продовження преамбули (перемикання з високим рівнем низьких частот) також збільшує рівень помилок пакету.


Ви можете також зазначити, що ці труби посилаються лише на функцію "6 приймачів даних" (s. 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
Я відредагував код. Ви можете використовувати будь-яку з цих "труб" для надсилання, але не забудьте (як я), щоб виключити цю трубку від читання.
Faig
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.