Ne, ich meine das "rütteln" von links/rechts. Du hattest geschrieben, das ist standardmäßig "lshift+strg" und "rshift+strg". Kannst du das auf jeweils eine einzelne Taste abändern?
Beiträge von Seppl1
-
-
Keine Sorge, mich gibt's noch.
War nur die letzten Tage ziemlich beschäftigt bzw. wollte in meiner freien Zeit dann nicht noch mehr vor dem Computer sitzen.
Kannst du die Schubser von links/rechts auf einzelne Tasten legen? In dem Fall sollte es mit dem folgenden Code funktionieren.
- Wenn du die Tasten vergeben hast, musst du in Zeile 18-23 die jeweiligen Keys für Haue von links/rechts/vorne... eintragen. Wenn eine Richtung nicht verwendet wird, sollte der Wert auf 0 gesetzt werden.
- In Zeile 47-52 müssen Referenzwert und Grenzwert für die jeweilige Achse gesetzt werden. Um das besser zu bestimmen kannst du den zweiten Code weiter unten verwenden, damit der Sensor dir jede Malträtierung per serieller Schnittstelle berichtet. Genauer gesagt wird er ständig den aktuellen Sensorwert ausgeben und wenn getriggert wird kommt eine entsprechende Meldung.
C
Alles anzeigen#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 #define SENSE_X_POSITIVE_KEY SP_KEY #define SENSE_X_NEGATIVE_KEY SP_KEY #define SENSE_Y_POSITIVE_KEY SP_KEY #define SENSE_Y_NEGATIVE_KEY 0 #define SENSE_Z_POSITIVE_KEY 0 #define SENSE_Z_NEGATIVE_KEY 0 // 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 // Sensor values // Referenzwert ist der Wert in Ruhe, Threshold ab welchem Ausschlag es reagieren soll #define SENSE_X_REF 0 #define SENSE_X_THRESHOLD 10 #define SENSE_Y_REF 0 #define SENSE_Y_THRESHOLD 10 #define SENSE_Z_REF 0 #define SENSE_Z_THRESHOLD 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 char poskey; const char negkey; const int pin; const int ref; const int minBump; sensor(int pk, int nk, int p, int r, int mB) : poskey(pk), negkey(nk), pin(p), ref(r), minBump(mB){} int readraw() { return analogRead(pin); } bool hit() { int a = readraw(); posHit = a > ref; return abs(a - ref) > minBump; } void tilt() { if (!(hit()) || (millis() - lastHit <= debounceTime)) {return;} lastHit = millis(); if (posHit && poskey) { Keyboard.press(poskey); Keyboard.release(poskey); } else if (negkey) { Keyboard.press(negkey); Keyboard.release(negkey); } } private: const unsigned long debounceTime = 500; unsigned long lastHit = 0; bool posHit; }; 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_POSITIVE_KEY, SENSE_X_NEGATIVE_KEY, SENSE_X_PIN, SENSE_X_REF, SENSE_X_THRESHOLD}, {SENSE_Y_POSITIVE_KEY, SENSE_Y_NEGATIVE_KEY, SENSE_Y_PIN, SENSE_Y_REF, SENSE_Y_THRESHOLD}, //{SENSE_Z_POSITIVE_KEY, SENSE_Z_NEGATIVE_KEY, SENSE_Z_PIN, SENSE_Z_REF, SENSE_Z_THRESHOLD}, }; const uint8_t NumButtons = sizeof(buttons) / sizeof(button); const uint8_t NumSensors = sizeof(sensors) / sizeof(sensor); const uint8_t ledPin = 17; 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); } pinMode(N1_PIN, INPUT_PULLUP); pinMode(N2_PIN, INPUT_PULLUP); } void loop() { for (int i = 0; i < NumButtons; i++) { buttons[i].update(); } for (int i = 0; i < NumSensors; i++) { sensors[i].tilt(); } typeName(N1_PIN); typeName(N2_PIN); }
C
Alles anzeigen#include <Keyboard.h> /* Sensor Test */ // --------------------------------- // KEYS #define SP_KEY 0x20 #define SENSE_X_POSITIVE_KEY SP_KEY #define SENSE_X_NEGATIVE_KEY SP_KEY #define SENSE_Y_POSITIVE_KEY SP_KEY #define SENSE_Y_NEGATIVE_KEY 0 #define SENSE_Z_POSITIVE_KEY 0 #define SENSE_Z_NEGATIVE_KEY 0 // PINS #define SENSE_X_PIN A3 #define SENSE_Y_PIN A2 #define SENSE_Z_PIN A1 // Sensor values // Referenzwert ist der Wert in Ruhe, Threshold ab welchem Ausschlag es reagieren soll #define SENSE_X_REF 0 #define SENSE_X_THRESHOLD 10 #define SENSE_Y_REF 0 #define SENSE_Y_THRESHOLD 10 #define SENSE_Z_REF 0 #define SENSE_Z_THRESHOLD 10 // --------------------------------- class sensor { public: const char poskey; const char negkey; const int pin; const int ref; const int minBump; sensor(int pk, int nk, int p, int r, int mB) : poskey(pk), negkey(nk), pin(p), ref(r), minBump(mB){} int readraw() { return analogRead(pin); } bool hit() { int a = readraw(); Serial.println(a); posHit = a > ref; return abs(a - ref) > minBump; } void tilt() { if (!(hit()) || (millis() - lastHit <= debounceTime)) {return;} lastHit = millis(); if (posHit && poskey) { Serial.println("positive hit"); } else if (negkey) { Serial.println("negative hit"); } } private: const unsigned long debounceTime = 500; unsigned long lastHit = 0; bool posHit; }; void failsafe() { for (;;) {} // Just going to hang out here for awhile :D } sensor sensors[] = { {SENSE_X_POSITIVE_KEY, SENSE_X_NEGATIVE_KEY, SENSE_X_PIN, SENSE_X_REF, SENSE_X_THRESHOLD}, //{SENSE_Y_POSITIVE_KEY, SENSE_Y_NEGATIVE_KEY, SENSE_Y_PIN, SENSE_Y_REF, SENSE_Y_THRESHOLD}, //{SENSE_Z_POSITIVE_KEY, SENSE_Z_NEGATIVE_KEY, SENSE_Z_PIN, SENSE_Z_REF, SENSE_Z_THRESHOLD}, }; const uint8_t NumSensors = sizeof(sensors) / sizeof(sensor); const uint8_t ledPin = 17; 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; } void loop() { for (int i = 0; i < NumSensors; i++) { sensors[i].tilt(); } }
So, jetzt bin ich gespannt ob der Code funktioniert -
Also an inputstreamhelper bzw. Widevine scheint es nicht zu liegen. Für mich sieht es nach Problemen mit dem VPN aus.
-
Ohne [definition=12,0]debug[/definition] [definition='1','0']log[/definition] kann ich da jetzt nicht helfen.
-
Ja, die Ground Pins sind auf dem Board alle direkt miteinander verbunden, man kann die also beliebig verwenden.
-
Hey. Sorry, dass ich mich so lange nicht gemeldet habe, war viel los diese Woche.
Ich werde mich heute oder morgen mal an den Code setzen, damit anstupsen in jede Richtung separat erkannt wird. Welche Werte du dann eintragen musst, kann ich nicht sagen, da werd ich vielleicht noch Code schreiben, der beim bestimmen der Werte hilft.
Könnte es vielleicht auch sein, dass einfach nur die Lötverbindung nicht gut ist? Dann würde der Arduino zufällige Werte auslesen und die dann häufig als Stoß interpretieren.
-
Ich habe vor kurzem bemerkt, dass die Fortschrittsanzeige nichts sinnvolles anzeigt und das extrahieren ziemlich lange dauert. Man muss also einfach viel Geduld mitbringen, es arbeitet im Hintergrund durchaus noch.
-
wenn ich das zeug flashe, geht's - ich krieg zwar keine zahlen oder so, aber die spaces kommen, wie sie sollen und ohne nachträglichen "tick".
Ja, stimmt. Für die Zahlen hätte man noch mehr ändern müssen.
stecke ich den arduino aber ab und wieder an, dann tickt der space wieder.
Hast du nach dem einstecken daran gedacht, ihn ein paar Sekunden ruhig liegen zu lassen? Bei jedem einstecken wird nämlich der Referenzwert ermittelt und dafür muss er (2s nach dem einstecken) ruhig liegen. Wenn die Position/Stellung vom Sensor nicht mehr verändert wird, könnte man den Referenzwert natürlich auch fest einprogrammieren.
-
Das war Zeile 145/146, nicht 81/82.
-
Ersetze mal in Zeile 81/82
Keyboard.press(SP_KEY);
Keyboard.release(SP_KEY);
durch
Keyboard.println(ref);Dann mach einen Texteditor auf und schließ den Arduino an. Wenn du ihn dann schüttelst, sollte er statt einem Leerzeichen den Referenzwert in den Editor schreiben. Wenn er dann alle 2s den selben Wert schreibt, ist was am Code falsch. Wenn aber nach den ersten 2s ein anderer Wert alle 2s geschrieben wird, dann verliert er beim schütteln die Stromversorgung.
-
Muss ich mir später mal nochmal anschauen, aber kann es sein, dass beim schütteln einfach die Stromversorgung vom Arduino kurz gekappt war?
-
Aktuell machen auf jeden Fall nur positive Werte Sinn. -30 bis +30m/s^2 entsprechen einer Spannung zwischen 0 und 3,3V. Der Arduino kann 0-5V mit 10bit Genauigkeit lesen, also 1024 Werte. Spannungen zwischen 0 und 3,3V entsprechen also Werten zwischen 0 und 576. D.h. 1m/s^2 entspricht ungefähr Wert 11,25. Ein paar Beispielwerte:
m/s^2 Sensorwert -30 0 -20 112 -10 225 0 337 2 360 4 382 6 405 8 427 10 450 20 562 30 576
So wie es momentan implementiert ist, muss die Differenz zur "Ruhebeschleunigung" größer sein, als der eingestellte Wert. Wenn der Sensor in Ruhe z.B. waagerecht steht, müsste er 0m/s^2 spüren. Dann bedeutet 100 also, dass es also einfach bei 100 auslöst, also grob bei +/-10m/s^2. Wenn er aber senkrecht steht spürt er in Ruhe die Erdbeschleunigung von knapp 10m/s^2, dann würde er bei 100 also bei 0 oder 20m/s^2 auslösen.Ich weiß nicht, was ich gestern gerechnet hatte, aber ich denke du könntest es mal im Bereich 40-50 versuchen.
-
Ja, Tippfehler. Das soll natürlich "int" sein, nicht "in".
-
könnte man das auch für x und y extra einstellen? denke, x ist nicht so sensibel wie y und z könnte man sowieso total ignorieren.
Hab den Code gerade minimal abgeändert. Z ist deaktiviert und jetzt kannst du in Zeile 115/116 einstellen, ab wann es triggern soll.
für mehr "echtheit" ists auch wichtig, dass ich die richtungen unterscheiden kann, also x+, x- und y. ist zwar rein technisch ned so wichtig, aber würde mehr in richtung "simulation" gehen.
Auslesen lässt sich das natürlich problemlos, aber was willst du damit anfangen? Letztendlich wird doch nur die Leertaste gedrückt, oder? Vielleicht musst du mir mal noch genauer erklären welche Bewegungen es so gibt. Ich hatte bisher angenommen, es gibt einfach nur "dran rütteln".
ich fände es aber deutlich einfacher, wenn man den batch aufruft. das kann ich, da kann ich mich dann gut genug aus, ohne dich zu nerven. also wenn das ginge ...
Wenn es eine Tastenkombination zum öffnen der Kommandozeile gibt, könnte der Arduino die eingeben und danach den Befehl zum ausführen der Batch.
-
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
Alles anzeigen#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); }
-
Bezüglich Amazon: Öffne mal das Addon "Inputstream Helper" und geh auf "Inputstream Helper Informationen".
Wenn da bei Widevine CDM Version 4.10.2391.0 steht, liegt es vermutlich daran. Dann müsstest du entweder eine Testversion von Inputstream Helper installieren oder auf ein Update warten, dass in ein paar Tagen in den Repos sein sollte.Wenn du dann die neue Version von Inputstream Helper hast, musst du darin noch einmal auf "Widevine CDM erneut installieren" gehen.
Eine Testversion findest du hier: Aktuelle Widevine Problematik
oder die aktuellste hier: https://github.com/emilsvennesson…ment-1098497007 -
Pins hat der Pro Micro auf jeden Fall genug und welchen du wofür nutzt ist auch fast egal. Einzige Vorgabe ist, dass der Sensor für jede Achse einen analogen Input braucht, also einen der "grünen" Pins.
-
@JoePeter1000 Danke für die Meldung, ich habe den Fehler gefunden und behoben. Du kannst aber, wie @Gggggggg sagt, auch die neuste Version installieren. Für mich bzw. den Code war das jetzt aber von Vorteil so
-
ich kann also meinen ausgewählten amazonas-sensor kaufen? nur, um 100% sicher zu gehen. nicht dass ich das falsche kauf *g*.
Ja
-
Sehr professioneller Experimentaufbau
. Dann sollte der Sensor ja reichen.