/*
von Tom Igoe für usb-Tastatur-Emulation
geändert am 11. Nov. 2013
von Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/KeyboardMessage
angepasst für Engine Driver als Tastatur von Henner 11 Feb 2024
Leonardo auf com13 funktioniert in meiner Umgebung. Unprogrammierten
Mikro einstecken und im
Gerätemanager nachsehen, welcher Com-Port verwendet wird, bevor man
die Arduino IDE (Entwicklungssoftware) startet.
Die Bibliotheken Keyboard.h und Bounce2.h muessen geladen sein.
Der Pro Micro ist pingelig, wenn er als USB-Tastaturgerät programmiert wird,
da jede Eingabe
an das aktuelle Programm weitergeleitet wird , auch an den Arduino-Editor.
Um dies zu vermeiden, geht beim Programmieren wie folgt vor:
1. Waehrend des Einsteckens die Taste "Licht" (Pin2) drücken. Dadurch wird das
Programm angehalten, bevor die USB-Tastatur aktiviert wird.
2. Kompiliert das Programm und haltet die Taste gedrückt, bis der Upload
abgeschlossen ist.
3. Steckt es in ein Handy, auf dem der Engine Driver läuft, ohne den
"Licht"-Knopf zu drücken!
*/
Es muss ein Arduino Pro Micro Board sein!
#include "Keyboard.h" // Header-Dateien aus Bibliothek für Tastatur
// und Entpreller laden
#include <Bounce2.h> // Bounce ist eine Bibliothek zur Entprellung von
//Eingängen
// Alle digitalen Eingänge sind entprellt, so dass sie nur einmal einen Code senden
// Instanziiert ein Bounce-Objekt (Muss man nicht verstehen...)//
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
//Bounce debouncer4 = Bounce(); // und so weiter
// Belegung der digitalen Eingangspins
int Hupe = 4; // Taster zwischen Pin 4 und GND
int Licht = 2; // Taster zwischen Pin 2 und GND
int Reverser = 5; // Einpoliger Schalter zwischen Pin 5 und GND
//int SomeOtherFunction = 12; // Pins 6..12 können für zusätzliche Eingänge
//verwendet werden, Funktion ist nur ein
// Platzhalter
int analogPin = A0; // Potentiometerschleifer (mittlere Klemme) an Analog-Pin A0
// angeschlossen
// äußere Anschluesse an Masse und +5V
int val = 0; // Variable zur Speicherung des abgelesenen Potentiometerwerts
int CabSpeed = 0;
int OldCabSpeed = 0;
char command[10];
unsigned long previousmillis = 0; // speichert das letzte Mal, als das Poti aktualisiert wurde
const long interval = 20; // Intervall, in dem das Poti aktualisiert werden soll
void setup() {
// Eingänge mit internem Pullup:
pinMode(Hupe, INPUT_PULLUP);
pinMode(Licht, INPUT_PULLUP);
pinMode(Reverser, INPUT_PULLUP);
digitalWrite(Licht,HIGH);
delay (200);
if(!digitalRead(Licht)){ // Wenn Licht beim Einschalten gedrückt wird, hängt sich
//der Arduino auf, kann aber programmiert werden
while(true); // Dies wurde gemacht, um zu verhindern, dass ein bereits
// programmierter Chip die Tastatur über USB ansteuert.
}
debouncer1.attach(Reverser); // Entpreller 1, 2 und 3 einschalten und den Pins zuweisen
debouncer1.interval(5); // Entprellzeit in ms
debouncer2.attach(Licht);
debouncer2.interval(5);
debouncer3.attach(Hupe);
debouncer3.interval(5);
// Wenn mehr Eingänge verwendet werden, hier entprellen.
// Kontrolle über die Tastatur initialisiere
Keyboard.begin();
delay (1000);
if ( Reverser == LOW ) { // Synchronisieren von Handy und Schalter
Keyboard.press(']'); // vorwaerts
Keyboard.releaseAll(); // muss offensichtlich sein...
}
else {
Keyboard.press('['); // rueckwaerts
Keyboard.releaseAll();
}
}
void loop() {
debouncer1.update(); // Arduino spezifisch, muss oft gerufen werden
debouncer2.update();
debouncer3.update();
// debouncer4.update();
unsigned long currentmillis = millis(); // die aktuelle Zeit lesen
if (currentmillis - previousmillis >= interval) { // prüfen, ob die Fahrregler aktualisiert
// werden muss
previousmillis = currentmillis;
val = analogRead(analogPin); // Poti lesen
CabSpeed = map(val, 0, 1023, 0, 100); // in 0..100 umrechnen
if (CabSpeed != OldCabSpeed){
OldCabSpeed = CabSpeed;
// Serial.print(CabSpeed); //Debug md
// Serial.print(" "); //Debug md
sprintf(command,"S%0.3i",CabSpeed); // Format S000 ... S100
Keyboard.print(command); //
// Serial.println(command); //Debug md
}
}
// Taster/Schalter auslesen
if ( debouncer1.rose() ) { // Hat sich der Schalter bewegt, ansteigendes Signal ?
Keyboard.press(']'); // Vorwärts
Keyboard.releaseAll(); //
}
else if ( debouncer1.fell() ) {
Keyboard.press('['); // Rückwärts
Keyboard.releaseAll();
}
if ( debouncer2.fell() ) { // Schaltet nur um wenn nochmal gedrueckt
Keyboard.print("F00"); // Licht
}
if ( debouncer3.changed() ) { // Schaltet um bei Druecken und Loslassen
Keyboard.print("F01"); // Hupe
}
}