自从看了http://bbs.mydigit.cn/read.php?tid=1399122这个帖子后,心里就痒痒,想自己做一把GH60。奈何GH60价格对我来说还是太高,所以就放弃了。
但是这个草还是长在我心里挥之不去,于是我决定自己做一把小键盘,这样既能满足我的DIY心,又能为我的扁扁的钱包出一份力。
Espode 1:硬件采购和介绍
经过放狗搜索,我查找到可以用Arduino Pro Micro来做键盘主控,并且有相应的固件(TMK)支持。
这就是Arduino Pro Micro:
从淘宝淘来的二手Cherry黑轴机械键盘:
让我们把它打开:
打开后是这个样子的:
[attachment=6730532]
翻开来看看:
其实我们是不要那个显示部分的,只要主键位就好:
让我们来看看主控室什么:
斜着看看:
好,居然是74HC595
楼下继续
Espode 2 硬件改造
仔细观察键盘反面的线路,发现他是全部键共用一个脚的:

well,我们要做一个键盘阵列,便于节省IO口。
首先 把纵向的铜箔割开:

然后把他们连起来:

这里我犯了一个错误,我应该把74HC595拆下来的。
于是我就改线路了:

一个键盘阵列就做好了。
我们来看看Arduino的IO定义(这张图来自网络)

我的设想是,用10/16/15/14作为阵列的纵向输入口,用5/6/7/8/9作为阵列的横向输入口。
于是我就这么连接了:

连接好后,硬件改造完毕。
楼下继续。
Espode 3 软件改造
如果你不想知道怎么修改固件,请只看黑体字!
我们在这里使用开源的TMK,Github:https://github.com/tmk/tmk_keyboard
同时说明一下,TMK也被用于GH60。
你还需要准备的东西有:
TMK修改版:https://github.com/kairyu/tmk_keyboard_custom
TKG,一个键位生成器:https://github.com/kairyu/tkg
TKG_TOOLKIT,用于刷写固件及EEPROM:https://github.com/kairyu/tkg-toolkit
我们这里以GHPad为蓝本来修改固件:
首先进入TMK的修改版文件夹下的keyboard/ghpad/,
打开matrix.c,修改阵列配置:
找到下面这几行:
复制代码
-
/* Column pin configuration
-
* col: 0 1 2 3
-
* pin: F0 F1 E6 C7
-
*/
-
static void init_cols(void)
-
{
-
// Input with pull-up(DDR:0, PORT:1)
-
DDRF &= ~(1<<PF1 | 1<<PF0);
-
PORTF |= (1<<PF1 | 1<<PF0);
-
DDRE &= ~(1<<PE6);
-
PORTE |= (1<<PE6);
-
DDRC &= ~(1<<PC7);
-
PORTC |= (1<<PC7);
-
}
-
-
/* Column pin configuration
-
* col: 0 1 2 3
-
* pin: F0 F1 E6 C7
-
*/
-
static matrix_row_t read_cols(void)
-
{
-
return (PINF&(1<<PF0) ? 0 : (1<<0)) |
-
(PINF&(1<<PF1) ? 0 : (1<<1)) |
-
(PINE&(1<<PE6) ? 0 : (1<<2)) |
-
(PINC&(1<<PC7) ? 0 : (1<<3));
-
}
-
-
/* Row pin configuration
-
* row: 0 1 2 3 4 5
-
* pin: D0 D1 D2 D3 D4 D5
-
*/
-
static void unselect_rows(void)
-
{
-
// Hi-Z(DDR:0, PORT:0) to unselect
-
DDRD &= ~0b00111111;
-
PORTD &= ~0b00111111;
-
}
-
-
/* Row pin configuration
-
* row: 0 1 2 3 4 5
-
* pin: D0 D1 D2 D3 D4 D5
-
*/
-
static void select_row(uint8_t row)
-
{
-
// Output low(DDR:1, PORT:0) to select
-
switch (row) {
-
case 0:
-
DDRD |= (1<<0);
-
PORTD &= ~(1<<0);
-
break;
-
case 1:
-
DDRD |= (1<<1);
-
PORTD &= ~(1<<1);
-
break;
-
case 2:
-
DDRD |= (1<<2);
-
PORTD &= ~(1<<2);#p#分页标题#e#
-
break;
-
case 3:
-
DDRD |= (1<<3);
-
PORTD &= ~(1<<3);
-
break;
-
case 4:
-
DDRD |= (1<<4);
-
PORTD &= ~(1<<4);
-
break;
-
case 5:
-
DDRD |= (1<<5);
-
PORTD &= ~(1<<5);
-
break;
-
}
-
}
修改为:
复制代码
-
/* Column configuration
-
* col: 0 1 2 3
-
* pin: PB1 PB3 PB2 PB6
-
*/
-
static void init_cols(void)
-
{
-
// Input with pull-up(DDR:0, PORT:1)
-
DDRB &= ~(1<<PB1 | 1<<PB3 | 1<<PB2 | 1<<PB6);
-
PORTB |= (1<<PB1 | 1<<PB3 | 1<<PB2 | 1<<PB6);
-
-
}
-
-
/* Column configuration
-
* col: 0 1 2 3
-
* pin: PB1 PB3 PB2 PB6
-
*/
-
static matrix_row_t read_cols(void)
-
{
-
return (PINB&(1<<PB1) ? 0 : (1<<0)) |
-
(PINB&(1<<PB3) ? 0 : (1<<1)) |
-
(PINB&(1<<PB2) ? 0 : (1<<2)) |
-
(PINB&(1<<PB6) ? 0 : (1<<3));
-
}
-
-
/* Lotpad Row configuration
-
* row: 0 1 2 3 4
-
* pin: PC6 PD7 PE6 PB4 PB5
-
*/
-
static void unselect_rows(void)
-
{
-
// Hi-Z(DDR:0, PORT:0) to unselect
-
DDRD &= ~0b10000000;
-
PORTD &= ~0b10000000;
-
-
DDRC &= ~0b01000000;
-
PORTC &= ~0b01000000;
-
-
DDRB &= ~0b00110000;
-
PORTB &= ~0b00110000;
-
-
DDRE &= ~0b01000000;
-
PORTE &= ~0b01000000;
-
}
-
-
/* Row configuration
-
* row: 0 1 2 3 4
-
* pin: PC6 PD7 PE6 PB4 PB5
-
*/
-
static void select_row(uint8_t row)
-
{
-
// Output low(DDR:1, PORT:0) to select
-
switch (row) {
-
case 4:
-
DDRC |= (1<<6);
-
PORTC &= ~(1<<6);
-
break;
-
case 3:
-
DDRD |= (1<<7);
-
PORTD &= ~(1<<7);
-
break;
-
case 2:
-
DDRE |= (1<<6);
-
PORTE &= ~(1<<6);
-
break;
-
case 1:
-
DDRB |= (1<<4);
-
PORTB &= ~(1<<4);
-
break;
-
case 0:
-
DDRB |= (1<<5);
-
PORTB &= ~(1<<5);
-
break;
-
}
-
}
如果你的IO不同,请自行修改。
然后是修改Config.h,这里是定义按键个数的:
复制代码
-
/* key matrix size */
-
#define MATRIX_ROWS 6
-
#define MATRIX_COLS 4
改为:
复制代码
-
/* key matrix size */
-
#define MATRIX_ROWS 5
-
#define MATRIX_COLS 4
之后是修改keymap_common.h
复制代码
-
/* GHPad keymap definition macro
-
*/
-
#define KEYMAP( \
-
K0A, K0B, K0C, K0D, \
-
K1A, K1B, K1C, K1D, \
-
K2A, K2B, K2C, K2D, \
-
K3A, K3B, K3C, K3D, \#p#分页标题#e#
-
K4A, K4B, K4C, K4D, \
-
K5A, K5B, K5C, K5D \
-
) { \
-
{ KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
-
{ KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
-
{ KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
-
{ KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
-
{ KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D }, \
-
{ KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D } \
-
}
改成:
复制代码
-
/* GHPad keymap definition macro
-
*/
-
#define KEYMAP( \
-
K0A, K0B, K0C, K0D, \
-
K1A, K1B, K1C, K1D, \
-
K2A, K2B, K2C, K2D, \
-
K3A, K3B, K3C, K3D, \
-
K4A, K4B, K4C, K4D \
-
) { \
-
{ KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
-
{ KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
-
{ KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
-
{ KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
-
{ KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D } \
-
}
最后是修改keymap_4x6.c
复制代码
-
[0] = KEYMAP(
-
ESC, TAB, PEQL,BSPC, \
-
NLCK,PSLS,PAST,PMNS, \
-
P7, P8, P9, PPLS, \
-
P4, P5, P6, PENT, \
-
P1, P2, P3, PENT, \
-
P0, NO, PDOT,NO)
改为:
复制代码
-
[0] = KEYMAP(
-
NLCK,PSLS,PAST,PMNS, \
-
P7, P8, P9, PPLS, \
-
P4, P5, P6, PENT, \
-
P1, P2, P3, PENT, \
-
P0, NO, PDOT,NO)
然后可以去编译了。编译方式直接make就行。
编译后的HEX文件最后给出。
编译后,将HEX文件用你喜欢的工具刷写进去。
你可以使用tkg_toolkit/windows/bin里面的avrdude.exe来刷写,命令是:
复制代码
-
avrdude -p m32u4 -P COM6 -c avr109 -b 57600 -U flash:w:ghpad_lufa.hex
其中,COM6是进入DFU后的COM口。
用镊子或者其他什么东西短接RST与GND两次,就可以进入DFU。进入后运行上面命令刷写固件。
如果一切正常,那么刷写完毕后,键盘就可以当成一个正常的小键盘使用了。
END。。
众人:等等。。可编程呢?
好吧,首先去Keyboard Layout Editor定制一个键盘布局,然后从RawData中拷贝出来,放入TKG的网页中,做一些基本设置后,点击下载eep
然后,使用以下命令刷写EEPROM:
复制代码
-
avrdude -p m32u4 -P COM6 -c avr109 -b 57600 -U eeprom:w:keymap.eep
也是需要先进入DFU再刷写。
完成!
-----------------------------我是分割线--------------------------
我的键盘设置:
复制代码
-
["Num Lock","/","*","-"],
-
["7\nHome","8\n↑","9\nPgUp","bs"],
-
["4\n←","5","6\n→","+"],
-
["1\nEnd","2\n↓","3\nPgDn","Enter"],
-
["Fn","0\nIns",".\nDel","Enter"]
-
-
-
["Fn1","Fn2","Fn3","Fn5"],
-
["7\nHome","8\n↑","9\nPgUp","Fn6"],
-
["4\n←","5","6\n→","Fn7"],
-
["1\nEnd","2\n↓","3\nPgDn","Fn8"],
-
["Fn","0\nIns",".\nDel","Fn9"]
-
-
-
["Num Lock","","",""],
-
["Esc","↑","R",""],
-
["←","↓","→",""],
-
["","","",""],
-
["Fn","","",""]
-
-
-
["Num Lock","","",""],
-
["Esc","F1","F2","R"],
-
["","","wheel up","wheel down"],
-
["Z","X","C","V"],
-
["Fn","","",""]
-
-
-
["!\n1","@\n2","#\n3","$\n4"],
-
["Q","W","E","R"],
-
["A","S","D","F"],
-
["Tab","Esc","C","B"],
-
["Fn","LCtrl","LAlt","P"]

成品!
最后的最后是键盘布局和固件HEX:
好吧,首先去Keyboard Layout Editor定制一个键盘布局,然后从RawData中拷贝出来,放入TKG的网页中,做一些基本设置后,点击下载eep#p#分页标题#e#
这一句话是不是太简单了呢?我这里给出一个详细教程:
1.打开Keyboard Layout Editor
2.找到RawData,把第一个布局粘贴进去:

粘贴完成是这个样子的:

3.切换回Properties标签页,点击按钮,然后修改上面的文字:

等到满意之后,切换回rawdata,复制出来。
打开TKG,修改语言,修改阵列,然后把复制出来的RawData复制进去:

自己修改配置,最后点击生成EEP

然后就可以刷进去了。
这里给一个TKG的修改版本,增加了这个键盘Lotpad,直接解压打开index.html就行
(责任编辑:admin) |