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 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;
}
}