В предыдущей части урока мы подготовили проекты для двух передатчиков, также в проект приёмника добавили возможность приёма пакетов от двух передатчиков и отображения их в разных строках дисплея и проверили наш код на практике.
Теперь займёмся третьим передатчиком. Схема для него будет такая же точно, как и для второго. Подключим теперь третий передатчик к ПК, а плату приёмника подключим к отдельному питанию.
Проект для третьего передатчика мы сделаем из проекта для второго, а назовём уже NRF24_TX_PIPE2.
Запустим данный проект в Cube MX, и, ничего в нём не трогая, сгенерируем проект и откроем его в Keil. Настроим программатор на авторезет, оптимизацию включим в 1, подключим файл NRF24.c и попробуем собрать проект. Прошивать пока не будем, так как одинаковые адреса, будут неизбежно коллизии на приёмнике.
Перейдём в файл NRF24.c и изменим адрес
uint8_t TX_ADDRESS[TX_ADR_WIDTH] = {0xb6,0xb5,0xa1};
Почему мы меняем именно первый байт?
Да потому что мы, когда изучали каналы, мы видели, что начиная с PIPE2, мы не можем полностью задавать адреса, а можем задавать только младшую часть адреса, которая и находится в буфере адреса в первой (а точней на нулевой) ячейке.
Также изменим время между попытками повторной передачи пакета в функции инициализации
NRF24_WriteReg(SETUP_RETR, 0x8F); // 2250 us, 15 retrans
В файле main.c в бесконечном цикле функции main() изменим время задержки
/* USER CODE BEGIN 3 */
HAL_Delay(1358);
Соберём проект и прошьём контроллер.
Мы опять же ничего не увидим от данного передатчика на дисплее приёмника, так как мы ещё приёмник не настраивали на адрес третьего передатчика.
Поэтому подключим к отдельному питанию плату третьего передатчика, а плату приёмника опять подключим к ПК.
Перейдём в проект приёмника в файл NRF24.h и добавим макросы для третьего канала
#define RX_ADDR_P1 0x0B //'RX address pipe1' register address
#define RX_ADDR_P2 0x0C //'RX address pipe2' register address
#define TX_ADDR 0x10 //'TX address' register address
#define RX_PW_P0 0x11 //'RX payload width, pipe0' register address
#define RX_PW_P1 0x12 //'RX payload width, pipe1' register address
#define RX_PW_P2 0x13 //'RX payload width, pipe2' register address
Затем зайдём в файл NRF24.c и добавим третий адрес, а верней его младший байт
#define TX_PLOAD_WIDTH 7
#define TX_ADDRESS2 0xb6
Мы задаём только младшую часть адреса.
Перейдём теперь в функцию инициализации и сначала включим третий канал
NRF24_WriteReg(EN_AA, 0x07); // Enable Pipe0, Pipe1 and Pipe2
NRF24_WriteReg(EN_RXADDR, 0x07); // Enable Pipe0, Pipe1 and Pipe2
Передадим адрес модулю (вернее младшую часть адреса, поэтому и функцию мы уже используем не для буфера, а для обычного регистра)
NRF24_Write_Buf(RX_ADDR_P1, TX_ADDRESS1, TX_ADR_WIDTH);
NRF24_WriteReg(RX_ADDR_P2, TX_ADDRESS2);
Также зададим величину пакета для третьего канала
NRF24_WriteReg(RX_PW_P1, TX_PLOAD_WIDTH); //Number of bytes in RX payload in data pipe 1
NRF24_WriteReg(RX_PW_P2, TX_PLOAD_WIDTH); //Number of bytes in RX payload in data pipe 2
Соберём проект, прошьём контроллер и увидим следующую картину на нашем дисплее
А вот так выглядит вся наша схема (нажмите на картинку для увеличения изображения)
Вот теперь цель занятия достигнута. Мы одновременно принимаем с трёх передатчиков пакеты в одном приёмнике, выводя их содержимое нагляжно на дисплей, также научились работать с ножкой прерываний модуля аппаратно, что добавило нашему проекту профессиональность
Всем спасибо за внимание!
Предыдущая часть Программирование МК STM32 Следующий урок
Исходный код для передатчика 0
Исходный код для передатчика 1
Исходный код для передатчика 2
Модуль NRF24L01+ с антенной можно купить здесь NRF24L01+
Модуль NRF24L01+ без антенны можно купить здесь (целых 4 штуки) NRF24L01+
Адаптер для NRF24L01 можно купить здесь (5 штук) Адаптер для NRF24L01
Датчик температуры и влажности можно приобрести здесь DHT22
Отладочную плату можно приобрести здесь Nucleo STM32F401RE
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Отладочную плату NUCLEO-F303K8 можно купить здесь NUCLEO-F303K8
Программатор недорогой можно купить здесь ST-Link V2
Дисплей LCD 20×4 можно приобрести здесь LCD 20×4
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добрый вечер, при нескольких передатчиках все работает штатно , считываю регистр observe_tx и время от времени набегает парочка недозвонов,не упущенных пакетов,а имменно «недозвонов»,это нормально?дальность очень маленькая,в пределах комнаты.т.е. передатчик недостукивается до приемника и тут же передает дальше. Или такого на столе не должно быть?