В предыдущей части нашего занятия мы создали и написали проект для приёмника, а также проект для первого передатчика.
Проект мы сделаем полностью из проекта первого передатчика NRF24_RX_00 и назовём его NRF24_RX_01 с целью наименьших временных затрат для написания исходного кода.
Откроем проект в Cube MX, ничего там не трогая, сгенерируем проект для Keil, откроем его, настроим программатор на авторезет, установим уровень оптимизации в 1, а также подключим к дереву проекта файлы NRF24.c и max7219.c.
Попробуем собрать проект.
Если всё нормально, то идём в файл NRF24.c и изменим там только адрес, а точнее только его младший байт
uint8_t TX_ADDRESS[TX_ADR_WIDTH] = {0xb7,0xb5,0xa1};
Соберём код, прошьём контроллер. Теперь оба наших приёмника прекрасно принимают все пакеты от передатчика
В качестве третьего передатчика я хотел взять аналогичную плату, но почему-то у меня третий 8-разрядный индикатор отказался работать. Поэтому я решил использовать дисплей на контроллере HD44780. Дисплей небольшой размерностью 16×2. Мы с таким уже работали. И подключать мы его будем также, как и дисплей на передатчике, через переходник по шине I2C. По данной шине он с контроллером F103 тоже отказался работать вместе с модулем NRF. Без него нормально работает. Поэтому в качестве управляющей платой я решил взять старый добрый STM32F4-DISCOVERY, с которым мы прошли немало занятий и знаем о нём глубоко не понаслышке. Подключим к нему модуль NRF и дисплей (к каким ножкам и что подключать, мы увидим позже, когда будем конфигурировать проект в Cube MX). У нас получится вот такая схема
Подключим наш третий передатчик к ПК, а второй запитаем от независимого источника.
Проект мы для нашего третьего передатчика создадим новый, так как мы давно уже не работали с данной платой.
Выберем контроллер
Включим кварцевый резонатор
Включим отладчик
Включим SPI1 для модуля NRF
Для дисплея включим I2C3
Ножку PA2 включим на вход — это будет у нас ножка IRQ для модуля NRF. А ножки PA3 и PA4 — на выход. Это соответственно будут CE и CS
Также включим ножки, подключенные к светодиодам, тоже на выход
Перейдём в Clock Configuration и настроим наши частоты (нажмите на картинку для увеличения изображения)
Перейдём в Configuration, настроим шину SPI
Проверим настройки I2C
Зайдём в настройки проекта, зададим каталог проекта, имя и выберем среду программирования
Сохраним настройки, сгенерируем проект в Keil, откроем его, настроим программатор на автоперезагрузку и включим уровень оптимизации в 1.
Попробуем собрать проект.
Если всё нормально собирается, то из проекта 1 приёмника скопируем файлы NRF24.c и NRF24.h, а из проекта передатчика — файлы lcd.c и lcd.h. Данные файлы вполне подойдут, исправлений для дисплея такой размерности почти не будет, если не считать функции позиционирования.
Подключим к проекту файлы NRF24.c и lcd.c.
В файле main.c подключим наши библиотеки
/* USER CODE BEGIN Includes */
#include "NRF24.h"
#include "lcd.h"
#include <string.h>
/* USER CODE END Includes */
Инициализируем дисплей и приёмопередатчик в main()
/* USER CODE BEGIN 2 */
LCD_ini();
NRF24_ini();
/* USER CODE END 2 */
Вызовем функцию приёма пакета в бесконечном цикле
/* USER CODE BEGIN 3 */
NRF24L01_Receive();
}
В файле lcd.c уберём лишние строки из функции позиционирования, так как в нашем дисплее только 2 строки. Функция теперь приобретёт следующий вид
void LCD_SetPos(uint8_t x, uint8_t y)
{
switch(y)
{
case 0:
sendbyte(x|0x80,0);
break;
case 1:
sendbyte((0x40+x)|0x80,0);
break;
}
}
Перейдём в файл NRF24.h, исправим библиотеку, также удалим подключение библиотеки индикатора, а вместо неё подключим библиотеку для дисплея
#include "stm32f4xx_hal.h"
#include "max7219.h"
#include "lcd.h"
Также исправим ножку для светодиода и полярность его включения и выключения
#define LED_GPIO_PORT GPIOD
#define LED_PIN GPIO_PIN_12
#define LED_ON HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_SET)
#define LED_OFF HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET)
Перейдём в файл NRF24.c и заменим там младший байт адреса
uint8_t TX_ADDRESS[TX_ADR_WIDTH] = {0xb6,0xb5,0xa1};
Подключим строковый массив
uint8_t RX_BUF[TX_PLOAD_WIDTH] = {0};
extern char str1[100];
В функции приёма пакета NRF24L01_Receive заменим строки кода, отвечающие за вывод информации на индикатор на строки, которые будут выводить информацию на дисплей
Clear_7219();
Number_7219(*(uint16_t*)RX_BUF);
LCD_SetPos(0, 0);
sprintf(str1,"%5u ", *(int16_t*)RX_BUF);
LCD_String(str1);
Соберём код, прошьём контроллер. После этого мы увидеть то, что все пакеты прекрасно и вовремя доставляются и информация выводится на дисплей и индикаторы всех трёх приёмников (нажмите на картинку для увеличения изображения)
Также и у передатчика дисплей всё прекрасно и вовремя отображает
Вот так вот приблизительно выглядит вся наша общая схема на практике (нажмите на картинку для увеличения изображения)
Таким образом, данный урок показал нам то, что вполне реально работать сразу с тремя приёмниками, собранными на модулях NRF. Также мы научились менять на ходу адрес передачи у передатчика и передавать пакеты адресно на любой из трёх приёмников, причём порой почти одновременно.
Ещё сегодня мы лишний раз убедились в том, какое облегчение в написание кода вносит использование библиотеки HAL. Мы, почти не напрягаясь, переносим код с одного контроллера на другой.
Всем спасибо за внимание!
Предыдущая часть Программирование МК STM32 Следующий урок
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Модуль NRF24L01+ с антенной можно купить здесь NRF24L01+
Модуль NRF24L01+ без антенны можно купить здесь NRF24L01+
Адаптер для NRF24L01 можно купить здесь (5 штук) Адаптер для NRF24L01
Индикатор светодиодный семиразрядный с драйвером MAX7219
Смотреть ВИДЕОУРОК (нажмите на картинку)
Я хочу знать, когда использовать «optimal level 3», «optimal level 2», «optimal level 1», «optimal level 1», на c/c++ code tab