Difference between revisions of "Custom bluetooth keyboard"

From SkullSpace Wiki
Jump to navigation Jump to search
m
 
(23 intermediate revisions by one other user not shown)
Line 1: Line 1:
 +
{{Archived}}
 +
 
Bluetooth conversion of a [http://en.wikipedia.org/wiki/Kinesis_(keyboard) Kinesis contour keyboard] to a bluetooth keyboard.
 
Bluetooth conversion of a [http://en.wikipedia.org/wiki/Kinesis_(keyboard) Kinesis contour keyboard] to a bluetooth keyboard.
  
Line 118: Line 120:
 
== Key Matrix ==
 
== Key Matrix ==
 
The creator of the HumbleHacker keyboard replaced the controller in his keyboard and kindly [http://humblehacker.com/blog/20100720/hacking-the-kinesis-contoured-keyboard/ posted] his reverse-engineered key matrix. I have copied them below, with some basic modifications.
 
The creator of the HumbleHacker keyboard replaced the controller in his keyboard and kindly [http://humblehacker.com/blog/20100720/hacking-the-kinesis-contoured-keyboard/ posted] his reverse-engineered key matrix. I have copied them below, with some basic modifications.
 +
 +
(Keywell pin numbers start at 1 closest to the thumb switches and end at 13 towards the function keys)
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|+ Left Keywell
 
|+ Left Keywell
 
|-
 
|-
! Pin !! 6 !! 7 !! 8 !! 10 !! 11 !! 12
+
! Pin  
 +
! width="60" | 6  
 +
! width="60" | 7  
 +
! width="60" | 8  
 +
! width="60" | 10  
 +
! width="60" | 11  
 +
! width="60" | 12
 
|-
 
|-
 
! scope="row" | 1
 
! scope="row" | 1
Line 140: Line 150:
 
|}
 
|}
  
 +
{| class="wikitable"
 +
|+ Right Keywell
 +
|-
 +
! Pin
 +
! width="60" | 1 
 +
! width="60" | 2 
 +
! width="60" | 3 
 +
! width="60" | 6 
 +
! width="60" | 12 
 +
! width="60" | 13
 +
|-
 +
!scope="row" | 4
 +
| UP  || DN  ||  ||  || [  || ]
 +
|-
 +
!scope="row" | 7
 +
| N  || ,  || M  || RS  || .  || /
 +
|-
 +
!scope="row" | 8
 +
| H  || K  || J  || '  || L  || ;
 +
|-
 +
!scope="row" | 9
 +
| Y  || I  || U  || \  || O  || P
 +
|-
 +
!scope="row" | 10
 +
|| 6  || 8  || 7  || -  || 9  || 0
 +
|}
 +
 +
(Thumbswitch pin numbers start at 1 closest to the center of the keyboard and end at 10 towards the keywells)
 +
 +
{| class="wikitable"
 +
|+ Left Thumbswitches
 +
|-
 +
! Pin 
 +
! width="60" | 1 
 +
! width="60" | 2 
 +
! width="60" | 3 
 +
! width="60" | 8
 +
|-
 +
!scope="row" | 4
 +
| SL3  ||  || SL6  || SL4
 +
|-
 +
!scope="row" | 5
 +
|  || SL1  || SL5  || SL2
 +
|}
  
 +
{| class="wikitable"
 +
|+ Right Thumbswitches
 +
|-
 +
! Pin 
 +
! width="60" | 3 
 +
! width="60" | 4 
 +
! width="60" | 5 
 +
! width="60" | 6
 +
|-
 +
!scope="row" | 7
 +
| SR1  ||  || SR2  || SR5
 +
|-
 +
!scope="row" | 8
 +
| SR4  || SR3  || SR6  ||
 +
|}
 +
 +
(Function key pins start with 1 near the USB/PS2 cable and 13 near the keywells)
 +
 +
{| class="wikitable"
 +
|+ Left Function Keys
 +
|-
 +
! Pin 
 +
! width="60" | 2 
 +
! width="60" | 3 
 +
! width="60" | 4 
 +
! width="60" | 6 
 +
! width="60" | 7 
 +
! width="60" | 10 
 +
! width="60" | 11
 +
|-
 +
!scope="row" | 1
 +
| ESC || || || || || F1  || F2
 +
|-
 +
!scope="row" | 5
 +
| F6  || F7  || F8  || || || ||
 +
|-
 +
!scope="row" | 8
 +
| F3  || || || F4  || F5 || ||
 +
|}
 +
 +
{| class="wikitable"
 +
|+ Left Function Keys (Condensed)
 +
|-
 +
! Pin 
 +
! width="60" | 2 
 +
! width="60" | 3,6,10 
 +
! width="60" | 4,7,11
 +
|-
 +
!scope="row" | 1
 +
| ESC  || F1  || F2
 +
|-
 +
!scope="row" | 8
 +
| F3  || F4  || F5
 +
|-
 +
!scope="row" | 5
 +
| F6  || F7  || F8
 +
|}
 +
 +
{| class="wikitable"
 +
|+ Right Function Keys
 +
|-
 +
! Pin 
 +
! width="60" | 1 
 +
! width="60" | 2 
 +
! width="60" | 5 
 +
! width="60" | 8 
 +
! width="60" | 7
 +
! width="60" | 10
 +
! width="60" | 11
 +
|-
 +
!scope="row" | 3
 +
| PG  || KY || || || || ||
 +
|-
 +
!scope="row" | 4
 +
| || || PB || || || ||
 +
|-
 +
!scope="row" | 6
 +
| || || F9  || F10  || F11 || ||
 +
|-
 +
!scope="row" | 9
 +
| || || F12 || || || SL  || PS
 +
|}
 +
 +
{| class="wikitable"
 +
|+ Right Function Keys (Condensed)
 +
|-
 +
! Pin 
 +
! width="60" | 5 
 +
! width="60" | 8/1/11
 +
! width="60" | 7/2/10
 +
|-
 +
!scope="row" | 3/4
 +
| PB  || PG  || KY
 +
|-
 +
!scope="row" | 6
 +
| F9  || F10 || F11
 +
|-
 +
!scope="row" | 9
 +
| F12 || PS  || SL
 +
|}
 +
 +
{| class="wikitable"
 +
|+ Full Matrix
 +
|-
 +
! Pin
 +
! width="60" | A
 +
! width="60" | B
 +
! width="60" | C
 +
! width="60" | D
 +
! width="60" | E
 +
! width="60" | F
 +
! width="60" | G
 +
! width="60" | H
 +
! width="60" | I
 +
! width="60" | J
 +
! width="60" | K
 +
! width="60" | L
 +
! width="60" | M
 +
! width="60" | N
 +
! width="60" | O
 +
|-
 +
!scope="row" | 1
 +
|= || 1 || 2 || 3 || 4 || 5 ||  ||  ||  ||  ||  ||  || F6 || F7 || F8
 +
|-
 +
!scope="row" | 2
 +
|TB || Q || W || E || R || T ||  ||  ||  ||  ||  ||  || F3 || F4 || F5
 +
|-
 +
!scope="row" | 3
 +
|CP || A || S || D || F || G ||  ||  ||  ||  ||  ||  || ESC || F1 || F2
 +
|-
 +
!scope="row" | 4
 +
|LS || Z || X || C || V || B || UP ||  || DN || [ || ] || X1 || F9 || F10 || F11
 +
|-
 +
!scope="row" | 5
 +
|X2 || ` || IN || LT ||  || RT || 6 || 7 || 8 || 9 || 0 || - || F12 || PS || SL
 +
|-
 +
!scope="row" | 6
 +
|  || SL1 ||  || SL2 ||  || SL5 || Y || U || I || O || P ||  || PB || PG || KY
 +
|-
 +
!scope="row" | 7
 +
|SR4 || SR3 || SR6 || SL4 || SL3 || SL6 || H || J || K || L || ; || ‘ ||  ||  ||
 +
|-
 +
!scope="row" | 8
 +
|SR1 ||  || SR2 ||  || SR5 ||  || N || M || , || . || / || RS ||  ||  ||
 +
|}
 +
 +
The Humble Hacker keyboard uses a condensed version of the above matrix, but I wanted to condense it further, retain 8 rows for ease of scanning, and I wanted to be able to split the matrix into left and right handed sections in case I ever decide to split my keyboard physically into two sections. By combining the single-element columns in each thumb cluster, I was able achieve this, with room for an extra 2x3 (less 1) matrix in each half, perfect for mouse buttons and modifiers.
 +
 +
{| class="wikitable"
 +
|+ Condensed Kinesis matrix (original qwerty labelling)
 +
|-
 +
! Pin
 +
! width="60" | 0   
 +
! width="60" | 1 
 +
! width="60" | 2 
 +
! width="60" | 3 
 +
! width="60" | 4 
 +
! width="60" | 5   
 +
! width="60" | 6   
 +
! width="60" | 7   
 +
! width="60" | 8 
 +
! width="60" | 9 
 +
! width="60" | 10 
 +
! width="60" | 11
 +
|-
 +
!scope="row" | 0
 +
| =    || 1  || 2  || 3  || 4  || 5    || 6    || 7    || 8  || 9  || 0  || -
 +
|-
 +
!scope="row" | 1
 +
| TB  || Q  || W  || E  || R  || T    || Y    || U    || I  || O  || P  || \
 +
|-
 +
!scope="row" | 2
 +
| CP  || A  || S  || D  || F  || G    || H    || J    || K  || L  || ;  || ‘
 +
|-
 +
!scope="row" | 3
 +
| LS  || Z  || X  || C  || V  || B    || N    || M    || ,  || .  || /  || RS
 +
|-
 +
!scope="row" | 4
 +
|      || `  || IN || LT ||    || RT    || UP    ||      || DN  || [  || ]  ||
 +
|-
 +
!scope="row" | 5
 +
|      || F6  || F7 || F8 ||    ||      ||      ||      || F9  || F10 || F11 ||
 +
|-
 +
!scope="row" | 6
 +
| BKSP || F3  || F4 || F5 || DEL || LALT || SPACE || ENTER || F12 || PS  || SL  || RCTRL
 +
|-
 +
!scope="row" | 7
 +
| HOME || ESC || F1 || F2 || END || LCTRL  || PGDN  || RALT || PB  || PG  || KY  || PGUP
 +
|}
  
 
= Reference =
 
= Reference =

Latest revision as of 14:37, 4 October 2017

Info.png This page has been archived. All information in this article is historical.

Bluetooth conversion of a Kinesis contour keyboard to a bluetooth keyboard.

Brainstorming

Available approaches

Options Pros Cons
USB HID to bluetooth adapter
  • No modification of the keyboard necessary (for USB versions of the keyboard)
  • Usable on any USB keyboard
  • USB HID host chips are uncommon and expensive
  • Programming USB HID host may be complicated
  • PS/2 version of keyboard may or may not have USB output (though there are USB related markings on the PCB)
    • If capable, would likely require modifications to the original controller board
PS/2 to bluetooth adapter
  • Simpler to decode than USB HID
  • Any microcontroller can be used
  • No modification of the keyboard necessary (for PS/2 versions of the keyboard)
  • Usable on any PS/2 keyboard
  • USB version of keyboard may or may not have PS/2 output
    • If capable, would likely require modifications to the original controller board
Custom replacement keyboard controller with integrated bluetooth
  • Getting data directly from button matrix is likely simpler than decoding some other protocol
  • Opportunity to add extra features
  • Likely better battery life
  • Any microcontroller (with enough IO) can be used
  • Supposedly replacement key wells can be had for < $90 directly from Kinesis. Add on some extra keycaps and the thumb boards and the custom controller and you could have a brand new, bluetooth Kinesis for much less than a brand new one.
    • A case would need to be made, but many people have modded their existing cases so the two halves are physically separated anyway, plus I personally think that the the thumb buttons could be at a slightly better angle, so that could be considered another pro (good use for AsentWorks 3D printer)
  • Kinesis keyboards have some advanced programmability - reimplementing that on a custom controller could take some time
  • Requires interfacing with the key matrix directly which either requires special connectors or soldering to the key matrix

Features

  • Bluetooth module might have audio capabilities in addition to the required HID function
    • Use keyboard as audio extender - include a headphone port in keyboard
    • Kinesis has a key recognition click speaker built in which can be hard to hear when listening to music, but might still annoy others
    • WT12 will do low-fi audio such as a typical BT headset, but does not support analog A2DP (use WT32 instead)
      • Overlay key click sound over bluetooth audio signal
  • USB interface for charging
    • disable bluetooth while charging and instead use the USB connection
  • Saving, editing, and uploading custom keyboard layouts to the keyboard from the computer
    • Cross platform application
    • Keyboard layers could be saved, exported, and uploaded individually
      • Example:
        • Standard keyboards have "qwerty" on the base layer and the shift key brings them to the next layer containing "QWERTY" (assuming qwerty keyboard)
        • The Kinesis firmware has a keypad layer, so when you press the keypad button, the keys under the right hand become a numpad and the shift key moves between the layers of the numpad (numbers or arrows)
      • Separate keys and their shifted values for more finely tuned layouts (can be done in xmodmap in Linux, but this isn't portable/cross platform)
        • May not act as expected in some programs as normally it is the computer that determines the shift's effect on the key, not the keyboard
        • Probably need to take special consideration into key sequences (eg pressing shift then x as opposed to x then shift)
  • Integrated pointing device
  • Bluetooth pedal
    • Needs to connect to the controller directly for most functions, so really only feasible with the custom controller
    • Need to verify keyboard's bluetooth controller can connect to two devices at once (PC and pedal(s))
  • Battery status report via bluetooth
    • Might be able to do this with just the ADC on the micro, but might need something like this for detection
    • WT12 does not directly read battery level (use WT32 instead), though reading with MCU and reporting over SPP link would work

Prototype

The Kinesis Advantages was found to natively support PS/2 output. This was tested using the PS/2 cable from a Kinesis Essential 132 (the 132 was also found to be capable of outputting USB using the Kinesis Advantages USB cable/board). The USB Kinesis Advantage is the first board that is going under the knife. Because of the relative simplicity of reading PS/2 data, this is the method that will be used.

PS/2 communication (according to the Arduino PS/2 library) only requires an interrupt pin and a generic IO pin. The WT12 requires a serial channel. These requirements are pretty basic, so any microcontroller should work fine. Additional IO might be desirable for a BT pairing button, but this feature could also be embedded into a special key combination on the keyboard itself.

To-Do list

  • Order prototype parts
  • Assemble prototype
  • Test PS/2 data aquisition
  • Test bluetooth HID output
  • Determine power consumption (will probably be somewhat high as the keyboard is likely going to not have any kind of power saving mode)
  • Find an appropriate battery
  • Design custom PCB for a final version
  • Order final version parts
  • Assemble final version

Parts

  • Bluegiga WT12 Bluetooth module (serial only breakout board - $40, full breakout board - $50, just the module - $28)
  • Microcontroller development board
    • Arduino (easy to use, PS/2 libraries) - $10-$50
    • ATmega32u4 based dev board (native USB HID output which can be used while plugged in and charging for improved reliability and charging speed) - $15-$40
    • MSP430 (specialize in low power, great for battery operation) - $5+
  • Logic level converter (PS/2 device requires 5v and WT12 requires 3.3v; microcontroller could use either) - $2
  • Power supply (for testing could use bench supply but USB charged Lithium Ion would be good to prototype too)
  • 3v3 voltage regulator - $2
  • Right angle SPDT slide switch with 3mm spacing between pins - for enabling memory lockout feature of the Kinesis pro on other versions of the keyboard - $0.50

Schematic

Block diagram:

VCC1 = 5V     VCC2 = 3V3
------------------------
              VCC1                  VCC1  VCC1               VCC2  VCC2                     VCC1                  VCC2      
 _____________  ^      _____________  ^     ^  _____________  ^     ^  ____________           ^                     ^      
|             |-'     |             |-'     '-|             |-'     '-|            |          |                     |      
|             |       |             |   RTS   |             |   RTS   |            |          |     ___________     |      
|             |       |             |---------|             |---------|            |          |    |           |    |      
|             | CLOCK |             |   CTS   |  LOGIC      |   CTS   |            |          |----|  Voltage  |----|      
|   KINESIS   |-------|   ARDUINO   |---------|  LEVEL      |---------|  BLUEGIGA  |          |    | Regulator |    |      
|             | DATA  |             |   TXD   |  CONVERTER  |   RXD   |  WT12      |         ===   |___________|   ===     
|             |-------|             |---------|             |---------|            |          |          |          |      
|             |       |             |   RXD   |             |   TXD   |            |          '----------+----------'      
|             |       |             |---------|             |---------|            |                     |                 
|_____________|-,     |_____________|-,     ,-|_____________|-,     ,-|____________|                     |                 
                v                     v     v                 v     v                                    v                 
               GND                   GND   GND               GND   GND                                  GND                

Key Matrix

The creator of the HumbleHacker keyboard replaced the controller in his keyboard and kindly posted his reverse-engineered key matrix. I have copied them below, with some basic modifications.

(Keywell pin numbers start at 1 closest to the thumb switches and end at 13 towards the function keys)

Left Keywell
Pin 6 7 8 10 11 12
1 \ IN LT RT
2 LS Z X C V B
3 CP A S D F G
5 TB Q W E R T
13 = 1 2 3 4 5
Right Keywell
Pin 1 2 3 6 12 13
4 UP DN [ ]
7 N , M RS . /
8 H K J ' L ;
9 Y I U \ O P
10 6 8 7 - 9 0

(Thumbswitch pin numbers start at 1 closest to the center of the keyboard and end at 10 towards the keywells)

Left Thumbswitches
Pin 1 2 3 8
4 SL3 SL6 SL4
5 SL1 SL5 SL2
Right Thumbswitches
Pin 3 4 5 6
7 SR1 SR2 SR5
8 SR4 SR3 SR6

(Function key pins start with 1 near the USB/PS2 cable and 13 near the keywells)

Left Function Keys
Pin 2 3 4 6 7 10 11
1 ESC F1 F2
5 F6 F7 F8
8 F3 F4 F5
Left Function Keys (Condensed)
Pin 2 3,6,10 4,7,11
1 ESC F1 F2
8 F3 F4 F5
5 F6 F7 F8
Right Function Keys
Pin 1 2 5 8 7 10 11
3 PG KY
4 PB
6 F9 F10 F11
9 F12 SL PS
Right Function Keys (Condensed)
Pin 5 8/1/11 7/2/10
3/4 PB PG KY
6 F9 F10 F11
9 F12 PS SL
Full Matrix
Pin A B C D E F G H I J K L M N O
1 = 1 2 3 4 5 F6 F7 F8
2 TB Q W E R T F3 F4 F5
3 CP A S D F G ESC F1 F2
4 LS Z X C V B UP DN [ ] X1 F9 F10 F11
5 X2 ` IN LT RT 6 7 8 9 0 - F12 PS SL
6 SL1 SL2 SL5 Y U I O P PB PG KY
7 SR4 SR3 SR6 SL4 SL3 SL6 H J K L ;
8 SR1 SR2 SR5 N M , . / RS

The Humble Hacker keyboard uses a condensed version of the above matrix, but I wanted to condense it further, retain 8 rows for ease of scanning, and I wanted to be able to split the matrix into left and right handed sections in case I ever decide to split my keyboard physically into two sections. By combining the single-element columns in each thumb cluster, I was able achieve this, with room for an extra 2x3 (less 1) matrix in each half, perfect for mouse buttons and modifiers.

Condensed Kinesis matrix (original qwerty labelling)
Pin 0 1 2 3 4 5 6 7 8 9 10 11
0 = 1 2 3 4 5 6 7 8 9 0 -
1 TB Q W E R T Y U I O P \
2 CP A S D F G H J K L ;
3 LS Z X C V B N M , . / RS
4 ` IN LT RT UP DN [ ]
5 F6 F7 F8 F9 F10 F11
6 BKSP F3 F4 F5 DEL LALT SPACE ENTER F12 PS SL RCTRL
7 HOME ESC F1 F2 END LCTRL PGDN RALT PB PG KY PGUP

Reference