Arhn - архитектура программирования

Arduino: возникли проблемы с подключением / записью AT-команд в модуль Bluetooth HC05 через USB-порт

В качестве введения я купил себе ардуино и несколько модулей, чтобы изучить некоторые программные вещи. Проект состоит в том, чтобы в конечном итоге подключить к моей машине считыватель bluetooth OBD2 для отображения данных в реальном времени на небольшом ЖК-дисплее.

Проблема

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

  1. Я вообще не могу подключиться к модулю.

У меня Мега 2560 и HC05.

5V ‹-› VCC

GND ‹-› GND

D2 ‹-› RXD

D3 ‹-› TXD

Обратите внимание, что я видел скорости передачи 9600 и 38400 бод для подключения, но ни один из них не работал, поэтому я сделал эту функцию, чтобы попробовать их все для себя ...

//set up serial relay into HC05.
SoftwareSerial hc05(2,3);

//computer serial baud rate 115200

bool hc05_connect() { 
  long baud_list[] = {300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, 230400}; 
  Serial.println("Attempting to connect to HC05 bluetooth module...");
  bool success = 0;
  for (int i=0; i<(sizeof(baud_list) / sizeof(baud_list[0])); i++) {
    Serial.print("Baud rate ");
    Serial.print(baud_list[i]);
    Serial.print("...");
    hc05.begin(baud_list[i]);
    hc05.write("AT");
    delay(1000);
    if (hc05.available()) {
      Serial.println(" successful!");
      success = 1;
      return success;
    } else {
      Serial.println(" failed");
    }
  }
  return success;
}

Примечания:

  • Это всегда возвращалось неудачно для каждой скорости передачи.
  • У меня модуль bluetooth находится в командном режиме, который запускается нажатием кнопки при подаче питания.
  • Я попытался отключить контакты TX / RX при загрузке скетча. Никакой разницы не замечено.
  1. Мои попытки отправить команды на HC05 безуспешны.

Ниже моя функция для отправки команд модулю.

void loop() {
  // listen for communication from the ESP8266 and then write it to the serial monitor
  if (hc05.available()) {
    Serial.write(hc05.read());
  }

  // listen for user input and send it to the ESP8266
  if (Serial.available() > 0) {
    Serial.println("Writing to hc05...");
    Serial.println(Serial.available());
    Serial.println(Serial.read());
    hc05.write(Serial.read());
  }
}

Я добавил несколько строк, которые записываются обратно в Serial, чтобы я мог видеть, что отправляется, а монитор возвращает странные вещи. Например, если я отправлю AT, монитор прочитает следующее:

Writing to hc05...
3
65
Writing to hc05...
1
10

Примечания:

  • Почему он отправляет 2 разных предмета?
  • Почему он отправляет целые числа, а не символы, которые я сказал?
  • Означает ли это, что я просто отправляю ему бессмысленные команды, поэтому он не отвечает?

Я могу предоставить полный код, если хотите, но это уже огромный текстовый экран. Помогите, пожалуйста!

Изменить

Таким образом, я смог установить связь двумя способами через модуль bluetooth, используя модифицированную версию кода в этом руководстве: https://www.instructables.com/How-to-Set-Up-and-Test-Arduino-Bluetooth-Connectio/

Мне удалось отправить только с ПК и не получить на терминал Bluetooth Android с помощью SoftwareSerial с RX - TX0 / TX - RX0 HC05. И я смог принимать на ПК и не отправлять, используя аппаратный последовательный / Serial1 с RX - TX1 / TX - RX1 HC05.

Итак, теперь у меня есть RX - TX0 / TX - RX1. Вроде через терминал общается вот так.

void setup() {
  Serial.begin(9600); //open the serial port
  Serial1.begin(9600);
}

void loop() {
  if (Serial1.available()) {
    Serial.print("(Received)");
    Serial.println(Serial1.readString()); // send from serial to bluetooth
  }
  if (Serial.available()) {
    Serial.print("(Sent)");
    Serial.println(Serial.readString());
    Serial1.println(Serial.readString()); // send from bluetooth to serial
  }
}

Но если я применяю это к своему коду, я все равно не могу заставить его работать.

Прежде чем я попытаюсь взломать это вместе, почему я получаю последовательное соединение для работы через 2 разных последовательных канала? Странный...


  • Попробуйте использовать что-нибудь вроде терминального приложения на телефоне, чтобы проверить подключение к HC-05. Кроме того, я никогда не могу вспомнить, нужно ли менять местами линии Rx / Tx. Вы пробовали с SoftwareSerial hc05(3,2);? 03.10.2020
  • Mega имеет 4 аппаратных последовательных порта. почему вы используете SoftwareSerial? не все пины Mega поддерживают SoftwareSerial 03.10.2020
  • Спасибо ребята. У меня был некоторый успех, но это вызвало много вопросов - см. Правка. 05.10.2020
  • RX - TX0 / TX - RX1 TX0? 06.10.2020
  • Привет @juraj, извини, я не мог просто описать. По сути, RX из HC05 в порт TX0 на Mega (он же D1) и т. Д. 06.10.2020

Ответы:


1

Хорошо, вот я и разобрался. (Не могу сказать, что полностью понимаю, но, возможно, это поможет людям в будущем.)

1. Невозможно подключиться к модулю

Спасибо @ukBaz за предложение подключиться к терминальному приложению на моем телефоне, это позволило мне в первую очередь отладить подключение к модулю. и @Juraj за предположение, что Mega использует аппаратный последовательный порт.

Serial1 на моей плате явно не работает, поэтому я использую Serial3. Я подключился к устройству с помощью телефона и смог отправлять команды между Serial и Serial3 со скоростью 9600 бод. Вот код, который я использовал:

void setup() {
  Serial.begin(9600); //open the serial port to PC
  Serial3.begin(9600); //open serial port to HC05. TX -> 15, RX -> 14
}

void loop() {
  if(Serial3.available()){
    Serial.print(Serial3.readString()); // send from serial to bluetooth
  }
  if(Serial.available()){
    Serial3.print(Serial.readString()); // send from bluetooth to serial
  }
}

Я подозреваю, что изначально использовал неправильные _6 _ / _ 7_ и _8 _ / _ 9 _ / _ 10_.

2. Невозможно отдавать команды модулю

Как только я заработал, я изменил скорость передачи данных на 38400 и привязал вывод STATE модуля к VCC (вместо использования кнопки). Загрузил код, отключил 5 В, снова подключил 5 В, сбросил Arduino.

В этот момент я мог послать AT модулю через Serial Monitor и получить обратно OK. Woohoo!

Думаю, теперь я понимаю, что @hlovdal предполагал, что я давал команду модулю и никогда не анализировал полученный мной ответ, так что он был .. забит, возможно? В любом слючае. Теперь я могу успешно отдавать команды и получать ответы от модуля.

Спасибо всем за вашу помощь.

10.10.2020

2

Есть некоторые проблемы с тем, как вы передаете на устройство командные строки AT. Например:

hc05.write("AT");
delay(1000);

Вы не отправляете AT-команду на модем, вы отправляете AT-команду строка, которая содержит ноль или более AT-команд, за которой следует команда символ завершения строки (всегда должен быть '\r', он же возврат каретки (или <CR>)).

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

Кроме того, вам никогда и никогда не следует использовать задержку вместо чтения и анализа ответов, которые модем отправляет обратно. Дополнительные сведения см. В этом ответе.

07.10.2020
  • Спасибо за ответ @hlovdal, я буду реализовывать это в своем коде. Я должен отметить, что я не ожидаю, что он что-то изменит, кроме как правильно сказать мне, подключен он или нет - когда я использую последовательный монитор для отправки AT, он все равно не будет отвечать, подключаюсь / читаю с 9600 или 38400 скорость передачи. Не могли бы вы объяснить простым языком (я новичок), почему мне не следует использовать задержку и что я могу сделать вместо этого? Я еще недостаточно способен понять ответ, который вы связали. 09.10.2020
  • Так же, как вы не пытаетесь написать веб-браузер, который отправляет HTTP-запрос на веб-сервер, но затем игнорирует любой ответ, который он отправляет обратно, вам не следует писать код, который отправляет AT-команды на модем, но затем игнорирует любой ответ, который он отправляет обратно. Когда модем завершает обработку командной строки AT (что может занять много-много секунд), он отправляет Final Result Code, чтобы указать, что это выполнено. После отправки командной строки ваш код никогда не должен снова отправлять что-либо на модем до получения окончательного кода результата. Вот почему вам нужно читать и разбирать ответы модема. 09.10.2020
  • OK. Итак, здесь я обновил свой цикл setup() до Serial3.write("AT\r");, а затем while ( !Serial3.available() );. Это моя лучшая попытка дождаться окончательного результата (?). Программа теперь навсегда остается в цикле while. 10.10.2020
  • См. это, это и этот ответ, который содержит описания необходимых шагов (и некоторые другие для некоторых ответов). 10.10.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..