STM32.Bluetooth и Android.

Автор: | 19.03.2017

Здравствуйте.

Сегодня хотел бы рассказать Вам о том, как можно связать отладочную плату STM32 F3 DISCOVERY с телефоном на базе ОС Android. Данная статья не будет уроком, Я лишь поделюсь своими наработками в достаточно фривольной форме.

Недавно передо мной встала задача передачи данных АЦП с платы STM32 F3 DISCOVERY на телефон под управлением системы Android. Решено было организовать передачу при помощи Bluetooth, так как он как раз имелся на борту телефона, и модуль HC-05 был под рукой)

Питание для Bluetooth модуля можно смело брать с отладочной платы, так как его потребление колеблется в районе 50мА. Для отладки устройства, на вход АЦП подавался сигнал с потенциометра. В итоге получилась следующая схема:

UART1 находится на ножках PA9(TX) и PA10(RX). Поэтому ножка PA9 подключается к ножке RX модуля. На ножку PC1 подадим напряжение с потенциометра R1, изменяя которое будем проверять корректность передаваемых данных. Резистор R2 необходим для защиты цепи, когда потенциометр R1 будет занимать крайние положения.

Телефон(или даже планшет) подойдет почти любой. Требуется лишь версия Андроид старше 4.0.3 (Хотя без проблем запустилось на HTC Desire HD, с Android 2.3.5) и наличие Bluetooth.

И вот тут первая незадача, все попытки инициализировать UART отладочной платы при помощи SPL, закончились неудачами. Данные либо вовсе не шли, либо шел какой то мусор.

Поэтому решено было настраивать UART при помощи ручной правки регистров (привет CMSIS!). На этом проблемы с написанием прошивки для STM32F3DISCOVERY закончились, и код приобрел свой окончательный вид:

Рассмотрим данный код подробнее.

Сначала необходимо настроить RCC, подробнее об этом читайте здесь. После этого в функции usart_init настраиваем USART/UART1 отладочной платы.

Читайте также  Bluetooth модуль HC-05 для AVR.

Код функций UART/USART (Файл usart.h):

В функции usart_init(void) мы настраиваем USART1/UART1 нашего микроконтроллера. Для этого мы сначала включаем его тактирование, затем настраиваем соответствующие выводы, задаем скорость передачи данных, и напоследок включаем его. Функции usart1_tx и Usart1_Send_String , служат для передачи по UART одного символа и строки соответсвтенно.

После настройки UART, остается лишь настроить АЦП и таймер, так как передавать значение АЦП мы будем раз в секунду. О настройке таймера можете прочесть здесь а о настройке АЦП в данном уроке.

Для проверки работы можно использовать программу Bluetooth Terminal для телефона. Однако, в мою задачу так же входило написание приложения для телефона, которое предоставляло бы данные пользователю в удобочитаемом виде.

Писать ПО для ОС Android предлагаю в официальной среде Android Studio. Подробнее о ней мы поговорим в одной из следующих статей нашего нового раздела мобильные приложения. Пока лишь покажу вам код текущего проекта:

Полностью объяснять данный код считаю нецелесообразным, так как он достаточно сырой, и делался по принципу “лишь бы заработало уже”. Однако при небольшой доработке (которую я скорее всего произведу в ближайшее время) данное приложение подойдет для работы с Bluetooth устройствами на микроконтроллерах.

Читайте также  COM порт Windows. SerialPort. C#.

Пока лишь остановимся на моментах, вызвавших у меня затруднения.

Необходимо получить адрес нашего модуля. Сделать это помогает указанная выше программа Bluetooth Terminal. Достаточно найти модуль HC-05 в данной программе, а адрес будет написан рядом с названием модуля. Для тех, кто не в курсе, адрес выглядит примерно так:

98:D3:32:70:AC:AA

После того как Вы нашли данный адрес, не забудьте поменять соответствующую строку программы:

И ещё один момент.

Работать с Bluetooth в Android следует в отдельном потоке. Для этого служит класс ConnectedThread. А для отображения принятых данных, следует использовать класс Handler. Сначала это кажется слегка запутанным, однако потратив немного времени на изучение кода, Вы обязательно все поймете.

Внешний вид программы получился таким:

Отображение графика пока не реализовано.

По мере вращения ручки потенциометра R1 изменяется получаемое телефоном значение (0..4095) в соответствии с которым заполняется ProgressBar.

В процессе отладки устройство выглядело так:

В принципе задачу можно считать реализованной. Однако недоработок ещё куча, так как это был лишь мой первый опыт работы с ОС Android. Второй опыт смотрите здесь.

Надеюсь что Вам был интересен мой опыт. Напомню, что данная статья лишь описывает личный опыт автора, и не является уроком. Весь код представленный на данной странице не лишен ошибок, однако он вполне работоспособен.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *