MCP для X-Plane
13.04.2020: Прошивка, новый плагин плагин 0.6.2, ардуино скетч и
инсталлятор ConfigHelper (используется также для тестирования оборудования).
arduino_mcp-0.7.0_plugin-0.6.2.zip. СОДЕРЖАНИЕ1. ВВЕДЕНИЕ
|
Рис.1 |
а в качестве индикаторов применяются восьмиразрядные модули с чипом MAX7219 (рис.2), включенные гирляндой от трёх до четырёх штук.
Рис.2 |
Было заманчиво прихватить в компанию ещё какой-нибудь модуль, чтобы максимально использовать предоставляемое мегой 2560 пространство ввода/вывода. Естественно, это должен быть EFIS.
На рис.3 показано взаимодействие устройства с симулятором через плагин с использованием интерфейса USB.
Рис.3 |
Программное обеспечение устройства должно решать две параллельные асинхронные задачи:
1. Опрос органов управления и отправка событий от этих органов в плагин.
2. Приём от плагина данных и их отображение на органах индикации.
На рис.4 показана стуктурная схема программного обеспечения устройства, отвечающая пунктам 1 и 2.
Рис.4 |
Сначала главный цикл выглядел так:
void loop() { refresh_all_digits_n_lamps(); /* takes 8640uS for all 4 x 8 digits (64 registers)*/ discrete_task(); /* takes 441uS for 85 discrete inputs matrix nodes processing*/ }
Было подозрение, что это не будет нормально работать, и оно подтвердилось. Получалось быстродействие чуть более 100 герц. Для дисплеев это даже сверхбыстро, а дискретный ввод нужно вызывать не менее чем 1000 раз в секунду. Захотелось разменять быстродействие обновления дисплеев так, чтобы частота вызова дискретной задачи повысилась, пусть и за счёт снижения частоты обновления индикации. Решение лежало на поверхности. Квантом времени при выводе на дисплей является время записи одного регистра. Что, если вызов дискретной задачи перенести из главного цикла и поместить после каждого вызова функции записи байта в регистр? Так и было сделано.
void refresh_all_digits_n_lamps(void) { * * max7219_write_byte(pos); /* takes 135uS per one register */ discrete_task(); /* takes 441uS for 85 discrete inputs (including matrix nodes) processing*/ * * max7219_write_byte(bt); /* takes 135uS per one register */ discrete_task(); /* takes 441uS for 85 discrete inputs (including matrix nodes) processing*/ * * }
В итоге получается, что дискретная задача вызывается чаще, чем один раз в миллисекунду, что
для программного подавления дребезга и обработки энкодеров вполне достаточно. Обновление
всех индикаторов происходит 27 раз в секунду, что тоже более чем приемлемо.
f = 1 / ((135uS + 441uS) x 64 регистра) = 27Hz
Потом уже, когда всё было готово, в экспериментальных целях, была добавлена сигнализация входа в discrete_task() и
выхода, путём управления свободным выводом Ардуино A0, чтобы подтвердить рассуждения и уточнить численные значения времён.
Высокий уровень означает, что процессорное время отдано discrete_task(), а низкий уровень - время на всё остальное.
На рис.5 показана осциллограмма сигнала на ножке A0. Видно, что основной потребитель процессорного времени
это discrete_task().
Рис.5 |
Таблица 1 | |||||||||||||||||||||||||||||||||||||||||||||
|
Рис.6 |
Рис.7 |
На рис.8 показан внешний вид панелей в таком виде, в каком это всё задумывалось. Видно как нерационально используются индикаторы, но это только на первый взгляд. На самом деле такой подход технологичен и экономически оправдан.
Рис.8 |
На рис.9 показан прототип устройства сразу после сборки.
Рис.9 |
А это внешний вид со стороны монтажа (рис.10).
Рис.10 |
При изготовления прототипа использовался вспененный поливинилхлорид
(рекламный пластик) толщиною 2 мм. Особенностью этого материала
является то, что он легко режется канцелярским ножом и склеивается
встык клеем на основе цианакрилата (суперклей "Секунда").
На рис.11 показан шаблон панели, который надо распечатать из файла
по ссылке ниже (нужен принтер формата А3), наклеить на заготовку и
сделать обрезку по контурам.
Остальные заготовки вырезались по размерам:
MCP ===== 1. Горизонтальные стенки 370 x 50 x 2 мм ....... 2 шт. 2. Боковые стенки 50 x 76 x 2 мм ............... 2 шт. 3. Задняя крышка 366 х 76 х 2 мм ............... 1 шт. 4. Ребро жёсткости 366 x 25 x 2 мм ............. 1 шт. EFIS ====== 1. Горизонтальные стенки 145 x 50 x 2 мм ....... 2 шт. 2. Боковые стенки 50 x 76 x 2 мм ............... 2 шт. 3. Задняя крышка 141 х 76 х 2 мм ................1 шт.
Сначала склеивалась передняя панель MCP с ребром жёсткости таким образом, чтобы образовалась полка для модулей семисегментных индикаторов, а цифры попали в окна на должном уровне. После чего выклеивался весь короб.
Рис.11 |
Шаблон для лазерной резки по органическому (акриловому) стеклу (рис.12)
Рис.12 |
Шаблон для печати наклеек на передние панели с надписями (рис.13)
Рис.13 |
1. Выполнить соединения по цепи GND согласно таблице 1, колонка "Контакты для соединения с цепью GND".
2. Выполнить объединение кнопок в матрицу по
схеме соединений. Лист 4 схемы содержит дополнительное
изображение матрицы кнопок в прямоугольной системе координат.
3. Выполнить остальные соединения.
1. Установить среду разработки Arduino IDE (если не установлена)
https://www.arduino.cc/en/Main/Software
2. Скачать прошивку arduino_mcp-0.5.3.zip и распаковать в удобное место.
3. Подключить плату Mega2560 к PC при помощи USB кабеля.
4. Определить имя нового коммуникационного USB устройства Arduino Mega 2560 при помощи Диспетчера устройств,
как показано на рис.14 в качестве примера.
Рис.14 |
Рис.15 |
#ifndef HardwareSerial_h #define HardwareSerial_hПосле изменений:
#include <inttypes.h>
#include "Stream.h"
#ifndef HardwareSerial_h #define HardwareSerial_h #define SERIAL_TX_BUFFER_SIZE 512 #define SERIAL_RX_BUFFER_SIZE 1024 #include <inttypes.h>7. Выполнить действия, показанные на рис.16, используя в качестве имени порта данные, полученные в п.4
#include "Stream.h"
Рис.16 |
7. После загрузки прошивки на индикаторах должно появиться заполнение цифрами во всех разрядах,
соответствующее номеру индикатора (CRS: 00000000 ... ALT:33333333).
Если в результате прошивки выдана ошибка
#error SERIAL_TX_BUFFER_SIZE still is not 512 bytes
или
#error SERIAL_RX_BUFFER_SIZE still is not 1024 bytes,
это может означать, что изменение размера буфера, описанное в п. 6 не выполнено или выполнено, но не
в актуальной папке. Такое возможно, если имеются множественные установки Arduino IDE разных версий.
1. Скачать тестовую программу mcptest.zip и распаковать в удобное место.
2. Отрыть файл удобное_место\mcptest\Resources\plugins\xfcmcp.ini и отредактировать в секции [serial]
значение для port_0 согласно полученному значению в разделе 6 п.4.
Ниже, для справки, содержимое этого файла.
[mode] log=on [serial] port_0=COM36 #port_1=COM13 #port_2=COM10 #port_3=COM18 [debug] keyinfo=on
3. Запустить на выполнение файл удобное_место\mcptest\Resources\plugins\mcptest.exe.
4. В результате п.3 должно появиться консольное окно (рис.17),
а индикаторы на панели MCP обнулиться.
Рис.17 |
5. Выполнять действия с органами управления, наблюдать код в окне тестовой программы
и сравнивать с кодами на рис.18 и в таблице 2.
Примечание 1. Нажатие на кнопку со встроенной индикацией должно
изменять состояние встроенного светодиода.
Примечание 2. При вращении энкодеров должны изменяться показания соответствующих
семисегментных индикаторов.
Примечание 3. События органов управления в окне тестовой программы имеют вид:
0x2048 Key0072, где 0x - признак шестнадцатеричного представления числа 2 - один из кодов событий (1-событие переключения на позицию (для многопозиционных переключателей)), 2-событие энкодера, 4-цепь разомкнута, 8-цепь замкнута), 0 - номер порта, 48 - код события органа управления, Key0072 - Имя секции данного органа управления в ini файле.
Примечание 4. Возможно, нужно будет добавить папку размещения mcptest.exe в исключения Защитника Windows. Было замечено значительное потребление процессорного времени PC со стороны защитника Windows при манипуляциях с органами управления MCP. Добавление папки в исключения решило проблему.
1. Загрузить плагин xfcmcp-0.5.3.zip
и разместить файлы по своим местам, как показано ниже.
Содержание архива: =================== Resources\plugins\xfcmcp.xpl - плагин, скопировать в папку Resources\plugins\ симулятора Resources\plugins\xfcmcp.ini - дефолтные настройки, скопировать в папку Resources\plugins\ симулятора for_boeing757_767_folder\xfcmcp.ini - файл с настройками для Boeing757/767 by FF&STS, поместить в папку модели самолёта (если имеется).
2. Отрыть файл папка_симулятора\Resources\plugins\xfcmcp.ini и отредактировать в секции [serial] значение для port_0 согласно полученному значению в разделе 6 п.4. Ниже, для справки, часть содержимого этого файла с настройками последовательного порта.
[mode] log=on [serial] port_0=COM36 #port_1= #port_2= #port_3= [debug] keyinfo=on [operation] reload_key = 20
3. Запустить симулятор и проверить функционирование.
Примечание 1. Настроек в самом симуляторе не требуется.
Примечание 2.Лог плагина ведётся в файле папка_симулятора\Resources\plugins\xfcmcp.log
и пересоздаётся при каждом запуске плагина.
Примечание 3. Текущий файл настроек можно редактировать на лету, чтобы перезагрузить
настройки нужно вызвать пункт меню симулятора
Plugins/FlyingCat USB I/O hub -> Re-register all
Рис.18 |
или нажать специальную выделенную кнопку (по умолчанию это кнопка SPARE с кодом 20)
Примечание 4. Служебную функцию перезагрузки настроек допускается назначать на любую кнопку,
занятую в обычных настройках. Но, желательно назначать малоиспользуемую кнопку.
Примечание 5. При необходимости перегрузить устройство,
можно остановить плагин через Plugin Admin симулятора:
Рис.19 |
Останов плагина не происходит мгновенно, нужно подождать, пока чек в чекбоксе исчезнет. После этого можно переподключить устройство путём отсоединения/присоединения USB кабеля.
1. Карта кодов событий органов управления и позиций органов индикации
Рис.20 |
2. Формат события от устройства к плагину
Имеет вид как показано ниже:{252}
Это текстовый протокол с STX/ETX маркерами начала и конца текстового сообщения.
Обычно STX имеет код 0x02, a ETX - код 0x03. В текущей реализации эту же самую роль играют
символы { и } соответственно.
В примере, указанном выше, каждый символ означает:
{ | - | Start of text (STX) |
2 | - | один из один из кодов типа событий |
52 | - | код события органа управления в шестнадцатеричном представлении |
} | - | End of text (ETX) |
1 | - | событие переключения на позицию |
2 | - | событие энкодера |
4 | - | цепь разомкнута |
8 | - | цепь замкнута |
3. Формат сообщения от плагина к устройству для семисегментных индикаторов
Рис.21 |
4. Формат сообщения от плагина к устройству для одиночных светодиодных индикаторов
Рис.22 |
5. Таблица распределения пространства ввода/вывода платы Arduino Mega 2560 и коды событий органов управления
Таблица 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|