Ардуино: Bluetooth

Bluetooth — это пожалуй самый распространенный протокол радиосвязи для коротких дистанций, которым пользуются большинство современных электронных устройств. Телефонные гарнитуры, наушники, клавиатуры и мышки, принтеры и бог знает какие еще гаджеты. Некоторое время назад bluetooth был распространен как средство передачи файлов между телефонами.

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

Bluetooth HC-05

Самыми популярным на сегодня Bluetooth модулями являются HC-05 (на картинке выше) и HC-06. Отличия между ними в том, что первый может работать как в режиме ведущего (slave), так и в режиме ведомого (master). Второй же является чисто ведомым устройством (хотя это поправимо, но сложно). Другими словами, HC-06 не может сам обнаружить парное устройство и наладить с ним связь, он может лишь подчиниться ведущему. Однако, после того как связь установлена, модули могут передавать данные в обоих направлениях, хоть HC-05, хоть HC-06.

Спецификация

  • напряжение питания: сигнальные линии 3,3 В, питание 5 В;
  • рабочий ток: от 15 до 30 мА;
  • контроллер: BC417143;
  • поддерживаемые профили: последовательный порт Bluetooth (ведущий/ведомый/loopback (петля));
  • спецификация Bluetooth: v2.0 + EDR;
  • частота: 2,4 ГГц;
  • модуляция: GFSK (Gaussian Frequency Shift Keying);
  • мощность: ≤4 дБм, класс 2;
  • чувствительность: ≤-84 дБм при 0.1% BER;
  • скорость асинхронной передача: 2,1 Мбит/с;
  • скорость синхронной передачи: 1 Мбит/с;
  • рабочая дистанция: до 10 м;
  • рабочая температура: от -5 до +45°С.

На этом уроке мы научимся подключать bluetooth модуль к Ардуино, напишем программу для работы с ним и сделаем устройство, управляемое со смартфона!

Список необходимых компонентов

Для выполнения всех примеров из этого урока потребуется контроллер Arduino Uno или любой его аналог, bluetooth модуль HC-05, светодиод, резисторы, макетная плата и немного проводов.

Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.

В корзину
В корзину
В корзину
В корзину
В корзину
В корзину
В корзину

Подключение к Ардуино

В основе модулей HC-05 и HC-06 лежит микросхема CSR BC417, которая поддерживает Bluetooth версии 2.0 со скоростью до 2,1 Мбит/сек. Надо отметить, что это довольно старая микросхема, и в мире уже во всю используется версия 4.0 (она же BLE). Однако, для нашего урока и для многих DIY проектов этот вариант вполне пригоден.

Обычно для DIY целей используют модули в виде двух спаянных вместе плат. Меньшая из них — заводской модуль, широко используемый в разных электронных устройствах. Большая — специальная макетная платка, которая позволяет удобно подключать HC-05 и HC-06 к Ардуино-подобным системам. Мы будем пользоваться именно DIY вариантом.

Так выглядят типичные bluetooth-модули HC-05 и HC-06:

Сравнение Bluetooth HC-05 и HC-06

Встречаются и варианты плат с немного другим расположением контактов. Например в HC-05 вместо контакта EN может быть контакт KEY, с помощью которого осуществляется настройка модуля AT-командами.

Контакты

Полный список возможных контактов:

EN включение/выключение модуля
KEY входа в режим AT-команд
VCC питание +5В
GND земля
TX TX линия UART интерфейса
RX RX линия UART интерфейса
STATEиндикатор состояния, дублирует встроенный светодиод состояния

Контакт STATE дублирует светодиод состояния, который показывает в каком режиме находится устройство. Всего есть три режима:

  • мигает один раз в 2 секунды — модуль в режиме AT-команд;
  • быстро мигает: ожидание соединения;
  • мигает раз в секунду: успешно соединился.

Контактов у модуля не так много, и на первый взгляд запутаться не получится. Однако, рабочее напряжение модулей HC-05 и HC-06 составляет 3,3 Вольта, поэтому при подключении их к Ардуино следует этот факт учитывать.

Согласование уровней напряжения

Максимальное рабочее напряжение микросхемы Bluetooth модуля должно быть в диапазоне от 3 В до 4,2 В. Это значит, что прямое подключение его к Ардуино Уно или к любому другому контроллеру с 5-Вольтовой логикой может вывести модуль из строя!

Благо, большая вспомогательная плата, на которую смонтирован bluetooth, уже имеет в своем составе преобразователь напряжения. Так что модуль можно без опасений питать от Ардуино. А вот с сигнальными линиями RX и TX не всё так однозначно.

Вариант №1. Если требуется передавать данные от bluetooth к Ардуино, то можно соединить эти две платы только одной сигнальной линией Arduino RX <-> HC-05 TX и тогда никаких дополнительных ухищрений не понадобится. Например, однонаправленное управление каким-нибудь устройством или роботом через bluetooth — именно такой случай.

Arduino UnoGnd+5V0 (RX)
Bluetooth HC-05GndVccTX

Вариант №2. Если же требуется передавать данные от bluetooth модуля к Ардуино, то необходимо использовать делитель напряжения. Полная схема подключения будет выглядеть так:

Подключение HC-05 к Ардуино

Для нашего урока достаточно будет подключить bluetooth-модуль HC-05 к Ардуино по трёх-контактной схеме (вариант №1). Теперь перейдем ко второй части системы — пульту дистанционного управления, в роли которого у нас будет смартфон со специальной программой.

Пульт ДУ из смартфона

Для управления arduino-bluetooth устройством будем использовать наш виртуальный геймпад для Android. Скачать его можно в Google Play по ссылке: Bluetooth robot control

На главном экране приложения имеется джойстик-крестовина слева и набор кнопок справа: A,B,C,D. Сверху имеется бегунок для управления уровнем чего-нибудь, например, скоростью робота.

Виртуальный геймпад ROC Remote Control

Принцип работы приложения

После каждого нажатия кнопки, программа отправляет по Bluetooth один символ, кодирующий команду. Например, при нажатии левой стрелки джойстика, будет отправлен символ «L» от английского слова Left. А если верхняя стрелка — «F» (Forward). При этом, приложение поддерживает два режима отправки команд.

1) Если в настройках стоит галочка «непрерывный поток команд», то символы будут отправляться непрерывной последовательностью, пока пользователь жмет на кнопку. Если же никакая кнопка не нажата, то приложение будет отправлять символ, означающий отсутствие команд — «I».

2) В обычном режиме (без галочки), при нажатии на кнопку будет отправлен только один символ в верхнем регистре и такой же символ, но в нижнем регистре, при её отпускании.

Будем использовать первый режим — «непрерывный поток команд».

Список доступных команд

  • стрелка вперед — F
  • стрелка назад — B
  • стрелка влево — L
  • стрелка вправо — R
  • кнопки A, B, C, D — соответственно символы A, B, C, D
  • бегунок — символы от 0 до 9

Инструкция

Чтобы подключить пульт к Bluetooth устройству необходимо:

  1. подать питание на bluetooth устройство, пока у нас это Ардуино с модулем HC-05;
  2. в настройках смартфона зайти в раздел blueooth, найти там HC-05 (или HC-06) и произвести сопряжение с этим устройством; если потребуется пароль, то по-умолчанию у данных модулей он «1234».
  3. затем, запустить приложение «Bluetooth robot control», нажать там кнопку с символом блютуза и выбрать в появившемся списке всё тот же модуль HC-05 (HC-06).
  4. после выбора нужного модуля, слева начнет мигать индикатор состояния; как только он перестанет мигать и станет зеленым — подключение совершено, можно тыкать кнопки:)

Теперь нужно написать программу для Ардуино, которая будет принимать эти команды и выполнять какие-то действия. Попробуем сначала собрать простой стенд со светодиодами для проверки приёма команд.

Программа

Итак, чтобы протестировать bluetooth-соединение, подключим к Ардуино четыре обычных светодиода и заставим их зажигаться от нажатия кнопок на пульте.

В одном из ранних уроков мы разбирали как правильно подключать светодиоды к плате Ардуино. Для работы используем контакты 2, 3, 4 и 5.

Никаких дополнительных библиотек для работы с bluetooth требуется. Модули bluetooth HC-05 и HC-06 подключаются по UART интерфейсу, а значит достаточно использовать стандартный класс Serial. Скорость передачи по UART у модуля HC-05 равна 9600 бод, указываем это при вызове функции инициализации «begin». (более подробно об UART в этом уроке)

int led1pin = 2;
int led2pin = 3;
int led3pin = 4;
int led4pin = 5;

void setup() {
    Serial.begin(9600); // скорость UART интерфейса у HC-05

    // настройка контактов
    pinMode(led1pin, OUTPUT);
    pinMode(led2pin, OUTPUT);
    pinMode(led3pin, OUTPUT);
    pinMode(led4pin, OUTPUT);
}

void loop() {
    char data;
    // есть во входном буфере есть данные
    if( Serial.available() > 0 ){
        data = Serial.read(); // считываем один байт из буфера
        switch(data){ // сравниваем полученный символ с R,L,F,B
        case 'R':{
            digitalWrite(led1pin, HIGH);
            break;  
        }
        case 'L':{
            digitalWrite(led2pin, HIGH);
            break;  
        }
        case 'F':{
            digitalWrite(led3pin, HIGH);
            break;  
        }
        case 'B':{
            digitalWrite(led4pin, HIGH);
            break;  
        }
        default:{
            // если полученный символ не равен ни одному из вышеуказанных
            // гасим все светодиоды
            digitalWrite(led1pin, LOW);
            digitalWrite(led2pin, LOW);
            digitalWrite(led3pin, LOW);
            digitalWrite(led4pin, LOW);
        }
        }
    }
}

Загружаем программу на Ардуино, подаем питание на наш стенд, подключаемся со смартфона к устройству и пробуем нажимать на стрелки джойстика. Можно даже попробовать нажать сразу на несколько стрелок.

В следующей программе будем использовать пульт для управления яркостью светодиода. В схеме останется только один светодиод, подключенный к любому выводу Ардуино с поддержкой ШИМ. Для Ардуино Уно это 3,5,6,9,10,11.

int led1pin = 3;

void setup() {
    Serial.begin(9600);

    // настройка контактов
    pinMode(led1pin, OUTPUT);
}

void loop() {
    byte data;
    // есть во входном буфере есть данные
    if( Serial.available() > 0 ){
        data = Serial.read(); // считываем один байт из буфера
        if( data >= 48 && data <= 57 ){
            analogWrite(led1pin, 255*(data-48)/9);
        }
    }
}

Что за числа 48 и 57? И формула 255*(data-48)/9. Поясним.

Как мы уже писали, приложение Bluetooth robot control отправляет нам символы. Как известно, в вычислительной технике принято хранить символы с помощью кода из ASCII таблицы. Так вот согласно этой таблице, символам, обозначающим цифры 0, 1, 2, …, 9 соответствуют числовые коды 48, 49, 50, …, 57. То есть, когда мы говорим, что символ пришел в последовательный порт, на самом деле мы получили один байт, что есть число в диапазоне от 0 до 255.

В нашей программе сразу после получения байта мы проверяем, является ли этот байт цифрой (символом, на числом!) в диапазоне от 0 до 9. Если является, то мы преобразуем эту цифру сначала в число от 0 до 9:

data - 48

А затем применяем обычную пропорцию чтобы превратить число в диапазоне от 0 до 9 в число от 0 до 255:

255*(data-48)/9

Таким образом выражение 255*(data-48)/9 преобразует символы от 0 до 9 в число от 0 до 255! Никакой магии.

Загружаем программу в Ардуино, подключаемся к устройству через смартфон и пробуем двигать бегунок. Светодиод будет менять яркость. Смена яркости будет происходить скачкообразно, так программа поддерживает всего 10 позиций бегунка (ну от 0 до 9 же, помните?).

На основе этих примеров можно составить программу для управления движением робота. Разберем это в одной из следующих статей на нашем портале!


Изменено:

Ардуино: Bluetooth: 3 комментария

  1. Здравствуйте. У вас стрелка назад перекликается с кнопкой B, и это небольшая проблема, но значительная

    • Приветствую! Есть такое, уже публикуем новую версию приложения:) не приметили слона

  2. Вариант №2. Если же требуется передавать данные от bluetooth модуля к Ардуино, то необходимо использовать делитель напряжения. Полная схема подключения будет выглядеть так:
    Что- то мне подсказывает, что в этом варианте данные передаются ОТ Ардуино На БТ.

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.