Использование AVR с передатчиками радиоуправления

Использование AVR с передатчиками радиоуправления

Многие меня спрашивают, как без дорогих модулей использовать сигнал приемника радиоуправляемых моделей для своих целей, например, включения БАНО (Бортовые аэронавигационные огни) на модели самолета или подсветки на квадрокоптере. Я решил привести пример использования микроконтроллеров AVR для этих целей.

Для управления, к примеру БАНО, с выключателя передатчика я буду использовать небольшой модуль Digispark Attiny85. Памяти и архитектуры МК Аttiny85 будет достаточно для моей цели:

Вес такого модуля всего 1,8 граммов. Питание на модуль можно подать двумя способами:

  1. На борту платы установлен линейный регулятор напряжения LM7805 питание на регулятор приходит с пина VIN, поэтому можно подключить напрямую с аккумулятора до 35В, однако будьте внимательны, в некоторых моделях могут быть установлены другие регуляторы, поэтому сначала убедитесь в его модели и посмотрите максимальное входное напряжение по datasheet. Минимальное будет в частых случаях 5+1,25 = 6,25 В. Если будет ниже, регулятор будет занижать выходное напряжение. Допуски на изготовление могут быть разные, поэтому гарантировано при 7В на входе будет 5В на выходе.
  2. Подать питание 5В на P3 куда по умолчанию выведен плюс питания от порта USB.

Использовать выводы микроконтроллера для питания светодиодной ленты не правильно на выходе платы МК всего до 40мА, этого хватит на два светодиода. Поэтому необходимо использовать силовые ключи — MOSFET либо оптопару. Подбирать необходимо по вашим потребностям. Я к примеру нашел MOSFET с двумя n-каналами в одном корпусе IRF5852TRPBF.

Если совсем по фэн-шую, то необходимо подключить к аккумулятору линейный регулятор LM7812, от него подвести питание на светодиодную ленту и модуль Digispark Attiny85. Такое подключение обеспечит стабильность питание. Напомним, что мы используем N-канальный MOSFE, это значит, что мы замыкаем землю.

Чтобы подключить Digispark вам необходимо установить драйверы, ссылка для скачивания в конце статьи, внести ссылку репозитария в Arduino IDE и установить платы через менеджер плат. Полезное видео по установке драйверов и прошивки данной платы по ссылке после статьи.

В виду того, что у Digispark свой бутлоадер, подключиться к нему и проводить отладку через COM порт, в привычном понимании, не получится. Поэтому отладку скетчей лучше проводить через, к примеру, Arduino Uno. Далее на своем примере я покажу, как использовать команды для считывания данных с порта приемника и проводить преобразования на свое усмотрение.

Подключим приемник к плате Arduino Uno, питание 5В и землю берем с платы, сигнальный провод подключаем к порту 2. Выбор порта в приемнике зависит от ваших целей, я использовал порт 3 это стик газа на передатчике. Далее используем следующий код:

#define inPutPin1 2

unsigned long duration;

void setup() {
  Serial.begin(9600);
  pinMode(inPutPin1, INPUT);
}

void loop() {
  duration = pulseIn(inPutPin1, HIGH);
  Serial.println(duration);
  delay(1000);
}

Команда PulseIn будет считывать данные с порта каждую секунду по изменению входного сигнала, в нашем случае постоянно, я использовал задержку в секунду, чтобы в мониторе порта сделать скриншот:

На картинке значение 990 соответствует 0% положения стика газа, 1480 — 50%, 1965 — 100%. В зависимости от качества исполнения стиков аппаратуры значения будут колебаться в этих пределах с большей или меньшей точностью.

Теперь мы можем использовать собранные данные для дальнейшего использования.

Я использовал лазерный модуль, которым я буду управлять и подключил его к P1 платы Digispark. Сигнал с приемника буду снимать в P0.

И так получаем следующий код:

#define inPutPin1 0
#define outPutPin1 1
unsigned long duration;

void setup() {
  pinMode(inPutPin1, INPUT);
  pinMode(outPutPin1, OUTPUT);
  digitalWrite(outPutPin1, LOW);
}

void loop() {
  duration = pulseIn(inPutPin1, HIGH);
 
  if (duration > 1480) {
    digitalWrite(outPutPin1, HIGH);
  }
  if (duration < 1480) {
    digitalWrite(outPutPin1, LOW);
  }

}

Из кода следует, что если положение стика газа выше 50% мы включаем лазерный модуль, если ниже — выключаем:

Так как у нас P1 с ШИМ мы можем плавно регулировать яркость лазерного модуля, для этого нужно использовать следующий код:

#define inPutPin1 0
#define outPutPin1 1
unsigned long duration;

void setup() {
  pinMode(inPutPin1, INPUT);
  pinMode(outPutPin1, OUTPUT);
  digitalWrite(outPutPin1, LOW);
}

void loop() {
  duration = pulseIn(inPutPin1, HIGH);
 
  if (duration >= 1050) {
    duration = map(duration, 1050, 1965, 0, 255);
    analogWrite(outPutPin1, duration);
  }
  else {
    digitalWrite(outPutPin1, LOW);
  }
}

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

Примерно так выглядит схема использования двух сигналов и двух выводов для управления светодиодными приборами. Спустя время зайдя на сайт я увидел, что не хватает контакта земли в схеме. Земля соединяет минус аккумулятора и ноги №3 от мосфетов. Прошу учесть.

Опубликовано:07.06.2019monsoa
WP2Social Auto Publish Powered By : XYZScripts.com