Вторник, 19.03.2024, 11:30
RC - Мастерская
Главная | Каталог статей | Регистрация | Вход
Меню
Статистика
Главная » Статьи » Обмен опытом » Начинающему моделисту

Пульт радиоуправления. Внутреннее устройство.
Пульт радиоуправления. Внутреннее устройство.

В общем случае все пульты управления моделями устроены примерно одинаково. Различия касаются в основном того, что называется "фичами" - различные дополнительные функции, повышающие эргономичность. Фактически любой пульт управления состоит из двух основных частей, неразрывно связанных между собой. Это собственно "железо" (электронная начинка) и программное обеспечение (прошивка микроконтроллера).
Электронную начинку пульта можно представить в виде следующей блок-схемы:

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

Крайние контакты подключаются к источнику напряжения(батарее питания), а подвижный контакт подключается ко входу АЦП микроконтроллера - схема слева. Таким образом в каждый момент времени эту схему можно привести к правому варианту. Здесь значения R1 и R2 определяются положением подвижного контакта и в сумме составляют номинал резистора. Таким образом уровень напряжения на входе микроконтроллера можно посчитать по следующей формуле: U = VCC * R2 / (R1 + R2).
Использование переменных резисторов обусловлено их низкой ценой и простотой установки. Но у них есть один существенный недостаток - ввиду трения подвижного контакта они очень быстро изнашиваются. 90% отказов пультов связано именно с этим фактором. Некоторые производители в своих топовых моделях устанавливают бесконтактные датчики. Например, датчики Холла. Они выходе выдают уровень напряжения, пропорциональный величине магнитного поля, действующего на датчик. Магнит при этом закрепляется на подвижной оси.
Так Jeti предлагает к своим пультам джойстики на таких датчиках в виде опционального апгрейда. Правда стоит заметить, что цена одного джойстика в три раза превосходит цену популярного китайского пульта целиком.
К цифровым органам управления относятся всевозможные тумблеры, кнопки, переключатели и триммеры. Это, как правило, устройство замыкающее пару контактов между собой с фиксацией положения или без, включенное по следующей схеме к цифровому входу микроконтроллера:

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

Устройством отображения информации обычно является жидкокристаллический дисплей. На него выводится информация о текущих настройках, о текущем состоянии пульта, телеметрия с модели и различные программные диалоги.
Так же в пульте могут присутствовать дополнительные устройства ввода/вывода. Например, блок речевого синтезатора для голосового информирования пользователя о каких-либо важных изменениях в пульте или модели, SD-карта памяти для хранения настроек и записи логов, USB интерфейс для подключения к ПК.

Но устройства вывода и отображения могут и отсутствовать в пульте. А вот вч-модуль является его неотъемлемой частью. Он отвечает за обмен данными с моделью по радиоканалу. Правда, надо уточнить, что модуль может быть и съемным. Но пульт без модуля не сможет выполнить свою главную функцию - передать управляющие сигналы на модель. Без него он становится "глухонемым".
Для большинства пультов управления фактическим стандартом передачи данных с пульта в вч-модуль стал суммарный PPM-сигнал. Однако, если вч-модуль является встроенным, то данные на приемник могут передаваться напрямую с микроконтроллера в цифровом виде минуя ppm-кодирование.

Программа микроконтроллера (прошивка).

Условно ее можно разделить так же на две части:
1. основная часть - составление и передача управляющих сигналов;
2. дополнительные сервисные функции - меню настроек, управление списком моделей и прочее.

На второй части я останавливаться не буду, потому как она сугубо индивидуальна для каждой прошивки. А вот в первой части уже сложилась некоторая стандартная последовательность операций, которую можно описать следующей блок-схемой:

Этот алгоритм выполняется циклически с достаточно большой частотой, что обеспечивает практически мгновенную реакцию модели на действия человека, ей управляющего.
А суть его такова:
Первым делом необходимо получить данные с органов управления. С цифровыми все понятно - бинарный сигнал не оставляет вариантов для творчества. Мы получим либо 0, либо 1 с каждого органа. А вот с аналоговыми все гораздо интереснее. Тут мы получим число, характеризующее положение подвижного контакта (ручки) резистора относительно его нулевого положения. Но сам резистор может иметь погрешность. К этой добавляется погрешность установки резистора в джойстике и другие... В итоге нулевое и максимальное положение резистора на выходе АЦП дадут совсем не ноль и максимум, а какие-то близкие к ним(или не очень близкие) значения. Для того, чтобы их правильно дальше использовать, их надо привести к заданному диапазону значений. Сделать это достаточно легко при помощи математической пропорции. Но для этого нам понадобятся калибровочные значения - значения АЦП, соответствующие минимальному и максимальному положению каждого аналогового органа управления. Кстати, именно поэтому каждый новый или только что отремонтированный(перепрошитый) пульт необходимо калибровать. Процесс калибровки как раз и заключается в получении этих значений и запись их в память пульта. Новые пульты обычно калибруются на заводе производителем, но тут уже вопрос Вашего доверия к этому самому производителю. Мой совет: если у Вас появился новый пульт(неважно откуда и абсолютно он новый или б/у) - первым делом откалибруйте его.
Дальше наступает очередь микширования. Для каждой модели обычно настраиваются свои микшеры. Простейшим микшером является триммер - сдвиг полученного значения для оси джойстика на некоторую константу в одну или другую сторону. На самом деле микшеры могут быть самыми разными, но все они описываются математической формулой: y[] = f(x[]) - массив выходных значений есть некоторая функция(или набор функций) от массива значений с органов управления.
Следующий этап - преобразование массива y к значениям канальных импульсов. Обычно он выражается в приведении к заданному диапазону значений. После этого готовый массив значений канальных импульсов передается вч-модулю для отправки на модель.

Для примера сделаем электронную начинку 4-х канального пропорционального пульта управления. Джойстики возьмем от Турниги 9XR. Цифровыми органами управления пренебрежем. Подключаем каждый из четырех резисторов джойстиков по выше указанной схеме. При этом у Arduino задействуем контакты A0-A3. Эти контакты подключены к АЦП микроконтроллера и могут быть запрограммированы как аналоговые входы. Более менее подробно о программировании аналоговых входов я писал тут. Повторяться не буду.

Пишем прошивку. Я предумышленно разбил код на три файла:

TX.ino – основной файл. Он содержит главные точки входа – функции setup() и loop().

Config.h – в этом файле в дефайнсах определяется подключение периферии

Analog.ino - собственно код работы с АЦП.

Принцип простой. Настраиваем регистры микроконтроллера так, чтобы АЦП непрерывно выполнял преобразования. По завершении каждого преобразования срабатывает прерывание ISR(ADC_vect) и выполняется соответствующий код. Нам остается только переключать входы к АЦП и запоминать результат в массиве. Время на одно преобразование порядка 26мкс. Если Вы внимательно посмотрите на мой код, то заметите, что я беру результат каждого второго преобразования. Все дело в том, что АЦП работает независимо от центрального ядра. Пока выполняется код в прерывании и переключаются входы АЦП уже делает следующее преобразование. Как следствие – недостоверный результат. Поэтому я и беру каждое второе… В итоге получим массив из четырех элементов, значения которых должны изменяться пропорционально движению джойстиков в интервале от 0 до 1023. Вот архив (TX1.rar) с кодом примера.

Формируем выходной сигнал

Теперь нам надо сформировать массив канальных импульсов. Сделаем для этого такую функцию:

void UpdateChannels()

{

for (uint8_t i = 0; i<CHANNELS_COUNT; i++)

{

Channels[i] = map(AnalogValues[i], 0, 1023, 1000, 2000);

}

}

Здесь мы заполняем массив значений каналов попутно приводя полученные с АЦП значения к интервалу 1000-2000мкс. Это будут наши канальные импульсы. Осталось по этому массиву сформировать выходной сигнал. Для этого воспользуемся таймером.

У 168-ой /328-ой меги есть три таймера/счетчика, работающих от основного задающего генератора. Два из них имеют разрядность 16 и один – 8. Будем использовать один из 16-ти разрядных таймеров.

Сначала его надо настроить. Во-первых при частоте 16МГц установим делитель на 8, чтоб таймер отсчитывал половинки микросекунд:

TCCR1B |= (1<<CS11);

Каждый из таймеров имеет два компаратора и может генерить прерывания по совпадению значений. Разрешим эти прерывания для нашего таймера:

TIMSK1 = (1<<OCIE1A) | (1<<OCIE1B);

Компаратор А настроим на длину фрейма – 20мс

OCR1A = 40000;

Компаратор В будем использовать для формирования канальных импульсов.

Выводить импульсы будем на 13-й вывод Arduino.

В прерывании компаратора А напишем код инициализации нового канального фрейма:

ISR (TIMER1_COMPA_vect)

{

ppm_cur = 0;

OCR1B = PPM_PAUSE;

TCNT1 = 0;

PPM_on;

}

Фрейм начинается с паузы. Ее длину мы и запишем в соответствующий регистр компаратора В.

В прерывании компаратора В будет следующий код:

ISR (TIMER1_COMPB_vect)

{

if (PPM_0){

PPM_off;

OCR1B = TCNT1 + PPM_PAUSE;

ppm_cur++;

}

else {

PPM_on;

if(ppm_cur <= CHANNELS_COUNT)

OCR1B = TCNT1 + (Channels[ppm_cur-1]<<1);

else {

OCR1B = 0;

}

}

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

Если на выходе была пауза, то установим на выходе сигнал. А в регистр таймера запишем его длину. Если это синхропауза, то длина будет до конца фрейма и в регистр запишем 0.

Вроде бы как все. Загружаем в контроллер, подключаем к вч-модулю, на выход приемника вешаем серы… Работает!

Вот только есть одно НО. Сервы работают не в полном диапазоне. В чем проблема?

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


И сопротивления R1 и R4 как раз и дают эту погрешность. Ну да не проблема. Введем калибровку. Для этого подключим кнопку. Алгоритм будет примитивный:

Первый джойстик влево вниз, держать, нажать кнопку.

Первый джойстик вправо вверх, держать, нажать кнопку.

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

Второй джойстик вправо вверх, держать, нажать кнопку.

Так мы заполним два массива минимальных и максимальных значений для каждого аналогового входа. Вот только каждый раз калибровать – как-то неудобно. Ок. У нашего контроллера есть энергонезависимая память – запишем туда.

Теперь все работает как надо. Код по ссылке (TX2.rar) .

В итоге мы от части воспроизвели блок-схему из начала статьи. Пульт, конечно, примитивный. Но на этом примере можно увидеть основные его составляющие. Микширование (тоже примитивное) реализовано в функции UpdateChannels(). Заключается оно в переносе один-к-одному сигналов с джойстиков в каналы управления.
Категория: Начинающему моделисту | Добавил: Mactep (07.06.2013)
Просмотров: 7691 | Рейтинг: 4.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск