Радиоуправление на Arduino с HC-12 (2 servo)
×

Радиоуправление на Arduino с HC-12 (2 servo)

Смотреть видео в Дзен

Настройка модулей НС-12

Для начала настроим оба модуля на нужную скорость обмена данными.

Собираем схему:

И загружаем скетч в плату:

#include <SoftwareSerial.h>
SoftwareSerial hc12(11, 10);

void setup()
{
  pinMode(7, OUTPUT);
  digitalWrite(7, LOW);
  Serial.begin(9600);
  hc12.begin(9600);
  hc12.print(F("AT+C001"));
  delay(100);
  digitalWrite(7, LOW);
}
void loop()
{
  if (Serial.available()) hc12.write(Serial.read());
  if (hc12.available()) Serial.write(hc12.read());
}

Далее заходим в Инструменты -> Монитор порта, внизу справа выбираем скорость обмена данными 9600 бод и отправляем команду AT+B57600.

В ответ должно прийти:

Такую операцию необходимо провести для обеих плат. Обратите внимание, что если в будущем Вы решите перенастроить плату, в скетче надо будет заменить строку hc12.begin(9600); на hc12.begin(57600);.

Подробнее обо всех настройках НС-12 написано в этой статье.

1) Управление одним серводвигателем

Нам понадобятся:

1) Arduino (UnoNano или Mega) (две штуки);

2) Серийный беспроводной микроконтроллер HC-12 (две штуки);

3) Любой серводвигатель для Arduino (у меня Tower Pro 9g SG90);

4) Любой потенциометр.

Схема подключения:

Скетч передатчика:

#include <SoftwareSerial.h>

SoftwareSerial HC12(11, 10); //выбор пинов для обмена данными (D11 - TX, D10 - RX)
int pin1 = A0; //пин для приема сигнала с потенциометра
byte arr[] = {0}; //массив, в котором будем отправлять данные

void setup() {
  HC12.begin(57600); //инициализация работы порта на скорости 57600 бод
  pinMode(pin1, INPUT); //привязка потенциометра к пину А0
}

void loop() {
  //чтение, масштабирование и запись в массив данных с пина А0
  arr[0] = map(analogRead(pin1), 0, 1023, 0, 180);

  HC12.write(arr, 1); //передача сигнала второму модулю
  delay(200); //пауза на 0.2 секунды для стабилизации
}

Скетч приемника:

#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial HC12(11, 10); //выбор пинов для обмена данными (D11 - TX, D10 - RX)
Servo servo; //задаем переменную типа Servo

byte arr[] = {0}; //массив для записи входящего сигнала

void setup() {
  HC12.begin(57600); //инициализируем работу порта на скорости 57600 бод
  servo.attach(3); //привязываем серводвигатель к пину 3
}

void loop() {
  HC12.readBytes(arr, 1); //принимаем сигнал и заполняем ячейку массива
  servo.write(arr[0]); //фиксируем вал серводвигателя под заданным углом
}

2) Управление двумя серводвигателями

Нам понадобятся:

1) Arduino (UnoNano или Mega) (две штуки);

2) Серийный беспроводной микроконтроллер HC-12 (две штуки);

3) Любой серводвигатель для Arduino (у меня Tower Pro 9g SG90) (две штуки);

4) Два потенциометра либо двухосевой джойстик.

Схема подключения:

Скетч передатчика:

#include <SoftwareSerial.h>

SoftwareSerial HC12(11, 10); //выбор пинов для обмена данными (D11 - TX, D10 - RX)
int pin1 = A0; //пин для приема сигнала с первого потенциометра
int pin2 = A1; //пин для приема сигнала со второго потенциометра
byte arr[] = {0, 0}; //массив, в котором будем отправлять данные

void setup() {
  HC12.begin(57600); //инициализация работы порта на скорости 57600 бод
  pinMode(pin1, INPUT); //настройка пина A0 на прием данных
  pinMode(pin2, INPUT); //настройка пина A1 на прием данных
}

void loop() {
  //чтение, масштабирование и запись в массив данных с пинов А0 и А1
  arr[0] = map(analogRead(pin1), 0, 1023, 0, 180);
  arr[1] = map(analogRead(pin2), 0, 1023, 0, 180);

  HC12.write(arr, 2); //передача сигнала другому модулю
  delay(200); //пауза на 0.2 секунды для стабилизации
}

Скетч приемника:

#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial HC12(11, 10); //выбор пинов для обмена данными (D11 - TX, D10 - RX)
Servo servo1, servo2; //задаем две переменные типа Servo

byte arr[] = {0, 0}; //массив для записи входящего сигнала

void setup() {
  HC12.begin(57600); //инициализируем работу порта на скорости 57600 бод
  servo1.attach(3); //привязка первого серводвигателя к пину 3
  servo2.attach(4); //привязка второго серводвигателя к пину 4
}

void loop() {
  HC12.readBytes(arr, 2); //принимаем сигнал и заполняем ячейки массива
  servo1.write(arr[0]); //фиксируем вал первого серводвигателя под заданным углом
  delay(10); //пауза на 0.01 секунды для стабилизации
  servo2.write(arr[1]); //фиксируем вал второго серводвигателя под заданным углом
  delay(10); //пауза на 0.01 секунды для стабилизации
}