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

Краны 254/395 как HID Joystick и Keyboard на Arduino Leonardo


СОДЕРЖАНИЕ

ВВЕДЕНИЕ
1. КОНСТРУКЦИЯ
2. HID JOYSTICK
3. HID KEYBOARD
4. АВТОНОМНОЕ ПРОГРАММИРОВАНИЕ

ВВЕДЕНИЕ

Это продолжение работы над Кран машиниста 254/395 с использованием Arduino Nano , где во введении описывалась вариантность способов подключения к симулятору ZDSimulator. В первоначальной редакции был упущен вариант подключения с применением HID Keyboard, на что была получена реакция на форуме ZDSimulator.

Действительно, это очень интересный способ из-за возможности его реализации с использованием готовых плат Arduino Leonardo с Atmega32u4 с полноценным USB контроллером (рис.1).

Рис.1

В результате работы над прошивкой HID Keyboard было выявлено, что 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, поддерживающий описанную специфику, должен вырабатывать двойной набор событий. Один вырабатывается при перемещении ручек вперёд, а другой при перемещении назад.
В MCabMapper этим событиям можно назначить и инкрементные команды, и команды непосредственного позиционирования.

Скетчи и набор файлов для программирования в архиве leonardo_valves_kbd_joy.zip

    +- leonardo_valves_joy                          папка скетча для джойстика
    +- leonardo_valves_kbd                          папка скетча для клавиатуры
    -- leonardo_valves_programming_set_joy_and_kbd  файлы для автономного программирования
       \
        prog_joy.bat                  запуск программирования леонарды как джойстика
        prog_kbd.bat                  запуск программирования леонарды как клавиатуры
        
        leonardo_valves_joy.ino.hex   прошивкa леонарды как джойстика
        leonardo_valves_kbd.ino.hex   прошивкa леонарды как клавиатуры
       
        avrdude.exe                   программатор  
        avrdude.conf                  файл, необходимый для работы программатора
        libusb0.dll                   файл, необходимый для работы программатора
        
        bootfinder.exe                исполняемый файл для определения порта бутлоадера
        listComPorts.exe              формирователь списка портов с именем порта, VID и PID,
                                      вызывается из bootfinder.exe
    
    

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

Пример конструкции имеется здесь, а электрический монтаж делается согласно таблице 2, для HID Joystick и для HID Keyboard одинаково.

Таблица 2
Цепь,
орган управления
Контакт на плате
Arduino Leonardo
Примечание
Кран 395 I 2
Кран 395 II 3
Кран 395 III 4
Кран 395 IV 5
Кран 395 V A0
Кран 395 Va(э) A1
Кран 395 VI A2
Кран 254 I 6 Отпуск
Кран 254 II 7 Поездное и Отпуск
Кран 254 III 8 Тормозное 1
Кран 254 IV 9 Тормозное 2
Кран 254 V 10 Тормозное 3
Кран 254 VI 11 Тормозное 4
Кран 254 VI 12 Дублирующее положение с расположением ручки
крана параллельно ходу поезда в затянутом положении
Общий контакт
переключателя крана 395
GND
Общий контакт
переключателя крана 254
GND

2. HID JOYSTICK

Для успешной компиляции скетча для HID Joystick необходима библиотека ArduinoJoystickLibrary by Matthew Heironimus: https://github.com/MHeironimus/ArduinoJoystickLibrary.

3. HID KEYBOARD

При написании скетча для HID Keyboard потребовался грязный хак в библиотечном коде в файле (Arduino 1.8.3 и более поздние):

installation_folder\Arduino\libraries\Keyboard\src\Keyboard.cpp

До внесения изменений:

//////////////////////////////
//   Before
//////////////////////////////
#define SHIFT 0x80
const uint8_t _asciimap[128] =
{
  0x00,             // NUL
  0x00,             // SOH
  0x00,             // STX
  0x00,             // ETX
  0x00,             // EOT
  0x00,             // ENQ
  0x00,             // ACK
  0x00,             // BEL
после:
//////////////////////////////
//   After
//////////////////////////////
#define SHIFT 0x80
const uint8_t _asciimap[128] =
{
  0x00,             // NUL
  0x65,             //    (VK_APPS)          0x01
  0x2D,             // -  (VK_OEM_MINUS)     0x02
  0x2E,             // +  (VK_OEM_PLUS)      0x03
  0x31,             // |  (VK_OEM_5)         0x04
  0x2A,             // BS (VK_BACK)          0x05
  0x00,             // ACK
  0x00,             // BEL
Например, значение ячейки подстановочной таблицы с индексом 1:
0x65,             //    (VK_APPS)          0x01
0x65 - код, который USB библиотека отправляет в систему, чтобы заставить Windows выработать клавиатурное событие с кодом VK_APPS (клавиша Menu).

VK_APPS - клавиатурное событие, которое происходит в Windows, когда USB HID отправляет код 0x65.

0x01 - код (индекс, смещение в таблице) который Keyboard.press(код)/Keyboard.release(код) будет транслировать в 0x65.

Подстановочные коды взяты здесь http://www.usb.org/developers/hidpage/Hut1_12v2.pdf, Table 12: Keyboard/Keypad Page.

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


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

Под автономным программированием понимается программирование без использования Arduino IDE, минуя процесс компиляции. Однако, установки Arduino IDE не избежать из-за папки с драйверами на плату Leonardo (Pro Micro).

Программирование очень простое, несмотря на то, что определение порта бутлоадера в леонарде является трюком.
Для определения порта запускается программа bootfinder.exe, которая перестраивает видимый в диспетчере порт леонарды на бодовую скорость 1200, это активирует бутлоадер.
Порт Arduino Leonardo системе исчезает и повляется порт бутлоадера Arduino Leonardo bootloader. Чтобы узнать значение этого порта запускается программа listComPorts.exe для получения списка портов.
Список анализируется и по VID=2341/PID=0036 бутлоадера определяется имя порта, которое используется программатором avrdude.exe при программировании.

Процесс автоматизирован (кроме указания порта Arduino Leonardo) и на практике нужно проделать следующее:

1) достать из архива leonardo_valves_kbd_joy.zip папку leonardo_valves_programming_set_joy_and_kbd и разместить в удобном месте;
2) подключить плату;
3) открыть диспетчер устройств;
4) определить имя порта Arduino Leonardo;

Рис.2

5) открыть файл prog_joy.bat (если программируем как джойстик или prog_kbd.bat, если как клавиатуру) и отредактировать первую строчку с именем порта Arduino Leonardo (рис.3);

Рис.3

6) запустить на выполнение файл prog_joy.bat (prog_kbd.bat).

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