Also, anbei mal eine erste Version.
- Aktuell wird nach den Strings Enter gedrückt, falls das nicht so sein soll, einfach das "println" jeweils durch "print" ersetzen.
- Generell ist der Teil zu den Strings nicht unbedingt schön (insb. falls er jemals erweitert werden sollte), aber er sollte funktionieren.
- Man muss sicher noch mit "minBump" einstellen, wie sensibel der Beschleunigungssensor sein soll. Könnte mir vorstellen, dass es so noch etwas zu sensibel ist und der Wert höher sein sollte.
- Wenn du die Tastatur einsteckst, solltest du sie hinstellen und kurz ruhig stehen lassen, dann wird dieser Wert für die Beschleunigung (die Erdbeschleunigung) als Referenz verwendet. Da alle 3 Sensoren gleich behandelt werden, sollte es aktuell auch relativ egal sein, wie der Sensor positioniert ist.
- Nach einem Tilt wird 2s jede Beschleunigung ignoriert, den Wert könnte man vermutlich noch runter setzen, aber ich denke Tilt wird nicht so oft benötigt?
- Wegen dem Starten/Ausführen von nem Batch Skript: Ich denke da ist es sinnvoller einen Service zu erstellen, der das Skript ausführt, wenn das USB-Gerät erkannt wird. Unter Linux wäre das kein Problem, wie das unter Windows funktioniert kann ich dir aber nicht sagen. Dabei sollte man aber beachten, dass die USB VendorID und ProductID standardmäßig bei jedem Pro Micro gleich sein wird, also evtl. braucht es noch etwas anderes um genau diese Gerät zu identifizieren, sonst startet es auch bei deinem HandGamer.
C
#include <Keyboard.h>
/*
flipper gross
*/
// ---------------------------------
// KEYS
#define RS_KEY 0x85
#define LS_KEY 0x81
#define R_KEY 0xB0
#define EC_KEY 0xB1
#define XX_KEY 0x00
#define UP_KEY 0xDA
#define RT_KEY 0xD7
#define LF_KEY 0xD8
#define DN_KEY 0xD9
#define SP_KEY 0x20
// STRINGS
#define N1_STRING "BUCHSTABENFOLGE1"
#define N2_STRING "BUCHSTABENFOLGE2"
// PINS
#define RS_PIN 2
#define LS_PIN 3
#define R1_PIN 4
#define N1_PIN 5
#define N2_PIN 6
#define R2_PIN 7
#define EC_PIN 8
#define XX_PIN 9
#define SENSE_X_PIN A3
#define SENSE_Y_PIN A2
#define SENSE_Z_PIN A1
#define UP_PIN 15
#define RT_PIN 14
#define LF_PIN 16
#define DN_PIN 10
// ---------------------------------
// Button helper class for handling press/release and debouncing
class button {
public:
const char key;
const uint8_t pin;
button(uint8_t k, uint8_t p) : key(k), pin(p) {}
void press(boolean state) {
if (state == pressed || (millis() - lastPressed <= debounceTime)) {
return; // Nothing to see here, folks
}
lastPressed = millis();
state ? Keyboard.press(key) : Keyboard.release(key);
pressed = state;
}
void update() {
press(!digitalRead(pin));
}
private:
const unsigned long debounceTime = 30;
unsigned long lastPressed = 0;
boolean pressed = 0;
};
class sensor {
public:
const int pin;
int ref;
int minBump;
sensor(int p, in mB) : pin(p), minBump(mB) {}
int readraw() {
return analogRead(pin);
}
void setref() {
ref = readraw();
}
bool hit() {
return (abs(readraw() - ref) > minBump);
}
void tilt() {
if (!(hit()) || (millis() - lastHit <= debounceTime)) {return;}
lastHit = millis();
Keyboard.press(SP_KEY);
Keyboard.release(SP_KEY);
}
private:
const unsigned long debounceTime = 2000;
unsigned long lastHit = 0;
};
void failsafe() {
for (;;) {} // Just going to hang out here for awhile :D
}
void typeName(int pin) {
if (digitalRead(pin)) {return;}
if (pin == N1_PIN) {
Keyboard.println(N1_STRING);
} else if (pin == N2_PIN) {
Keyboard.println(N2_STRING);
}
delay(1500);
}
// Button objects, organized in array
button buttons[] = {
{RS_KEY, RS_PIN},
{LS_KEY, LS_PIN},
{R_KEY, R1_PIN},
{R_KEY, R2_PIN},
{EC_KEY, EC_PIN},
{UP_KEY, UP_PIN},
{RT_KEY, RT_PIN},
{LF_KEY, LF_PIN},
{DN_KEY, DN_PIN},
};
sensor sensors[] = {
{SENSE_X_PIN, 100},
{SENSE_Y_PIN, 100},
//{SENSE_Z_PIN, 100},
};
const uint8_t NumButtons = sizeof(buttons) / sizeof(button);
const uint8_t NumSensors = sizeof(sensors) / sizeof(sensor);
const uint8_t ledPin = 17;
const unsigned long hitDebounceTime = 2000;
unsigned long lastHit = 0;
bool anyHit() {
for (int i=0; i < NumSensors; i++) {
if (sensors[i].hit()) {
return 1;
}
}
return 0;
}
void anyTilt() {
if (!(anyHit()) || (millis() - lastHit <= hitDebounceTime)) {return;}
lastHit = millis();
Keyboard.press(SP_KEY);
Keyboard.release(SP_KEY);
}
void setup() {
// Safety check. Ground pin #1 (RX) to cancel keyboard inputs.
pinMode(1, INPUT_PULLUP);
if (!digitalRead(1)) {
failsafe();
}
// Set LEDs Off. Active low.
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
TXLED0;
for (int i = 0; i < NumButtons; i++) {
pinMode(buttons[i].pin, INPUT_PULLUP);
}
delay(2000); // Wait for device to be at rest after plugging it in before setting reference g force.
for (int i = 0; i < NumSensors; i++) {
pinMode(sensors[i].pin, INPUT); // not really necessary, just to be sure
sensors[i].setref();
}
pinMode(N1_PIN, INPUT_PULLUP);
pinMode(N2_PIN, INPUT_PULLUP);
}
void loop() {
for (int i = 0; i < NumButtons; i++) {
buttons[i].update();
}
anyTilt();
typeName(N1_PIN);
typeName(N2_PIN);
}
Alles anzeigen