├── 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
--------------------------------------------------------------------------------