Mein aktuelles Projekt soll folgendes können:
Ich möchte ein Handheld für meine CNC-Maschine realisieren. Das Steuerprogramm unterstützt leider keinen Handbedienteil und Shortcuts für Funktionen sind hier leider Mangelware. Mein Gerät soll dann z.B. bei einem Tastendruck eine "Alt + A + U"-Sequenz senden um eine Funktion auszuführen. Das funktioniert ja prinzipiell schon.
Ausgangsbasis ist: http://www.practicalarduino.com/projects/virtual-usb-keyboard
Soweit habe ich mich in die USB-Keyboard-Bibliothek schon eingearbeitet, dass ich die um die fehlenden Tasten ergänzen kann.
Jetzt brauch ich aber mehr Tasten als mein Freeduino anbietet, daher will ich das mit einer KeyPad-Matrix lösen.
Hier ist meine Quelle das mitgelieferte Beispiel "Custom Keypad bzw. Dynamic Keypad"
Den Code versuchte ich zu erweitern, aber irgendwie werden meine Matrixdaten (für Testzwecke auf 2x2 abgespeckt) nicht ausgewertet.
Die "Extra Schalter" sind hier nur als Test noch im Code zu finden- Funktionieren die, kann ich sehen ob das Keyboard vom Windows-System erkannt wird. Die "delayMs(80);" sollen dem Prellen der Taster entgegenwirken, ist aber auch noch nicht das gelbe vom Ei ;(
Kann mir hier jemand sagen was da im Code nicht stimmt? Als absoluter Newbie finde ich den Fehler nicht.
#include <Keypad.h> #include "UsbKeyboard.h" // Extra Schalter #define BUTTON_ENTER 8 #define BUTTON_RED 9 #define BUTTON_BLUE 10 // DEfinition der Matrix const byte ROWS = 2; const byte COLS = 2; char hexaKeys[ROWS][COLS] = { {'A','B'}, {'C','D'}, }; byte rowPins[ROWS] = {11, 12}; byte colPins[COLS] = {6, 7}; Keypad cusomKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); // LED für Extra Schalter int ledPin = 3; void setup() { Serial.begin(9600); // Initialisieren der LED pinMode (ledPin, OUTPUT); digitalWrite (ledPin, HIGH); pinMode (BUTTON_RED, INPUT); pinMode (BUTTON_BLUE, INPUT); pinMode (BUTTON_ENTER, INPUT); // aktiviert die internen PullUp digitalWrite (BUTTON_RED, HIGH); digitalWrite (BUTTON_BLUE, HIGH); digitalWrite (BUTTON_ENTER, HIGH); // Disable timer0 since it can mess with the USB timing. Note that // this means some functions such as delay() will no longer work. TIMSK0&=!(1<<TOIE0); // Clear interrupts while performing time-critical operations cli(); // Force re-enumeration so the host will detect us usbDeviceDisconnect(); delayMs(250); usbDeviceConnect(); // Set interrupts again sei(); } /** * Main program loop. Scan for keypresses and send a matching keypress * event to the host * FIXME: currently repeats as fast as it can. Add transition detection */ void loop() { // Einlesen der Matrix und serielle Ausgabe des Ergebnisses char customKey = cusomKeypad.getKey(); if (customKey != NO_KEY){ Serial.println(customKey); } // Einlesen der Extraschalter UsbKeyboard.update(); if (digitalRead(BUTTON_RED) == LOW) { delayMs(80); UsbKeyboard.sendKeyStroke(KEY_R); digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED } if (digitalRead(BUTTON_BLUE) == LOW) { UsbKeyboard.sendKeyStroke(KEY_H, MOD_SHIFT_LEFT); UsbKeyboard.sendKeyStroke(KEY_E); UsbKeyboard.sendKeyStroke(KEY_L); UsbKeyboard.sendKeyStroke(KEY_L); UsbKeyboard.sendKeyStroke(KEY_O); UsbKeyboard.sendKeyStroke(KEY_SPACE); UsbKeyboard.sendKeyStroke(KEY_W, MOD_SHIFT_LEFT); UsbKeyboard.sendKeyStroke(KEY_O); UsbKeyboard.sendKeyStroke(KEY_R); UsbKeyboard.sendKeyStroke(KEY_L); UsbKeyboard.sendKeyStroke(KEY_D); UsbKeyboard.sendKeyStroke(KEY_ENTER); digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED } if (digitalRead(BUTTON_ENTER) == LOW) { delayMs(80); UsbKeyboard.sendKeyStroke(KEY_E); digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED } } /** * Define our own delay function so that we don't have to rely on * operation of timer0, the interrupt used by the internal delay() */ void delayMs(unsigned int ms) { for (int i = ; i < ms; i++) { delayMicroseconds(1000); } }
vor 1 year 34 weeks
was macht eigentlich diese Zeile genau?
wenn ich die entferne, cli() und sei() ebenfalls, dann funktioniert das mit der Matrix. Allerdings funktioniert dann das USB-Keyboard nicht mehr.
Login or register to post comments