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:
- Arduino Due
- nakładka na Arduino Mega DFRobot DFR0921
- skrzynka narzędziowa Patrol Tandem B 400
- różne przełączniki monostabilne
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;
}
}