Модуль HC-05, подключенный к Arduino Uno напрямую к пинам 0 и 1, блокирует загрузку скетча и выдает ошибку avrdude: stk500_recv() — это самая частая проблема при сборке Bluetooth-контроллера, и решается она отключением модуля от аппаратного UART на время прошивки. Запрос «arduino bluetooth controller» обычно означает одну из двух задач: управлять платой Arduino со смартфона через Bluetooth или собрать самодельный контроллер (пульт) на базе Arduino. В обоих случаях основой служит последовательный порт и Bluetooth-модуль.
В статье разберем выбор модуля, схему подключения с учетом уровней напряжения, настройку через AT-команды, минимальный скетч для приема команд и типичные ошибки, из-за которых связь не устанавливается. Инструкции даются для классических модулей HC-05 и HC-06 как самых распространенных; поведение конкретного клона может отличаться, поэтому при расхождениях сверяйтесь с документацией на вашу плату.
Выбор Bluetooth-модуля для Arduino
Для проектов на Arduino чаще всего используют три типа модулей. HC-05 умеет работать в режимах master и slave, то есть может сам инициировать соединение. HC-06 работает только в режиме slave — он дешевле и проще, если контроллером выступает смартфон. Модули BLE (например, на базе HM-10) используют Bluetooth Low Energy и требуют другого подхода в коде, но потребляют заметно меньше энергии.
Классические HC-05/HC-06 работают по профилю SPP (Serial Port Profile) и прозрачно передают байты: все, что Arduino отправляет в Serial, уходит в эфир, и наоборот. Это делает их совместимыми практически с любым терминальным приложением на Android. Учтите, что iOS с классическим Bluetooth 2.0 через SPP не работает — для iPhone нужен BLE-модуль.
- 🔵 HC-05 — master/slave, подходит для связи двух Arduino между собой.
- 🟢 HC-06 — только slave, оптимален для управления со смартфона.
- ⚡ HM-10 (BLE) — низкое энергопотребление, совместимость с iOS.
- 🔧 Встроенный BLE — платы Arduino Nano 33 BLE и ESP32 не требуют внешнего модуля.
Схема подключения и согласование уровней
Логика модуля рассчитана на 3,3 В, тогда как Arduino Uno выдает на TX-пине 5 В. Сам модуль обычно питается от 5 В через вывод VCC (на плате модуля стоит стабилизатор), а вот линия RX модуля требует защиты. Классическое решение — делитель напряжения из двух резисторов между TX Arduino и RX модуля: например, 1 кОм и 2 кОм, что снизит 5 В примерно до 3,3 В.
Линия TX модуля (3,3 В) подключается к RX Arduino напрямую — уровень 3,3 В Arduino воспринимает как логическую единицу. Для удобства прошивки модуль лучше подключать не к аппаратным пинам 0 и 1, а к программному порту через библиотеку SoftwareSerial, например на пины 10 (RX) и 11 (TX).
| Пин модуля | Куда подключать на Arduino | Примечание |
|---|---|---|
| VCC | 5V | Через стабилизатор на плате модуля |
| GND | GND | Общая земля обязательна |
| TXD | Пин 10 (RX SoftwareSerial) | Напрямую, 3,3 В совместимо |
| RXD | Пин 11 (TX SoftwareSerial) | Через делитель напряжения |
| KEY/EN | 3,3 В или не подключен | Нужен для входа в AT-режим |
⚠️ Внимание: подача 5 В напрямую на RX модуля может со временем вывести его из строя. Не пропускайте делитель напряжения, даже если «на макетке и так работает».
Настройка модуля через AT-команды
Перед использованием модуль желательно настроить: задать имя устройства, PIN-код и скорость порта. Для этого HC-05 переводится в AT-режим — обычно удержанием кнопки на модуле (или подачей высокого уровня на пин KEY) в момент подачи питания. Признак входа в AT-режим — редкое медленное мигание светодиода вместо частого. Точная процедура зависит от версии платы модуля, поэтому при сомнениях сверьтесь с описанием конкретной ревизии.
Команды отправляются через Serial-монитор Arduino IDE. Полезный набор команд для HC-05:
AT — проверка связи, ответ OK
AT+NAME? — запрос текущего имени
AT+NAME=ArduinoCtrl — установка имени
AT+PSWD? — запрос PIN-кода
AT+UART=9600,0,0 — скорость 9600 бод
Обратите внимание: в AT-режиме многие модули работают на фиксированной скорости (часто 38400 бод), а в рабочем режиме — на той, что задана командой AT+UART. Если модуль не отвечает в мониторе порта, первым делом проверьте скорость соединения и настройку окончания строки — HC-05 обычно требует NL & CR (оба символа перевода строки).
Почему модуль не отвечает на AT-команды
Наиболее вероятные причины: модуль не переведен в AT-режим (светодиод мигает часто), неверная скорость порта в мониторе, не выбрано окончание строки "NL & CR", перепутаны линии RX/TX. Проверяйте по одному пункту, меняя только один параметр за раз.
Скетч контроллера: прием команд со смартфона
Минимальный скетч принимает символы из Bluetooth и выполняет действия — например, включает светодиод или управляет мотором. Логика проста: читаем байт из SoftwareSerial, сравниваем с ожидаемыми командами, выполняем действие.
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX, TX
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
BTSerial.begin(9600);
}
void loop() {
if (BTSerial.available()) {
char cmd = BTSerial.read();
if (cmd == '1') digitalWrite(13, HIGH);
if (cmd == '0') digitalWrite(13, LOW);
Serial.println(cmd); // эхо в монитор
}
}
На смартфоне устанавливается любое приложение типа «Bluetooth Terminal» или специализированное — Arduino Bluetooth Controller и аналоги, где кнопкам назначаются отправляемые символы. Сопряжение выполняется стандартно: в настройках Bluetooth Android найдите модуль по имени и введите PIN (у новых модулей это чаще всего 1234 или 0000, точное значение указано в описании вашего модуля).
☑️ Проверка перед первым запуском
Типичные проблемы и их диагностика
Если скетч не загружается с ошибкой программатора — почти наверняка модуль занимает аппаратный UART. Отключите провода от пинов 0 и 1, прошейте плату, затем верните подключение. Именно поэтому и рекомендуется SoftwareSerial: аппаратный порт остается свободным для отладки.
Когда смартфон не видит модуль, проверьте питание: светодиод на модуле должен мигать. Отсутствие свечения указывает на проблему с питанием или неисправность платы. Если модуль виден, но приложение не подключается — удалите старое сопряжение в настройках Bluetooth и выполните его заново. Данные передаются в приложение, но приходят «мусором» из непонятных символов — это почти всегда несовпадение скоростей порта в скетче и в модуле.
- 🔌 Ошибка загрузки скетча — модуль занимает пины 0/1, отключите его на время прошивки.
- 📵 Модуль не виден — проверьте питание и землю, светодиод должен мигать.
- 🌀 Кракозябры в терминале — скорость
BTSerial.begin()не совпадает с настройкой модуля. - 🔁 Связь рвется — слабое питание; не питайте модуль и моторы от одного слабого источника.
⚠️ Внимание: не питайте мощную нагрузку (моторы, сервоприводы) от пина 5V Arduino одновременно с Bluetooth-модулем — просадки напряжения вызывают разрывы соединения и перезагрузку платы. Используйте отдельный источник питания для силовой части с общей землей.
Arduino как пульт: передача команд на другое устройство
Обратная задача — сделать из Arduino сам контроллер, который отправляет команды. Здесь нужен модуль в режиме master, то есть HC-05. В AT-режиме ему задают роль мастера командой AT+ROLE=1 и привязку к адресу ведомого устройства через AT+BIND. После этого модуль при включении сам устанавливает соединение, и скетч просто пишет байты в Serial — например, по нажатию кнопок или по показаниям джойстика.
Такая схема применяется в самодельных пультах для роботов и машинок: на передающей стороне Arduino с джойстиком и HC-05, на приемной — вторая Arduino с любым slave-модулем и драйвером моторов. Протокол обмена вы задаете сами — проще всего передавать один байт на команду или короткие текстовые пакеты вида F100 (вперед, скорость 100).
FAQ: частые вопросы
Чем HC-05 отличается от HC-06 на практике?
HC-05 умеет работать мастером и сам устанавливать соединение, HC-06 — только ведомый. Для управления со смартфона разницы нет, для связи двух Arduino нужен хотя бы один HC-05.
Можно ли управлять Arduino с iPhone?
Классические HC-05/HC-06 с iOS не работают, так как Apple не поддерживает профиль SPP для сторонних устройств. Используйте BLE-модуль (HM-10) или плату со встроенным BLE, например ESP32.
Какой PIN-код у модуля по умолчанию?
Чаще всего 1234 или 0000, но значение зависит от прошивки конкретного модуля. Точный PIN указан в описании товара или меняется командой AT+PSWD.
Почему данные приходят непонятными символами?
Почти всегда это несовпадение скоростей: в скетче задана одна скорость SoftwareSerial, а модуль настроен на другую. Узнайте скорость модуля командой AT+UART? и укажите ее в BTSerial.begin().
Нужен ли делитель напряжения, если модуль и так работает?
Да. Работа RX на 5 В — это эксплуатация вне штатного режима, которая сокращает срок службы модуля. Делитель из двух резисторов стоит копейки и собирается за минуту.