I needed keyboard support for a project where I could plug a keyboard in to a live Arduino based box so that I could monitor things and change parameters stored in eeprom but without having to use a computer or turning off the box.
Plugging/unplugging the keyboard live was my main problem with previous PS2Keyboard libraries but I also wanted shifted keys to work properly with the caps lock light too.
The solution I came up with is based on PS2Keyboard but modified extensively. I've gone for functionality rather than small code size so this version will take up about 2500 bytes of code space. I also went for ease of use at the calling level, hence shifting and caps lock is all done within the library. <alt> and <ctrl> are also handled but the user has to "read" these as extra information and use them themselves.
Heres an example sketch:
#include <PS2Keyboard.h>
// Simple test program for new PS2Keyboard library
// Connect a PS2 keyboard to pins 3 & 4 (CLK and DATA respectively) and supply 5V to the keyboard
// For examples, see here: http://www.arduino.cc/playground/ComponentLib/Ps2mouse
// or here: http://www.beyondlogic.org/keyboard/keybrd.htm
// That second article is a great place to start if you want to understand whats going on
//
// When you've compiled the code and uploaded it to the board, start a serial monitor at
// 9600bd. Then press keys on your PS2 keyboard (the one connected to Arduino, not the one
// connected to your computer!) Try using <shift>, <ctrl> and <alt> keys
// and check that the caps_lock key sets the caps_lock light.
// Pressing <esc> key should reset the keyboard and you should see all 3 lights go on briefly.
#define KBD_CLK_PIN 3
#define KBD_DATA_PIN 4
PS2Keyboard keyboard;
void setup() {
keyboard.begin(KBD_DATA_PIN);
Serial.begin(9600);
delay(1000);
}
#define is_printable(c) (!(c&0x80)) // don't print if top bit is set
void loop() {
if(keyboard.available()) {
// reading the "extra" bits is optional
byte extra = keyboard.read_extra(); // must read extra before reading the character byte
byte c = keyboard.read();
boolean ctrl = extra & 1; // <ctrl> is bit 0
boolean alt = extra & 2; // <alt> is bit 1
if (ctrl) Serial.print('^');
if (alt) Serial.print('_');
if (c==PS2_KC_UP) Serial.print("up\n");
else if (c==PS2_KC_DOWN) Serial.print("down\n");
else if (c==PS2_KC_BKSP) Serial.print("backspace\n");
else if (c==PS2_KC_ESC) { Serial.print("escape and reset\n"); keyboard.reset(); }
else if ( is_printable(c) ) Serial.print(c); // don't print any untrapped special characters
}
}
and here's the code (sorry not bundled up into a library I'm afraid - haven't tried that yet. I just overwrote the PS2Keyboard.cpp and PS2Keyboard.h files with my own version.