Ich schau mir bei Gelegenheit vielleicht mal noch das mit dem Skript an, aber schön, dass es soweit mal funktioniert.
Beiträge von Seppl1
-
-
Genau. Ich dachte du hättest das bereits so.
-
ich müsste für die achse eine richtung, also pos oder neg ausschalten. hau ich dem ding nämlich eine vor den latz, löst er 2 mal aus.
Da du bei SENSE_Y_NEG_KEY 0 hast, ist das eigentlich schon deaktiviert. Du könntest vielleicht mal die debounceTime (Zeile 109) vergrößern. Falls du die lieber für jede Achse separat einstellen willst, braucht es eine kleine Codeänderung.
-
Also, der Reihe nach:
dir sind nicht zufällig dehnmesstreifen (oder ähnliches) in erschwinglich preislicher art bekannt, die man an so 'nen arduino dran machen könnte?
Nicht wirklich. Piezos erzeugen ja eine Spannung, wenn sie Druck abbekommen bzw. minimal verformt werden. Die werden bei Arduinos z.B. als Vibrationssensor verwendet, aber wenn man da z.B. ein Gummiband befestigen könnte, müsste das eine Spannung abhängig vom Zug am Band ausgeben. Allerdings nur so rein theoretisch.
Wenn du googelst findest du aber bestimmt auch Dehnmessstreifen die man mit nem Arduino auslesen kann.wegen meines start-programms - müsste da einfach als zeile 1 "Keyboard.println(" C:\Users\the ratman\Spiele\pbfx3.bat");" rein?
Naja, auf jeden Fall nicht in Zeile 1. Aber wenn man es ans Ende der setup Funktion setzt, wird nichts anderes passieren, als ob du diese Zeichenfolge einfach per Tastatur eintippen und Enter drücken würdest. Also wenn du schon die Kommandozeile offen hast, würde das sogar funktionieren, aber im Allgemeinen nicht. Man müsste aber im Prinzip nur noch per Tastenkürzel die Kommandozeile öffnen, dann könnte das hinhauen.
wenn der sensor auslöst, was er grade wirklich super macht, dann drückt quasi der arduino z.b. die space-taste nicht lange genug.
Das ist schnell gelöst: Du musst nur zwischen Keyboard.press() und Keyboard.release() in Zeile 101 und 104 jeweils noch eine Zeile mit delay(50); einfügen. Kannst auch mit dem Wert noch etwas rumspielen, das ist einfach wieviele Millisekunden es gedrückt bleibt.
-
Spüldienst?
-
Also, dass es ständig "m" schreibt, liegt sicher an den noch nicht gesetzten Referenzwerten.
Der 2. Code schreibt nur in die Konsole, die Textdatei würde nämlich sehr schnell sehr lang werden. Wenn dir das aber lieber ist musst du nur in Zeile 44, 53 und 55 Serial.println durch Keyboard.println ersetzen.
Der 2. Code wird nach dem einstecken sofort anfangen ständig eine Zahl zu schreiben. Wenn die Tastatur ruhig steht sollte das immer (nahezu) der gleiche Wert sein, den trägst du dann als Referenzwert für die x-Achse ein. (Im ersten Code Zeile 46, im 2. Code Zeile 22). Solange dieser Referenzwert noch nicht stimmt, wird es auch ständig "negative hit" oder "positive hit" schreiben.
Danach kannst du testen, ob der Grenzwert zum triggern i.O. ist, dafür am Besten in Zeile 44 (2. Code) das Serial.println (bzw. Keyboard.println) auskommentieren. Dann sollte es nur bei einem erkannten Hit entsprechend "positive/negative hit" schreiben. Wenn dir das zu früh/spät kommt den Wert in Zeile 47 (1. Code) bzw. 23 (2. Code) ändern.Dann machst du das Gleiche nochmal für die y-Achse, also im 2. Code in Zeile 69/70 die x-Achse auskommentieren und y aktivieren.
-
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?
-
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.