Связь между Arduino на большие расстояния с помощью модулей HC-12


В этом уроке Arduino мы узнаем, как использовать модуль беспроводной последовательной связи большого радиуса действия HC-12, который способен обеспечивать беспроводную связь на большие расстояния между несколькими платами Arduino на расстоянии до 1,8 км. Мы рассмотрим два основных примера, объясняющих, как подключить модуль HC-12 и установить базовую связь между двумя Arduino, а также дополнительный пример, где с помощью датчика акселерометра на первом Arduino мы управляем по беспроводной сети положением шагового двигателя на второй плате Ардуино.

Связь между Arduino на большие расстояния с помощью модулей HC-12

Наглядно основы данного урока представлены в следующем видео, более подробная информация содержится в тексте статьи.

Также на нашем сайте мы рассматривали следующие способы беспроводной связи между платами Arduino:

Необходимые компоненты

  1. Плата Arduino Uno – 2 шт (купить на AliExpress).
  2. Модуль беспроводной связи HC-12 – 2 шт. (купить на AliExpress).
  3. Макетная плата.
  4. Соединительные провода.

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

Модуль беспроводной связи HC-12

Внешний вид модуля беспроводной связи HC-12

Сначала давайте подробнее рассмотрим модуль беспроводной связи HC-12. Вот его основные возможности:

  • Его беспроводной рабочий диапазон частот составляет от 433,4 МГц до 473,0 МГц.
  • Всего он имеет 100 каналов с шагом 400 кГц между каждым каналом.
  • Мощность передачи составляет от -1 дБм (0,79 мВт) до 20 дБм (100 мВт).
  • Чувствительность приема составляет от -117 дБм (0,019 пВт) до -100 дБм (10 пВт).

Эти значения фактически зависят от выбранной скорости последовательной и беспроводной передачи данных, как показано в следующей таблице.

Значения чувствительности модуля беспроводной связи HC-12 в зависимости от скорости передачи данных

Модуль HC-12 имеет микроконтроллер, который фактически не требует программирования пользователем. Для настройки модуля мы просто используем AT-команды, которые можно отправлять с Arduino, ПК или любого другого микроконтроллера через последовательный порт. Для входа в режим AT-команд нам просто нужно установить вывод «Set» модуля на низкий логический уровень.

Подключение модуля HC-12 к плате Ардуино 

Теперь подключим модуль HC-12 к Arduino и сделаем первый пример. Принципиальная схема этого подключения показана на следующем рисунке.

Схема подключения модуля HC-12 к плате Ардуино 

Рабочее напряжение модуля от 3,2 В до 5,5 В и для более стабильной работы рекомендуется использовать развязывающий конденсатор и внешний источник питания. Однако я использовал USB-порт ПК в качестве источника питания для всех трех примеров в этом уроке, и у меня не возникло с этим никаких проблем.

Я подключил первый модуль к Arduino UNO, а второй модуль к Arduino MEGA, но, конечно, вы можете использовать любую плату, какую захотите.

Код Arduino для примера №1

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

Один и тот же код используется для обоих плат Arduino. Мы можем подключить два Arduino к двум отдельным компьютерам, но также можем использовать один компьютер.

Структурная схема проекта для примера №1

В этом случае, как только мы подключим первый Arduino к компьютеру, нам нужно будет выбрать модель и COM-порт и загрузить код в Arduino. Затем мы подключаем второй Arduino, и нам нужно снова запустить Arduino IDE, чтобы иметь возможность выбрать другой COM-порт, к которому подключен наш второй Arduino, а затем загрузить тот же код.

Итак, как только у нас будут запущены две IDE Arduino, мы сможем запустить последовательные мониторы и проверить, работает ли связь правильно. Все, что мы вводим в последовательный монитор, будет отправлено с одной платы Arduino на другую.

Тестирование работы примера №1

Как работает код: Итак, как только мы введем что-то в последовательный монитор и нажмем кнопку Send («Отправить»), на первом Arduino цикл while с функцией Serial.available() станет истинным, и, используя функцию HC12.write(), мы отправим данные с последовательного монитора на модуль HC-12. Этот модуль будет передавать данные по беспроводной сети на второй модуль HC-12, поэтому на втором Arduino цикл while с функцией HC12.available() станет истинным, и с помощью функции Serial.write() данные будут отправлены на последовательный монитор.

Мы можем использовать один и тот же код для отправки AT-команд и настройки параметров модуля. Все, что нам нужно сделать, это подключить контакт «Set» модуля к земле или любому цифровому контакту Arduino и установить на этом контакте низкий логический уровень.

Установка на контакте «Set» модуля HC-12 низкого уровня

Чтобы проверить, успешно ли мы вошли в режим AT-команд, в последовательном мониторе мы можем ввести «AT» и получить ответное сообщение «ОК». Всего существует 12 AT-команд, и они используются для изменения различных параметров, таких как скорость передачи данных, канала, мощности передачи и т. д. Например, если мы наберем «AT+B38400», скорость передачи данных модуля будет установлена ​​на 38400.

АТ-команды:

1. AT – Тестовая команда.

Пример: Отправьте «AT» модулю, и модуль вернет «ОК».

2. AT+Bxxxx – изменение скорости передачи данных последовательного порта.

Доступные скорости передачи данных: 1200 бит/с, 2400 бит/с, 4800 бит/с, 9600 бит/с, 19200 бит/с, 38400 бит/с, 57600 бит/с и 115200 бит/с. По умолчанию: 9600 бит/с.

Пример: отправьте модулю «AT+B38400», и модуль вернет «OK+B19200».

3. AT+Cxxxx – изменить канал беспроводной связи с 001 на 100.

По умолчанию: канал 001, рабочая частота 433,4 МГц. Каждый следующий канал на 400 кГц выше.

Пример: если мы хотим настроить модуль на канал 006, нам нужно отправить модулю команду «AT+C006», и модуль вернет «OK+C006». Новая рабочая частота составит 435,4 МГц.

Пример №2

Теперь давайте переместим второй пример. Здесь мы воспользуемся двумя кнопками для выбора разных каналов связи и увидим другой метод хранения входящих данных.

Тестирование работы примера с выбором каналов на модуле HC-12

Примечание. Контакты «Set» обоих модулей HC-12 подключены к контактам номер 6 двух плат Arduino, а две кнопки на первом Arduino — к контактам 4 и 3.

Первый код Arduino:

Второй код Arduino:

Описание работы кодов

Итак, сначала нам нужно задать используемые контакты и установить для вывода «Set» высокий логический уровень, чтобы модуль работал в нормальном, прозрачном режиме (transparent mode). С помощью первого цикла while мы сохраняем входящие данные в строковую переменную, чтобы потом с ними было удобнее работать.

Входящие данные всегда поступают по одному байту, поэтому, например, если мы отправим строку «Test123» со второго Arduino, этот цикл while выполнит 7 итераций. На каждой итерации, используя функцию HC12.read(), мы будем читать каждый входящий байт или символ и добавлять его в строковую переменную с именем «readBuffer».

Состояние буфера на каждой итерации при передаче строки «Test123»

Далее давайте посмотрим, как мы можем изменить канал связи с помощью первой кнопки. Поэтому, если мы нажмем первую кнопку, используя функцию HC12.print(), мы отправим строку «AT+C001» на модуль HC-12 или на второй Arduino.

Когда эта строка будет получена на втором Arduino, мы переведем модуль HC-12 в режим AT-команд, а затем запишем в него ту же строку «AT+C001», которая установит модуль на канал связи номер один.

Мы используем следующий цикл while для вывода ответного сообщения от модуля HC-12 о том, был ли канал успешно изменен.

Вернувшись к первому Arduino, мы проделываем ту же процедуру отправки AT-команды на первый модуль HC-12. Таким же образом мы, нажав вторую кнопку, устанавливаем канал связи номер два. Таким образом, используя этот метод, мы можем в любой момент выбрать, с каким модулем HC-12 мы будем связываться.

В конце пользовательская функция checkATCommand() проверяет, является ли полученное сообщение AT-командой, проверяя, начинается ли строка с «AT». Если это так, модуль входит в режим AT-команд и выполняет команду.

Беспроводное управление шаговым двигателем с помощью акселерометра и модуля HC-12

Теперь давайте посмотрим на третий пример. Здесь мы контролируем положение шагового двигателя на второй плате Arduino, используя модуль акселерометра на первой плате Arduino.

Собранная конструкция проекта для примера №3

Необходимые компоненты

  1. Плата Arduino Uno – 2 шт (купить на AliExpress).
  2. Модуль беспроводной связи HC-12 – 2 шт. (купить на AliExpress).
  3. Драйвер шагового двигателя A4988 (купить на AliExpress).
  4. Шаговый двигатель NEMA 17 (купить на AliExpress).
  5. Плата GY-80 с акселерометром ADXL345 (купить на AliExpress).
  6. Макетная плата.
  7. Соединительные провода.

Схема для беспроводного управления шаговым двигателем с помощью акселерометра и модуля HC-12 представлена на следующем рисунке.

Схема для беспроводного управления шаговым двигателем с помощью акселерометра и модуля HC-12

У нас на сайте уже есть подробные руководства по подключению к плате Arduino акселерометра и шагового двигателя, поэтому в этом примере я объясню только часть кода для модуля HC-12.

Первая плата Arduino — код передатчика:

Вторая плата Arduino — код приемника:

Описание работы кодов

Итак, сначала мы определяем контакты и инициализируем модули в разделе настройки. Затем мы считываем значения осей X и Y акселерометра и сопоставляем их со значениями от 0 до 180 градусов. Значения, поступающие с акселерометра, иногда могут быть нестабильными или трясущимися, поэтому для сглаживания результата я использовал среднее значение ста показаний.

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

Здесь обратите внимание, что при отправке угла в модуль HC-12 я также отправляю символ «s» впереди и символ «e» после, что поможет мне при получении данных на второй плате Arduino.

На второй плате Arduino ждем, пока придет маркер начала «s», затем читаем значение угла до тех пор, пока не придет маркер конца «e». Таким образом мы уверены, что получим только значение угла.

Затем мы преобразуем значение в целое число и сопоставляем значение от 0 до 1600 шагов, что соответствует выбранному разрешению шестнадцати шагов в драйвере шагового двигателя A4988. Затем поворачиваем шаговый двигатель на текущий угол. Если вы не очень уверенно чувствуете себя в этих вопросах, то можете прочитать статью об управлении шаговым двигателем NEMA 17 с помощью Arduino и драйвера A4988, также более подробно можете узнать о принципах работы драйвера двигателя A4988.

Источник статьи

(Проголосуй первым!)
Загрузка...
2 488 просмотров

Комментарии

Связь между Arduino на большие расстояния с помощью модулей HC-12 — 6 комментариев

  1. Добрый вечер,возможно, что есть скетчи для передачи данных с одного модуля HC-12 на другой с АЦП,например, с платы (АЦП) MCP3421, можете Вы что то посоветовать?

    • Добрый. К сожалению я не в курсе данной проблематики. Советую спросить на deepseek.com, он наверняка знает

  2. Добрый вечер, команды if и while не повлияли на процесс передачи данных с одного модуля на другой. AT команды проверил, всё было правильно и только при отсоединении выводов SET модулей от GMD всё заработало. Спасибо за помощь.

  3. Попробовал передать данные с одного модуля на другой. Компьютер один. Порты установлены разные. Скорость передачи и канал одинаковые. При попытке отправить, например HELLO на мониторе, с которого отправляю появляется сообщение error. Что неправильно, ошибка?

    • Главная причина: несовпадение скорости обмена (Baud Rate)

      Самая частая причина — несоответствие скорости передачи данных между Arduino и модулем HC-12.
      - В примере из урока скорость установлена на 9600 бод.
      - Если ваши модули были ранее настроены на другую скорость (например, 38400 или 115200), они не будут понимать команды от Arduino.
      Решение: принудительно установить скорость 9600 через AT-команды

      Для каждого модуля HC-12 выполните следующие шаги:
      Подключите пин SET модуля к GND (земле) на Arduino. Это переведёт модуль в режим AT-команд.
      Загрузите в Arduino скетч, который работает с последовательным портом на скорости 9600 (как в примере №1 статьи).
      Откройте монитор порта (скорость 9600 бод) и отправьте команду:
      AT+B9600
      Модуль должен ответить: OK+B9600
      Отключите пин SET от GND (верните в обычный режим работы).
      Повторите эту процедуру для второго модуля.

      Вторая причина: разные каналы или мощность передачи
      Даже при одинаковой скорости модули должны работать на одном канале и желательно с одинаковой мощностью.
      Решение: синхронизировать канал и мощность
      В режиме AT (пин SET на GND) отправьте на обоих модулях следующие команды:
      AT+C001 — установить канал 001 (как в примере)
      AT+P8 — установить максимальную мощность (100 мВт)
      Каждая команда должна возвращать OK.

      Третья причина: ошибка в коде или логике работы
      Если вы писали свой код, а не использовали готовый из урока, проверьте следующее:
      У передатчика не должно быть ожидания ответа от модуля перед отправкой. Ошибка может возникать, если программа пытается прочитать то, чего нет.
      У приёмника обязательно должен быть такой фрагмент:
      if (HC12.available()) {
      Serial.write(HC12.read());
      }
      В мониторе порта приёмника должно появиться сообщение HELLO, а не в мониторе передатчика.

      Быстрая диагностика: проверка связи через AT-команды
      Это самый надёжный способ понять, работают ли модули друг с другом.
      Залейте в оба Arduino скетч из Примера №1 статьи.
      На одном модуле временно замкните пин SET на GND (режим AT).
      В мониторе порта этого Arduino введите:
      AT
      Если модуль отвечает OK — связь с ним есть.
      Затем введите:
      AT+RC
      Эта команда заставляет модуль передать тестовый сигнал второму модулю. Если второй модуль (в обычном режиме) его получит, его светодиод моргнёт, а на первом модуле появится подтверждение.

      Аппаратные проблемы (если ничего не помогает)
      Питание: HC-12 чувствителен к питанию. При передаче он потребляет до 100 мА. Попробуйте подключить внешнее питание 5В, а не полагаться только на USB Arduino.
      Подключение: Убедитесь, что TX Arduino соединён с RX модуля, а RX Arduino — с TX модуля.
      Два монитора порта: На одном компьютере открыто два окна монитора порта. Убедитесь, что в каждом выбран правильный COM-порт и скорость 9600 (после настройки).

      Итог: что сделать в первую очередь
      Переведите модули в режим AT (SET на GND).
      Отправьте команду AT+B9600 на оба модуля.
      Установите канал: AT+C001 и мощность: AT+P8.
      Отключите SET от GND.
      Залейте стандартный скетч из примера №1.
      Проверьте связь через AT+RC.
      С большой вероятностью проблема решится после синхронизации скорости обмена.

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

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