В уроке 97 мы научились настроенный в обзоре модуль HC-05 в режиме ведомого устройства подключать к ведущему устройству в виде смартфона. Также мы смогли передать данные в обоих направлениях в виде строк. Данные передаются весьма уверенно, поэтому мы можем смело продолжать продвигаться вперёд по данной теме.
В рамках сегодняшнего занятия мы попробуем настроить данный модуль в качестве ведущего устройства (Master), соединить его с таким же модулем, выступающем в роли ведомого устройства, оставив его подключенным к контроллеру STM32F103. Затем мы уже модуль, настроенный в качестве ведущего устройства, подключим к аналогичному микроконтроллеру и в результате этого два контроллера у нас соединятся без проводов по беспроводному интерфейсу Bluetooth. Также к данному контроллеру мы подключим символьный дисплей разрешением 20×4 через переходник к шине I2C для того, чтобы отслеживать данные, которые будут нам приходить от ведомого устройства.
Задача на первый взгляд кажется сложной, но это вовсе не так. Мы обязательно справимся и вы поймёте. что страшного в этом нет ничего абсолютно.
Для начала давайте возьмём ещё один модуль HC-05 и также, как и в обзоре, подключим его к переходнику USB-TTL, который в свою очередь подключим к ПК и запустим терминальную программу CoolTerm также настроенную, как в том же самом обзоре. и, прежде чем подключать его к контроллеру, настроим его в режиме ведущего устройства.
Первым делом переведём наш модуль в режим работы с командами AT. Затем проверим его, отправив команду
Адрес и имя нам данного модуля нам в принципе не потребуются. Нам главное знать адрес ведомого устройства, к которому мы будем подключать ведущее.
Далее идём по пунктам:
1) Для начала произведём сброс всех настроек при помощи команды «AT+ORGL«.
2) Произведём сброс всех спаренных устройств, введя в терминал команду «AT+RMAAD«.
3) Установим в модуле режим ведущего устройства — «AT+ROLE=1«.
4) Можно установить желаемую скорость USART, например 115200 — «AT+UART=115200,0,0«. Причём не обязательно, чтобы скорость была одинаковой на модулях, они между собой договорятся.
5) Перезагрузим модуль командой «AT+RESET«. и снова переведём в режим приёма AT-команд.
6) Установим пароль ведомого устройства «AT+PSWD=1234«.
7) Вспомним адрес ведомого устройства из занятия по обзору и свяжем ведущее устройство с ведомым по команде «AT+BIND=98d3,31,4058cf«. Если не помним или не знаем адрес ведомого устройства, то его можно узнать, также подключив к USART-переходнику и терминальной программе и затем введя универсальную команду. Но если мы не можем этого сделать, например, ведомое устройство у нас куда-то впаяно и мы его не можем подключить и испытать с помощью AT-команд, то есть альтернативные способы узнавания адреса.
8) Ещё раз перезагружаемся «AT+RESET» и уже можем не переводить устройство в режим приёма команд, а только организовать поддержку, соединив на короткое время ножку KEY к ножке питания. После этого не забываем сменить скорость в терминальной программе на ту, которую мы установили в 4 шаге.
9) Добавляем пару «AT+PAIR=98d3,31,4058cf,5» (терминал в этом случае скорее всего не ответит ОК) и на всякий случай ещё раз перезагружаемся.
Теперь контроллер, к которому подключено ведомое устройство можно включить, подав на него питание. Устройства должны будут соединиться и за счёт программы, которую мы написали в уроке 97, будут приходить соответствующие данные из ведомого контроллера в терминальную программу, к которой подключен с помощью переходника ведущий контроллер. Также мы теперь можем убрать эхо из настройки порта в терминальной программе и попробовать передавать удалённо строки из неё, так как эхо у нас, как вы помните, есть своё в программе контроллера ведомого устройства. И в результате мы увидим следующую картину
Отлично!
Мы соединили ведущий модуль с ведомым.
Следующая задача: соединить его с контроллером, чтобы потом связать два контроллера. Для этого мы возьмём подобную маленькую отладочную плату. У меня такой же на данный момент не нашлось, есть парочка плат NUCLEO-F303K8, одну из которых мы и возьмём. У контроллера, установленного на ней всего 32 ножки, но нам много и не потребуется. Хоть данная плата стоит и недёшево, но зато она очень удобная, так как не требует наличия программатора, который в ней уже есть и также не требует переходников USART, так как данный порт виртуализирован там прямо через ST-Link. Пока мы сразу модуль HC-05 к данной плате подключать не будем, а подключим мы к ней дисплей 20х4 через переходник I2C. С данным дисплеем мы очень много занимались, поэтому он нам знаком. К каким именно ножкам подключать дисплей, мы узнаем, когда будем создавать проект в Cube MX, к чему мы, собственно, сейчас и приступим.
Вы, конечно, можете применять любые платы и любые контроллеры, которые у вас есть в наличии, не обязательно такие, как я.
Запустим Cube MX, создадим новый проект и выберем контроллер
Включим кварцевый резонатор
Затем включим отладку через SWD
Включим USART1
Включим I2C для переходника дисплея
Причём ножку SCL мы в нём переопределим, так как ножка по умолчанию не выведена наружу и используется для порта сквозь ST-Link
Ножку PB3 установим на выход, так как на ней у нас светодиод
Clock Configuration настроим следующим образом (нажмите на картинку для увеличения изображения)
Переходим в Configuration и для начала настроим USART
Включим прерывания
В I2C ничего не трогаем.
А вот для USART в разделе NVIC изменим приоритет, иначе почему-то как только начиналась обработка прерываний от USART, I2C переставал работать
Настроим проект, немного добавив стека и кучи, также укажем путь и придумаем проекту имя, ну и выберем среду программирования
Сгенерируем проект, откроем его в Keil, настроим атоперезагрузку программатора, а также включим уровень оптимизации 1 и попробуем наш проект собрать.
Далее мы из проекта урока 22 I2CLCD80 возьмём файлы lcd.h и lcd.c и скопируем их в соответствующие папки нашего проекта.
Затем подключим к проекту файл lcd.c.
Откроем файл lcd.h и заменим там наименование подключаемой библиотеки HAL, а также подключим библиотеку для работы со строками
#include "stm32f3xx_hal.h"
#include <string.h>
Заодно немного поправим ошибки в комментариях
#define setled() LCD_WriteByteI2CLCD(portlcd|=0x08) //включение бита подсветки
#define setwrite() LCD_WriteByteI2CLCD(portlcd&=~0x02) //установка линии RW в 0
В файле lcd.c уберём объявление глобального строкового массива
extern I2C_HandleTypeDef hi2c1;
char str1[100];
Подключим в main.c библиотеку LCD
/* USER CODE BEGIN Includes */
#include "lcd.h"
/* USER CODE END Includes */
Добавим глобальный строковый массив
/* Private variables ---------------------------------------------------------*/
char str1[21];
/* USER CODE END PV */
Также проинициализируем и очистим дисплей в функции main() и запустим приём байта в шину USART
/* USER CODE BEGIN 2 */
LCD_ini();
LCD_Clear();
HAL_UART_Receive_IT(&huart1,(uint8_t*)str1,1);
Ну и затем проверим наш дисплей
HAL_UART_Receive_IT(&huart1,(uint8_t*)str1,1);
LCD_SetPos(0,0);
sprintf(str1,"String 1");
LCD_String(str1);
LCD_SetPos(4,1);
sprintf(str1,"String 2");
LCD_String(str1);
LCD_SetPos(8,2);
sprintf(str1,"String 3");
LCD_String(str1);
LCD_SetPos(12,3);
sprintf(str1,"String 4");
LCD_String(str1);
Давайте посмотрим расположение ножек на нашей отладочной плате, так как явно ножки портов не указаны — всё указано как в Arduino
Руководствуясь данным изображением, а также распиновкой в Cube MX, подключим наш дисплей к плате, соберём наш код, прошьём контроллер и посмотрим его работоспособность
Как мы видим — всё у нас работает.
В следующей части нашего занятия мы напишем некоторые функции по приёму строки из модуля и отправки их на дисплей и испытаем наш код на практике.
Предыдущий урок Программирование МК STM32 Следующая часть
Переходник USB to TTL можно приобрести здесь ftdi ft232rl
Модуль bluetooth HC-05 можно купить здесь bluetooth HC-05
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Отладочную плату NUCLEO-F303K8 можно купить здесь NUCLEO-F303K8
Программатор недорогой можно купить здесь ST-Link V2
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий