最好的电子音响科技diy制作网站

haoDIY_音响电子电脑科技DIY小制作发明

当前位置: 主页 > 电脑DIY > 电脑DIY >

也跟风!做一把可编程机械小键盘

时间:2017-05-16 12:38来源:数码之家 作者:江小g 点击:
这一句话是不是太简单了呢?我这里给出一个详细教程: 1. 打开Keyboard Layout Editor 2.找到RawData,把第一个布局粘贴进去: 粘贴完成是这个样子的: 3.切换回Properties标签页,点击按钮,然后修改上面的文字:
自从看了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,修改阵列配置:

找到下面这几行:
复制代码
  1. /* Column pin configuration
  2. *  col: 0   1   2   3
  3. *  pin: F0  F1  E6  C7
  4. */
  5. static void  init_cols(void)
  6. {
  7.     // Input with pull-up(DDR:0, PORT:1)
  8.     DDRF  &= ~(1<<PF1 | 1<<PF0);
  9.     PORTF |=  (1<<PF1 | 1<<PF0);
  10.     DDRE  &= ~(1<<PE6);
  11.     PORTE |=  (1<<PE6);
  12.     DDRC  &= ~(1<<PC7);
  13.     PORTC |=  (1<<PC7);
  14. }
  15.  
  16. /* Column pin configuration
  17. *  col: 0   1   2   3
  18. *  pin: F0  F1  E6  C7
  19. */
  20. static matrix_row_t read_cols(void)
  21. {
  22.     return (PINF&(1<<PF0) ? 0 : (1<<0)) |
  23.            (PINF&(1<<PF1) ? 0 : (1<<1)) |
  24.            (PINE&(1<<PE6) ? 0 : (1<<2)) |
  25.            (PINC&(1<<PC7) ? 0 : (1<<3));
  26. }
  27.  
  28. /* Row pin configuration
  29. * row: 0   1   2   3   4   5
  30. * pin: D0  D1  D2  D3  D4  D5
  31. */
  32. static void unselect_rows(void)
  33. {
  34.     // Hi-Z(DDR:0, PORT:0) to unselect
  35.     DDRD  &= ~0b00111111;
  36.     PORTD &= ~0b00111111;
  37. }
  38.  
  39. /* Row pin configuration
  40. * row: 0   1   2   3   4   5
  41. * pin: D0  D1  D2  D3  D4  D5
  42. */
  43. static void select_row(uint8_t row)
  44. {
  45.     // Output low(DDR:1, PORT:0) to select
  46.     switch (row) {
  47.         case 0:
  48.             DDRD  |= (1<<0);
  49.             PORTD &= ~(1<<0);
  50.             break;
  51.         case 1:
  52.             DDRD  |= (1<<1);
  53.             PORTD &= ~(1<<1);
  54.             break;
  55.         case 2:
  56.             DDRD  |= (1<<2);
  57.             PORTD &= ~(1<<2);#p#分页标题#e#
  58.             break;
  59.         case 3:
  60.             DDRD  |= (1<<3);
  61.             PORTD &= ~(1<<3);
  62.             break;
  63.         case 4:
  64.             DDRD  |= (1<<4);
  65.             PORTD &= ~(1<<4);
  66.             break;
  67.         case 5:
  68.             DDRD  |= (1<<5);
  69.             PORTD &= ~(1<<5);
  70.             break;
  71.     }
  72. }
修改为:
复制代码
  1. /* Column configuration
  2. * col: 0    1    2    3
  3. * pin: PB1  PB3  PB2  PB6
  4. */
  5. static void  init_cols(void)
  6. {
  7.     // Input with pull-up(DDR:0, PORT:1)
  8.     DDRB  &= ~(1<<PB1 | 1<<PB3 | 1<<PB2 | 1<<PB6);
  9.     PORTB |=  (1<<PB1 | 1<<PB3 | 1<<PB2 | 1<<PB6);
  10.     
  11. }
  12.  
  13. /* Column configuration
  14. * col: 0    1    2    3
  15. * pin: PB1  PB3  PB2  PB6
  16. */
  17. static matrix_row_t read_cols(void)
  18. {
  19.     return (PINB&(1<<PB1) ? 0 : (1<<0)) |
  20.            (PINB&(1<<PB3) ? 0 : (1<<1)) |
  21.            (PINB&(1<<PB2) ? 0 : (1<<2)) |
  22.            (PINB&(1<<PB6) ? 0 : (1<<3));
  23. }
  24.  
  25. /* Lotpad Row configuration
  26. * row: 0    1    2    3    4
  27. * pin: PC6  PD7  PE6  PB4  PB5
  28. */
  29. static void unselect_rows(void)
  30. {
  31.     // Hi-Z(DDR:0, PORT:0) to unselect
  32.     DDRD  &= ~0b10000000;
  33.     PORTD &= ~0b10000000;
  34.     
  35.     DDRC  &= ~0b01000000;
  36.     PORTC &= ~0b01000000;
  37.     
  38.     DDRB  &= ~0b00110000;
  39.     PORTB &= ~0b00110000;
  40.     
  41.     DDRE  &= ~0b01000000;
  42.     PORTE &= ~0b01000000;
  43. }
  44.  
  45. /* Row configuration
  46. * row: 0    1    2    3    4
  47. * pin: PC6  PD7  PE6  PB4  PB5
  48. */
  49. static void select_row(uint8_t row)
  50. {
  51.     // Output low(DDR:1, PORT:0) to select
  52.     switch (row) {
  53.         case 4:
  54.             DDRC  |= (1<<6);
  55.             PORTC &= ~(1<<6);
  56.             break;
  57.         case 3:
  58.             DDRD  |= (1<<7);
  59.             PORTD &= ~(1<<7);
  60.             break;
  61.         case 2:
  62.             DDRE  |= (1<<6);
  63.             PORTE &= ~(1<<6);
  64.             break;
  65.         case 1:
  66.             DDRB  |= (1<<4);
  67.             PORTB &= ~(1<<4);
  68.             break;
  69.         case 0:
  70.             DDRB  |= (1<<5);
  71.             PORTB &= ~(1<<5);
  72.             break;
  73.     }
  74. }
如果你的IO不同,请自行修改。
然后是修改Config.h,这里是定义按键个数的:
复制代码
  1. /* key matrix size */
  2. #define MATRIX_ROWS 6
  3. #define MATRIX_COLS 4
改为:
复制代码
  1. /* key matrix size */
  2. #define MATRIX_ROWS 5
  3. #define MATRIX_COLS 4
之后是修改keymap_common.h
复制代码
  1. /* GHPad keymap definition macro
  2. */
  3. #define KEYMAP( \
  4.     K0A, K0B, K0C, K0D, \
  5.     K1A, K1B, K1C, K1D, \
  6.     K2A, K2B, K2C, K2D, \
  7.     K3A, K3B, K3C, K3D, \#p#分页标题#e#
  8.     K4A, K4B, K4C, K4D, \
  9.     K5A, K5B, K5C, K5D  \
  10. ) { \
  11.     { KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
  12.     { KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
  13.     { KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
  14.     { KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
  15.     { KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D }, \
  16.     { KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D }  \
  17. }
改成:
复制代码
  1. /* GHPad keymap definition macro
  2. */
  3. #define KEYMAP( \
  4.     K0A, K0B, K0C, K0D, \
  5.     K1A, K1B, K1C, K1D, \
  6.     K2A, K2B, K2C, K2D, \
  7.     K3A, K3B, K3C, K3D, \
  8.     K4A, K4B, K4C, K4D  \
  9. ) { \
  10.     { KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
  11.     { KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
  12.     { KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
  13.     { KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
  14.     { KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D }  \
  15. }
最后是修改keymap_4x6.c
复制代码
  1. [0] = KEYMAP(
  2.         ESC, TAB, PEQL,BSPC, \
  3.         NLCK,PSLS,PAST,PMNS, \
  4.         P7,  P8,  P9,  PPLS, \
  5.         P4,  P5,  P6,  PENT, \
  6.         P1,  P2,  P3,  PENT, \
  7.         P0,  NO,  PDOT,NO)
改为:
复制代码
  1. [0] = KEYMAP(
  2.         NLCK,PSLS,PAST,PMNS, \
  3.         P7,  P8,  P9,  PPLS, \
  4.         P4,  P5,  P6,  PENT, \
  5.         P1,  P2,  P3,  PENT, \
  6.         P0,  NO,  PDOT,NO)
然后可以去编译了。编译方式直接make就行。
编译后的HEX文件最后给出。

编译后,将HEX文件用你喜欢的工具刷写进去。
你可以使用tkg_toolkit/windows/bin里面的avrdude.exe来刷写,命令是:
复制代码
  1. 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:
复制代码
  1. avrdude -p m32u4 -P COM6 -c avr109 -b 57600 -U eeprom:w:keymap.eep
也是需要先进入DFU再刷写。

完成!
-----------------------------我是分割线--------------------------
我的键盘设置:
复制代码
  1. ["Num Lock","/","*","-"],
  2. ["7\nHome","8\n↑","9\nPgUp","bs"],
  3. ["4\n←","5","6\n→","+"],
  4. ["1\nEnd","2\n↓","3\nPgDn","Enter"],
  5. ["Fn","0\nIns",".\nDel","Enter"]
  6.  
  7.  
  8. ["Fn1","Fn2","Fn3","Fn5"],
  9. ["7\nHome","8\n↑","9\nPgUp","Fn6"],
  10. ["4\n←","5","6\n→","Fn7"],
  11. ["1\nEnd","2\n↓","3\nPgDn","Fn8"],
  12. ["Fn","0\nIns",".\nDel","Fn9"]
  13.  
  14.  
  15. ["Num Lock","","",""],
  16. ["Esc","↑","R",""],
  17. ["←","↓","→",""],
  18. ["","","",""],
  19. ["Fn","","",""]
  20.  
  21.  
  22. ["Num Lock","","",""],
  23. ["Esc","F1","F2","R"],
  24. ["","","wheel up","wheel down"],
  25. ["Z","X","C","V"],
  26. ["Fn","","",""]
  27.  
  28.  
  29. ["!\n1","@\n2","#\n3","$\n4"],
  30. ["Q","W","E","R"],
  31. ["A","S","D","F"],
  32. ["Tab","Esc","C","B"],
  33. ["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)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容