Последовательные протоколы

Последовательные протоколы Мультикоптеры

А что дальше?

А дальше приложение

Считывает коды с порта RS-232 и “дергает за ниточки” знакомой раковины

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

Что еще можно почитать

На сайте производителя вы найдете описание и документацию.

Crazybee f3

Этот контроллер предназначен для микроквадрокоптеров с приемником FlySky или FrSky. Создан по образцу полетного контроллера F3.

Eachine minicube (совместимый) flysky 2.4g ppm 8ch

На это устройство можно установить стопку приемников, монтажные отверстия имеют размер 20 на 20 миллиметров. Имеется встроенная пищалка. Имеется только один выход сигнала – PPM.

Ev1527

– является одним из самых популярных аппаратных кодеров/декодеров, используемых в различных радиоуправляемых устройствах (розетки, лампы, двери, ворота). Он интересен прежде всего тем, что использует очень простой метод кодирования информации, похожий на ШИМ, который заключается в кодировании нулей и единиц сигнала с различным соотношением между длительностью импульса и длительностью молчания:

Последовательные протоколы

Единичный бит кодируется последовательностью {3; 1}, т.е. сначала в течение 3 временных выборок выдается высокий уровень, затем – низкий. Нулевой бит имеет инверсию {1; 3}. – 1 высокий импульс и 3 низких импульса. Единица времени (импульс) EV1527 составляет 350 микросекунд. Кроме того, перед данными передается специальная преамбула формулы {1; 31}:

Последовательные протоколы

Приемник может определить, когда началась передача данных, и начать их прием. Реализация может поместить преамбулу в начало или конец посылки. Тот факт, что посылки с сообщениями отправляются много раз, не имеет большого значения, поскольку для повышения надежности посылки с сообщениями отправляются много раз. Этот протокол кодирует 8-битное двоичное число 10101010 следующим образом:

Последовательные протоколы

По умолчанию посылки V1527 имеют длину три байта (24 бита), но что ограничивает нас от использования любого размера по нашему желанию? В идеальной ситуации это было бы возможно, но в реальности слишком длинные сообщения не могут быть переданы этим методом из-за помех и отсутствия коррекции ошибок.

), поэтому я решил его реализовать. Существует множество вариаций таких протоколов, есть даже трехсостоятельные варианты, где бит помимо стандартных “0” и “1” может принимать третье значение “F” и называется

Но я реализовал только самый простой вариант – двоичный.

Happymodel f4 pro v3.0

Полетный контроллер со встроенным приемником FlySky. С помощью этого устройства можно собрать микро квадрокоптер. Поскольку эта плата 4-в-1 объединяет в себе полетный контроллер, плату распределения питания, приемник и регуляторы скорости, не требуется пайка или установка.

Технические характеристики

  • Протокол: AFHDS и AFHDS-2A с возможностью переключения
  • Каналы: 8 (AFHDS) или 14 (AFHDS-2A)
  • Дальность приема: 300 м
  • Функция FailSafe активируется при отключении питания.

Как и чем управлять

Обычные люди берут приемник, подключают к нему сервопривод и регулятор скорости, двигают рычажки на пульте управления и наслаждаются жизнью, не спрашивая о принципе работы и не вдаваясь в подробности. В нашем случае это не сработает. Первым заданием было посмотреть, как управляются сервоприводы.

Последовательные протоколы

Так, если мы хотим установить привод в крайнее левое положение, мы должны послать импульсы длительностью 0,9 мс с интервалом 20 мс, если в крайнее правое – длительность 2,1 мс, а интервал такой же, аналогично для средних положений. Было установлено, что регуляторы скорости управляются аналогично. Те, кто в теме, скажут вам, что это

Я купил сервомашинку в местном магазине и сделал для нее макетную плату – сервотестер ATtiny13. Затем я купил сервомашинку в местном магазине и сделал так называемый сервотестер с помощью макетной платы и ATtiny13. В итоге оказалось, что ШИМ не так прост, как я думал, но с подводными камнями.

Как видно из диаграммы выше, рабочий цикл составляет от 5% до 10% (в качестве крайних положений я возьму импульсы длительностью 1,0 мс и 2,0 мс) для 256-символьного ШИМ-счетчика ATtiny13 это соответствует значениям между 25 и 50.

Это предполагает, что для заполнения счетчика требуется 20 мс, но в действительности так не получается, потому что для частоты 9,6 МГц и делителя 1024 необходимо ограничить счетчик до 187 (TOR), в этом случае мы получим частоту 50,134 Гц. Для большинства сервомашинок не существует точных средств генерации опорной частоты, поэтому управляющий сигнал может быть немного переменным.

Если оставить счетчик TOR на 255, частота управляющего сигнала будет 36,76 Гц. Некоторые приводы будут работать (возможно, с глюками), но не все. Итак, теперь у нас есть 187-разрядный счетчик, для него 5-10% соответствует значениям от 10 до 20 – всего 10 значений, немного дискретных получится. Если надумаете поиграть с тактовой частотой и делителем, то вот сравнительная таблица для 8-битного ШИМ:

Последовательные протоколы
Последовательные протоколы

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

Передатчик

Радиочастотный модуль, или модуль радиочастот, представляет собой печатную плату с контактами для подключения питания, данных и сигналов управления. Рассмотрим передатчик HM-T868

image

Для припаивания антенны я использовал провод МГТФ диаметром 8,5 см со шлейфом длиной 1/4 волны. Плата имеет три контакта: GND (общий), DATA (данные), VCC (питание).

Передающая часть


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

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

Для фильтрации сигнала от шума я посылаю в десятом байте XOR всех предыдущих 9 байтов. Это помогло, но не сильно, я еще добавил проверку таймаута между байтами, если он превышен – весь пакет игнорируется и прием начинается заново в ожидании идентификационного байта.

Последовательные протоколы

Это контрольная сумма в левом нижнем углу. Используя компьютерные ползунки, я двигал рули на самолете! Отладив все, я задумал сделать пульт дистанционного управления и купил эти джойстики:

image

Но потом я кое-что вспомнил. Раньше я был поклонником всевозможных авиасимуляторов: “Ил-2 Штурмовик”, “Lock On”, “MSFSX”, “Ка-50 Черная акула” и других. У меня был джойстик Genius F-23, и я решил добавить его к описанному выше программному обеспечению для краулера. Я погуглил и нашел вот это

И все получилось! Я думаю, что гораздо круче летать с джойстиком, чем с пультом дистанционного управления, который содержит только маленький стик. На первой фотографии мы видим нетбук, джойстик, преобразователь FT232 и передатчик HM-T868 вместе.

Последовательные протоколы

Следующие контроллеры имеют возможность радиоуправления: PWM, PPM, SBush, DSM2, DSMX, SUMD

Опубликовано: 08.05.2022 13:11 Автор: rider / 2 комментария

Выбор оборудования для радиоуправления осложняется аббревиатурами, такими как PWM, PPM, SBUS и DSMX. Для радиоуправления используются различные протоколы и технологии. Наша следующая дискуссия будет посвящена их различиям и тому, как они помогают сделать управление более надежным и безопасным.

PWM

Наиболее распространенным выходным сигналом приемника является этот сигнал. Стандартный ШИМ-сигнал использовался для управления сервоприводами или ESC в радиоуправляемых самолетах до того, как квадрокоптеры получили широкое распространение. Эту технологию можно встретить и сегодня. Для мультикоптеров требуется как минимум 4-5 каналов (иногда больше). Количество проводов между приемником и полетным контроллером такое же.

Смотрите про коптеры:  Дистанционное управление светом: 3 способа реализации - пошаговое руководство

ШИМ является наиболее распространенным и обычно самым экономичным вариантом.

Последовательные протоколы

При изменении ширины импульса происходит изменение положения или скорости двигателя. Методы ШИМ основаны на изменении длительности импульса. Длительность импульсов варьируется от 1000 секунд до 2000 секунд.

PPM

Также известен как P PM или PPMSUM. При использовании PPM используется только один сигнальный кабель для нескольких каналов (обычно не более 8). Единственными необходимыми кабелями являются кабели заземления, питания и сигнальные кабели.

Последовательные протоколы

P PM-сигнал обычно представляет собой последовательность ШИМ-сигналов по одному и тому же кабелю, каждый с разной модуляцией. Каналы передаются один за другим в разное время. Несмотря на свою менее точную и менее помехоустойчивую природу, этот метод передачи поддерживается и широко используется большинством полетных контроллеров.

PCM

C M – основан на импульсной модуляции, данные похожи на PPM. Несмотря на это, сигнал PCM является цифровым (нули и единицы). Сигналы PCM способны обнаруживать ошибки при передаче и даже исправлять их. Несмотря на это, не все продукты поддерживают эту функцию.

Для цифро-аналогового преобразования P CM более надежен и менее подвержен помехам. Это делает аппаратуру радиоуправления более дорогой. В настоящее время тенденции развития аппаратуры радиоуправления сосредоточены на PPM.

Секвентальный протокол.

Последовательные приемники используют три провода для управления (земля, плюс, сигнал) в цифровом последовательном протоколе с передачей данных. Существует требование к последовательному порту на полетном контроллере. Он содержит последовательные протоколы, такие как SBUS, XBUS, MSP, IBUS и SUMD.

Приемник

HM-R868 внешне очень похож на соответствующий передатчик.

image

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

Приемник 8/18ch mini

Клон приемника FS-A8S. Помимо съемной антенны, он включает разъем для подключения проводов полетного контроллера.

Приемник flit10 2.4g 10ch

Мне кажется интересным этот приемник с дипольной антенной. К полетному контроллеру он подключается через специальный переходник. Существует проблема, если ваш полетный контроллер не имеет специального разъема.

Приемник flysky fs2a

Приемник имеет только четыре канала ШИМ. Сервокомпенсация – 3 контакта.

Идеально подходит для монокрыльев. Весит всего 0,9 г.

Вы можете установить более подходящую антенну, удалив небольшую антенну.

Приемник flysky fs-a8s 8ch 2v

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

В результате во второй версии больше нет никаких проблем, и на самом деле, она даже улучшила дело.

При использовании протокола iBus можно будет использовать до 18 каналов.

Есть FailSafe при работе на iBUS.

Приемник flysky fs-ia10b

Он имеет десять каналов вместо шести каналов на Flysky FS-IA6B. Для того чтобы пульт дистанционного управления видел все 10 каналов, ваше оборудование Flysky должно быть прошито на 10 каналов, если оно поставляется с приемником на 6 каналов.

Размеры: 47*33,1*14,7 и вес 19,3г.

Приемник flysky fs-ia6b

Поскольку он поставляется в комплекте с аппаратурой, это один из самых популярных приемников Flysky. 6-канальный приемник подходит для любого гоночного квадрокоптера, даже для планера и, возможно, даже для самолета. Существует также версия Flysky IA6. Их отличает друг от друга наличие iBus. Версия B имеет его, а версия simple – нет.

Сигналы можно принимать на расстоянии до 500 метров (в полевых условиях этот показатель достигает 1000 метров).

Кроме того, этот приемник имеет одну из лучших антенн (т.е. в линейке приемников FlySky), он имеет 2 разнонаправленные антенны. Они припаяны к плате.

Большой и тяжелый приемник делает его непригодным для микросборок

Приемник flysky fs-x14s

Несмотря на небольшие размеры и малый вес, он оснащен множеством антенн, которые, к сожалению, не являются съемными и обычно заключены в какой-либо корпус. Поддерживаются протоколы SBM, PPM и iBUS. Но самое главное – это дальность приема – от 500 до 1500 метров. Приемник протокола AFHDS 2A с самой большой дальностью приема.

Приемник flysky ia6

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

Приемник flysky irangex fli14

Он способен передавать RSSI по протоколу iBus. Кроме того, поддерживается 14 каналов и он имеет небольшой вес.

С помощью Betaflight данные RSSI можно отображать на экранном меню.

Идеальный передатчик видеосигнала для FPV-гонок.

Приемник flysky x6b 2.4g 6ch

Этот приемник можно прикрепить к стеку полетных контроллеров, но с одной стороны, так как сам приемник имеет только 2 отверстия.

Две антенны подключаются к приемнику с помощью разъема MCPX, поэтому при необходимости их можно заменить. Кроме того, этот приемник можно легко обновить (есть даже кнопка UPDATE).

Приемник flysky x8b

В этой модернизированной версии X6B улучшен корпус. Вес был уменьшен. Приемник имеет один выход для PPM и iBus. iBUS поддерживает 18 каналов по сравнению с 8 каналами в PPM. Также важно, чтобы ваше оборудование поддерживало 18 каналов (если они все вам нужны).

Приемник fs82 micro 2.4g 8ch

Также очень маленький приемник с поддержкой PPM и iBUS. Он имеет только 8 каналов через PPM и 10 каналов через iBUS, поэтому подходит только для квадрокоптеров или монопилотов с самолетами. Автоматическая функция FailSafe доступна при работе с протоколом iBUS.

К сожалению, он не имеет телеметрии.

Антенная припаяна.

Приемник fs-rx2a pro

Самый маленький и легкий приемник FlySky поддерживает AFHDS-2A. Он имеет:

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

Приемник fs-rx2a pro v1 2.4g

В целом, этот приемник похож на FS-RX2A, но с большим диапазоном приема. На антенне имеется разъем MCPX. Устройство работает по протоколу iBUS и питается от 5-20 В, поэтому его можно подключить к любой плате распределения питания (с батареями 1-4S).

Очень легкий приемник.

Приемник irangex fli14 mini

Почти такой же приемник, как и описанный выше, но с двумя антеннами и встроенным LNA-фильтром. Приемник может принимать сигналы на расстоянии 500 метров и имеет 14 каналов. На 14 канале все еще можно принимать RSSI. При весе 1,7 грамма этот приемник немного тяжелее.

Идеально подходит для гоночных квадрокоптеров.

Приемники flysky с протоколом afhds

В производстве больше нет приемников, работающих только по этому протоколу.

Это и были бенефициарии:

  • FLYSKY Pro Micro 2.4G 6CH;
  • 8CH Dual Antenna Mini Flysky TH9X.

Пример №1 — управляем светодиодами

. Вот пример реализации 4-канального радиореле: Передатчик последовательно передает 8 команд (4 из которых включают/выключают светодиоды) с промежутком 0,5 секунды между ними, а приемник принимает и включает/выключает имеющиеся у него светодиоды.

Схема приемника:
Последовательные протоколы
Для тестов я собрал его из подручных материалов на обрезке макетки:
Последовательные протоколы
Последовательные протоколы
Для увеличения дальности следует припаять к приемнику обрезок провода длиной 17.3 см. Скомпилированный с оптимизацией по размеру пример приемника занимает 636 байт (62% памяти микроконтроллера), причем довольно много весит сама логика проверки сообщений. Тем не менее, еще остается достаточно места на добавление каких-либо действий.Схема передатчика:
Последовательные протоколы
В качестве антенны — такой же кусок провода:
Последовательные протоколы
Последовательные протоколы
Пример работы:
Последовательные протоколы
Передатчик весит заметно скромнее — всего 286 байт (28%), что дает пространство для маневра и добавления целой кучи своей логики. Дальность уверенной связи — около 20 метров по прямой или в пределах одной комнаты, в первую очередь из-за шумности приемника. Кроме того, как выяснилось, приемник работает нормально только в узком диапазоне напряжений питания (4-5В), в остальных случаях безбожно шумит и не может обеспечить нормальный сигнал на выходе даже при передаче «в упор».

Одним из совместимых микроконтроллеров ATtiny85 является ATtiny85, который находится на плате Arduino Digispark, микроконтроллер из серии ATtiny. Благодаря этому эксперименты очень просты, поскольку вы можете просто прошить его через Arduino IDE, а не использовать какое-либо программное обеспечение для программирования.

Смотрите про коптеры:  Робототехнологические комплексы в сварочном производстве

Я перенес пример мигания светодиодов в скетч Digispark с той разницей, что вместо управления 4 внешними светодиодами, он включает только один светодиод, встроенный в Digispark (висящий на пине PB1). Стоит отметить, что в скетчах не нужно указывать частоту в F_CPU, так как Arduino IDE сама подставляет ее во время компиляции.

Схема приемника и передатчика:
Последовательные протоколы
Пример работы:
Последовательные протоколы
В приведенном примере представлен простой и немного избыточный, но действенный способ проверки целостности коротких сообщений. Фактически размер команды — 1 байт, вторым байтом в сообщении отправляется инвертированное значение первого:

{ 11, (uint8_t) ~11 }

Приемник предварительно проверяет полученную команду на корректность, сравнивая ее с аналогичной командой:

if (data_buffer[0] == (uint8_t)(~data_buffer[1])) {...}

При ошибках приема равенство не проверяется и команда игнорируется. Он достаточно надежен, я тестировал его и не встречал ложных срабатываний после нескольких дней непрерывной работы, но в реальных сценариях ответственного использования имеет смысл добавить дополнительные проверки к защите.

Пример №2 — приемник и передатчик в одном флаконе

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

Схемы:.

Последовательные протоколы

В целом, скомпилированный код занимает всего 576 байт (56% памяти ATtiny13), что значительно меньше, чем в примере управления светодиодами. Как вы можете догадаться, с помощью этого повторителя можно увеличить дальность действия предыдущего примера, если поместить его между приемником и передатчиком (предварительно уменьшив время задержки до 250-500 мс).

Версия для Digispark:
Последовательные протоколы
Чтобы сделать пример более осязаемым предлагаю на примере скетча для Digispark немного видоизменить код повторителя, сделав из него «инвертор»: при получении команды на включение светодиода (11, 22, 33, 44) он будет с задержкой 250 мс передавать в эфир обратную ей команду на выключение (55, 66, 77, 88):

#define TRF_RX_PIN          PB0 // Приемник на PB0
#define TRF_TX_PIN          PB1 // Передатчик на PB1
#define TRF_DATA_SIZE       2   // 2-байтовая команда

#include "tinyrf.h"
#include <util/delay.h>

// Команды включения
byte commands[4] = {11, 22, 33, 44};
// Обратные команды выключения
byte inv_commands[4][TRF_DATA_SIZE] = {
  { 55, (byte) ~55 },
  { 66, (byte) ~66 },
  { 77, (byte) ~77 },
  { 88, (byte) ~88 }
};

void setup() {
  trf_init();
}

void loop() {
  // Получена новая команда
  if (trf_has_received_data()) {
    // Извлекаем данные
    byte data[TRF_DATA_SIZE];
    trf_get_received_data(data);

    // Проверяем корректность
    if (data[0] == (byte)(~data[1])) {
      // Ищем обратную команду и отправляем
      for (byte i = 0; i < 4; i  ) {
        if (commands[i] == data[0]) {
          _delay_ms(250);
          trf_send(inv_commands[i]);
        }
      }
    }

    // Разрешаем прием следующей команды
    trf_reset_received();
  }
}

И если раньше переключение светодиодов происходило так:
Последовательные протоколы
То со включенным находящимся рядом «инвертирующим повторителем» оно происходит так:
Последовательные протоколы
Т.е. повторитель принимает «включающие» команды одновременно с основным приемником и с небольшой задержкой перебивает их своими «выключающими».

Примеры использования

От теоретических примеров предлагаю перейти к практическим. Прежде всего, помимо микроконтроллеров нам нужны передатчики и приемники, я взял самые дешевые на 433,92 МГц:

Последовательные протоколы

Вы можете купить пару за раз

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

Программная реализация

Кодирование/декодирование легко реализовать программно, поскольку его примитивная природа занимает мало места для реализации. Он настолько мал, что код передатчика и приемника может поместиться на ATtiny13 с 1024 байтами памяти, и у вас еще останется место для полезной работы (!). Вместо того чтобы подробно описывать код, я кратко изложу его, поскольку он хорошо документирован и довольно короткий. Исходные тексты и примеры доступны

И распространяется под лицензией MIT. Как вы можете догадаться, вся библиотека представляет собой всего один заголовочный файл

Процесс отправки и приема сообщений завязан на аппаратный таймер (ATtiny13 имеет только один таймер), расчет настроек таймера производится во время компиляции с учетом тактовой частоты микроконтроллера, поэтому в проекте должна быть объявлена директива F_CPU с указанием тактовой частоты в герцах (например, 1.

Таймер (а точнее тактовый генератор) у ATtiny может быть очень кривым, поэтому при каких-либо проблемах с приемом/передачей в первую очередь необходимо попробовать подкрутить F_CPU, а в идеале — откалибровать генератор. С этим я столкнулся, когда проверял правильность отсчета времени таймером. Так по мнению ATtiny13, работающего на частоте 4.8МГц, выглядит меандр с шириной импульса 350 микросекунд:
Последовательные протоколы
Поначалу я грешил на вычислительные затраты, но при понижении до частоты 1.2 МГц ситуация наоборот улучшилась:
Последовательные протоколы
Разгадка оказалась проста — у многих версий ATtiny13 внутри стоят 2 разных тактовых генератора: на 9.6 МГц и 4.8 МГц, причем первый более-менее откалиброван с завода, а второй — как получится. Частоты 1.2 МГц и 0.6 МГц соответственно получаются с помощью деления на 8, поэтому погрешности сохраняются. Тем не менее, как показали эксперименты, разница в 50мкс оказалась несущественной, поэтому прием/передача практически всегда работают нормально без лишних калибровок и настроек.

Обобщенный пример передачи сообщений :

// Шаг 1: задаем параметры

#define F_CPU           1200000UL   // Тактовая частота МК в Гц
#define TRF_TX_PIN      PB1         // Пин, к которому подключен передатчик (если не указано - используется PB0)
#define TRF_DATA_SIZE   2           // Размер сообщения в байтах (если не указано - используются 3 байта)
#define TRF_RX_DISABLED             // Исключить код приемника для экономии места

// Шаг 2: подключаем библиотеку

#include "tinyrf.h"

// Шаг 3: вызываем инициализацию
// Если ваш код не меняет настройки прерываний и таймера, то вызвать инициализацию можно один раз при запуске
// иначе следует вызывать инициализацию каждый раз перед тем, как хотим отправить сообщение

trf_init();

// Шаг 4: готовим сообщение и отправляем его

uint8_t message[TRF_DATA_SIZE] = { 123, 234 };
trf_send(message);

Пример общего приёма сообщения:

// Шаг 1: задаем параметры

#define F_CPU           1200000UL   // Тактовая частота МК в Гц
#define TRF_RX_PIN      PB0         // Пин, к которому подключен приемник (если не указано - используется PB1)
#define TRF_DATA_SIZE   2           // Размер сообщения в байтах (если не указано - используются 3 байта)
#define TRF_TX_DISABLED             // Исключить код передатчика для экономии места

// Шаг 2: подключаем библиотеку

#include "tinyrf.h"

// Шаг 3: вызываем инициализацию
// Если ваш код не меняет настройки прерываний и таймера, то вызвать инициализацию можно один раз при запуске
// иначе следует вызывать инициализацию каждый раз перед тем, как хотим начать принимать сообщения

trf_init();

// Шаг 4: проверка наличия нового сообщения

if (trf_has_received_data()) {

    // Шаг 5: подготовка буфера и чтение в него сообщения

    uint8_t data_buffer[TRF_DATA_SIZE];
    trf_get_received_data(data_buffer);

    // Шаг 6: проверка корректности полученного сообщения и выполнение требуемых действий
    if (data_buffer[0] == 123 && data_buffer[1] == 234) {
        ...
    }

    // Шаг 7: сброс флага наличия сообщения для приема следующего

    trf_reset_received();
}

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

Пуск!

.итак, вот самолет и радиоуправление – поехали! (c) Первый полет над асфальтом привел к повреждению фюзеляжа и разрушению двигателя. Второй полет был совершен над более мягкой поверхностью:

В последующих 10 полетах он также был не очень успешным. Я считаю, что основная причина в том, что джойстик давал только 16 значений крена (вместо возможных 256), в то время как тангаж не давал никаких улучшений. Однако в результате испытаний самолет получил значительные повреждения и не подлежит ремонту:

Последовательные протоколы

Работа

Согласно документации, рабочее напряжение составляет 2,5-5 В, чем выше напряжение, тем шире диапазон. По сути, это радиоудлинитель: когда напряжение подается на вход DATA передатчика, напряжение появляется и на выходе DATA приемника (при условии, что напряжение также подано на ENABLE).

B UT есть несколько нюансов. Во-первых, это скорость передачи данных (600-4800 бит/с для нашего случая). Второе: если на входе DATA нет сигнала дольше 70 мс, передатчик переходит в спящий режим (по сути, выключается). Третье: если в зоне приема приемника нет работающего передатчика, то на его выходе появляются всевозможные шумы.

Проведем небольшой эксперимент: к контактам GND и VCC трансмиттера подключим питание. Вывод DATA соединим с VCC через кнопку или джампер. К контактам GND и VCC ресивера также подключаем питание, ENABLE и VCC замыкаем между собой. К выходу DATA подключаем светодиод (крайне желательно через резистор). В качестве антенн используем любой подходящий провод длинной в 1/4 длинны волны. Должна получиться такая схемка:
Последовательные протоколы
Сразу после включения приемника и/или подачи напряжения на ENABLE должен загореться светодиод и гореть непрерывно (ну или почти непрерывно). После нажатии кнопки на передатчике, со светодиодом также ничего не происходит — он продолжает гореть и дальше. При отпускании кнопки светодиод мигнет(погаснет и снова загорится) и продолжает гореть дальше. При повторном нажатии и отпускании кнопки все должно повторится. Что же там происходило? Во время включения приемника, передатчик находился в спящем состоянии, приемник не нашел нормального сигнала и стал принимать всякий шум, соответственно и на выходе появилась всякая бяка. На глаз отличить непрерывный сигнал от шума нереально, и кажется, что светодиод светит непрерывно. После нажатия кнопки трансмиттер выходит из спячки и начинает передачу, на выходе ресивера появляется логическая «1» и светодиод светит уже действительно непрерывно. После отпускания кнопки передатчик передает логический «0», который принимается приемником и на его выходе также возникает «0» — светодиод, наконец, гаснет. Но спустя 70мс передатчик видит что на его входе все тот же «0» и уходит в сон, генератор несущей частоты отключается и приемник начинает принимать всякие шумы, на выходе шум — светодиод опять загорается.

Смотрите про коптеры:  Сварочный робот: особенности и сфера применения

Из вышесказанного следует, что если на входе передатчика отсутствует сигнал менее 70 мс и он находится в нужном частотном диапазоне, модули будут вести себя как обычный провод (мы не обращаем внимание на помехи и другие сигналы).

Реализация в железе

Теперь, когда мы разобрались с теорией, мы готовы к ее реализации. Эта система работает на кристалле с частотой 16 МГц, тактируемом микроконтроллером ATmega8A (хотя мне на самом деле не нужно было 16000 позиций сервоприводов, но у меня были некоторые из них). MCU получает сигналы управления через UART. В результате получилась вот такая схема:

Последовательные протоколы

Со временем появилась такая шаль:

Последовательные протоколы

Два трехконтактных разъема я не паял, потому что они мне не нужны, и не подряд они припаяны, потому что у меня нет отверстий для металлизации, а в нижней дорожке разъема с обеих сторон можно было бы заменить провод, но программа без проблем выводит сигнал на любой разъем. Кроме того, мой мотор-регулятор имеет встроенный стабилизатор (VES) и поэтому лишен 78L05.

Для извлечения данных плата подключается к

HM-R868:

Последовательные протоколы

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

Плата обошлась примерно в 20грн = $2.50, приемник — 30грн = $3,75.

Результат

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

Скетч для arduino

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

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


byte a = 0;				// Текущий уровень на входе
byte b = 0;				// Сохраненный уровень на входе
byte bc = 0;				// Счетчик битов

const boolean dbg=false;		// Режим отладки =)

boolean start=false;			// Запущен ли отсчет импульсов
unsigned int usecs = 0;			// Таймер 1 - определяет длительность фронтов
unsigned int usecs2 = 0;		// Таймер 2 - определяет паузы между посылками
unsigned int plen = 0;			// Длительность интервала между фронтами
unsigned int plen2 = 0;			// Длительность паузы между посылками
String bits;				// Представление буфера в виде единиц и нулей, для отладки
unsigned int buffer;			// Буфер. Собственно, сюда помещается код нажатой кнопки


void setup() 
{
  // Initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards
  
  pinMode(13, OUTPUT);			// Ок, пусть светодиод там и будет.
  pinMode(12, OUTPUT);			// А пин 12 будет подключаться к разъему кнопки питания на мат.плате.
  digitalWrite(13,HIGH);		// Включаем светодиод.
  digitalWrite(12,HIGH);		// Настраиваем на выходе высокий уровень, чтобы плата считала что контакт разомкнут.
  pinMode(7, INPUT);			// Сюда подаем сигнал от ИК-приемника TSOP.

  Serial.begin(115200);
  Serial.println("READY");
  
  usecs = micros();			// Инициализируем индусский таймер
  usecs2 = micros();
}
 
void loop()
{

  a = digitalRead(7);			// Считываем значение уровня на входе

  if(a != b) {				// Уровень изменился! Фронт импульса.
	
    start=true;				// Отсчет импульсов считаем начатым.
    b = a;				// Сбрасываем детектор фронта
    plen = micros() - usecs;		// Замеряем прошедшее время между предыдущим и текущим фронтом
    usecs = micros();			// Сбрасываем таймер
    usecs2 = micros();

    if (plen<2000) {			// фильтруем стартовый импульс и длительность между импульсами
      if (plen>200 && plen < 620) {	// ноль
        bits  = "0";
        buffer = buffer << 1;
        buffer = buffer | 0;
        bc  ;
      }
      if (plen>620 && plen < 1150) {	// единица
        bits  = "1";
        buffer = buffer << 1;
        buffer = buffer | 1;
        bc  ;
      }
      if (plen>1150 && plen < 1600) {	// тоггл-бит
        bits  = "01";
        buffer = buffer << 2;		// Тут сдвигаем на два бита!
        buffer = buffer | 1;
        bc  ;
        bc  ;
      }


      if(dbg==true){ 
        Serial.print(plen);		// если включена отладка - выводим длительности импульсов
        Serial.print(";");
      }
    }

  } else {				// Если в этом цикле изменения уровня на входе не произошло
    plen2 = micros() - usecs2;		// Определяем длительность паузы

    if(plen2 > 5000 ) {			// ЕСЛИ ПАУЗА БОЛЬШЕ 5 МИЛЛИСЕКУНД, ЭТО ЗНАЧИТ ЧТО ПОСЫЛКА ЗАКОНЧИЛАСЬ ИЛИ ЕЩЕ НЕ НАЧИНАЛАСЬ

      usecs2 = micros();		// сбрасываем Таймер 2

      if(start==true){			// Если до этого был запущен отсчет импульсов, значит у нас в буфере должен был скопиться код клавиши.

        usecs = micros();		// сбрасываем таймер 1
        while(bc<40){			// выравниваем вывод. честно говоря, я уже не помню почему так сделал, но раз сделал - значит так надо.
          bits  = "0";
          buffer = buffer << 1;
          bc  ;
        }
        
        buffer = buffer & 1048575;	// Использование magic-numbers плохо влияет на карму. Это маска для toggle-бита.
        
        Serial.println(buffer);		// ВЫВОДИМ КОД!

	
        if (dbg){			// если включена отладка
          Serial.print("bits=");	// выводим код в виде единиц и нулей
          Serial.println(bc);		// выводим число битов
        }

        digitalWrite(13,LOW);		// Мигаем светодиодом в знак того,
        delay(100);			// что код от пульта был
        digitalWrite(13,HIGH);		// принят и распознан.
        

        switch(buffer){			// Прочие действия при нажатии некоторых кнопок.
          case 8448:			// Кнопка Power на моём пульте.
            Serial.println("POWER");	// Выводим сообщение POWER помимо кода кнопки. Удобно при разборе логов EventGhost.
            digitalWrite(12,LOW);	// Прижимаем к земле пин кнопки питания на мат.плате
            delay(300);			// На 300мс
            digitalWrite(12,HIGH);	// И отпускаем
          default:
          break;
        }
        
        buffer=0;			// Обнуляем буффер
        bits="";			// Обнуляем отладочную строку с битами
        start=false;			// Сбрасываем признак отсчета
        bc=0;				// Сбрасываем количество бит
      }
    }
  }
  
}

Технические характеристики

  • Название: iRangeX Fli14;
  • Каналы: 14. На 14 RSSI каналов;
  • Рабочие частоты: 2.4G, автонастройка;
  • Протокол 2.4GHz: AFHDS 2A;
  • Выход сигнала: IBUS;
  • Длина антенны: 70 мм, 2 антенны;
  • Входное напряжение: 4,0-6. 5 В (подключение только к полетному контроллеру в соответствующих точках питания);
  • Дальность: >500 м;
  • Размер: 19,5 мм * 12 мм * 5 мм
  • Вес: 1,7 г;
  • Совместимость: FS-i4, FS-i6, FS-I6X ,FS-i6S, FS-i10, FS-iT4S, Eachine I6, Turnigy I6S, Turnigy Evolution.

Типы модулей

R F-модули передают данные, используя УКВ-диапазон и стандартные частоты 433 МГц, 868 МГц или 2,4 ГГц (реже 315 МГц, 450 МГц, 490 МГц или 915 МГц). С увеличением несущей частоты увеличивается и скорость передачи данных.

Большинство производимых RF-модулей поддерживают тот или иной протокол передачи данных. Чаще всего это интерфейс UART (RS-232) или SPI. Обычно использование UART-модуля дешевле, и это позволяет использовать нестандартные (пользовательские) протоколы связи. Сначала я думал придумать что-то вроде

Учитывая мой горький опыт изготовления аппаратуры радиоуправления, я выбрал дешевые HM-T868 и HM-R868 (60грн. = менее $8 комплект). Помимо указанных ниже моделей, существуют также варианты HM-*315 и HM-*433, которые отличаются только несущими частотами (315 МГц и 433 МГц).

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector