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