Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Переделка USB-симулятора полета в пульт радиоуправления на основе Arduino

2020-01-27

Всі статті →

Автор: Антон Царицынский

1 Компоненты

USB-симуляторы полета используют совместно со специальными компьютерными программами-симуляторами (например, FMS, рис. 1) для наработки или поддержания навыков пилотирования авиамоделями.

Рис. 1 – Flight Model Simulator

У меня в наличии был простейший четырехканальный FS-SM020 с возможностью триммирования по всем каналам (рис. 2).

Рис. 2 – Симулятор полета FS-SM020 автора

Вскрытие показало (рис. 3), что корпус имеет множество отверстий, скрытых под наклейками, для установки дополнительных органов управления, разъема питания; кроме того, внутри достаточно места для воплощения идей, описанных далее.

Рис. 3 – Первое вскрытие

Электронная часть, за исключением четырех потенциометров, подлежала удалению (рис. 4).

Рис. 4 – После удаления всего ненужного

Функциональность пульта определил так:

  • частота передачи 2,4ГГц;
  • питание от литий-ионного аккумулятора с возможностью подзарядки от USB-блока питания без изъятия аккумулятора;
  • контроль заряда батареи;
  • возможность настройки расхода и реверса по каждому из каналов с сохранением настроек;
  • наличие простой звуковой сигнализации для определения режима работы пульта.

Дальше постепенно вырисовалось все необходимое «железо»:

  • плата ARDUINO Pro Mini 5V на ATMega 328P – «мозг» всея будущего пульта, имеет малый размер (уже была у меня в наличии);
  • макетная плата для беспаечного монтажа 47х35мм (170 контактов) – пульт «обрастал» функционалом шаг за шагом, потому решил обойтись без паяльника поблизости платы ARDUINO;
  • радиомодуль nRF24L01 с внешней антенной для, собственно, передачи данных;
  • адаптер 5V-3,3V для радиомодуля nRF24L01, так как основным напряжением выбрал именно 5V, а радиомодулю подавай 3,3V;
  • пьезоэлемент, отвечающий за все звуки, которые будет издавать пульт;
  • энкодер с кнопкой для выбора канала и настройки расхода для него и реверса;
  • провода – обычные и для беспаечного монтажа;
  • система питания (рис. 5), с которой все начиналось, т.к. без нее не было  смысла вообще продолжать.

Рис. 5 – Система питания пульта

Питается пульт от одного литиево-ионного аккумулятора типоразмера 18650, расположенного в батарейном отсеке. Для контроля заряда-разряда аккумулятора использован модуль на основе микросхемы TP4056. Необходимое напряжение (5V) формирует повышающий стабилизатор. Между ним и контроллером заряда-разряда установлен тумблер для отключения питания.

Базовая схема системы питания показана на рис. 6.

Рис. 6 – Базовая схема системы питания

С наличием стабильного питания можно было двигаться дальше и разместить все вышеперечисленное внутри корпуса выпотрошенного симулятора (рис. 7–16).

Рис. 7 – Собрали все вместе

Рис. 8 – Вид на систему питания. Здесь и далее широко используются стяжки и Его величество термоклей

Рис. 9 – Небольшое дополнение в системе питания: гнездо 2,1-5,5мм для кабеля

Рис. 10 – Большое дополнение к системе питания: белый провод, идущий через резистор 10кОм к ARDUINO Pro Mini для контроля уровня заряда аккумулятора

Рис. 11 – Адаптер и радиомодуль с антенной. Для обеспечения возможности присоединять антенну пришлось расширить отверстие, через которое ранее проходил USB-кабель

Рис. 12 – Энкодер

Рис. 13 – Вид на ARDUINO Pro Mini. Макетная плата под ней посажена на термоклей

Рис. 14 – По центру – пьезоэлемент

Рис. 15 – Отгородил систему питания от проводов

 

Рис. 16 – Контроллер заряда-разряда аккумулятора развернут  светодиодом к лицевой стороне корпуса. Через отверстие, прорезанное в наклейке, можно следить за окончанием процесса зарядки (красный – заряжается, зеленый – зарядка окончена)

Схема пульта показана на рис. 17.

Рис. 17 – Схема пульта

Свободный батарейный отсек, который также имеется в корпусе симулятора, приспособил для хранения кабеля для подзарядки и  антенны при транспортировке (рис. 18).

 

Рис. 18 – USB-кабель и антенна в батарейном отсеке пульта

С лицевой стороны все выглядит как на рис. 19.

Рис. 19 – Вид с лицевой стороны

2 Программная часть

Для удобства весь код содержится в нескольких файлах:

1. VMETER.h, VMETER.cpp – содержат описание класса VMETER для контроля уровня заряда аккумулятора. Косвенно оценка этого уровня выполняется через измерение напряжения на аккумуляторе с учетом неизменного напряжения питания самого микроконтроллера благодаря повышающему стабилизатору. Некоторые константы и методы приведены в табл. 1.

Табл. 1 – Некоторые константы и методы класса VMETER

Наименование Описание
Константы
SM_FACTOR Поскольку аналоговые измерения «скачут», для их сглаживания применен экспоненциальный фильтр. Эта константа задает коэффициент фильтрации от 0 до 1
V_RF Опорное напряжение для измерений. В данном случае совпадает с напряжением питания микроконтроллера. Измеряется мультиметром непосредственно на ногах VCC и GND платы ARDUINO Pro Mini при включенном пульте
V_MIN Минимальное напряжение на аккумуляторе
V_MAX Максимальное напряжение на аккумуляторе
Методы
VMETER(byte pin); Конструктор. pin – один из аналоговых пинов, с которого будут выполняться измерения
void init(void); Должен вызываться в setup() для проведения первого измерения
boolean check(void); Вызывается в loop() для каждого последующего измерения. Возвращает true, если напряжение понизилось по сравнению с предыдущим измерением
byte getPercent(void); Возвращает «процент заряда» от 0 до 100

2. PIEZO.h, PIEZO.cpp – содержат описание класса PIEZO для работы с пьезоэлементом. Некоторые методы класса приведены в табл. 2.

Табл. 2 – Некоторые константы и методы класса PIEZO

Наименование Описание
Методы
PIEZO(byte pin); Конструктор. pin – цифровой пин (только со 2 по 7), к которому подключен пьезоэлемент
void enable(boolean enabled); Включает (параметр равен true) или отключает (параметр равен false) воспроизведение звука
boolean isEnabled(void); Возвращает true, если пьезоэлемент включен
void shortBeeps(byte n); Воспроизводит n коротких звуков
void longBeep(void); Воспроизводит один длинный звук

3. ENC.h, ENC.cpp – содержат описание класса ENC для работы с энкодером с кнопкой. Константы и методы класса приведены в табл. 3.

Табл. 3 – Константы и методы класса ENC

Наименование Описание
Константы
DEBOUNCE_DELAY Время в миллисекундах на программное устранение дребезга кнопки
LONG_PRESS Время длительного нажатия в миллисекундах (хотя в текущей версии пульта оно никак не задействовано, но оставил на будущее)
Методы
ENC(byte pinA, byte pinB, byte pinS); Конструктор. pinA, pinB – пины, которым подключены сигнальные выводы энкодера; pinS – пин, к которому подключена кнопка (switch) энкодера
encState getState(void); Вызывается в loop() для получения состояния энкодера. Возможные значения типа encState (описан в ENC.h):

esNone – энкодер не вращали и не нажимали;

esRotated – энкодер повернули;

esPressed –короткое нажатие;

esLongPressed – длительное нажатие

int getPos(void); Возвращает позицию энкодера. Для нашей задачи:

1 – повернули в одну сторону;

–1 – повернули в противоположную

4. TR.ino – основная программа. Помимо файлов VMETER.h, PIEZO.h, ENC.h добавлены стандартные библиотеки:

  • RF24 для работы с радиомодулем. Никаких особенностей здесь нет, поэтому подробно останавливаться на этом я не буду.
  • EEPROM для возможности сохранения пользовательских настроек в память микроконтроллера. Здесь особенность есть: при подаче питания на микроконтроллер проверяется значение определенного байта его памяти (назовем его ключом). Если значение ключа отличается от заданного – настройки еще ни разу не записывались в память, поэтому следует принять их по умолчанию и записать вместе с ключом. При следующем включении пульта и добром здравии EEPROM-памяти микроконтроллера (число циклов перезаписи которой ограничено) программа найдет ключ и восстановит пользовательские настройки.

Что будем запоминать в качестве пользовательских настроек? Согласно сформулированных ранее требований: величины расходов и наличие/отсутствие реверса по каналам. В каком виде? Тут я предложу немного математики.

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

 

Рис. 20 – Пределы отклонений ручки и сервомашинки

Запишем зависимость положения сервомашинки xout от положения ручки xin

xout = aout + (xin – ain) × (bout – aout) / (bin – ain).

Если в качестве пределов отклонения для ручки принять минимальный и максимальный уровни напряжения с потенциометра в цифровом виде, то ain = 0, bin = 1023, и формулу можно упростить:

xout = aout + xin × (bout – aout) / 1023.

Для контроля расхода по каналу с сервомашинкой введем коэффициент

k = (mout – x’out) / (mout – xout),

где mout = (aout + bout) / 2 – среднее положение сервомашинки; x’out – искомое нами положение машинки с настроенным пользователем расходом, которое выразим из этой формулы, преобразуем и получим

x’out = 0,5 × (aout + bout) × (1 – k) + k × xout.

Изменяя знак коэффициента k, получаем реверс.

Таким образом, в EEPROM микроконтроллера будем записывать четыре таких коэффициента – по количеству каналов.

Регулирование этих коэффициентов выполняется с помощью энкодера. Выбор канала осуществляется нажатием на кнопку, собственно регулирование –вращением ручки. При выборе следующего канала коэффициент предыдущего записывается в EEPROM микроконтроллера.

В табл. 4 приведены некоторые константы, переменные и функции из файла TR.ino.

Табл. 4 – Некоторые константы, переменные и функции из файла TR.ino

Наименование Описание
Константы
K_MIN Минимальное значение коэффициента k
K_MAX Максимальное значение коэффициента k
K_STEP Шаг изменения коэффициента k
EEPROM_KEY Ключ для работы с EEPROM
EEPROM_KEY_ADDR Адрес байта EEPROM для хранения ключа
BATTERY_CRITICAL «Процент заряда», ниже которого будет воспроизводиться звуковое предупреждение
CHECK_INTERVAL Интервал времени измерения напряжения в миллисекундах
Переменные

ch chs[CH_COUNT] = {

  {700, 2100, K_MAX},

  {700, 2100, K_MAX},

  {700, 2100, K_MAX},

  {700, 2100, K_MAX}

};

Массив структур типа

typedef struct {

  unsigned int Min;

  unsigned int Max;

  float k;

} ch

для каждого из каналов. Сюда следует вписать:

aout и bout (см. рис. 20), значение коэффициента k по умолчанию. Для сервомашинки удобно принять управляющий сигнал в миллисекундах

Функции
unsigned int convert (unsigned int v, int c) Реализует все формулы, описанные выше.

v – уровень напряжения с потенциометра в цифровом виде;

с – номер канала от 0 до 3.

Возвращает то самое x’out.

void writeSettings(int c) Записывает настройки в EEPROM для канала с
void readSettings(void) Считывает настройки из EEPROM для всех каналов

Прошивка ARDUINO Pro Mini через USB-TTL конвертер показана на рис. 21.

Рис. 21 – Процесс прошивки

3 Эксплуатация

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

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

При снижении «уровня заряда» ниже критического пульт будет издавать длинный сигнал через заданный интервал времени.

Заряжается пульт через гнездо 2,1–5,5мм блоком питания 5V, рекомендуется 1А и выше.

Пример настройки одного канала:

4 Проверка работы

В архиве есть скетч для простого приемника, с помощью которого можно проверить работу пульта. Я использовал ARDUINO Nano и радиомодуль nRF24L01 с адаптером (рис. 22).

Рис. 22 – Приемник

Схема приемника показана на рис. 23.

Рис. 23 – Схема приемника

После включения пульта и приемника в Мониторе порта можно наблюдать значения по четырем каналам (рис. 24).

Рис. 24 – Проверка пульта через Монитор порта

5 Вместо заключения

Рис. 25 – Для сравнения с первым фото

Мой список компонентов

USB-симулятор полетов FS-SM020 Плата макетная для беспаечного монтажа 47х35мм (170 контактов)
Плата ARDUINO Pro Mini (ATmega328P, 5V) Конвертер USB-TTL
Аккумулятор Li-Ion 18650 (2000mAh) Контроллер заряда-разряда LI CHARGER microUSB TP4056
Батарейный отсек для одного аккумулятора 18650 Повышающий стабилизатор напряжения DC-DC StepUp 3v-to-5v 1A
Радиомодуль NRF24L01-SMA Резистор выводной 10кОм
Адаптер 5V-3,3V для радиомодуля NRF24L01 Пьезоэлемент LD-BZPN-2203
Энкодер EC11  20MM Ручка алюминиевая для энкодера

Ссылки:

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Переделка USB-симулятора полета в пульт радиоуправления на основе Arduino"
5 з 5
зроблена на основі 1 оцінки 1 клієнтських відгуку.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Дмитро
07.10.2022 10:54:28
Гарна робота. А чи не залишилась у вас та електроніка що вийняли? У мене на такому пульті електроніка вийшла з ладу.
оплата картами Visa і MasterCard