sobota, 15 lipca 2023

Panel do gry SimRail (aktualizacja: 20.02.2025)

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 j = 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();
 pinMode(49, OUTPUT);
}

// https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers/
void loop() {

 i = 23; // otwarcie drzwi lewych
 j = 31; // otwarcie drzwi prawych
 if (digitalRead(i) == LOW || digitalRead(j) == LOW) {

  Keyboard.press('g');
  delay(250);
  Keyboard.release('g');

  digitalWrite(49, HIGH); // zaświecenie kontrolki
 }
 i = 47; // zamknięcie drzwi
 if (digitalRead(i) == LOW) {
  digitalWrite(49, LOW); // wygaszenie kontrolki

  Keyboard.press(178);
  delay(1000);
  Keyboard.release(178);

  Keyboard.press('o');
  delay(50);
  Keyboard.release('o');

  Keyboard.press('k');
  delay(50);
  Keyboard.release('k');

  stanKlawisza[i] = HIGH;
 }

 klawisz(2, '=');
 klawisz(3, '1');

 klawisz(9, 179);  // Tab
 //klawisz(9, 178); // BACKSPACE
 klawisz(22, '-');
 klawisz(37, '\\');
 
 klawisz(28, 220); // NUM /
 klawisz(52, 218); // UP ARROW
 klawisz(29, 217); // DOWN ARROW
 klawisz(36, 221); // NUM *
 klawisz(44, 235); // NUM .
 klawisz(51, 226); // NUM 2
 klawisz(30, 230); // NUM 6
 klawisz(43, 232); // NUM 8
 
 klawisz(39, 'h');
 klawisz(23, 'i');
 klawisz(53, 'j');
 //klawisz(47, 'o');
 klawisz(31, 'p');
 klawisz(46, 'z');

 klawisz(27, 'A');
 klawisz(35, 'C');

 i = 45; // radio
 if (digitalRead(i) == LOW && stanKlawisza[i] == LOW) {
  // nadawanie
  Keyboard.press('`');
  delay(50);
 } else if (digitalRead(i) == LOW && stanKlawisza[i] == HIGH) {
  // poczatek nadawania
  Keyboard.press(128);
  delay(50);
  Keyboard.press('M');
  delay(50);
  Keyboard.release('M');
  delay(50);
  Keyboard.release(128);
  delay(50);
  Keyboard.press('`');
  delay(50);
  stanKlawisza[i] = LOW;
 } else if (digitalRead(i) == HIGH && stanKlawisza[i] == LOW) {
  // koniec nadawania
  Keyboard.release('`');
  delay(50);
  Keyboard.press(128);
  delay(50);
  Keyboard.press('M');
  delay(50);
  Keyboard.release('M');
  delay(50);
  Keyboard.release(128);
  delay(50);
  stanKlawisza[i] = HIGH;
 }

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