- Arduino: using Serial and Software Serial with bluetooth module
- Arduino и Bluetooth JDY-31
- Подключение
- Подключение к Bluetooth
- Windows
- Android
- SoftwareSerial
- Настройка JDY-31, AT команды
- Домашнее задание
- Arduino и Bluetooth
- Передача данных из Arduino по Bluetooth
- Двунаправленный обмен данными по Bluetooth
- Подключаем к Android
- Прикрепленные файлы:
Arduino: using Serial and Software Serial with bluetooth module
My purpose is to use Arduino to set up communication between a PC and an Android device using an HC-05 bluetooth module. I use the USB communication between the PC and the Arduino (Serial Monitor) and a SoftwareSerial to connect to the HC-05. My problem is that the communication works well from BT to the PC, but doesn’t work as expected in the other way. When sending from the PC to BT all the characters sent are received by the BT device only when I close the Serial Monitor on the PC or when I reset the Arduino. I’ve excluded a problem with the BT Module or the Android application because if in Arduino I implement an «ECHO» code (write in Android and the send in Android) everything works fine. With the Arduino code posted below the expected behaviour is: Arduino reset-> Hello word sent, Serial monitor opened-> nothing happens, character written on serial monitor-> character received on BT, character written on BT-> character received on Serial Monitor, Serial monitor closed-> nothing happens. The real behaviour is: Arduino reset-> Hello word sent, Serial monitor opened-> 2 Hello word on BT and 1 («goodnight») on PC, character written on serial monitor-> nothing, character written on BT-> character received on Serial Monitor, Serial monitor closed-> previous written character(s) in serial monitor received + Hello Word. How can I fix this problem? Code:
#include SoftwareSerial mySerial(2, 3); // RX, TX int a=0; char c; char d; void setup() < Serial.begin(9600); Serial.println("Goodnight moon!"); mySerial.begin(9600); mySerial.println("Hello, world?"); >void loop() < delay(10); if (Serial.available()) < c=Serial.read(); delay(10); Serial.write(c); >delay(10); if (mySerial.available()) < d=mySerial.read(); delay(10); mySerial.write(d); >>
Arduino и Bluetooth JDY-31
В наборе GyverKIT обеих комплектаций есть Bluetooth модуль JDY-31 (аналог популярного HC-06). Данный модуль обеспечивает беспроводную связь UART – COM порт, что позволяет использовать его для удобного обмена данными между Arduino и приложением на смартфоне или программой на компьютере. Основные характеристики:
- Рабочая частота: 2.4 GHz
- Интерфейс: UART
- Напряжение питания: 3.6.. 6V
- Ток потребления: 5 мА в режиме поиска, ~8 мА в режиме передачи
- Логический уровень: 3.3V, но вроде как не боится 5V
- Дальность связи: 30м
- Версия Bluetooth: 3.0 SPP
- Чувствительность антенны: -97dbm
- Скорость UART: 9600.. 128000
Официальную документацию на JDY-31 можно открыть по ссылке .
Индикация состояния подключения:
- Ожидание
- Светодиод мигает
- Пин STATE: LOW
- Светодиод горит постоянно
- Пин STATE: HIGH
Подключение
Модуль подключается к питанию и цифровым пинам МК:
- JDY-31 > Arduino
- GND > GND
- VCC > 5V
- RX > Serial TX
- TX > Serial RX
- Опционально можно подключить EN на любой цифровой пин для отслеживания состояния подключения.
На левой схеме я подключил JDY-31 к аппаратным выводам UART напрямую, на правой – через делитель напряжения, образованный тремя резисторами по 10 кОм (есть в наборе GyverKIT). Такой делитель 2:1 обеспечит около 3.1V на вход RX модуля. Правая схема предпочтительнее, но от прямого подключения модуль ещё ни у кого не выходил из строя, насколько я знаю.
- Модуль будет мешать загрузке прошивки (она загружается по RX TX), на момент загрузки нужно отключить провода от пинов RX и TX Arduino
- С модулем можно общаться при помощи штатного Serial, фактически он будет дублировать монитор COM порта
На следующих двух схемах я подключил модуль к любым двум цифровым пинам Arduino:
При таком подключении модуль ничему не мешает, но для работы с ним придётся использовать стандартную библиотеку программного Serial – SoftwareSerial.
Подключение к Bluetooth
Windows
Для работы на компьютере у вас должен быть Bluetooth адаптер. Заходим в панель управления, добавляем Bluetooth устройство, вводим пин 1234 для сопряжения:
После этого в Arduino IDE появится ещё один COM порт. Загрузим следующий пример, который просто выводит в порт строчку со счётчиком. Модуль подключен к аппаратному UART.
Откроем Bluetooth порт и увидим вывод:
Точно таким же образом можно подключиться к Arduino из своей программы, написанной например на Processing или Python. У меня есть уроки по этой теме:
Android
Для теста на Android я использую приложение Serial Bluetooth Terminal. Сопрягаемся с паролем 1234, заходим в программу, открываем настройки слева, Devices, выбираем JDY-31 и подключаемся (кнопка со штекером в левом правом углу экрана. Модуль подключен к аппаратному Serial, на Arduino прошит код, отправляющий принятые данные обратно в Serial (эхо):
Пишем в терминал – модуль нам отвечает. Своё приложение с Bluetooth можно сделать в MIT App Inventor, этим мы займёмся в будущих уроках.
SoftwareSerial
В качестве примера подключим модуль по второй схеме (на пины D2 и D3) и загрузим простую программу, которая будет пересылать данные с программного Serial (на пинах D2 и D3, Bluetooth) на аппаратный (который мы можем смотреть через монитор порта в Arduino IDE):
#include SoftwareSerial mySerial(3, 2); // RX, TX void setup() < Serial.begin(9600); mySerial.begin(9600); >void loop() < if (mySerial.available()) < Serial.write(mySerial.read()); >if (Serial.available()) < mySerial.write(Serial.read()); >>
Откроем терминал и монитор порта и можем общаться с компьютером, Arduino выступает в роли посредника и перекидывает данные с Bluetooth на USB и наоборот:
Точно так же можно использовать SoftwareSerial для программ и приложений, если аппаратный UART на Arduino нужен для других целей.
Настройка JDY-31, AT команды
Рассмотрим также настройку самого JDY-31, делается это при помощи AT-команд:
- Чтобы модуль отвечал на команды, он должен находиться в режиме ожидания подключения (светодиод мигает)
- Загружаем в Arduino пустую программу (Файл/Новый). Либо любую другую, в которой не задействован Serial. Либо подключаем пин RST к GND, чтобы микроконтроллер не запустился и нам не мешал
- Подключаем JDY-31 на RX TX Arduino (аппаратный Serial) наоборот: TX > TX, RX > RX
- Открываем монитор порта, ставим текущую скорость модуля (по умолчанию 9600 бод), конец строки NL & CR
Отправляем команду AT+VERSION . Если всё сделано правильно – модуль ответит +VERSION=JDY-31-V1.35,Bluetooth V3.0
Какие ещё есть команды? Полный список есть в документации, давайте разберём:
Домашнее задание
Arduino и Bluetooth
В настоящее время в зарубежных и отечественных магазинах можно найти большое количество различных Bluetooth Serial модулей для DIY-устройств. Цена на них не сильно высока: 5-10$ за модуль (с учетом бесплатной доставки в любую страну). Их легко можно найти на широко известной площадке AliExpress введя в поисковую строку одно из словосочетаний: Bluetooth RS232, Bluetooth Serial, HC-03, HC-04, HC-05, HC-06 или нажать на эту ссылку. В большинстве модулей используется чип BC417, плюс Flash-память. Чип поддерживает спецификацию Bluetooth v2.0 + EDR, AT-команды, может работать в режиме Master или Slave (модули HC-03/HC-5, может устанавливаться AT-командой), поддерживает скорость обмена от 2400 до 1382400.
Напряжение питание модуля составляет 3.3В, ток потребления ~50мА.
Модули HC-03/HC-05 более функциональные, чем HC-04/HC-06. Основные выводы модулей HC-04/HC-06:
UART_TX (pin 1), UART_RX (pin 2), UART_CTS (pin 3), UART_RTS (pin 4) — пины UART.
3,3V (pin 12) — питание 3.3В.
GND (pin 13) — общий.
PIO1 (pin 24) — индикатор рабочего режима. Если соединение не установлено — то светодиод мигает, если установлено, то постоянно горит. Для модулей HC-03/HC-05 есть некоторые отличия. Линии UART и питания те же самые, но:
PIO8 (pin 31) — индикатор рабочего режима.
PIO9 (pin 32) — статус соединения, если соединение установлено, то на выходе будет высокий уровень.
PIO11 (pin 34) — вход включения режима AT-команд (необходимо подать лог. 1). За более подробной документацией обращайтесь к PDF. Итак, соберем простую схему для подключения Bluetooth модуля HC-06 к плате Arduino Nano V3. Обратите внимание, что выводы TX и RX в плате Arduino Nano поменяны местами в отличии от Ardunio UNO и др. Поэтому внимательно смотрите распиновку своей Arduino платы. Шаг между выводами в модуле составляет всего 1.5мм, поэтому придется взяться за паяльник и припаять провода к модулю. Всего необходимо припаять 5 проводов, однако светодиод подключать необязательно, он служит для индикации состояния. Итак припаиваем провода и подключаем Bluetooth модуль следующим образом:
вывод Arduino 3.3В — к 12 пину модуля
вывод Arduino GND — к 13 пину модуля
вывод Arduino TX — к 2 пину модуля RX
вывод Arduino RX — к 1 пину модуля TXПередача данных из Arduino по Bluetooth
int cnt = 0; // счетчик void setup() < Serial.begin(9600); // инициализация порта >void loop() < cnt++; Serial.print("Hello BB from Arduino! Counter:"); // выводим надпись Serial.println(cnt); // выводим значение счетчика и переводим на новую строку delay(1000); // ждем 1 секунду >
Как видите скетч довольно простой и хорошо прокомментирован. В цикле, раз в секунду происходит увеличение переменной cnt, которая затем с текстовой надписью выводится в последовательный порт на Bluetooth модуль. Обратите внимание, что скорость порта установлена в значение 9600. При покупке модуля, спрашивайте на какое значение установлена скорость обмена по последовательному интерфейсу. Но в большинстве случаев это 9600. При необходимости, скорость обмена можно изменить АТ-командами. Откройте данный скетч в Arduino IDE, скомпилируйте и прошейте ваш Arduino. Если вы подключали светодиод в Bluetooth модулю, то он должен мигать, показывая тем самым, что модуль ожидает соединение. Внимание! Если при прошивке платы Arduino ругается прошивальщик, то отключите питание 3.3В с Bluetooth модуля. На компьютере, в качестве Bluetooth модуля использовался самый дешевый китайский Bluetooth USB адаптер, стоимостью около 200 руб. После того, как адаптер подключается к компьютеру, установите необходимые драйвера (в Windows 7 x64 у меня все драйвера поставились автоматом).
Затем щелкаем в трее по иконке Bluetooth модуля и выбираем «Добавить устройство»: Имя моего модуля BOLUTEK, у вас оно скорее всего будет другим. Нажимаем «Далее» и переходим к окну, где необходимо ввести пароль для устройства: Выбираем второй пункт: «Введите код образования пары устройства». С завода, код установлен 1234. Его и вводим. Программа настроит и пропишет в системе виртуальные COM-порты (у меня прописало 2 шт, но может быть и один): В дальнейшем, можно посмотреть на какой COM-порт назначилось и его параметры. Для этого щелкаем правой кнопкой мыши по устройству и выбираем «Свойства» и вкладку «Оборудование». Там можно посмотреть и изменить параметры виртуального COM-порта: Теперь, для приема и передачи данных на виртуальный COM порт можно использовать любую терминал программу. Я использовал бесплатную Tera Term. При каждом запуске программы предлагается выбор соединения, переключаем флажок на Serial и выбираем COM порт вашего Bluetooth модуля. У меня это COM4. В терминале мы видим данные счетчика с платы Arduino: Как видим, данные успешно передаются по Bluetooth соединению. Ниже в статье вы можете посмотреть видео.Двунаправленный обмен данными по Bluetooth
Следующим шагом будет написание простенькой программы двунаправленного обмена данными между Arduino и компьютером. В схему я добавил светодиод, подключив его к 12 пину Arduino, через токоограничительный резистор. Но можно использовать и встроенный LED (обычно 13 пин).
char incomingByte; // входящие данные int LED = 12; // LED подключен к 12 пину void setup() < Serial.begin(9600); // инициализация порта pinMode(LED, OUTPUT); Serial.println("Press 1 to LED ON or 0 to LED OFF. "); >void loop() < if (Serial.available() >0) < //если пришли данные incomingByte = Serial.read(); // считываем байт if(incomingByte == '0') < digitalWrite(LED, LOW); // если 1, то выключаем LED Serial.println("LED OFF. Press 1 to LED ON!"); // и выводим обратно сообщение >if(incomingByte == '1') < digitalWrite(LED, HIGH); // если 0, то включаем LED Serial.println("LED ON. Press 0 to LED OFF!"); >> >
Программа работает очень просто. После запуска или сброса устройства, в последовательный порт выводится сообщение с предложением нажать 1 или 0. В зависимости от нажатой цифры светодиод будет загораться или гаснуть. А также, от Arduino будет выводиться сообщение загорелся светодиод, или погас. Видео работы:
Подключаем к Android
Для платформы Android также существуют программы-терминалы. Но необходима специальная программа для работы в терминальном режиме по Bluetooth. Я установил вот эту: Bluetooth Terminal. Достаточно простая программа, ничего лишнего. В моем Android устройстве нет Bluetooth модуля, но он прекрасно работает и с внешним USB-адаптером, который мы использовали для подсоединения к ПК. Подключаем адаптер по USB, включаем на андроиде bluetooth, находим и вводим пароль для нашего Bluetooth устройства на Arduino и наконец запускаем программу терминал. Нажимаем «Connect a device — Secure» и выбираем наше устройство BOLUTEK. Теперь вы можете отправлять и принимать данные с Bluetooth устройства при помощи терминала. Видео соединения с Android устройством:
Прикрепленные файлы: