Bluetooth-модуль HC-05 не принимает AT-команды

Я уже некоторое время пытаюсь запрограммировать Bluetooth-модуль HC-05 ZS-040 и не могу заставить AT-команды возвращать какие-либо значения. Я довольно долго искал в Google, и ни один из ответов, похоже, не работает для меня. Я следил за этим сайтом:

https://sites.google.com/site/wayneholder/inexpensively -запрограммируйте-вашу-arduino-через-Bluetooth

Я использую клон Arduino Mega 2560 от Elegoo для программирования этого модуля Bluetooth. В настоящее время я подключил его, используя эту схему

https ://sites.google.com/site/wayneholder/inexpensively-program-your-arduino-via-bluetooth/HC-05-to-FTDI.png?attredirects=0

В настоящее время я немного модифицировал его, чтобы использовать делитель напряжения между Tx Arduino и Rx HC-05, поскольку HC-05 работает на логике 3,3 В. Единственная возможность, которая, как мне кажется, может быть причиной этой проблемы, заключается в том, что Arduino Mega просто неправильно интерпретирует все Tx, поскольку я измерил, что он звучит около 3,2 вольта для высокого напряжения. Согласно нескольким веб-сайтам, HC-05 находится в командном режиме AT, когда светодиод медленно мигает, примерно раз в 2 секунды, что и происходит. Я перевел его в командный режим, удерживая нажатой кнопку над контактом EN при подаче питания на HC-05.

Я использовал контакты 14 и 15, которые относятся к аппаратному серийному номеру 3 на Arduino Mega. Вот код, который я написал:

 /*
Множественный серийный тест программного обеспечения

Получает от аппаратного серийного номера, отправляет на Software Serial.
Получает от SoftwareSerial, отправляет hardware serial.
*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(15, 14); // прием, передача

недействительная установка () {
// Открытие последовательной связи и ожидание открытия порта:
Серийный.начать(9600);
пока (!Серийный) {
; // ждем подключения последовательного порта. Требуется только для родного порта USB
}
Serial.println("AT");
// устанавливаем скорость передачи данных для порта SoftwareSerial
Serial3.begin(38400);
}

void loop() { // повторяем снова и снова
если (Serial3.доступно()) {
Serial.write(Serial3.read());
}
если (серийный.доступный()) {
Serial3.write(Serial.read());
}
}

Любые предложения приветствуются!

ИЗМЕНИТЬ: Теперь я получил некоторые неузнаваемые ответы от контроллера после многократной отправки AT, вот скриншот, включая видео моей схемы, которое показывает, как мигает светодиод:

https://drive.google.com/open?id=1mc8PEEnhiKpPzzy5kL9QxTvoQA3NAH6b

Единственным изменением кода является добавление Serial.println("TESTING"); в цикле while, который читает Serial3. Я также пробовал использовать другие аппаратные последовательные порты, все с тем же результатом, что и на скриншоте выше.

, 👍3

Обсуждение

Я более внимательно посмотрел на ваш код и теперь вижу проблему. Я добавлю дополнительную информацию в свой ответ, но вы заметили, что вы настроили объект mySerial, но на самом деле не ссылаетесь на него в коде? Ваш mySerial аналогичен моему объекту BTSerial. Я напишу ваш код так, как он должен быть в моем ответе, чтобы вы могли скопировать его и попробовать., @raddevus


2 ответа


Лучший ответ:

1

Спасибо за помощь! Я отказался от работы модуля Bluetooth, однако при работе с простым светодиодом RGB я заметил свою ошибку. Я использовал землю от моего блока питания для модуля вместо земли от Arduino Mega. Я перемонтировал свою макетную плату так, чтобы земля и питание поступали от моей Arduino Mega, и все работает отлично! В итоге я использовал тот же самый код, который я разместил в своем первоначальном вопросе, так что я просто не использовал землю от моего Arduino Mega

,

2

###### Попробуйте это : ваш код обновлен с возможными исправлениями ######

Изучив ваш код и сравнив его с моим рабочим кодом, я считаю, что нашел окончательный ответ. Я изменяю ваш код, чтобы вы могли скопировать его и попробовать. Я добавлю комментарии, где я это изменил.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(15, 14); // прием, передача

void setup() {
  // Открытие последовательной связи и ожидание открытия порта:
  Serial.begin(9600);
  Serial.println("Enter AT commands:"); // подсказка в Serial Monitor
  // Удален цикл while, ненужный

  // устанавливаем скорость передачи данных для порта SoftwareSerial
  // обратите внимание, что ваш комментарий к предыдущей строке говорит о порте SoftwareSerial
  // но вы устанавливаете порт Serial3 -- здесь мы используем mySerial
  // Serial3.begin(38400); // прокомментировал вашу строку кода
  mySerial.begin(38400);
}

void loop() { // повторяем снова и снова
  //if (Serial3.available()) { // мы больше не используем Serial3
  if (mySerial.available()) {
    //Serial.write(Serial3.read());
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    //Serial3.write(Serial.read());
    mySerial.write(Serial.read());
  }
}

Я уверен, что если вы воспользуетесь этим измененным кодом, он решит вашу проблему. Я должен был заметить это раньше.

Вот остальная часть моего первоначального ответа.

Я сам боролся с этим. На самом деле мне потребовалось несколько месяцев владения несколькими HC-05, прежде чем я наконец нашел ответ. Я давно с ним не работал, поэтому постараюсь объяснить, что делать.

Ардуино Нано

Кроме того, я использую Arduino Nano для программирования HC-05.

Эта установка позволяет изменять HC-05

После того, как вы подключите его и запустите программу (включенную здесь), вы сможете отправлять любые команды HC-05, и они прекрасно работают. Вы можете изменить имя устройства, 4-значный код доступа и все остальное.

Грубый снимок, но достаточный для построения простой схемы

У меня также есть грубый снимок* схемы, которую я использовал (в то время только для того, чтобы задокументировать ее на память), но я думаю, что мы можем проработать ее. и я знаю, что все эти провода набиты вместе, и кажется, что они находятся в одних и тех же макетных отверстиях, но на самом деле они правильно подключены. Я был так взволнован, что это наконец сработало, что сделал снимок слишком быстро.

*см. изображение ниже

Вот код, который я использую:

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(10, 11); // Прием | Передача

void setup()
{
  //pinMode(9, ВЫХОД); // этот контакт потянет контакт 34 HC-05 (ключевой контакт) на ВЫСОКИЙ уровень, чтобы переключить модуль в режим AT
  // цифровая запись (9, ВЫСОКИЙ);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(38400);  // HC-05 скорость по умолчанию в AT-команде подробнее
}

void loop()
{

  // Продолжаем читать с HC-05 и отправляем в Arduino Serial Monitor

  if (BTSerial.available())
    {
     //Serial.println("БТ доступен...");
    Serial.write(BTSerial.read());
    }

  // Продолжаем читать с последовательного монитора Arduino и отправляем на HC-05
  if (Serial.available())
    BTSerial.write(Serial.read());
}

Есть ли на вашем HC-05 кнопка?

Хорошо, так что первым делом нужно проверить, есть ли на вашем HC-05 маленькая кнопка? Если это так, это должно быть удержано, когда вы подаете питание на цепь. HC-05 мигнет, а затем перейдет в КОМАНДНЫЙ режим, и вы можете отпустить его.

Если нет кнопки

Вы можете видеть, что у меня есть кнопка. Поэтому первые две строки метода setup() закомментированы. Мне не нужно, чтобы D9 повышался (он не подключен к контакту), потому что у меня есть кнопка. Если у вас есть кнопка (скорее всего, есть), то вам даже не нужно об этом беспокоиться.

Оглядываясь назад на ваш вопрос

Теперь, когда я оглядываюсь назад на ваш пример кода, возможно, вы не знаете, что вам нужно удерживать эту кнопку при включении питания. Или вы не знаете, что вам нужно подключить этот провод, чтобы HC-05 оставался в командном режиме.

Контакты для TX/RX

Вероятно, это проблема, потому что все остальное выглядит одинаково, за исключением того, что вы используете 15 и 14 для TX/RX. Я использую D10 и D11 для себя, и я помню кое-что об этих контактах в глубине души, поэтому, если ваш все еще не работает, попробуйте переключиться на них и попробуйте использовать мой код.

Я помню, как впервые у меня это заработало, и я танцевала по комнате. Удачи, и я надеюсь, что вы скоро будете танцевать. :)

hc-05 через нано

,

Спасибо за ответ! Я попробовал ваше предложение использовать контакты 10 и 11, но не получил ответа. Я нажимал кнопку при подаче питания, и светодиодный индикатор горит один в течение двух секунд, а затем гаснет на две секунды. Однако при использовании аппаратных последовательных портов на моем Mega 2560 я теперь получаю ответы в последовательном мониторе, и мне удалось изменить имя HC-05, но ответы по-прежнему не читаются. Может ли быть так, что высокого уровня HC-05 (3,3 В) недостаточно для того, чтобы Arduino Mega интерпретировала его как высокое значение, поэтому иногда ответ выглядит нормально, а иногда нет?, @Justin VanderBerg

@JustinVanderBerg Я думаю, что это хорошее предположение, но я не уверен в этом, потому что у меня нет опыта работы с Mega. Возможно, вам стоит купить этот пакет из 3 Nano https://amzn.to/2MOfHYE (12,68 долларов США) на Amazon и использовать один из них для программирования вашего HC-05. Извините, я не мог больше помочь с этим. Как я уже сказал, я боролся с этим в течение нескольких месяцев, пытаясь решить эту проблему., @raddevus

@JustinVanderBerg Я снова думал об этом, и если вы получаете искаженный текст, это часто означает, что скорость не соответствует. Вчера я заметил, что, несмотря на то, что мой Arduino записывает данные в последовательный порт на частоте 9600 (путем настройки в программном обеспечении), мне фактически пришлось установить серийный монитор Arduino IDE на 19200, чтобы получить действительный вывод. Я хочу сказать, вы пытались установить разные значения скорости в Serial Monitor? Возможно, HC-05 по умолчанию использует 9600, что является значением по умолчанию для обычного режима отправки данных. Возможно, стоит попробовать., @raddevus