├── KeyboardAndMouseControl ├── KeyboardAndMouseControl.ino └── README.md ├── README.md ├── USBHIDBootKbd ├── README.md └── USBHIDBootKbd.ino └── pro_mini_usb_host_焊接方式.jpg /KeyboardAndMouseControl/KeyboardAndMouseControl.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Author : KevinsBobo 4 | * Email : kevins.bobo@gmail.com 5 | * Website : http://kevins.pro/ 6 | * 7 | */ 8 | 9 | /********************************************************** 10 | 11 | 此段代码用于 Arduino Micro 上,接收 Arduino Mini 12 | 传来的键位数据,然后做以处理向电脑输出。 13 | 14 | **********************************************************/ 15 | 16 | int microqwertybm[] = { 0, 0, 0, 0, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 176, 177, 178, 179, 32, 45, 61, 91, 93, 92, 92, 59, 39, 96, 44, 46, 47, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 144, 145, 19, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 144, 47, 42, 45, 43, 176, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 46, 0, 0, 128, 129, 130, 131, 132, 133, 134, 135}; // Qwerty 按键顺序数组 17 | 18 | int microdvorakbm[] = { 0, 0, 0, 0, 97, 120, 106, 101, 46, 117, 105, 100, 99, 104, 116, 110, 109, 98, 114, 108, 39, 112, 111, 121, 103, 107, 44, 113, 102, 59, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 176, 177, 178, 179, 32, 91, 93, 47, 61, 92, 92, 115, 45, 96, 119, 118, 122, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 144, 145, 19, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 144, 47, 42, 45, 43, 176, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 46, 0, 0, 128, 129, 130, 131, 132, 133, 134, 135}; // Dvorak 按键顺序数组 19 | 20 | int changedvo = 0; // dvorak切换判断 21 | int capled = 0; // 大写锁定灯控制 22 | int ledchanged = 1; // 大写锁定灯切换辅助 23 | int swich = 0; // 输出模式 24 | int swichturn = 0; // 输出模式切换 25 | int swichchanged = 1; // 输出模式切换辅助 26 | int arrowctrl = 0; // 方向控制键按下判断 27 | int moctrl = 0; // 鼠标 单次1/多次0 移动模式判断 28 | int momove[6] = { 0 }; // 鼠标移动 29 | int momoved[6] = { 0 }; // 鼠标移动判断 30 | 31 | void setup() { // initialize the buttons' inputs: 32 | 33 | Serial.begin(115200); 34 | Serial1.begin(115200); 35 | pinMode(13, OUTPUT); 36 | digitalWrite(13, LOW); 37 | // initialize mouse control: 38 | Mouse.begin(); 39 | Keyboard.begin(); 40 | } 41 | 42 | void loop() { 43 | // use serial input to control the mouse: 44 | if (Serial1.available() > 0) { 45 | int key = Serial1.read(); 46 | if(key <= 109 && key >= 4){ 47 | if(key == 57) ledchanged = 0; 48 | int keyp = (changedvo == 1) ? microdvorakbm[key] : microqwertybm[key]; 49 | //Serial.println(-keyp); 50 | if(swich == 0 || swich == 2) Keyboard.press(keyp); 51 | }else if(key <= 234 && key >= 129){ 52 | int keyp = (changedvo == 1) ? microdvorakbm[key - 125] : microqwertybm[key - 125]; 53 | //Serial.println(-keyp); 54 | if(swich == 0 || swich == 2) Keyboard.release(keyp); 55 | }else if(key == 110){ 56 | changedvo = 1 - changedvo; 57 | }else if(key == 121){ 58 | arrowctrl = 1; 59 | }else if(key == 246){ 60 | arrowctrl = 0; 61 | }else if(key == 111){ 62 | moctrl = 1; 63 | }else if(key == 236){ 64 | moctrl = 0; 65 | }else if(key == 113){ 66 | //Serial.println("mouse right clickdown"); 67 | Mouse.press(MOUSE_LEFT); 68 | }else if(key == 238){ 69 | //Serial.println("mouse right clickup"); 70 | Mouse.release(MOUSE_LEFT); 71 | }else if(key == 112){ 72 | //Serial.println("mouse left clickdown"); 73 | Mouse.press(MOUSE_RIGHT); 74 | }else if(key == 237){ 75 | //Serial.println("mouse left clickup"); 76 | Mouse.release(MOUSE_RIGHT); 77 | }else if(key == 119){ 78 | //Serial.println("mouse centent clickdown"); 79 | Mouse.press(MOUSE_MIDDLE); 80 | }else if(key == 244){ 81 | //Serial.println("mouse centent clickup"); 82 | Mouse.release(MOUSE_MIDDLE); 83 | }else if(key == 114){ 84 | if(arrowctrl == 1){ 85 | //Serial.println(218); 86 | Keyboard.press(218); 87 | }else if(moctrl == 1){ 88 | //Serial.println("mouse move up"); 89 | Mouse.move(0, -127); 90 | }else{ 91 | momove[3] = 1; 92 | } 93 | 94 | }else if(key == 239){ 95 | if(arrowctrl == 1){ 96 | //Serial.println(-218); 97 | Keyboard.release(218); 98 | }else{ 99 | momove[3] = 0; 100 | } 101 | 102 | }else if(key == 115){ 103 | if(arrowctrl == 1){ 104 | //Serial.println(216); 105 | Keyboard.press(216); 106 | }else if(moctrl == 1){ 107 | //Serial.println("mouse move left"); 108 | Mouse.move(-127, 0); 109 | }else{ 110 | momove[1] = 1; 111 | } 112 | 113 | }else if(key == 240){ 114 | if(arrowctrl == 1){ 115 | //Serial.println(-216); 116 | Keyboard.release(216); 117 | }else{ 118 | momove[1] = 0; 119 | } 120 | 121 | }else if(key == 116){ 122 | if(arrowctrl == 1){ 123 | //Serial.println(217); 124 | Keyboard.press(217); 125 | }else if(moctrl == 1){ 126 | //Serial.println("mouse move down"); 127 | Mouse.move(0, 127); 128 | }else{ 129 | momove[2] = 1; 130 | } 131 | 132 | }else if(key == 241){ 133 | if(arrowctrl == 1){ 134 | //Serial.println(-217); 135 | Keyboard.release(217); 136 | }else{ 137 | momove[2] = 0; 138 | } 139 | 140 | }else if(key == 117){ 141 | if(arrowctrl == 1){ 142 | //Serial.println(215); 143 | Keyboard.press(215); 144 | }else if(moctrl == 1){ 145 | //Serial.println("mouse move right"); 146 | Mouse.move(127, 0); 147 | }else{ 148 | momove[0] = 1; 149 | } 150 | 151 | }else if(key == 242){ 152 | if(arrowctrl == 1){ 153 | //Serial.println(-215); 154 | Keyboard.release(215); 155 | }else{ 156 | momove[0] = 0; 157 | } 158 | 159 | }else if(key == 118){ 160 | if(moctrl == 1){ 161 | //Serial.println("mouse to up"); 162 | Mouse.move(0, 0, 1); 163 | }else{ 164 | momove[4] = 1; 165 | } 166 | 167 | }else if(key == 243){ 168 | momove[4] = 0; 169 | 170 | }else if(key == 120){ 171 | if(moctrl == 1){ 172 | //Serial.println("mouse to down"); 173 | Mouse.move(0, 0, -1); 174 | }else{ 175 | momove[5] = 1; 176 | } 177 | 178 | }else if(key == 245){ 179 | momove[5] = 0; 180 | } 181 | else if(key >= 0 && key <= 3){ 182 | swichchanged = 0; 183 | swichturn = key; 184 | } 185 | //Serial.println(key); 186 | } 187 | 188 | if(ledchanged == 0){ 189 | capled = 1 - capled; 190 | if(capled == 0) digitalWrite(13, LOW); 191 | else if(capled == 1) digitalWrite(13, HIGH); 192 | ledchanged = 1; 193 | } 194 | 195 | if(swichchanged == 0){ 196 | if((swich == 0 || swich == 2) && (swichturn == 1 || swichturn == 3)){ 197 | swich = swichturn; 198 | //Serial.println("keybord is end"); 199 | Mouse.end(); 200 | Keyboard.end(); 201 | }else if((swich == 1 || swich == 3) && (swichturn == 0 || swichturn == 2)){ 202 | swich = swichturn; 203 | //Serial.println("keybord is begin"); 204 | Mouse.begin(); 205 | Keyboard.begin(); 206 | } 207 | swichchanged = 1; 208 | } 209 | 210 | for(int i; i < 4; i++){ 211 | if(momove[i] == 1){ 212 | //Serial.println(i+215); 213 | switch( i ){ 214 | case 0: Mouse.move(1, 0); break; 215 | case 1: Mouse.move(-1, 0); break; 216 | case 2: Mouse.move(0, 1); break; 217 | case 3: Mouse.move(0, -1); break; 218 | } 219 | delay(5); 220 | if(momoved[i] == 0) momoved[i] = 1; 221 | }else if(momoved[i] == 1 && momove[i] == 0){ 222 | momoved[i] == 0; 223 | } 224 | } 225 | 226 | if(momove[4] == 1){ 227 | //Serial.println("mouse to up"); 228 | Mouse.move(0, 0, 1); 229 | momoved[4] == 1; 230 | delay(10); 231 | }else if(momoved[4] == 1 && momove[4] == 0){ 232 | momoved[0] = 0; 233 | } 234 | 235 | if(momove[5] == 1){ 236 | //Serial.println("mouse to down"); 237 | Mouse.move(0, 0, -1); 238 | momoved[5] == 1; 239 | delay(10); 240 | }else if(momoved[5] == 1 && momove[5] == 0){ 241 | momoved[5] = 0; 242 | } 243 | 244 | } 245 | 246 | -------------------------------------------------------------------------------- /KeyboardAndMouseControl/README.md: -------------------------------------------------------------------------------- 1 | 此段代码用于 Arduino Micro 上,接收 Arduino Mini 传来的键位数据,然后做以处理向电脑输出。 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Arduino打造USB蓝牙键盘扩展器 2 | 3 | ### 基于arduino的键盘扩展器,将USB键盘插在扩展器上后,USB键盘有蓝牙键盘功能,实现可修改键盘布局(Dovrak)、调整大写锁定与Ctrl位置并在键盘上集成了鼠标功能 4 | 5 | --- 6 | 7 | > 制作原因:因为爱折腾所以尝试使用了`Dvorak`键盘布局,结果太爽了,于是就变成了现在这个使用两种键盘布局的XXX了:输入英文使用`Dvorak`布局、输入中文使用`Qwerty`布局(因为使用`Dvorak`输入中文特别别扭)

8 | 但是感觉在电脑上切换键盘布局不太爽,尤其是Linux下,于是就做了这个键盘扩展器,顺带实现了将USB键盘扩展为蓝牙键盘并集成了鼠标功能。

9 | > 当时制作的时候主要参考的是这里的做法:http://www.lab-z.com/ardusb2bt/
10 | 但是使用的硬件除了蓝牙都是不同的,因为我需要的是一个小巧的,可以随身携带的。

11 | > 2016年12月27日更新:

12 | 在开始制作的时候就写了一篇介绍博客,本来是打算做好了后详细更新一篇博客的,结果那段时间有点忙就只更新了需要的硬件,后来博客迁移了,就没把文章迁过来。没想到在这里留下坑了。。。所以现在把GitHub仓库里的README更新一下,把坑补上。虽然更新后的结果百度搜不到,但是谷歌可以,相信爱折腾的朋友肯定会用谷歌。

13 | 另外USB Host Shield mini的官方文档虽然内容的确比较少,英文阅读起来也有点费劲,改天有空了,我把官方说明翻译下,补充点信息,尽量少点坑^_^

14 | 感谢@caoczy 提出了问题:https://github.com/KevinsBobo/arduino_keyboard/issues/1 在我们的交流中也有很多细节问题,想入坑的朋友可以参考下。 15 | 16 | 17 | ### 硬件部分: 18 | 1. `Arduino Micro` 作用:模拟USB键盘 19 | 2. `Arduino Pro mini 改进版 ATMEGA328P 5V 16M` 作用:从`USB Host Shield mini`接收USB键盘按键信息,做以处理并选择通过`Arduino Micor`输出或通过蓝牙模块输出。 20 | 3. `USB Host Shield mini` 作用:接收USB键盘按键信息 21 | 4. `XM-04-HID-K 蓝牙键盘模块` 作用:实现HID蓝牙键盘功能。PS:这个是某宝的一家店里的,而且店铺里没有上架这一个模块,可以拍下`XM-04-HID-S 扫描枪模块`然后告诉老板需要蓝牙键盘模块就行了。 22 | 23 | ### 程序说明: 24 | USBHIDBootKbd代码是用于 Arduino Mini 上获取按键和处理输出。 25 | 获取键盘按键后根据按键和大写锁定切换情况向 Arduino Micro 或蓝牙模块输出数据。 26 | 27 | KeyboardAndMouseControl代码用于 Arduino Micro 上,接收 Arduino Mini 传来的键位数据,然后做以处理向电脑输出。 28 | 29 | ### Arduino pro mini & USB Host Shield mini 焊接方式 30 | 31 | 32 | 这是我的接法,官方手册中说可以直接把USB Host的USB电压输出直接接到上图中右下角的RAW针脚,因为这个针脚可以接受5V的供电,这样就不用提供3.3V的供电了(但VCC针脚应该还是不能接到一起,因为VCC针脚只能接受3.3V的供电)。 33 | 34 | 还有一些细节和需要注意的坑可以参考这里:https://github.com/KevinsBobo/arduino_keyboard/issues/1 35 | 36 | ~~详细功能说明见 http://kevins.pro/arduino_keyboard/~~ (博客迁移,文章没有迁过来。) 37 | 38 | --- 39 | 40 | ### Author : KevinsBobo 41 | ### Email : kevins.bobo@gmail.com 42 | ### Website: http://kevins.pro/ 43 | -------------------------------------------------------------------------------- /USBHIDBootKbd/README.md: -------------------------------------------------------------------------------- 1 | 本段代码是用于 Arduino Mini 上获取按键和处理输出。 2 | 3 | 获取键盘按键后根据按键和大写锁定切换情况向 Arduino Micro 或蓝牙模块输出数据。 4 | -------------------------------------------------------------------------------- /USBHIDBootKbd/USBHIDBootKbd.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Author : KevinsBobo 4 | * Email : kevins.bobo@gmail.com 5 | * Website : http://kevins.pro/ 6 | * 7 | */ 8 | 9 | /************************************************************* 10 | 11 | 程序说明: 12 | 13 | 本段代码是用于 Arduino Mini 上获取按键和处理输出。 14 | 15 | 获取键盘按键后根据按键和大写锁定切换情况向 Arduino Micro 16 | 或蓝牙模块输出数据。 17 | 18 | *************************************************************/ 19 | 20 | #include 21 | #include 22 | #include 23 | 24 | SoftwareSerial Serial1(2, 3); // RX, TX (软件模拟串口,供蓝牙使用) 25 | 26 | int btdvorakbm[] = { 0, 0, 0, 0, 4, 27, 13, 8, 55, 24, 12, 7, 6, 11, 23, 17, 16, 5, 21, 15, 52, 19, 18, 28, 10, 14, 54, 20, 9, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 48, 56, 46, 49, 49, 22, 45, 53, 26, 25, 29}; // dvorak切换数组 27 | 28 | int changecap = 0; // 大写锁定键切换判断,0 未切换,1 已切换 29 | int capchanged = 0; // 大写锁定切换辅助,防止重复切换 30 | int changedvo = 0; // dvorak切换判断 31 | int bmispress[9] = { 0 }; // 功能键按下判断 32 | int capispress = 0; // 大写锁定按下判断 33 | int capnothing = 0; // 大写锁定按下后是否按下其他键判断 34 | int arrowctrl = 0; // 方向控制键按下判断 35 | int swich = 0; // 键盘输出模式,0 仅USB,1 仅蓝牙,2 共同输出,3 不输出 36 | int capcannotup[3] = { 0 }; // 在大写锁定键按下期间按下其他键时值为1 37 | int capnotup = 0; // 在大写锁定键按下期间按下其他键时值为1 38 | int btwid = 0x00; // 蓝牙HID数据长度 39 | int btkeymode = 0x00; // 蓝牙HID数据模式 40 | int btctrlbm = 0x00; // 蓝牙HID控制键 41 | int btkey[4] = { 0x00 }; // 蓝牙HID普通键 42 | 43 | class KbdRptParser : public KeyboardReportParser 44 | { 45 | void PrintKey(uint8_t mod, uint8_t key); // 获取键盘按键后执行输出函数 46 | void AddBtbm(int addbtwid, int addbtkeymode, int addctrlbm, int addbtbm, int addpost, int addormin); // 蓝牙HID输出控制函数 47 | 48 | protected: 49 | virtual void OnControlKeysChanged(uint8_t before, uint8_t after); 50 | 51 | virtual void OnKeyDown (uint8_t mod, uint8_t key); 52 | virtual void OnKeyUp (uint8_t mod, uint8_t key); 53 | }; 54 | 55 | void KbdRptParser::PrintKey(uint8_t m, uint8_t key) 56 | { 57 | MODIFIERKEYS mod; 58 | *((uint8_t*)&mod) = m; 59 | int keyp; 60 | if(capispress == 1 || (changecap == 0 && key == 57)){ 61 | if(key == 57){ 62 | capispress = 1; 63 | capnothing = 1; 64 | }else if(key == 182){ 65 | if(capnothing == 1){ 66 | if(swich != 3){ 67 | Serial.write(57); 68 | delay(10); 69 | Serial.write(182); 70 | } 71 | if(swich == 1 || swich == 2){ 72 | AddBtbm(0x0C, 0x01, 0, 57, 0, 1); 73 | delay(10); 74 | AddBtbm(0x0C, 0x01, 0, 57, 0, 0); 75 | } 76 | capnothing = 0; 77 | } 78 | if(capcannotup[0] == 0) capispress = 0; 79 | else capnotup = 1; 80 | }else if(capispress == 1){ 81 | if(key == 39){ 82 | changedvo = 1 - changedvo; 83 | Serial.write(110); 84 | }else if(key == 45){ 85 | if(changecap == 0) changecap = 1; 86 | else capchanged = 1; 87 | }else if(key == 35){ 88 | if(swich != 0){ 89 | swich = 0; 90 | Serial.write((byte)0); 91 | } 92 | }else if(key == 36){ 93 | if(swich != 1){ 94 | swich = 1; 95 | Serial.write(1); 96 | } 97 | }else if(key == 37){ 98 | if(swich != 2){ 99 | swich = 2; 100 | Serial.write(2); 101 | } 102 | }else if(key == 38){ 103 | if(swich != 3){ 104 | swich = 3; 105 | Serial.write(3); 106 | } 107 | }else if(key == 25){ 108 | if(swich == 0 || swich == 2) Serial.write(121); 109 | arrowctrl = 1; 110 | }else if(key == 150){ 111 | if(swich == 0 || swich == 2) Serial.write(246); 112 | arrowctrl = 0; 113 | }else if(key == 22){ 114 | if(swich == 0 || swich == 2) Serial.write(111); 115 | }else if(key == 147){ 116 | if(swich == 0 || swich == 2) Serial.write(236); 117 | }else if(key == 7){ 118 | if(swich == 0 || swich == 2) Serial.write(113); 119 | }else if(key == 132){ 120 | if(swich == 0 || swich == 2) Serial.write(238); 121 | }else if(key == 9){ 122 | if(swich == 0 || swich == 2) Serial.write(112); 123 | }else if(key == 134){ 124 | if(swich == 0 || swich == 2) Serial.write(237); 125 | }else if(key == 12){ 126 | if(swich == 0 || swich == 2) Serial.write(114); 127 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 82, 0, 1); 128 | }else if(key == 137){ 129 | if(swich == 0 || swich == 2) Serial.write(239); 130 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 82, 0, 0); 131 | }else if(key == 13){ 132 | if(swich == 0 || swich == 2) Serial.write(115); 133 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 80, 0, 1); 134 | }else if(key == 138){ 135 | if(swich == 0 || swich == 2) Serial.write(240); 136 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 80, 0, 0); 137 | }else if(key == 14){ 138 | if(swich == 0 || swich == 2) Serial.write(116); 139 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 81, 0, 1); 140 | }else if(key == 139){ 141 | if(swich == 0 || swich == 2) Serial.write(241); 142 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 81, 0, 0); 143 | }else if(key == 15){ 144 | if(swich == 0 || swich == 2) Serial.write(117); 145 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 79, 0, 1); 146 | }else if(key == 140){ 147 | if(swich == 0 || swich == 2) Serial.write(242); 148 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 79, 0, 0); 149 | }else if(key == 16){ 150 | if(swich == 0 || swich == 2) Serial.write(118); 151 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 78, 0, 1); 152 | }else if(key == 141){ 153 | if(swich == 0 || swich == 2) Serial.write(243); 154 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 78, 0, 0); 155 | }else if(key == 54){ 156 | if(swich == 0 || swich == 2) Serial.write(119); 157 | }else if(key == 179){ 158 | if(swich == 0 || swich == 2) Serial.write(244); 159 | }else if(key == 55){ 160 | if(swich == 0 || swich == 2) Serial.write(120); 161 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 75, 0, 1); 162 | }else if(key == 180){ 163 | if(swich == 0 || swich == 2) Serial.write(245); 164 | if(arrowctrl == 1 && (swich == 1 || swich == 2)) AddBtbm(0x0C, 0x01, 0, 75, 0, 0); 165 | }else if((swich == 1 || swich == 2) && key == 58){ 166 | AddBtbm(0x08, 0x03, 0, 64, 5, 1); 167 | 168 | }else if((swich == 1 || swich == 2) && key == 183){ 169 | AddBtbm(0x08, 0x03, 0, 64, 5, 0); 170 | 171 | }else if((swich == 1 || swich == 2) && key == 59){ 172 | AddBtbm(0x08, 0x03, 0, 2, 5, 1); 173 | 174 | }else if((swich == 1 || swich == 2) && key == 184){ 175 | AddBtbm(0x08, 0x03, 0, 2, 5, 0); 176 | 177 | }else if((swich == 1 || swich == 2) && key == 60){ 178 | AddBtbm(0x08, 0x03, 0, 16, 5, 1); 179 | 180 | }else if((swich == 1 || swich == 2) && key == 185){ 181 | AddBtbm(0x08, 0x03, 0, 16, 5, 0); 182 | 183 | }else if((swich == 1 || swich == 2) && key == 61){ 184 | AddBtbm(0x08, 0x03, 0, 1, 7, 1); 185 | 186 | }else if((swich == 1 || swich == 2) && key == 186){ 187 | AddBtbm(0x08, 0x03, 0, 1, 7, 0); 188 | 189 | }else if((swich == 1 || swich == 2) && key == 62){ 190 | AddBtbm(0x08, 0x03, 0, 8, 5, 1); 191 | 192 | }else if((swich == 1 || swich == 2) && key == 187){ 193 | AddBtbm(0x08, 0x03, 0, 8, 5, 0); 194 | 195 | }else if((swich == 1 || swich == 2) && key == 63){ 196 | AddBtbm(0x08, 0x03, 0, 2, 6, 1); 197 | 198 | }else if((swich == 1 || swich == 2) && key == 188){ 199 | AddBtbm(0x08, 0x03, 0, 2, 6, 0); 200 | 201 | }else if((swich == 1 || swich == 2) && key == 64){ 202 | AddBtbm(0x08, 0x03, 0, 4, 6, 1); 203 | 204 | }else if((swich == 1 || swich == 2) && key == 189){ 205 | AddBtbm(0x08, 0x03, 0, 4, 6, 0); 206 | 207 | }else if((swich == 1 || swich == 2) && key == 65){ 208 | AddBtbm(0x08, 0x03, 0, 1, 6, 1); 209 | 210 | }else if((swich == 1 || swich == 2) && key == 190){ 211 | AddBtbm(0x08, 0x03, 0, 1, 6, 0); 212 | 213 | }else if((swich == 1 || swich == 2) && key == 41){ 214 | AddBtbm(0x08, 0x03, 0, 1, 5, 1); 215 | 216 | }else if((swich == 1 || swich == 2) && key == 166){ 217 | AddBtbm(0x08, 0x03, 0, 1, 5, 0); 218 | 219 | }else if((swich == 1 || swich == 2) && key == 76){ 220 | AddBtbm(0x08, 0x03, 0, 1, 8, 1); 221 | 222 | }else if((swich == 1 || swich == 2) && key == 201){ 223 | AddBtbm(0x08, 0x03, 0, 1, 8, 0); 224 | 225 | } 226 | 227 | if(key >= 4 && key <= 101){ 228 | capnothing = 0; 229 | for(int i = 0; i < 3; i++){ 230 | if(capcannotup[i] == 0){ 231 | capcannotup[i] = 1; 232 | break; 233 | } 234 | } 235 | } 236 | 237 | if(key >= 129 && key <= 226){ 238 | capnothing = 0; 239 | for(int i = 2; i >= 0; i--){ 240 | if(capcannotup[i] == 1){ 241 | capcannotup[i] = 0; 242 | break; 243 | } 244 | } 245 | if(capnotup == 1 && capcannotup[0] == 0){ 246 | capispress = 0; 247 | capnotup = 0; 248 | } 249 | } 250 | } 251 | }else{ 252 | if(swich == 0 || swich == 2){ 253 | if((key == 57 || key == 182) && changecap == 1){ 254 | key += 45; 255 | } 256 | Serial.write(key); 257 | } 258 | 259 | if(swich == 1 || swich == 2){ 260 | if(key <= 109 && key >= 4){ 261 | if(key == 57 && changecap == 1) key = 224; 262 | else if(changedvo == 1 && ((key >= 4 && key <= 29) || (key >= 45 && key <= 56))) key = btdvorakbm[key]; 263 | AddBtbm(0x0C, 0x01, 0, key, 0, 1); 264 | }else if(key <= 234 && key >= 129){ 265 | key -= 125; 266 | if(key == 57 && changecap == 1) key = 224; 267 | else if(changedvo == 1 && ((key >= 4 && key <= 29) || (key >= 45 && key <= 56))) key = btdvorakbm[key]; 268 | AddBtbm(0x0C, 0x01, 0, key, 0, 0); 269 | } 270 | } 271 | } 272 | }; 273 | 274 | void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) 275 | { 276 | PrintKey(mod, key); 277 | } 278 | 279 | void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) { 280 | 281 | MODIFIERKEYS beforeMod; 282 | *((uint8_t*)&beforeMod) = before; 283 | 284 | MODIFIERKEYS afterMod; 285 | *((uint8_t*)&afterMod) = after; 286 | 287 | if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl) { 288 | if(changecap == 1){ 289 | int keyp = (bmispress[8] == 1) ? 182 : 57; 290 | if(keyp == 57){ 291 | capispress = 1; 292 | capnothing = 1; 293 | bmispress[8] = 1 - bmispress[8]; 294 | }else if(keyp == 182){ 295 | if(capcannotup[0] == 0) capispress = 0; 296 | else capnotup = 1; 297 | 298 | bmispress[8] = 1 - bmispress[8]; 299 | if(capnothing == 1){ 300 | if(swich != 3){ 301 | Serial.write(57); 302 | delay(10); 303 | Serial.write(182); 304 | } 305 | if(swich == 1 || swich == 2){ 306 | AddBtbm(0x0C, 0x01, 0, 57, 0, 1); 307 | delay(10); 308 | AddBtbm(0x0C, 0x01, 0, 57, 0, 0); 309 | } 310 | capnothing = 0; 311 | }else if(capchanged == 1){ 312 | changecap = 0; 313 | capchanged = 0; 314 | } 315 | } 316 | 317 | }else{ 318 | if(swich == 0 || swich == 2) Serial.write((bmispress[0] == 1) ? 227 : 102); 319 | if(swich == 1 || swich == 2) AddBtbm(0x0C, 0x01, 1, 0, 0, (bmispress[0] == 1) ? 0 : 1); 320 | bmispress[0] = 1 - bmispress[0]; 321 | } 322 | } 323 | if (beforeMod.bmLeftShift != afterMod.bmLeftShift) { 324 | if(swich == 0 || swich == 2) Serial.write((bmispress[1] == 1) ? 228 : 103); 325 | if(swich == 1 || swich == 2) AddBtbm(0x0C, 0x01, 2, 0, 0, (bmispress[1] == 1) ? 0 : 1); 326 | bmispress[1] = 1 - bmispress[1]; 327 | } 328 | if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt) { 329 | if(swich == 0 || swich == 2) Serial.write((bmispress[2] == 1) ? 229 : 104); 330 | if(swich == 1 || swich == 2) AddBtbm(0x0C, 0x01, 4, 0, 0, (bmispress[2] == 1) ? 0 : 1); 331 | bmispress[2] = 1 - bmispress[2]; 332 | } 333 | if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI) { 334 | if(swich == 0 || swich == 2) Serial.write((bmispress[3] == 1) ? 230 : 105); 335 | if(swich == 1 || swich == 2) AddBtbm(0x0C, 0x01, 8, 0, 0, (bmispress[3] == 1) ? 0 : 1); 336 | bmispress[3] = 1 - bmispress[3]; 337 | } 338 | 339 | if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl) { 340 | if(swich == 0 || swich == 2) Serial.write((bmispress[4] == 1) ? 231 : 106); 341 | if(swich == 1 || swich == 2) AddBtbm(0x0C, 0x01, 16, 0, 0, (bmispress[4] == 1) ? 0 : 1); 342 | bmispress[4] = 1 - bmispress[4]; 343 | } 344 | if (beforeMod.bmRightShift != afterMod.bmRightShift) { 345 | if(swich == 0 || swich == 2) Serial.write((bmispress[5] == 1) ? 232 : 107); 346 | if(swich == 1 || swich == 2) AddBtbm(0x0C, 0x01, 32, 0, 0, (bmispress[5] == 1) ? 0 : 1); 347 | bmispress[5] = 1 - bmispress[5]; 348 | } 349 | if (beforeMod.bmRightAlt != afterMod.bmRightAlt) { 350 | if(swich == 0 || swich == 2) Serial.write((bmispress[6] == 1) ? 233 : 108); 351 | if(swich == 1 || swich == 2) AddBtbm(0x0C, 0x01, 64, 0, 0, (bmispress[6] == 1) ? 0 : 1); 352 | bmispress[6] = 1 - bmispress[6]; 353 | } 354 | if (beforeMod.bmRightGUI != afterMod.bmRightGUI) { 355 | if(swich == 0 || swich == 2) Serial.write((bmispress[7] == 1) ? 234 : 109); 356 | if(swich == 1 || swich == 2) AddBtbm(0x0C, 0x01, 128, 0, 0, (bmispress[7] == 1) ? 0 : 1); 357 | bmispress[7] = 1 - bmispress[7]; 358 | } 359 | 360 | } 361 | 362 | void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) 363 | { 364 | key = key + 125; 365 | PrintKey(mod, key); 366 | } 367 | 368 | void KbdRptParser::AddBtbm(int addbtwid, int addbtkeymode, int addctrlbm, int addbtbm, int addpost, int addormin){ 369 | btwid = addbtwid; 370 | btkeymode = addbtkeymode; 371 | if(addctrlbm != 0){ 372 | if(addormin == 1) btctrlbm += addctrlbm; 373 | else btctrlbm -= addctrlbm; 374 | } 375 | if(addpost == 0){ 376 | for(int i = 0; i < 4; i++){ 377 | if(addormin == 1){ 378 | if(btkey[i] == 0){ 379 | btkey[i] = addbtbm; 380 | break; 381 | } 382 | }else{ 383 | if(btkey[i] == addbtbm){ 384 | btkey[i] = 0; 385 | break; 386 | } 387 | } 388 | } 389 | }else{ 390 | if(addormin == 1){ 391 | btkey[addpost - 5] += addbtbm; 392 | }else{ 393 | btkey[addpost - 5] -= addbtbm; 394 | } 395 | 396 | } 397 | Serial1.write((byte)btwid); 398 | Serial1.write((byte)0x00); 399 | Serial1.write((byte)0xA1); 400 | Serial1.write((byte)btkeymode); 401 | if(btwid == 0x0C){ 402 | Serial1.write((byte)btctrlbm); 403 | Serial1.write((byte)0x00); 404 | Serial1.write((byte)btkey[0]); 405 | Serial1.write((byte)btkey[1]); 406 | Serial1.write((byte)btkey[2]); 407 | Serial1.write((byte)btkey[3]); 408 | Serial1.write((byte)0); 409 | Serial1.write((byte)0); 410 | }else if(btwid == 0x08){ 411 | Serial1.write((byte)btkey[0]); 412 | Serial1.write((byte)btkey[1]); 413 | Serial1.write((byte)btkey[2]); 414 | Serial1.write((byte)btkey[3]); 415 | }else{ 416 | Serial1.write((byte)btctrlbm); 417 | } 418 | 419 | }; 420 | 421 | USB Usb; 422 | //USBHub Hub(&Usb); 423 | HIDBoot HidKeyboard(&Usb); 424 | 425 | uint32_t next_time; 426 | 427 | KbdRptParser Prs; 428 | 429 | void setup() 430 | { 431 | Serial.begin( 115200 ); 432 | Serial1.begin( 9600 ); 433 | 434 | if (Usb.Init() == -1) 435 | Serial.write(255); 436 | 437 | delay( 200 ); 438 | 439 | next_time = millis() + 5000; 440 | 441 | HidKeyboard.SetReportParser(0, (HIDReportParser*)&Prs); 442 | } 443 | 444 | void loop() 445 | { 446 | Usb.Task(); 447 | } 448 | 449 | -------------------------------------------------------------------------------- /pro_mini_usb_host_焊接方式.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevinsBobo/arduino_keyboard/c23d4789a8e8656c9231f16449c7e75d5a6ff121/pro_mini_usb_host_焊接方式.jpg --------------------------------------------------------------------------------