На главную страницу

Кран машиниста 254/395 с использованием Arduino Nano

История изменений: скетч | маппер

СОДЕРЖАНИЕ

ВВЕДЕНИЕ
1. СКЕТЧ ДЛЯ ARDUINO NANO
2. МАППЕР
3. КОНСТРУКЦИЯ
4. ПРОГРАММИРОВАНИЕ ARDUINO NANO С ПОМОЩЬЮ ARDUINO IDE
5. АВТОНОМНОЕ ПРОГРАММИРОВАНИЕ
6. ПОДКЛЮЧЕНИЕ К СИМУЛЯТОРУ
7. СПРАВОЧНЫЕ МАТЕРИАЛЫ

ВВЕДЕНИЕ

В ЖД кабиностроении делаю первые шаги. С чего начать?
Решил, что это будут краны 254/395 отдельным модулем.
Oпределился с двухэтажной компоновкой (рис.1), что сами краны быдут иметь одинаковую конструкцию с разницей в части ограничителей хода рукоятки. Кран 254 расположен на пьедестале. Очень хотелось, чтобы затянутое и отпущенное положения были вдоль хода поезда, из-за этого к 5 штатным положениям добавились два дополнительных, дублирующие крайние.

Дальше было два пути: устройство определяемое в Windows, как HID (джойстик) или устройство, определяемое как CDC (последовательный коммуникационный порт). В мире Arduino это выбор между Arduino Leonardo (Micro) и Arduino Uno (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 серым цветом показаны команды, обладающие дополнительным эффектом. Их возможно больше.

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

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

Таблица 1
Переключение на позицию Действие на
клавиатуре
Клавиатурный макрос в
VK кодах
Кран 395, положение I Menu+1 VK_APPS, VK_KEY_1
Кран 395, положение II Menu+2 VK_APPS, VK_KEY_2
Кран 395, положение III Menu+3 VK_APPS, VK_KEY_3
Кран 395, положение IV Menu+4 VK_APPS, VK_KEY_4
Кран 395, положение Va(э) Menu+7 VK_APPS, VK_KEY_7
Кран 395, положение V Menu+8 VK_APPS, VK_KEY_8
Кран 395, положение VI Menu+9 VK_APPS, VK_KEY_9
Кран 254, положение I
(зарядное)
[ VK_OEM4
Кран 254, положение II
(зарядное/поездное)
Menu+0 VK_APPS, VK_KEY_0
Кран 254, положение III Menu+ - VK_APPS, VK_OEM_MINUS
Кран 254, положение IV Menu+ + VK_APPS, VK_OEM_PLUS
Кран 254, положение V Menu + | VK_APPS, VK_OEM_5
Кран 254, положение VI Menu + BackSpace VK_APPS, VK_OEM_BACK
Кран 254, положение VI
(дублирующее)
Menu + BackSpace VK_APPS, VK_OEM_BACK

С учётом описанных эффектов, HID Keyboard должен вырабатывать позиционные коды (клавиатурные команды) в большинстве положений кранов и инкрементные там, где проявляются дополнительные эффекты. Необходимо также учитывать предыдущее положение ручек, чтобы оценить направление перемещения и выработать правильный инкрементный код.

HID Joystick, поддерживающий описанную специфику, и устройство с USB/Serial, должны вырабатывать двойной набор событий. Один вырабатывается при перемещении ручек вперёд, а другой при перемещении назад.
В клавиатурном маппере, этим событиям можно назначить и инкрементные коды, и коды непосредственного позиционирования.

Итак, сделан выбор:

- Arduino Uno(Nano, рис.3)
- на компьютере используется программа-маппер, работающая с последовательным портом.

Рис.3

1. СКЕТЧ ДЛЯ ARDUINO NANO

Программный код для Arduino Nano имеет стандартную для ардуиновских скетчей структуру и использует алгоритм обработки сигналов, базирующийся на программной модели реверсивного счётчика.
Алгоритм подавляет дребезг контактов, детектирует переходы сигналов из одного состояния в другое и отправляет события органов управления в определённом формате.
Скачать скетч можно здесь.

2. МАППЕР

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

Правила преобразования задаются в конфигурационном файле mapper.ini.

Исходный код маппера serial_keymapper_src-0.2.0.zip

3. КОНСТРУКЦИЯ

Краны собраны на пластине-основании с пьедесталом под кран 254, как показано на рис.4.
Полный список комплектующих изделий содержится в таблице 2.

Рис.4
Таблица 2
Поз.№ Наименование Колич. Примечание Вид для справки
1 Основание 1 Фанера 210x150x6 мм -
2 Пьедестал 1 Фанера 105x75x6 мм -
3 G1018, Корпус
для РЭА 88х68х32.7мм
2 Пластик, чёрный
4 RCL371-1-1-12,
Переключатель галетный 16F
2
5 Ручка переключателя
ebay спецификация:
36mm Top Rotary Control
Turning Knob for
Hole 6mm Shaft Potentiometer
2
6 Уголок 2 Уголок мебельный
30х30х35х2мм, оцинкованный
7 Ручка крана 2 Набор отвёрток из Fix Price
8 Стойка пьедестала
М3, 40 мм, F/F (мама/мама)
ebay spec:
M3x40mm Brass Hex Standoff Pillar Female-Female
4 латунь
9 Стойка ограничителя
М3, 25 мм, F/М (мама/папа)
ebay spec:
M3x25mm Brass Hex Standoff Pillar Male-Female
6 латунь
10 Пластина ограничителя хода ручки крана 254
1 Вырезается из нижней
крышки корпуса (поз.3)
11 Пластина ограничителя хода ручки крана 395
1 Вырезается из нижней
крышки корпуса (поз.3)
12 Винт М3х15, потайной
12
13 Винт М3х5, полукруглая
6
14 Шайба М3 плоская
18
15 Шайба гровер М3
18
16 Гайка М3
18
17 Винт М4х8, полукруглая
6 Для крепления уголка на ручке переключателя.

В ручке, с лицевой стороны, сверлятся
глухие отверстия
D3.3 и глубиной 6 mm, где толщина
сечения это позволяет, и нарезается
резьба M4.

Контрение краской.
18 Гайка М5
2 Крепление ручки крана
19 Шайба М5 плоская
2
20 Шайба гровер М5
2
21 Контроллер Arduino Nano V.3

ebay spec:
Nano V3.0 Mini USB ATmega328 5V 16M Micro-controller Board CH340G Arduino
1
22 PBS-40 (DS1023-1x40), Гнездо на плату 2.54мм 1х40 прямое 1 Отрезаются две полоски по 15 контактов для запайки в контроллер
23 PLS-40 (DS1021-1x40), Вилка штыревая 2.54мм 1х40 прямая тип1 1 Вынимаются штыри для использования в качестве наконечников для проводов шлейфа на стороне подключения к контроллеру
24 DS1058-10 (FRC-10-30C), Кабель плоский цветной 1.27мм, 10 жил 0.5 м
25 PBF D:1.6/0.8 мм (черная), Трубка термоусадочная (1м) 1
26 G758RBFT, Ножки для РЭА, 1 компл. - 4 шт. 1
27 Прокладка 18 х 12 мм под кабельный разъём USB mini 1 Вырезается из нижней крышки корпуса (поз.3)
28 Пластиковые стяжки 2 х 200 2 для крепления разъёма USB кабеля

Контроллер ардуино располагается под крышкой корпуса крана 254 на пьедестале.
Для этого делается разметка и сверлятся два отверстия диаметром 3 мм
для пропускания пластиковой стяжки, крепящей кабельную часть USB разъёма B-mini. Перед затягиванием стяжки, под разъём кладётся прокладка (таблица 2, поз.27). После этого устанавливается плата контроллера, которая закрепляется второй стяжкой, пропущенной под USB разъёмом. Вторая стяжка не позволяет контроллеру слететь с разъёма (рис.5).

Рис.5

Электрический монтаж делается согласно таблице 3.

Таблица 3
Цепь,
орган управления
Контакт на плате
Arduino Micro
Примечание
Кран 395 I D2
Кран 395 II D3
Кран 395 III D4
Кран 395 IV D5
Кран 395 Va(э) A0
Кран 395 V A1
Кран 395 VI A2
Кран 254 I D6 ОТПУСКНОЕ
Кран 254 II D7 ПОЕЗДНОЕ/ОТПУСКНОЕ
Кран 254 III D8 ТОРМОЗНОЕ 1
Кран 254 IV D9 ТОРМОЗНОЕ 2
Кран 254 V D10 ТОРМОЗНОЕ 3
Кран 254 VI D11 ТОРМОЗНОЕ 4
Кран 254 VI D12 Дублирующее положение с расположением ручки
крана параллельно ходу поезда в затянутом положении
Общий контакт
переключателя крана 395
GND
Общий контакт
переключателя крана 254
GND

4. ПРОГРАММИРОВАНИЕ ARDUINO NANO С ПОМОЩЬЮ ARDUINO IDE

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

6. Открыть файл прошивки из места, определённого в пункте 2
.
Рис.7
7. Выполнить действия, показанные на рис.8, используя в качестве имени порта данные, полученные в п.4

Рис.8

5. АВТОНОМНОЕ ПРОГРАММИРОВАНИЕ

Автономное программирование удобно в том случае, когда нет необходимости вносить изменения в код. Иногда, для успешной компиляции, необходимо доустанавливать дополнительные библиотеки и менять некоторые параметры ядра. Часто бывает так, что при использовании некоторых дополнительных библиотек возникают проблемы при компиляции в Arduino IDE новейших версий. В этом случае использование уже протестированных готовых бинарных или .hex прошивок упрощает задачу.

1. Скачать пакет программирования (программатор avrdude и прошивка в формате .hex)
valves-0.2.0_programming_set.zip и распаковать в удобное место.

2. Открыть в блокноте на редактирование файл prog.bat и указать актуальный порт подключения платы, как показано на рис.9.

Рис.9

3. Запустить на выполнение файл prog.bat. После окончания процесса программирования, окно будет иметь вид, как показано на рис.10.

Рис.10

6. ПРОВЕРКА И ПОДКЛЮЧЕНИЕ К СИМУЛЯТОРУ

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

7. СПРАВОЧНЫЕ МАТЕРИАЛЫ

Символьный формат кодов клавиш

Выяснить символьные коды клавиш можно при помощи программы keyhelper.exe, которая лежит в папке маппера. После её запуска нажимать клавиши и смотреть коды. На рис.12 показано, как использовать полученную информацию.

Рис.12

Обобщённый формат событий и соответствующие опции в настройках

Таблица 4
Наименование органов
управления
Макроопределение
в Ардуино скетче
valves.ino
По часовой Против часовой Нажатие Отпускание Длит. удержание Перекл. на позицию Опции в
mapper.ini
Кнопкa, тумблер
(1 контакт)
PUSH_BUTTON - - 1000******** 0100******** - - оn/off,
hold/release
Кнопкa,
(1 контакт)
две функции (по короткому нажатию и по удержанию более 1.5..2сек)
PUSH_BUTTON_X - - - 00010******* 00011******* - on
Тумблер
(1 контакт)
TOGGLE_SWITCH - - 1000******** 0100******** - - оn/off,
hold/release
Контакт переключателя
(количество не ограничено)
ROTARY_SWITCH - - - - - 0001******** on
Энкодер
(2 контакта)
ENCODER_A
ENCODER_B
0010*******1 0010*******0 - - - - on

Примеры программирования органов управления

1. Переключатели кранов, как это сделано в текущей конструкции на примере крана 395, положение IV
Инициализация ввода в скетче


 input_init(3,5,ROTARY_SWITCH); /* No395 pos.IV */


Строчка конфигурации в файле mapper.ini

 [Key3]
 on: APPS+KEY_4
 

2. Пример программирования тумблера главного крана

Инициализация ввода в скетче


 input_init(15,А3,TOGGLE_SWITCH);  /*  */


Строчки конфигурации в файле mapper.ini

 [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


На главную страницу