В настоящее время Bluetooth является одной из самых популярных беспроводных технологий. На протяжении последних лет регулярно выходили обновления этой технологии чтобы она “успевала” за все возрастающими требованиями пользователей. В этой статье мы рассмотрим подключение Bluetooth модуля HM10 к плате Arduino и управление с его помощью светодиодом из Android приложения.
Принципы работы Bluetooth модуля HM-10 (at-09)
Работа Bluetooth модуля HM-10 (он также известен под названием at-09) основана на технологии Bluetooth 4.0. Также он поддерживает технологию BLE – Bluetooth-Low-Energy (Bluetooth с низким энергопотреблением), которая специально была разработана для обеспечения низкого потребления энергии, что дает возможность устройствам достаточно долго работать от обычной батарейки. В основе Bluetooth модуля HM-10 лежит чип CC2540 (или CC2541) BLE System SoC (System on Chip – система на кристалле (чипе)) от компании Texas Instruments. Программное обеспечение (прошивка) и дизайн модуля HM-10 разработаны компанией Jinan Huamao Technology. В составе модуля есть UART (Universal asynchronous receiver/transmitter – универсальный асинхронный приемопередатчик), что позволяет достаточно просто его подключать к различным микроконтроллерам.
HM-10 в настоящее время является одним из самых популярных модулей, поддерживающих технологию Bluetooth 4.0 BLE. Поскольку модуль поддерживает технологию Bluetooth 4.0, то он не сможет соединяться с устройствами, использующими технологию Bluetooth 2/2.1, например, Bluetooth модулями HC-05, HC-06. Модуль HM-10 управляется с помощью AT команд по последовательному порту связи (UART).
Различия между HM-10 и другими Bluetooth модулями
Основное отличие HM-10 от других Bluetooth модулей заключается в версии Bluetooth. HM-10 поддерживает Bluetooth версии 4.0, поэтому от модулей предыдущих поколений он будет отличаться (в выгодную сторону) скоростью работы, пропускной способностью и дальностью действия. HM10 поддерживает скорость передачи данных до 24 Мбит/с с низким потреблением энергии. А, к примеру, модуль HC-05, поддерживающий версию Bluetooth 2.0, может обеспечить скорость передачи данных только 3 Мбит/с. Вместе с этим модуль HM-10 обеспечивают дистанцию связи до 100 метров на открытой местности.
Однако более старые и менее производительные Bluetooth модули HC-05 и HC-06 до сих пор широко применяются радиолюбителями вследствие их низкой цены. На основе этих модулей на нашем сайте вы можете найти достаточно много проектов. Все проекты на нашем сайте, в которых используется технология Bluetooth, вы можете посмотреть по этой ссылке.
Необходимые компоненты
Аппаратное обеспечение
- Плата Arduino Uno (купить на AliExpress).
- Bluetooth модуль HM-10 (купить на AliExpress).
- Резисторы 1 кОм, 470 Ом (купить на AliExpress).
- Соединительные провода.
- Смартфон на операционной системе Android.
Программное обеспечение
- Arduino IDE.
- Arduino Bluetooth Controller (HM-10 Module) - Android приложение.
Работа схемы
Схема подключения Bluetooth модуля HM-10 к плате Arduino представлена на следующем рисунке. Как видите, схема крайне проста.
Но прежде чем использовать модуль HM-10 в нашем проекте убедитесь в том, что это настоящий (genuine) модуль HM-10, а не его клон. Сейчас на рынке в большом количестве присутствуют китайские клоны модуля HM-10. Чтобы отличить настоящий модуль HM-10 от его клона убедитесь в наличии кварцевого генератора (Crystal Oscillator) на 32 кГц на его плате. Если кварцевого генератора на плате модуля нет, то перед вами клон модуля HM-10 и прежде чем его использовать вам необходимо сменить его прошивку (программное обеспечение). Как это сделать можно прочитать, к примеру, в этой англоязычной статье.
Без смены прошивки вы не сможете использовать для управления клоном модуля HM-10 AT команды, также вы не сможете подключить его к смартфону. В нашем проекте мы использовали клон модуля HM-10 (он более дешевый чем настоящий), но перед этим сменили его прошивку по указанной методике.
Arduino Bluetooth Controller (HM-10 Module) – приложение на Android
Arduino Bluetooth Controller (HM-10 Module) представляет собой приложение для операционной системы Android, которое можно бесплатно скачать из Google Play Store. Это приложение обеспечивает простой и интуитивно понятный интерфейс для взаимодействия с Bluetooth модулем HM-10. В этом приложении можно создавать собственные кнопки и кастомизировать вид этого приложения под свои нужды. Мы создали в нем две кнопки для управления светодиодом, подключенным к плате Arduino.
Вначале скачайте это приложение из Google Play Store по этой ссылке (или можете сразу скачать его с помощью своего смартфона).
На главной странице этого приложения доступны такие функции как connect Device (подсоединить устройство), Search Icon (найти иконку), Delete Icon (удалить иконку), Device Status (состояние устройства), Send Text (передать текст), Add Template (добавить шаблон) и другие. Начните работу в этом приложении с поиска устройства – это можно сделать либо с помощью функции Search Icon, либо кликнув по трем точкам в верхнем правом углу приложения и выбрав connect Device.
После этого на экране приложения вы увидите все доступные для подключения устройства. Выберите среди них модуль HM-10.
После этого модуль HM-10 будет успешно подключен к вашему приложению и вы сможете видеть его состояние вверху экрана.
После этого вы сможете передать текст (строку) в модуль либо непосредственно из поля передачи текста, либо при помощи создания собственного (пользовательского) шаблона.
Для создания нового пользовательского шаблона (custom template) нажмите на иконку “+” в правом верхнем углу и после этого заполните необходимые параметры шаблона. “Name” – это будет название кнопки, поле “Text” будет использоваться для передачи текста (строки) на модуль HM-10, а “Description” – это будет описание кнопки.
Мы в нашем проекте создадим кнопку зеленого цвета для включения светодиода (LED ON). При нажатии этой кнопки на модуль HM-10 будет передаваться символ “N”, что будет приводить к включению светодиода, подключенного к плате Arduino. Аналогичным образом создадим кнопку красного цвета для выключения светодиода (LED OFF) – при ее нажатии на модуль HM-10 будет передаваться символ “F”.
После этого вы сможете увидеть в приложении две созданные вами кнопки – с их помощью вы сможете управлять светодиодом, подключенным к плате Arduino.
Объяснение программы Arduino для управления светодиодом с помощью Bluetooth модуля HM-10
Полный текст программы и видео, демонстрирующее работу проекта, приведены в конце данной статьи. Здесь же мы кратко рассмотрим работу основных фрагментов программы.
Написание программы Arduino для этого проекта не потребует использования каких либо дополнительных библиотек если вы подключите модуль HM-10 к стандартному аппаратному последовательному порту платы Arduino – то есть к ее контактам 0 и 1 как показано на выше приведенной схеме. Однако мы в данном проекте решили использовать библиотеку для последовательной связи (Software Serial Library), с помощью которой программным способом организуем последовательный порт на контактах 2 и 3 платы Arduino (соответственно, если вы тоже хотите использовать этот подход, то вам необходимо внести изменения в приведенную выше схему).
1 2 |
#include <SoftwareSerial.h> SoftwareSerial HM10(2, 3); // RX = 2, TX = 3 |
Далее объявим две переменные, которые будут использоваться для хранения данных, принимаемых от модуля HM-10.
1 2 |
char appData; String inData = ""; |
Далее инициализируем последовательную связь со скоростью 9600 бод с компьютером и модулем HM-10. Зададим режим работы используемого контакта и выключим светодиод.
1 2 3 4 5 |
Serial.begin(9600); Serial.println("HM10 serial started at 9600"); HM10.begin(9600); // set HM10 serial at 9600 baud rate pinMode(13, OUTPUT); // onboard LED digitalWrite(13, LOW); // switch OFF LED |
После этого мы начнем проверять поступают ли какие либо данные по последовательному порту, к которому подключен модуль HM-10. И пока этот порт будет доступен, мы будем считывать данные из него и сохранять их в переменной inData.
1 2 3 4 5 6 |
HM10.listen(); // listen the HM10 port while (HM10.available() > 0) { // if HM10 sends something then read appData = HM10.read(); inData = String(appData); // save the data in string format Serial.write(appData); } |
Для отладки работы модуля HM-10 с помощью AT команд допишите в программу следующие строчки кода, которые будут передавать строку в модуль HM-10.
1 2 3 4 |
if (Serial.available()) { // Read user input if available. delay(10); HM10.write(Serial.read()); } |
Если мы принимаем строку “F”, то мы печатаем соответствующее сообщение в окне монитора последовательной связи и выключаем светодиод. Если мы принимаем строку “N”, то мы печатаем соответствующее сообщение в окне монитора последовательной связи и начинаем мигать светодиодом с задержкой 500 мс.
1 2 3 4 5 6 7 8 9 10 11 12 |
if ( inData == "F") { Serial.println("LED OFF"); digitalWrite(13, LOW); // switch OFF LED delay(500); } if ( inData == "N") { Serial.println("LED ON"); digitalWrite(13, HIGH); // switch OFF LED delay(500); digitalWrite(13, LOW); // switch OFF LED delay(500); } |
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <SoftwareSerial.h> //библиотека последовательной связи SoftwareSerial HM10(2, 3); // RX = 2, TX = 3 char appData; String inData = ""; void setup() { Serial.begin(9600); Serial.println("HM10 serial started at 9600"); HM10.begin(9600); // set HM10 serial at 9600 baud rate pinMode(13, OUTPUT); // onboard LED digitalWrite(13, LOW); // выключаем светодиод } void loop() { HM10.listen(); // слушаем HM10 port while (HM10.available() > 0) { // если HM10 что то передает, то считываем данные appData = HM10.read(); inData = String(appData); // сохраняем данные в строковой переменной Serial.write(appData); } if (Serial.available()) { // считываем информацию если пользователь что-нибудь вводит delay(10); HM10.write(Serial.read()); } if ( inData == "F") { Serial.println("LED OFF"); digitalWrite(13, LOW); // выключаем светодиод delay(500); } if ( inData == "N") { Serial.println("LED ON"); digitalWrite(13, HIGH); // включаем светодиод delay(500); digitalWrite(13, LOW); // выключаем светодиод delay(500); } } |
Автор, у вас по инструкции по подключению указаны порты как 0 и 1 RX и TX/ А в коде SoftwareSerial HM10(2, 3); // RX = 2, TX = 3.
Исправьте пожалуйста)
Спасибо за внимательность, но в разделе статьи про объяснение программы эти моменты объяснены. Если вы не хотите использовать библиотеку SoftwareSerial, то необходимо использовать контакты 0 и 1, а с этой библиотекой для организации последовательной связи можно использовать любые цифровые контакты Ардуино - в нашем случае мы использовали контакты 2 и 3.
Возможно ли таким же образом посылать данные обратно - чтобы модуль передавал на телефон данные по запросу? Или это ПО может только посылать, но не получать?
Олег, в описании этой программы на play.google.com указано что она может только передавать команды, возможности приема данных нет, поэтому для вашей задачи необходимо найти другую аналогичную программу, с возможностью приема данных. Теоретически в передаче данных от модуля к смартфону никаких проблем нет
Спасибо. А не подскажите такую программу? Видел такие в других статьях, но они заточены под узкий круг задач, например, конкретно под термометр, я же ищу что-то для более "сырых" данных.
К сожалению, не подскажу. Не увлекался серьезно этой проблематикой
не подключайте к ардуине так!!! там 3.3в TTL. сожгете модуль.
Ну на представленном видео видно же, что ничего не сгорает. Не изучал даташит на данный модуль, но, может быть, допустимое напряжение для него составляет около 5 В при рабочем напряжении 3.3в? Такое достаточно часто бывает. К примеру, у нас на сайте есть статья где Ардуино напрямую подключается к Raspberry Pi, контакты которой тоже "заточены" под работу с 3.3в. Если так боитесь за модуль, можете подключить его к Ардуино с помощью резистивных делителей напряжения, понижающих напряжение с 5 до 3,3 В. Но логика работы, описанная в данной статье, от этого не поменяется
За то время сколько снималось видео, модуль не сгорит. Но что он сгорит обязательно это вопрос времени! Мне принесли другой китайский модуль, который был подключён без преобразователя к 5 вольтовой Ардуино, так от у него контроллер запускается после шаманских действий, но глючит и соответственно о нормальной работе нет речи. Так что используйте хотя бы резистор 1 килоом в цепи RXD модуля, а лучше копеечный китайский преобразователь логических уровней, он на на скорости до 115200 бит/сек работает нормально!!
Хорошо, будем надеяться что ваш совет поможет другим пользователям, которые будут читать данную статью
Модуль не сгорит от 5 вольт. На плате есть стабилизатор напряжения.
Да, вижу мнения по этому вопросу разошлись
Добрый день,
Можно ли с помощью этого приложения Arduino Bluetooth Controller (HM-10 Module) слать АТ-команды на модуль HM-10?
Буду очень благодарен за ответ.
Добрый вечер. К сожалению я не знаю ответа на этот вопрос, лично пока не собирал эту схему, и студенты мои ее пока не собирали. Даже не думал что эта статья станет достаточно популярной на нашем сайте
Можно
К примеру HM10.print("at+name\r\n");