sobota, 15 lipca 2023

Panel do gry SimRail (aktualizacja: 18.07.2023)

Od kilku miesięcy gram w polski symulator kolejowy SimRail. Niedawno na forum gry trafiłem na post pokazujący panel sterowniczy zrobione przez jednego z użytkowników. Natchnął mnie on do zrobienia podobnego. Postanowiłem zastosować Arduino Due - ma ono dwie wady - cenę i wielkość, ale ma też kilka zalet:

  • ma dużo wyprowadzeń, a przycisków do obsługi jest stosunkowo dużo
  • może emulować klawiaturę bez wgrywania dodatkowych zewnętrznych plików
  • oprogramowanie jest bardzo proste
  • elektryczne połączenia również są bardzo proste

Powoli dodaję kolejne przyciski, więc przyjemność gry z nowym panelem wciąż wzrasta.

Sprzęt:

Kod programu:

#include <Keyboard.h>
int i = 0;
int stanKlawisza[54] = {};

void setup() {
  for (int i = 2; i < 55; i++)
  {
    if (stanKlawisza[i] == NULL) {
      stanKlawisza[i] = HIGH;
    }
    pinMode(i, INPUT_PULLUP);
  }
  Keyboard.begin();
}

// https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers/
void loop() {
  klawisz(2, '=');
  klawisz(3, 'o');
  klawisz(9, 178); // BACKSPACE
  klawisz(22, '-');
  klawisz(23, 'i');
  klawisz(28, 220); // NUM /
  klawisz(29, 217); // DOWN ARROW
  klawisz(31, 'p');
  klawisz(30, 230); // NUM 6
  klawisz(36, 221); // NUM *
  klawisz(37, '\\');
  klawisz(39, 'h');
  //klawisz(45, 'spryskiwacz');
  klawisz(43, 232); // NUM 8
  klawisz(44, 235); // NUM .
  klawisz(46, 'z');
  klawisz(51, 226); // NUM 2
  klawisz(52, 218); // UP ARROW
  klawisz(53, 'J');

  i = 45; // hamulec - nastawnik czy nastawnik - hamulec
  if ((digitalRead(i) == LOW && stanKlawisza[i] == HIGH) || (digitalRead(i) == HIGH && stanKlawisza[i] == LOW)) {
    klawisz(4, 222); // NUM -
    klawisz(5, 223); // NUM +
    klawisz(7, 227); // NUM 3
    klawisz(8, 233); // NUM 9
    stanKlawisza[i] = LOW;
  }
  else if ((digitalRead(i) == LOW && stanKlawisza[i] == LOW) || (stanKlawisza[i] == HIGH)) {
    klawisz(4, 227); // NUM 3
    klawisz(5, 233); // NUM 9
    klawisz(7, 222); // NUM -
    klawisz(8, 223); // NUM +
    stanKlawisza[i] = HIGH;
  }

  i = 38; // wesołe Pendolino
  if (digitalRead(i) == LOW && stanKlawisza[i] == HIGH) {
    Keyboard.press('h');
    delay(750);
    Keyboard.release('h');
    delay(250);
    Keyboard.press('j');
    delay(600);
    Keyboard.release('j');
    delay(300);
    Keyboard.press('h');
    delay(250);
    Keyboard.release('h');
    stanKlawisza[i] = HIGH;
  }
}

void klawisz(int i, int l) {
  if (digitalRead(i) == LOW && stanKlawisza[i] == HIGH) {
    Keyboard.press(l);
    delay(50);
    stanKlawisza[i] = LOW;
  }
  if (digitalRead(i) == HIGH && stanKlawisza[i] == LOW) {
    Keyboard.release(l);
    delay(50);
    stanKlawisza[i] = HIGH;
  }
}