Serial bluetooth terminal как работает
В статье Arduino и Bluetooth был рассмотрен один из способов передачи информации между Android-устройством и ПК по Bluetooth-соединению. Там же, в двух словах было упомянуто и Android-устройство, но для принятия и передачи данных использовался Android Bluetooth терминал. Однако, для реальных устройств необходима полноценная программа (не будем же мы управлять тем же роботом из терминала. ), написанная для Android'а. В данной статье хотелось бы затронуть тему программного обеспечения для работы с Bluetooth, с применением языка Java и среды разработки Eclipse. Установка и настройка Eclipse хорошо описана в этой статье: Android и Arduino. Программное обеспечение.
Arduino
Я буду использовать Bluetooth модуль HC-06, однако для других модулей HC-04, HC-05 и т.п. схема подключения такая же (за исключением светодиода). Плата Arduino Nano V3.
Для наглядности, к плате Arduino я подключил красный светодиод, к 12-пину, но можно использовать и встроенный LED (обычно 13 пин).
Скетч для Arduino следующий:
Теперь, что касается Android. Мы рассмотрим два примера, в первом мы будем передавать данные от Android-устройства к arduino, а во втором примере мы рассмотрим двусторонний обмен данными между устройствами. Второй пример сложнее и в части понимания и по сложности кода, т.к. используются потоки (thread).
Мы будем использовать Java код, с явным указанием MAC-адреса устройства, к которому мы будем подключаться. Т.к. если делать интерфейс обнаружения Bluetooth-устройств, их выбора, подключения к ним и т.д., то код будет очень большой и для некоторых читателей труднопонимаем. Но для тех, кому интересно могут посмотреть стандартный пример Bluetooth Chat.
Узнать MAC-адрес можно к примеру в программе для Android'а: Bluetooth Terminal:
Нас интересует устройство BOLUTEK (наш модуль HC-06, подключенный к Arduino), его MAC адрес: 00:15:FF:F2:19:4C. Его и надо будет в дальнейшем прописать в программе.
Android - передаем данные в Arduino
Первая программа очень простая, главное окно активити будет содержать 2 кнопки: включить LED и выключить LED. При нажатии на кнопку включения LED, по Bluetooth будет передаваться "1", при нажатии на выключение LED - "0".
В файле манифеста необходимо прописать 2 строки разрешения работы с Bluetooth:
Сам код главного активити:
Данный код найден на одном из зарубежных блогов и слегка модернизирован. Как видно выше, на кнопки мы вешаем обработчики событий. При нажатии на кнопку передается строка 1 или 0 через sendData() в буфер Bluetooth адаптера. Полный проект с исходными кодами приведен ниже. Для работы программы, необходим Android не ниже версии API15, т.е. 4.0.3 и выше.
Android - прием и передача данных к Arduino
А вот здесь пришлось повозиться. Дело в том, что в Android'е для приема данных от какого-либо устройства необходимо создавать отдельный фоновый поток, чтобы у нас не зависало основное активити. Для этого мы задействуем thread и все данные будут приниматься в отдельном потоке.
На окно главного активити мы добавим новый элемент TextView, который будет служить для отображения принятых данных от Arduino. Сам java-код главного активити я постарался хорошо прокомментировать, чтобы сделать его удобочитаемым:
К статье прилагаются скомпилированные файлы для Android: bluetooth1.apk и bluetooth2.apk, а также исходники проекта для Arduino IDE и Eclipse
Модули Bluetooth, например HC-05 и HC-06, легко настраиваются и просты в использовании с Arduino IDE, но у них есть некоторые недостатки, например, высокое энергопотребление и поддержка только протокола Bluetooth V2.0. Cтоит отметить, что в ESP32 есть два вида Bluetooth: один – Bluetooth Classic, а другой – BLE (Bluetooth Low Energy).
В чем отличие Bluetooth Classic от Bluetooth Low Energy?
Bluetooth Low Energy потребляет меньше энергии, чем Bluetooth Classic. Протокол более энергоэффективен за счет наличия заранее определенных интервалов, во время которых происходит отключения модуля. Однако, он не используется для передачи файлов или музыки.
BLE также позволяет определить тип подключенного устройства, а также отображать некоторые характеристики устройства (например, уровень заряда батареи в Bluetooth-наушниках или фитнесс-браслете)
Устройства BLE работают с Bluetooth V4.0 и могут работать как в роли сервера, так и клиента, что делает BLE идеальным для маяков, смарт-часов, фитнес-трекеров и т. д.
Bluetooth Classic используется для передачи файлов и других данных. Почти у всех устройств BLE есть классические функции Bluetooth, связанные с первоначальным вариантом протокола. Bluetooth, используемый в таких модулях, как HC-05, представляет собой версию Bluetooth Classic, известную, как Bluetooth SSP (Serial Port Protocol). Это означает, что Bluetooth работает по стандартному последовательному протоколу, что упрощает отправку и получение данных без значительных задержек.
В данной статье будем использовать Serial Bluetooth для ESP32, установим соединение между платой и смартфоном и будем отправлять команды на плату для переключения состояния светодиода на плате.
Пишем скетч
Скетч данного проекта приведен в конце этой статьи. А пока разобьем код на небольшие фрагменты и попытаемся понять их. Если вы уже работали с модулям Bluetooth, такими как HC-05, то скетч покажется вам знакомым.
Сначала подключаем библиотеку, которая определяет работу модуля Bluetooth платы по протоколу Bluetooth SSP.
При разработке проектов с беспроводным управлением часто падает выбор на bluetooth-модули HC-05, HC-06. В связи с небольшой стоимостью и простотой использования. Но перед тем как создать проект нужно настроить bluetooth-модуль. Настройка модулей осуществляется с помощью AT-команд.
Схема подключения bluetooth-модулей HC-05, HC-06 к Arduino для настройки.
Какие параметры bluetooth-модулей HC-05, HC-06 можно настроить с помощью AT-команд?
В зависимости от версии bluetooth-модуля и прошивки настроить можно разное количество параметров. Также AT-команд могут быть разные, у разных версий модулей и прошивок. Но основной набор команд неизменный для любой версии. Возможно, разделительный знак будет отличаться, но методом «научного подбора» можно определить, если даже нет описания для вашего модуля.
Основные AT-команды bluetooth-модулей HC-05, HC-06:
- AT - Используется для проверки связи с модулем.
- AT+VERSION - Запрос версии прошивки
- AT+NAME - Запрос / установка имени модуля
- AT+PSWD или AT+PIN - Запрос / Установка PIN-кода
- AT+UART - Запрос / установка скорости UART
- AT+CMODE - Запрос / установка режима подключения
- AT+BIND - Запрос / установка фиксированного адреса
- AT+ADDR - Запрос адреса модуля
- AT+ROLE - Запрос / установка роли модуля
Это основные AT-команды. Остальные команды используются редко. Более подробный список вы можете посмотреть в таблице ниже.
AT-команды: | Ответ Bluetooth модуля: | Назначение AT-команд: |
---|---|---|
AT | OK | Команда Тест: Используется для проверки связи с модулем. |
AT+RESET | OK | Команда программной перезагрузки модуля: Модуль ведёт себя так, как после кратковременного отключения питания. |
AT+VERSION? | +VERSION:ВЕРСИЯ OK | Запрос версии прошивки модуля: Модуль возвращает версию в виде строки до 32 байт. Пример ответа: +VERSION:hc01.comV2.1OK |
AT+ORGL | OK | Сброс пользовательских настроек: Модуль сбрасывает следующие настройки: CLASS=0, IAC=9e8b33, ROLE=0, CMODE=0, UART=38400,0,0, PSWD=1234, NAME=hc01.com. |
AT+ADDR? | +ADDR:АДРЕС OK | Запрос адреса модуля: Модуль возвращает три части своего адреса NAP:UAP:LAP разделённые двоеточием. Каждая часть состоит из шестнадцатиричных цифр. Пример ответа: +ADDR:1234:56:789ABCOK Если количество символов в адесе не четное, то такой адрес не получется добавить мастеру в параметр AT+BIND |
AT+NAME? | +NAME:ИМЯ OK | Запрос / установка имени модуля: Имя модуля представлено строкой до 32 байт. Пример ответа: +NAME:iArduinoOK Пример установки: AT+NAME=iArduino Некоторые модули реагируют на команду AT+NAME? только при нажатой кнопке модуля или наличии высокого уровня на входе K. |
AT+NAME=ИМЯ | OK | |
AT+RNAME? АДРЕС | +RNAME:ИМЯ OK | Запрос имени найденного Bluetooth устройства: Адрес вводится после пробела, а части адреса (NAP,UAP,LAP) разделены запятой. Модуль возвращает имя найденного Bluetooth устройства находящегося в зоне действия, адрес которого был в запросе. Пример запроса: AT+NAME? 1234,56,789ABC Пример ответа: +RNAME:iArduinoOK |
AT+ROLE? | +ROLE:РОЛЬ OK | Запрос / установка роли модуля: Роль модуля представлена цифрой: 0 - ведомый, 1 - ведущий, 2 - ведомый в цикле*. Пример ответа: +ROLE:1 Пример установки: AT+ROLE=0 |
AT+ROLE=РОЛЬ | OK | |
AT+CLASS? | +CLASS:ТИП OK | Запрос / установка типа устройства: Тип устройства представляется 32 битным числом, по которому можно определить назначение модуля: Bluetooth клавиатура, Bluetooth мышь, гарнитура . Пример установки: AT+CLASS=0 |
AT+CLASS=ТИП | OK | |
AT+IAC? | +IAC:КОДOK | Запрос / Установка кода общего доступа GIAC: Код представлен 32 битным числом и используется для обнаружения Bluetooth устройств. В роли ведущего, по данному коду модуль будет получать доступ к другим Bluetooth устройствам для их поиска (опроса), а в роли ведомого по данному коду будет предоставляться доступ для опроса модуля другими ведущими. Пример ответа: +IAC:9e8b33OK Пример установки: AT+IAC=9e8b33 |
AT+IAC=КОД | OK или FAIL | |
AT+INQM? | +INQM:РЕЖИМ,КОЛ,ВРЕМЯ OK | Запрос / Установка режима опроса модулей: Используемые параметры являются настройками для команды поиска (опроса) других Bluetooth устройств. - Режим поиска представлен цифрой: 0-стандартный, 1-поиск по интенсивности сигнала. - Количество представлено цифрой определяющей предельное количество найденных Bluetooth устройств, после которого требуется прекратить поиск. - Время поиска задаёт таймаут после которого поиск прекращается. Реальное время поиска в секундах равно указанному числу умноженному на 1,28. Пример ответа: +INQM:1,1,48OK Пример установки: AT+INQM:1,1,48 |
AT+INQM=РЕЖИМ,КОЛ,ВРЕМЯ | OK или FAIL | |
AT+PSWD? | +PSWD:КОД OK | Запрос / Установка PIN-кода: Код доступа представлен строкой до 16 байт. Код модуля в роли ведомого устройства является паролем доступа к текущему модулю. Код модуля в роли ведущего устройства является паролем доступа к внешним Bluetooth устройствам. Пример ответа: +PSWD:1234OK Пример установки: AT+PSWD=1234arduino |
AT+PSWD=КОД | OK | |
AT+UART? | +UART:СКОР,СТОП,ПРОВ OK | Запрос / установка скорости UART: Скорость представлена числом бит/сек Стоп бит представлен цифрой: 0 - один, 1 - два Проверка представлена цифрой: 0 - без проверки, 1 - проверка нечётности, 2 - проверка чётности. Пример ответа: +UART:38400,0,0OK Пример установки: AT+UART=38400,0,0 |
AT+UART=СКОР,СТОП,ПРОВ | OK | |
AT+CMODE? | +CMOD:РЕЖИМ OK | Запрос / установка режима подключения: Режим представлен цифрой: 0 - модуль в роли ведущего подключается только к тому Bluetooth устройству, адрес которого указан командой AT+BIND. 1 - модуль в роли ведущего подключается к любому ведомому Bluetooth устройству. 2 - модуль в роли ведомого работает в цикле* Пример ответа: +CMOD:0OK Пример установки: AT+CMOD=1 |
AT+CMODE=РЕЖИМ | OK | |
AT+BIND? | +BIND:АДРЕС OK | Запрос / установка фиксированного адреса: Если модуль находится в роли ведущего (ROLE=1) и установлен режим подключения к фиксированному адресу (CMODE=0), то он будет подключаться только к тому Bluetooth устройству, адрес которого указан данной командой. Части адреса вводятся: при установке - через запятую, а при ответе - через двоеточие. Пример ответа: +BIND:1234:56:789ABCOK Пример установки: AT+BIND=0,0,0 |
AT+BIND=АДРЕС | OK | |
AT+POLAR? | +POLAR:ЛОГ,ЛОГ OK | Запрос / установка активного логического уровня для включения светодиодов: Полярность представлена цифрой 0 или 1 соответствующей активному логическому уровню. Первый параметр указывает логический уровень для включения светодиода подключённого к выводу PIO8 (отображает режим работы), а второй для светодиода подключённого к выводу PIO9 (отображает статус соединения). Пример ответа: +POLAR:1,1OK Пример установки: AT+POLAR=1,1 |
AT+POLAR=ЛОГ,ЛОГ | OK | |
AT+PIO=НОМЕР,УРОВЕНЬ | OK | Установка логического уровня PIO: Позволяет установить логический уровень на выводе PIO. Номер вывода представлен числом от 2 до 11, кроме 8 и 9. Уровень представлен цифрой 0 или 1. Пример установки: AT+PIO=11,0 |
AT+MPIO? | +MPIO:ЧИСЛО OK | Запрос / установка логических уровней PIO: Позволяет узнать или установить логические уровни сразу на всех выводах PIO. Уровни представлены шестнадцатиричным числом, каждый бит которого соответствует уровню вывода PIO. Пример ответа: +MPIO:1F0OK Пример установки: AT+MPIO:CFC |
AT+MPIO=ЧИСЛО | OK | |
AT+IPSCAN? | +IPSCAN:A,B,C,D OK | Запрос / установка параметров IP сканирования: A - интервал сканирования B - продолжительность сканирования C - интервал страниц D - количество страниц Пример ответа: +IPSCAN:1024,512,1024,512OK Пример установки: AT+IPSCAN:1024,512,1024,512 |
AT+IPSCAN=A,B,C,D | OK | |
AT+SNIFF? | +SNIFF:A,B,C,D OK | Запрос / установка параметров энергосберегающего режима: A - максимальное время B - минимальное время C - период повторов D - таймаут Пример ответа: +SNIFF:0,0,0,0OK Пример установки: AT+SNIFF=0,0,0,0 |
AT+SNIFF=A,B,C,D | OK | |
AT+ENSNIFF=АДРЕС | OK | Переход в энергосберегающий режим: Части адреса вводятся через запятую (NAP,UAP,LAP) Пример команды: AT+ENSNIFF=1234,56,789ABC |
AT+EXSNIFF=АДРЕС | OK | Выход из энергосберегающего режима: Части адреса вводятся через запятую (NAP,UAP,LAP) Пример команды: AT+EXSNIFF=1234,56,789ABC |
AT+SENM? | +SENM:СЕКРЕТ,ШИФР OK | Запрос / установка параметров безопасности: Режим секретности представлен цифрой: 0 - выключен 1 - незащищённое соединение 2 - защита на сервисном уровне 3 - защита на уровне соединения 4 - неизвестный режим Режим шифрования представлен цифрой: 0 - без шифрования 1 - шифруется только трафик PTP 2 - шифруется весь трафик Пример ответа: +SENM:0,0OK Пример установки: AT+SENM:0,0 |
AT+SENM=СЕКРЕТ,ШИФР | OK | |
AT+PMSAD=АДРЕС | OK | Удаление устройства из списка пар: Удаление Bluetooth устройства из списка приведёт к необходимости заново образовывать пару для подключения к нему. Части адреса удаляемого устройства вводится через запятую (NAP,UAP,LAP) Пример команды: AT+PMSAD=1234,56,789ABC |
AT+RMAAD | OK | Удаление всех устройств из списка пар: Очистка данного списка приведёт к необходимости заново образовывать пары с Bluetooth устройствами для подключения к ним. |
AT+FSAD=АДРЕС | OK или FAIL | Поиск устройства в списке пар: Если Bluetooth устройство с указанным адресом имеется в списке, то модуль вернёт OK иначе FAIL. Части адреса вводятся через запятую (NAP,UAP,LAP) Пример запроса: AT+FSAD=1234,56,789ABC |
AT+ADCN? | +ADCN:КОЛИЧЕСТВО OK | Запрос количества устройств в списке пар: При образовании пары ведущий-ведомый, данные о паре автоматически попадают в список пар и для последующих подключений (даже после отключения питания) не требуется повторно устанавливать пару. Пример ответа: +ADCN:10OK |
AT+MRAD? | +MRAD:АДРЕС OK | Запрос адреса устройства из списка пар: Модуль вернёт адрес Bluetooth устройства из списка пар с которым выполнялось последнее успешное соединение. Части адреса выводятся через двоеточие (NAP:UAP:LAP) Пример ответа: +MRAD:1234:56:789ABCOK |
AT+STATE? | +STATE:СТАТУС OK | Запрос статуса модуля: Модуль вернёт свое текущее состояние в виде строки: INITIALIZED - инициализация READY - готов PAIRABLE - образование пары PAIRED - пара образована INQUIRING - запрос CONNECTING - подключение CONNECTED - подключён DISCONNECTED - отсоединён NUKNOW - неизвестное состояние Пример ответа: +STATE:CONNECTEDOK |
AT+INIT | OK или FAIL | Инициализация профиля SPP: Профиль SPP эмулирует последовательный порт. |
AT+INQ | +INQ:АДРЕС,ТИП,СИГНАЛ +INQ:АДРЕС,ТИП,СИГНАЛ . +INQ:АДРЕС,ТИП,СИГНАЛ | Поиск (опрос) Bluetooth устройств: Команда доступна модулю в роли ведущего. Модуль ищет Bluetooth устройства в радиусе действия и выводит каждый найденный модуль на новой строке. Режим поиска (опроса) устанавливается командой AT+INQM, код опроса устанавливается командой AT+IAC, тип искомых устройств указывается командой AT+CLASS. Поиск завершается по достижении предельного количества найденных Bluetooth устройств, или по достижении таймаута, или командой AT+INQC. Пример ответа: +INQ:1234:56:789ABС,240404,7FFF |
AT+INQC | OK | Завершить поиск (опрос) Bluetooth устройств: Досрочно завершает поиск Bluetooth устройств инициированный командой AT+INQ |
AT+PAIR=АДРЕС,ТАЙМАУТ | OK или FAIL | Создать пару с Bluetooth устройством: Создание пары или сопряжение Bluetooth устройств инициируется ведущим устройством. Таймаут указывается десятичным числом в секундах. Если пара создана, то информация о ней автоматически запишется в список пар, модуль ответит OK после чего можно подключить Bluetooth устройство командой AT+LINK. Если пара не создана (например не подошёл PIN-код или истек таймаут), то модуль ответит FAIL. Пример команды: AT+PAIR=1234,56,789ABC,10 |
AT+LINK=АДРЕС | OK или FAIL | Подключиться к Bluetooth устройству: После выполнения данной команды можно общаться с подключённым Bluetooth устройством. Команда доступна модулю в роли ведущего. Пример команды: AT+LINK=1234,56,789ABC |
AT+DISC | +DISC:РЕЗУЛЬТАТ OK | Отключиться от Bluetooth устройства: Команда указывает модулю отключиться от Bluetooth устройства с которым установлено соединение. После отключения от Bluetooth устройства информация о нём сохраняется в списке пар. Если потребуется вновь подключиться к этому устройству, то создание пары будет необязательно (если Bluetooth устройство намеренно не удалить из списка пар). После выполнения команды модуль ответит результатом её выполнения: SUCCESS - успех LINK_LOSS - соединение потеряно NO_SLC - отсутствует SLC TIMEOUT - истекло время ожидания ERROR - ошибка Пример ответа: +DISC:SUCCESSOK |
Список ошибок которые может вернуть Bluetooth модуль HC-05, HC-06.
ERROR:(№) | Описание ошибки | Максимальный размер параметра |
---|---|---|
0 | Такая AT команда не существует | - |
1 | Результат по умолчанию | - |
2 | Ошибка сохранения пароля | - |
3 | Слишком длинное имя устройства | 32 байта |
4 | Имя устройства не указано | - |
5 | Часть адреса NAP слишком длинная | 4 разряда в шестнадцатиричной системе |
6 | Часть адреса UAP слишком длинная | 2 разряда в шестнадцатиричной системе |
7 | Часть адреса LAP слишком длинная | 6 разрядов в шестнадцатиричной системе |
8 | Не указана маска порта PIO | - |
9 | Не указан номер вывода PIO | - |
A | Не указан класс устройства | - |
B | Слишком длинный класс устройства | - |
C | Не указан общий код доступа IAC | - |
D | Слишком длинный общий код доступа IAC | - |
E | Недопустимый общий код доступа IAC | - |
F | Не указан пароль | - |
10 | Слишком длинный пароль | 16 байт |
11 | Недопустимая роль модуля | - |
12 | Недопустимая скорость передачи данных | - |
13 | Недопустимый размер стоп-бита | - |
14 | Недопустимая настройка бита четности | - |
15 | Устройство отсутствует в списке пар | - |
16 | Профиль последовательного порта не инициализирован | - |
17 | Повторная инициализация профиля SPP | - |
18 | Недопустимый режим опроса Bluetooth устройств | - |
19 | Слишком большое время опроса | - |
1A | Не указан адрес Bluetooth устройства | - |
1B | Недопустимый режим безопасности | - |
1C | Недопустимый режим шифрования | - |
Сравнение модулей HC-05 и HC-06
Модули HC-05 и HC-06 являются наиболее используемыми. Оба модуля основаны на одинаковом чипе, но есть и важные отличия. Модуль HC-05 может работать в двух режимах работы – и в качестве ведущего (master), и в качестве ведомого (slave).
Модуль HC-05 стоит несколько дороже, но он имеет большее количество полезных рабочих функций. Скорость передачи АТ команд по умолчанию для HC-05 равна 38400, для HC-06 – 9600. Важным моментом является то, что в конце АТ команд для HC-05 должны быть символы CRLF.
Подключение обоих модулей к плате Arduino одинаково.
Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.
В прошлой статье я пообещал рассказать, о том как подключать CANNY 3 tiny с помощью UART к bluetooth. И поскольку на этих майских особо не разгуляешься, было принято решение провести время с пользой и таки сдержать обещание. Но просто подключить контроллер к Bluetooth адаптеру HC-06, было бы слишком просто для Хабра.
Если вы любите мониторить «концевики» и герконы, так как это люблю я, милости прошу под кат.
Вот о чем пойдет речь сегодня:
Часть I: Введение
-
— в этой статье мы разбирали что из себя представляет контроллер, а также азы работы в среде разработки CannyLab.
- «Как зеницу ока. » или делаем простенькую охранную систему на базе микроконтроллера (CANNY или Arduino) и Raspberry PI — в этой статье мы разбирали работу с UART, а также повторили ранее пройденное.
— в этой статье мы разбирали работу с USB Virtual COM-port, подключение датчиков к АЦП, а также высокочастотный ШИМ на выходах контроллера.
Мы будем собирать систему, которая с помощью мобильного приложения мониторит состояние двух датчиков и при необходимости может в ручном режиме подавать звуковой сигнал.
Все что будет изложено в данной статье, выдумано чисто в учебно-демонстрационных целях. Я просто хотел показать, некоторые приемы работы с контроллером, а также, чтобы купленные в свое время железки хоть как-то отработали свою стоимость.
Несмотря на далекий от реальности характер решаемой задачи мы представим, что делаем систему мониторинга за раздвижной дверью купе. Когда она начнет движение, сработает геркон, а в конце пути даст сигнал концевик. Если нам надо будет привлечь внимание, например, чтобы дверь обратно закрыли, мы подадим «писклявый» сигнал через динамик. Правда динамика у меня нет, но зато есть старые наушники.
Ну и, как всегда, примечание. Настоятельно не рекомендую использовать, материалы данной статьи, как истину в последней инстанции. Многие вещи я сам делал в первый раз, их наверняка можно сделать лучше.
Часть II: Подключение схемы и программа для CANNY 3 tiny
Для начала, чтобы никого в авторских правах не обидеть уточню, что идею подключить контроллер к HC-06, по управлять им через приложение «Serial bluetooth terminal» и некоторые приемы при разработке диаграммы, я позаимствовал с форума, но само собой я их адаптировал под свою задачу.
Схема подключения выглядит следующим образом:
Концевик и геркон подключены к выводам контроллера №6 и №5, наушники к выводу №4 (у него есть ВЧ ШИМ), UART RX – это вывод № 1, UART TX – вывод № 2, вывод № 3 используется для подачи «+5В», вывод «-» — для связи с «землей».
Вот как это выглядит в сборе:
Диаграмму (программу) для СANNY 3 tiny я разрабатывал в CannyLab версии 1.42, возможно в других версиях среды разработки и с другими контроллерами, надо будет внести изменения в диаграмму.
Вот, что получилось:
Разберём подробней два оставшихся.
Вы можете в настройках поиграться с периодом заполнения ВЧ ШИМ, от этого будет зависеть, звук в наушниках.
Я решил, что самое простое решение — это передавать одно число, которое гарантированно дойдет до адресата без потерь.
В нашем случае мы мониторим дискретное состояние геркона и концевика. То есть у нас всего 4 возможные комбинации: геркон и концевик выключены, включен только кто-то один, оба включены.
Поскольку геркон и концевик дают дискретный сигнал (0/1) нужно как-то их различить. Для этого умножим значение сигнала геркона на 2. Теперь получается, что сумма сигналов даст нам значения от 0 до 3.
Теперь разберем не очевидный вариант с прибавлением к этому значению пятидесяти. Дело в том, что CannyLab передает в UART пару символов, то есть вместо 3 допустим 03, но как я говорил есть риск потери части информации. Например, из значения 01, программа на смартфоне может прочитать только первый «0», а это уже будет ошибка.
Загружаем программу в контроллер, нажимаем «запустить», если все работает как задумано, то HC-06 начнет периодически мигать красным светодиодом.
Далее сопрягаем смартфон с адаптером. Теперь можно проверить работоспособность в приложении «Serial Bluetooth terminal» или любом другом с похожим функционалом.
Запишите адрес Bluetooth адаптера, он нам пригодится в следующей главе.
Программу для контроллера и исходный код программы для смартфона можно скачать с GitHub
Хотелось бы отметить, что вам не обязательно реализовывать всё в железе именно на контроллерах CANNY, вы вполне можете написать программу для Arduino или другого любимого вами контроллера. Изначально я и сам планировал написать дополнительно еще и версию скетча для Arduino, но поскольку убил почти все майские праздники, на подключение CANNY и приложение для смартфона у меня уже просто не осталось сил.
Часть III: Пишем приложение на Xamarin для Android
Я знаю, что Xamarin скажем мягко – не самое популярное решение для мобильной разработки. И возможно у вас уже возник вопрос: «Почему я его выбрал?». Ответить на него мне бы хотелось словами из одноименной песни Псоя Короленко:
Ну и еще раз напомню. Я первый раз встречаюсь с Xamarin и это мое первое приложение для Android. Не стоит слепо копировать мой кривой код, если вдруг вы сможете найти более красивое решение, воспользуйтесь им.
При разработке своей программы я опирался на этот материал. Статья не особо разжевана, да еще и на испанском, поэтому я всё-таки счел уместным поделиться с вами своей вариацией на эту тему.
Я собирал программу в Visual studio 2019 community edition.
Первым делом создадим новый пустой проект для Android (Xamarin), как на картинке.
Я вносил изменения только в три файла, целиком их можно просмотреть на GitHub, а тут разберем только важные части:
AndroidManifest.xml
В стандартный шаблон добавлены 2 разрешения:
activity_main.xml
Был убран контейнер по умолчанию (RelativeLayout). Вместо него был добавлен, контейнер LinearLayout просто потому, что он проще. В данном контейнере все элементы выравниваются по вертикали, растягиваясь на всю ширину экрана.
Любому человеку немного знакомому с HTML вёрсткой или XML не составит труда разобраться со структурой пользовательского интерфейса. У нас есть три доступных только для чтения текстовых поля (TextView), один переключатель(Switch), который работает по сути как чекбокс и одна самая обычная кнопка(Button). Элементы можно разместить на форме путем перетаскивания из конструктора, а в окне свойств или в коде задать им более удобные Id, текстовые заглушки и другие параметры.
Осталось описать логику программы.
MainActivity.cs
Ниже под спойлером код целиком для удобства
Теперь по частям.
Блоки с подключением пространств имен, объявлением класса и т.п. я пропущу.
Создаём переменные с которыми позже свяжем элементы пользовательского интерфейса:
Дальше идет, код из примера на который я опирался. Переменные (поля) необходимые для работы тех или иных методов.
Нам здесь важно вбить адрес вашего модуля HC-06 в поле address.
Поскольку это мой первый опыт разработки для смартфонов в том числе работы с Xamarin, я решил ничего не усложнять поэтому адрес устройства, как и в исходном примере, жестко зафиксирован. Если хотите вы можете посмотреть эту статью, там похоже реализован перебор доступных Bluetooth устройств.
Проверяем подключение по Bluetooth:
Включение сирены. По сути просто отправка символов «11» в контроллер:
Проверка состояния переключателя (если смещен в право значит включён):
При включении начинаем соединение с Bluetooth.
Реализация непосредственно подключения:
А вот один из самых важных методов — непосредственно считывание данных:
Многие элементы метода я оставил как в примере, как я понимаю вначале создается соединение с потоком данных, если в буфере с прочитанными данными, что-то есть то оно считывается в переменную valor . При этом как я и обещал, цифру «5» мы просто удалим.
Ну а после уже все просто в зависимости от того какое число нам пришло, выводим тот или иной статус в UI.
Эти два метода я кардинально не менял:
Как ни странно, но все работает:
Часть IV: Заключение
Вот как работа программы выглядит в натуре:
Вот таким был мой первый опыт разработки приложений для смартфона на Android.
Хотелось бы отметить, что VS 2019 и Xamarin на моем стареньком компьютере работают очень медленно.
Я так понимаю, контроллеры CANNY можно использовать при тюнинге автомобилей, особенно отечественных так, что вполне можно сделать какую-нибудь «фичу» и написать к ней приложение для смартфона. Главное помнить, что при питании от бортовой сети автомобиля на выходах контроллера будет тоже напряжение что и на входе (например, 12 В вместо 5 В). Не забудьте защитить Bluetooth адаптер, чтобы он ненароком не вышел из строя.
Статья оказалась для меня очень трудоёмкой, надеюсь, что все было не зря и она вам понравиться.
Читайте также: