Кран машиниста 254/395 с использованием Arduino NanoИстория изменений: скетч | мапперСОДЕРЖАНИЕВВЕДЕНИЕ
|
Рис.1 |
Leonardo имеет модуль USB на кристалле микроконтроллера,
он может быть представлен как HID, как CDC, как абстрактное USB устройство, это зависит от написанной пользователем программы.
Uno (Nano) всего этого не имеет, а в системе представляется как CDC за счёт отдельной микросхемы CH340G,
которая является преобразователем USB/Serial, но при этом, Nano раза в четыре дешевле Leonardo.
Следующий выбор, который нужно было сделать, это способ подключения к симулятору. На рис. 2 показаны четыре основных варианта,
коротко о каждом:
Рис.2 |
1. Основной, самый предпочтительный, двунаправленный, позволяет не только отправлять события органов управления в симулятор,
но и получать данные из симулятора для организации устройств индикации. В тоже время, затруднительно его использовать из-за отсутствия
программного интерфейса для подключения дополнений. Будем надеяться, что это временная ситуация.
2. Самый простой, так как клавиатурные события непосредственно воспринимаются симулятором, а HID клавиатура может быть организована
с использованием плат Leonardo или Pro Micro, которые имеют на кристалле Atmega32u4 USB модуль.
3. Наиболее доступный, позволяющий использовать готовые и самодельные HID устройства и транслировать события
ввода в симулятор через специальный программный преобразователь. Существует симпатичная реализация такого
маппера .
4. Аппаратно тоже самое, что и способ 1, но только ввод. Позволяет использовать дешёвые ардуины с виртуальным последовательным портом.
Требуется специализированный маппер событий ввода в события клавиатуры, работающий с последовательным портом.
Было выявлено (оказалось, что это известная проблема), что ZDSimulator, дополнительно с действиями по позиционированию
ручек кранов, может произвести действия, которые не должны происходить (разные для разных типов локомотивов), например:
На ЭП1М: ======== 1. Переключаются страницы МСУД (клавиши '1' и '4') 2. Выключается "Вентилятор 3" (клавиша '7') На ЧС4Т: ======== 1. Переключается подсветка кабины на зелёную (клавиша '|' )То есть, дополнительно совершается действие так, если бы была нажата клавиша-одиночка без префикса Menu.
Таблица 1 | |||||||||||||||||||||||||||||||||||||||||||||
|
С учётом описанных эффектов, HID Keyboard должен вырабатывать позиционные коды (клавиатурные команды)
в большинстве положений кранов и инкрементные там,
где проявляются дополнительные эффекты. Необходимо также учитывать предыдущее положение ручек,
чтобы оценить направление перемещения и выработать правильный инкрементный код.
HID Joystick, поддерживающий описанную специфику, и устройство с USB/Serial, должны вырабатывать двойной набор событий.
Один вырабатывается при перемещении ручек вперёд, а другой при перемещении назад.
В клавиатурном маппере, этим событиям можно назначить и инкрементные коды, и коды непосредственного позиционирования.
Итак, сделан выбор:
- Arduino Uno(Nano, рис.3)
- на компьютере используется программа-маппер, работающая с последовательным портом.
Рис.3 |
Программный код для Arduino Nano имеет стандартную для ардуиновских скетчей
структуру и использует
алгоритм обработки сигналов, базирующийся на программной модели реверсивного счётчика.
Алгоритм подавляет дребезг контактов,
детектирует переходы сигналов из одного состояния в другое и отправляет события органов управления
в определённом формате.
Скачать скетч можно здесь.
Программа-маппер (структура программы) предназначена для преобразования событий ввода от устройств в системные события нажатия клавиш в ОС Windows.
Маппер, в том виде, в каком его можно скачать здесь,
позволяет подключать до восьми устройств, поддерживающих формат события, передаваемого по последовательному каналу связи.
Правила преобразования задаются в конфигурационном файле mapper.ini.
Исходный код маппера serial_keymapper_src-0.2.0.zip
Краны собраны на пластине-основании с пьедесталом под кран 254, как показано на рис.4.
Полный список комплектующих изделий содержится в таблице 2.
Рис.4 |
Таблица 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Контроллер ардуино располагается под крышкой корпуса крана 254 на пьедестале.
Для этого делается разметка и сверлятся два отверстия диаметром 3 мм
для пропускания пластиковой стяжки, крепящей кабельную часть USB разъёма B-mini.
Перед затягиванием стяжки, под разъём кладётся прокладка (таблица 2, поз.27).
После этого устанавливается плата контроллера, которая закрепляется второй стяжкой, пропущенной под USB разъёмом.
Вторая стяжка не позволяет контроллеру слететь с разъёма (рис.5).
Рис.5 |
Электрический монтаж делается согласно таблице 3.
Таблица 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||
|
1. Установить среду разработки Arduino IDE (если не установлена)
https://www.arduino.cc/en/Main/Software
2. Скачать скетч valves-0.2.0.zip и распаковать в удобное место.
3. Подключить изделие к PC при помощи USB кабеля.
4. Скачать и установить драйвер микросхемы CH340G.
5. Определить имя нового коммуникационного USB устройства с чипом CH340 при помощи Диспетчера устройств,
как показано на рис.6 в качестве примера.
Рис.6 |
Рис.7 |
Рис.8 |
Автономное программирование удобно в том случае, когда нет необходимости вносить изменения в код. Иногда, для успешной компиляции, необходимо доустанавливать дополнительные библиотеки и менять некоторые параметры ядра. Часто бывает так, что при использовании некоторых дополнительных библиотек возникают проблемы при компиляции в Arduino IDE новейших версий. В этом случае использование уже протестированных готовых бинарных или .hex прошивок упрощает задачу.
1. Скачать пакет программирования
(программатор avrdude и прошивка в формате .hex)
valves-0.2.0_programming_set.zip
и распаковать в удобное место.
2. Открыть в блокноте на редактирование файл prog.bat и указать актуальный порт подключения платы, как показано на рис.9.
Рис.9 |
3. Запустить на выполнение файл prog.bat. После окончания процесса программирования, окно будет иметь вид, как показано на рис.10.
Рис.10 |
1. Скачать рабочую папку skeymapper-0.2.0.zip и распаковать в удобное место.
2. Отрыть файл удобное_место\skeymapper\mapper.ini и отредактировать в секции [serial]
значение для port_0 согласно данным, полученным в разделе 4 п.5.
Ниже, для справки, содержимое этого файла.
[mode] log=on [app] #app_name=Безымянный — Блокнот app_name=ZDSimulator54.006 delay_after_shift: 20 pressing_duration: 60 [serial] port_0=COM22 #port_1=COM13 #port_2=COM10 #port_3=COM18
Остальные настройки в редактировании не нуждаются и соответствуют
актуальному маппированию событий кранов в клавиатурные события.
3. Запустить на выполнение файл удобное_место\skeymapper\mapper.exe.
4. В результате п.4 должно появиться консольное окно (рис.11),
Рис.11 |
5. Выполнять действия с органами управления, наблюдать код в окне mapper.exe
и сравнивать с ожидаемыми значениями.
6. Опробовать совместно с симулятором. Для этого нужно запустить ZDSimulator и рестартовать mapper.exe с системными правами не ниже, чем у симулятора.
7. После успешного опробования, маппер можно запускать батником start_daemon.bat. При этом не будет образовываться окно. Останов демона делать батником kill_daemon.bat
Выяснить символьные коды клавиш можно при помощи программы keyhelper.exe, которая лежит в папке маппера. После её запуска нажимать клавиши и смотреть коды. На рис.12 показано, как использовать полученную информацию.
Рис.12 |
Таблица 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1. Переключатели кранов, как это сделано в текущей конструкции на примере крана 395, положение IV
Инициализация ввода в скетче
input_init(3,5,ROTARY_SWITCH); /* No395 pos.IV */
[Key3] on: APPS+KEY_4
2. Пример программирования тумблера главного крана
Инициализация ввода в скетче
input_init(15,А3,TOGGLE_SWITCH); /* */
[KEY15] on: RSHIFT+KEY_L off: KEY_L
Маппер получился на вырост и допускает подключение до восьми устройств,
поддерживающих этот формат событий.
Для подключения устройств нужно дополнить секцию serial, как показано ниже.
[serial] port_0: com22 port_1: com20 port_2: com12 port_3: com8
Здесь port_N (N от 0 до 7) - условный номер порта, которому сопоставляется физический порт.
Блок описаний маппирования для отдельного устройства должен предваряться секцией device, как показано ниже
[device] port: 0 # здесь начинается описательная часть для устройства, подключенного к порту с условным номером 0 [device] port: 1 # здесь начинается описательная часть для устройства, подключенного к порту с условным номером 1 [device] port: 2 # здесь начинается описательная часть для устройства, подключенного к порту с условным номером 2 [device] port: 2 # здесь начинается описательная часть для устройства, подключенного к порту с условным номером 3