JM 2018/12/4 Using and stripped-down version of A scale with Arduino and AndroWish here is an interface to a PS2 keyboard.
The arduino is programmed with this: https://github.com/PaulStoffregen/PS2Keyboard
/* PS2Keyboard library example PS2Keyboard now requries both pins specified for begin() keyboard.begin(data_pin, irq_pin); Valid irq pins: Arduino Uno: 2, 3 Arduino Due: All pins, except 13 (LED) Arduino Mega: 2, 3, 18, 19, 20, 21 Teensy 3.0: All pins, except 13 (LED) Teensy 2.0: 5, 6, 7, 8 Teensy 1.0: 0, 1, 2, 3, 4, 6, 7, 16 Teensy++ 2.0: 0, 1, 2, 3, 18, 19, 36, 37 Teensy++ 1.0: 0, 1, 2, 3, 18, 19, 36, 37 Sanguino: 2, 10, 11 for more information you can read the original wiki in arduino.cc at http://www.arduino.cc/playground/Main/PS2Keyboard or http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html Like the Original library and example this is under LGPL license. Modified by [email protected] on 2010-03-22 Modified by Paul Stoffregen <[email protected]> June 2010 */ #include <PS2Keyboard.h> const int DataPin = 4; const int IRQpin = 3; PS2Keyboard keyboard; void setup() { delay(1000); keyboard.begin(DataPin, IRQpin); Serial.begin(9600); Serial.println("OK"); } void loop() { if (keyboard.available()) { // read the next key char c = keyboard.read(); // check for some of the special keys if (c == PS2_ENTER) { Serial.println(); } else if (c == PS2_TAB) { Serial.print("[Tab]"); } else if (c == PS2_ESC) { Serial.print("[ESC]"); } else if (c == PS2_PAGEDOWN) { Serial.print("[PgDn]"); } else if (c == PS2_PAGEUP) { Serial.print("[PgUp]"); } else if (c == PS2_LEFTARROW) { Serial.print("[Left]"); } else if (c == PS2_RIGHTARROW) { Serial.print("[Right]"); } else if (c == PS2_UPARROW) { Serial.print("[Up]"); } else if (c == PS2_DOWNARROW) { Serial.print("[Down]"); } else if (c == PS2_DELETE) { Serial.println("[Del]"); } else { // otherwise, just print all normal characters Serial.println(c); } } }
While Androwish (I actually used Undroidwish on a PC) is running this:
# AndroWish script to interface Arduino with PS2 Keyboard # # Wiring: # # +--------------+ +-------------+ +-----------------+ # | Android | | +5V|---| PS2 | # | Device |--USB--| Arduino GND|---| Keyboard | # | w/ AndroWish | | D4|---|DATA | # +--------------+ | D3|---|CK | # +-------------+ +-----------------+ console show wm attributes . -fullscreen 1 catch {borg screenorientation landscape} sdltk screensaver 0 option add *Radiobutton.borderWidth 3 option add *Radiobutton.highlightThickness 0 option add *Button.borderWidth 3 option add *Button.highlightThickness 0 # Open/reopen serial line to Arduino proc reopen {} { after cancel reopen if {[sdltk android]} { if {[catch { set dev [lindex [usbserial] 0] set ::SCALE(chan) [usbserial $dev] fconfigure $::SCALE(chan) -blocking 0 -translation binary \ -mode 9600,n,8,1 fileevent $::SCALE(chan) readable readv set ::SCALE(value) "online" puts -nonewline $::SCALE(chan) "S" } err]} { sdltk log verbose $err set ::SCALE(value) "offline" after 1000 reopen return } } else { if {[catch { set ::SCALE(chan) [open "COM4" {RDWR}] fconfigure $::SCALE(chan) -translation binary -mode 9600,n,8,1 fileevent $::SCALE(chan) readable readv set ::SCALE(value) "online" } err]} { sdltk log verbose $err puts $err set ::SCALE(value) "off..line" after 1000 reopen return } } # sendc 5 S } # Read data from Arduino proc readv {} { if {[eof $::SCALE(chan)]} { sdltk log verbose "EOF detected" puts "EOF detected" catch {close $::SCALE(chan)} set ::SCALE(value) "offline" after 1000 reopen return } if {[catch {gets $::SCALE(chan) v} err]} { sdltk log verbose $err puts $err catch {close $::SCALE(chan)} set ::SCALE(value) "offline" after 1000 reopen return } puts $v set ::SCALE(value) $v } # Main screen label .weight -textvariable SCALE(value) -font {Courier -160} grid .weight -row 0 -column 0 -columnspan 9 -sticky news grid columnconfigure . 0 -uniform largebutton grid rowconfigure . 0 -weight 12 grid columnconfigure . all -weight 1 reopen