Модули NRF24L01+

Ответить
Аватара пользователя
ru0aog
Сообщения: 942
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 125 раз
Поблагодарили: 138 раз

Модули NRF24L01+

Сообщение ru0aog » 07 фев 2022, 07:24

Добрый день всем!
Не знаю точно, куда поместить эту тему, вроде как больше всего подходит сюда.

Задумал я детишкам сделать радиоуправление :)
В Китае полно различных готовых модулей и устройств для этого, и я выбрал модули на основе чипа NRF24L01+ и усилителя к нему AT2401C.

Есть два типа плат на таких чипах - без усилителя, со встроенной антенной:
IMG_20220207_105048.jpg
И с усилителем и внешней антенной (антенну я тут не показал, она накручивается на разъём SMA-F):
IMG_20220207_105014.jpg
Мне нужно проконтролировать передачу сигнала, поэтому я выбираю вариант с усилителем и входом на SMA.

Для управления платой потребуется какой-нибудь микроконтроллер с SPI-интерфейсом.
Приспособил для этого китайскую же Ардуино Нано на АТМега328Р.
На плате контроллера уже имеется гнездо USB, что очень удобно при программировании.

Чтобы не припаиваться каждый раз или не изобретать что-то, что отнимает время, взял плату расширения для Ардуино Нано
IMG_20220207_105203.jpg
Контроллер на плате
IMG_20220207_105151.jpg
Также нужно учесть, что плата передатчика питается от напряжения 3,3 В, причём кушает приличный ток (встроенный стабилизатор Ардуино Нано не справляется). Нужен внешний стабилизатор.
Годится специальная платка YL-105
IMG_20220207_105125.jpg

Аватара пользователя
ru0aog
Сообщения: 942
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 125 раз
Поблагодарили: 138 раз

Модули NRF24L01+

Сообщение ru0aog » 07 фев 2022, 07:31

По многочисленным советам (раз, два) поставил на выход стабилизатора дополнительный электролит на 10 мкФ (на плате нет никакого) и зашунтировал вход питания платы передатчика керамикой на 1 мкФ.
Вышло примерно так
IMG_20220207_105306.jpg
Залил проверочный код.
010.png
Он простоянно передайт одну и ту же цифру (109) на канале 00
/*
Победа над nRF24L01: на три шага ближе, передатчик
https://habr.com/ru/post/476716/
*/

#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10); // порты D9, D10: CSN CE
const uint32_t pipe = 111156789; // адрес рабочей трубы;

byte data;

void setup() {
Serial.begin(115200);
Serial.println("TransmitterTester ON");

radio.begin(); // инициализация
delay(2000);
radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
radio.setCRCLength(RF24_CRC_8); // размер контрольной суммы 8 bit или 16 bit
radio.setPALevel(RF24_PA_MAX); // уровень питания усилителя RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX
radio.setChannel(0x00); // установка канала
radio.setAutoAck(false); // автоответ
radio.powerUp(); // включение или пониженное потребление powerDown - powerUp
radio.stopListening(); //радиоэфир не слушаем, только передача
radio.openWritingPipe(pipe); // открыть трубу на отправку
}

void loop() {
data = 109;
radio.write(&data, 1);
Serial.println("data= " + String(data));
}
Библиотека:
RF24-master.rar
(4.85 МБ) 176 скачиваний


Аватара пользователя
ru0aog
Сообщения: 942
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 125 раз
Поблагодарили: 138 раз

Модули NRF24L01+

Сообщение ru0aog » 07 фев 2022, 07:54

Далее, мне нужно определить - есть ли передача в эфир?
Воспользоваться программным откликом этого же модуля не совсем достоверно. Китайцы могли накосячить, например, в усилителе.
Тогда NRF24L01+ даст рапорт об успешной передаче, а AT2401C или не переключится на передачу, или ещё что-нибудь...

А что такое AT2401C ? Это китайский аналог RFX2401C - RFeIC (RF Front-end Integrated Circuit), то есть, усилитель мощности передатчика, малошумящий усилитель приёмника и цепи коммутации приём/передача.
Вся эта радость работает на выход 50 Ом на частотах 2,4 ГГц.
Выходной мощности обещано +22 dBm при потребляемом токе 100 мА.

В общем, раз есть 50-омный выход, то решил замерить сигнал прямо оттуда.
Поначалу ничего не получилось, ибо питался я от USB-порта.
Повторюсь, плата передачи кушает весьма неслабый ток. Причём импульсно. 100 мА - это уже среднее значение.
В результате порт просел, какие-то одиночные палочки выпрыгивали, но редко. И похоже, это приводило к перезагрузке контроллера.

Отключился от компа, запитал от лабораторного источника - и дело пошло.
IMG_20220207_110524.jpg
Кстати, по питанию выглядит это так:
Первоначальный пуск - 25 мА,
инициализация - 15 мА,
работа усилителя - 90...100 мА.

Поскольку передаётся цифра, то сигнал выглядит как набор палок.
IMG_20220207_105448.jpg
Включаем удержание пиков.
Это канал 00:
IMG_20220207_110503.jpg
Насколько я помню, верхний канал тут имеет номер 7F.
Проверим, на какой частоте находится этот канал:
IMG_20220207_110300.jpg
Ага, что-то работает.
Во-первых, контроллер устанавливает частоту чипа и происходит какая-то передача данных.
Во-вторых, усилитель тоже работает.
Но на нижних каналах мощность почему-то оказалась больше:
канал 00, частота 2400 МГц, сигнал +19 dBm,
канал 7F, частота 2520 МГц, сигнал +12 dBm.

Аватара пользователя
ru0aog
Сообщения: 942
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 125 раз
Поблагодарили: 138 раз

Модули NRF24L01+

Сообщение ru0aog » 07 фев 2022, 17:44

Так, передача есть.
Теперь надо наладить приём.

Поскольку мы работаем на диапазоне, также занятым сетями Wi-Fi, то сначала глянем, что там в эфире твориться.
Ставлю антенну на гнездо анализатора и разворачиваю диапазон 2,4 ГГц
IMG_20220207_203626.jpg
Ага, кто-то есть!
IMG_20220207_203711.jpg
Собственно, это и не удивительно.
Мой стационарный комп также подключен по Wi-Fi.

Собираем второй комплект.
На приёмнике нет особой надобности ставить конденсаторы по питанию. Может потом добавлю.
К тому же, приёмник соединён с компом - он получает данные через порт.
IMG_20220207_213751.jpg
Прошиваем программу сканера диапазона
Spoiler
/*
Победа над nRF24L01: на три шага ближе, сканер эфира
https://habr.com/ru/post/476716/
*/

/*
Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
*/

/**
Channel scanner

Example to detect interference on the various channels available.
This is a good diagnostic tool to check whether you're picking a
good channel for your application.

Inspired by cpixip.
See http://arduino.cc/forum/index.php/topic,54795.0.html
*/

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

//
// Hardware configuration
//

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9, 10); //Arduino UNO

//
// Channel info
//

const uint8_t num_channels = 128;
uint8_t values[num_channels];

//
// Setup
//

void setup(void)
{
//
// Print preamble
//

Serial.begin(9600);
Serial.println("Scanner Air On");
printf_begin();

//
// Setup and configure rf radio
//

radio.begin();
radio.setAutoAck(false);

// Get into standby mode
radio.startListening();
radio.printDetails();
delay(5000);

// Print out header, high then low digit
int i = 0;
while ( i < num_channels )
{
printf("%x", i >> 4);
++i;
}
printf("\n\r");
i = 0;
while ( i < num_channels )
{
printf("%x", i & 0xf);
++i;
}
printf("\n\r");
}

//
// Loop
//

const int num_reps = 100;

void loop(void)
{
// Clear measurement values
memset(values, 0, sizeof(values));

// Scan all channels num_reps times
int rep_counter = num_reps;
while (rep_counter--)
{
int i = num_channels;
while (i--)
{
// Select this channel
radio.setChannel(i);

// Listen for a little
radio.startListening();
delayMicroseconds(512);
radio.stopListening();

// Did we get a carrier?
if ( radio.testCarrier() )
++values;
}
}

// Print out channel measurements, clamped to a single hex digit
int i = 0;
while ( i < num_channels )
{
printf("%x", min(0xf, values & 0xf));
++i;
}
printf("\n\r");
}

Начинаем сканировать.
Каждый столбик цифр - это свой канал.
011.png
Циферки от работы сетей Wi-Fi примерно совпадают с тем местом на диапазоне, что показал анализатор.
В середине работы включаю передатчик (выделено красным).

Значит что-то передаётся и что-то принимается.
Уже хорошо.

P.S.
Кстати, на передатчике пришлось поднять напряжение до +8 вольт.
При питании от +7В возникали ошибки передачи по SPI, если потрогать пальцем около сигнальных линий. Видимо надо снизить скорость обмена.

Аватара пользователя
ru0aog
Сообщения: 942
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 125 раз
Поблагодарили: 138 раз

Модули NRF24L01+

Сообщение ru0aog » 08 фев 2022, 05:16

ru0aog писал(а):
07 фев 2022, 07:54
канал 00, частота 2400 МГц, сигнал +19 dBm,
канал 7F, частота 2520 МГц, сигнал +12 dBm.
Посмотрел описание частот каналов.
Канал 00 = 2400 МГц.
Каждый следующий канал отстоит на 1 МГц.
Канал 7F = 127. Частота 2400+127 = 2527 МГц.

Аватара пользователя
ru0aog
Сообщения: 942
Зарегистрирован: 30 сен 2021, 05:50
Позывной: ru0aog
Город: Красноярск
Имя: Станислав
Благодарил (а): 125 раз
Поблагодарили: 138 раз

Модули NRF24L01+

Сообщение ru0aog » 08 фев 2022, 06:08

Хм, забавно.
Вчера модули на передачу работали, а сегодня - нет.
Ответ дают, но тока не потребляют и сигнала на выходе нет.

Ответить

Вернуться в «SDR трансиверы»