Go Down

Topic: virtuelles USB-Keyboard mit Keypad (Matrix) (Read 546 times) previous topic - next topic

york

Dec 29, 2011, 11:26 pm Last Edit: Dec 29, 2011, 11:28 pm by york Reason: 1
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.
Code: [Select]

#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 = 0; i < ms; i++) {
    delayMicroseconds(1000);
  }
}



cu y.o.r.k
www.york.at.tf

Go Up