长期以来,我需要一个允许我发送各种鼠标和键盘的命令去测试我的一些 Web 应用和浏览器上的游戏的简易设备。另外,我也可以利用这样的一个设备去测试新型单板电脑(如树莓派)的键盘与鼠标功能,而不必为缺乏一个合适的键盘与鼠标而烦恼。因此,我决定创建这个项目。
首先,为了能够通过 USB 发送键盘和鼠标的命令,我使用了一个基于 ATmega 32U4(一个与 Atmega328 非常相像的 8 位 AVR)的 Arduino Pro Micro,在 ATmega 32U4 上有配备着一个可以模拟任何 USB 设备的全速 USB 收发器。
之后,我利用 4x4 的矩阵键盘设计了支持多达 32 个键和两个动态键盘选项的发送键盘键。
最后,我使用了两个操纵杆作为一个多功能鼠标,而且其还可以控制动态键盘选项和修改键。
arduino_based_mouse_and_keyboard_controller_ino.ino
[5704 Bytes at 2021-02-10, 11 次下载]
fabrication.pdf
[76874 Bytes at 2021-02-10, 9 次下载]
gerber.zip
[226745 Bytes at 2021-02-10, 11 次下载]
PCB 生产文件在本项目文件库中可以下载:
https://make.quwj.com/project/355
打样 PCB 拿到之后,首先,使用烙铁将插座焊接好。摇杆、LED、电阻也都焊接好。
PCB上的组件:
A1(Arduino Pro Micro的接头)
J1,J2(COM-09032模拟摇杆)
K1,K2,K3,K4,K5,K6,K7,K8,K9,K10,K11,K12,K13,K14,K15,k16(6x6的按键)
D1(5毫米绿色发光二极管)
D2(5毫米蓝色发光二极管)
R1,R2(220Ω电阻器)
C1(外部键盘的接头)
在编码之前,我们需要验证 Arduino IDE 上 Pro Micro board 的设置。在 Arduino IDE 的最新版本中,通过 Boards Manager 可以轻松将第三方的开发板添加在 IDE 中。
1、打开 Arduino IDE,之后转到首选项(文件 > 首选项)。之后,将下面这段URL粘贴到位于窗口底部 Additional Board Manager 框中。
你可以通过单击窗口图标并每行粘贴一个URL来添加多个URL。
2、点击 OK 之后,通过单击 工具(Tools)> 线路板选择选项卡(The Board selection tab)> 线路板管理器(Boards Manager)以打开线路板管理器(Boards Manager)。
3、在路板管理器(Boards Manager)中搜索 sparkfun。当 SparkFun AVR Boards出现时,单击安装(install),稍等片刻,直到 IDE 确认所有都已安装 .brd 文件。
4、最后,选择 Sparkfun Boards 下的 Sparkfun Pro Micro Board,将代码上传到 Pro Micro。
添加依赖的库。
Keypad
https://www.arduino.cc/reference/en/libraries/keypad/
Keyboard
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/
Mouse
https://www.arduino.cc/reference/en/language/functions/usb/mouse/
定义动态键盘选项按钮上的符号 - 字母和数字。初始化动态键盘。
char letterKeys[ROWS][COLS] = {
char letterKeys[ROWS][COLS] = {
{'e','a','r','i'},
{'o','t','n','s'},
{'p','m','h','w'},
{'l','c','u','d'}
};
char numberKeys[ROWS][COLS] = {
{'1','2','3','+'},
{'4','5','6','-'},
{'#','0','*','%'},
{'7','8','9','/'}
};
byte rowPins[ROWS] = {6, 7, 8, 9}; // Connect to the row pinouts of the keypad.
byte colPins[COLS] = {2, 3, 4, 5}; // Connect to the column pinouts of the keypad.
// Initialize an instance of class NewKeypad for each keypad setting - letter and number.
Keypad letterKeypad = Keypad( makeKeymap(letterKeys), rowPins, colPins, ROWS, COLS);
Keypad numberKeypad = Keypad( makeKeymap(numberKeys), rowPins, colPins, ROWS, COLS);
在 read_joysticks() 函数中,手机操纵手柄 J1 和 J2 生成的数据。
void read_joysticks(){
joystick_left_x = analogRead(VRX_L);
joystick_left_y = analogRead(VRY_L);
joystick_left_button = digitalRead(SW_L);
joystick_right_x = analogRead(VRX_R);
joystick_right_y = analogRead(VRY_R);
joystick_right_button = digitalRead(SW_R);
}
在 mouse_controls() 函数中,根据移动左操控杆(J1)移动光标,然后使用左(J1)和右(J2)手柄单击。
void mouse_controls(){
// Move mouse according to the left joystick movements.
if(joystick_left_y > 700) Mouse.move(0, -15); // UP
if(joystick_left_y < 300) Mouse.move(0, 15); // DOWN
if(joystick_left_x > 700) Mouse.move(-15, 0); // LEFT
if(joystick_left_x < 300) Mouse.move(15, 0); // RIGHT
if(joystick_left_button == 0) Mouse.click(MOUSE_LEFT); // LEFT CLICK
if(joystick_right_button == 0) Mouse.click(MOUSE_RIGHT); // RIGHT CLICK
delay(100);
}
在 keyboard_controls() 函数中,根据右摇杆(J2)的移动,更改动态键盘的设置(字母或数字),并按修改键(回车键和退格键)。
依靠选定的动态键盘选项(字母和数字)来获取自定义键,并将自定义键写为修改键。
void keyboard_controls(){
// Change keypad settings (letter or number) and press modifier keys according to the right joystick movements.
if(joystick_right_y > 700){ Keyboard.press(KEY_RETURN); delay(100); Keyboard.releaseAll(); } // RETURN
if(joystick_right_y < 300){ Keyboard.press(KEY_BACKSPACE); delay(100); Keyboard.releaseAll(); } // BACKSPACE
if(joystick_right_x > 700){ letter = true; number = false; digitalWrite(let_LED, HIGH); digitalWrite(num_LED, LOW); } // Letter Keypad
if(joystick_right_x < 300){ letter = false; number = true; digitalWrite(let_LED, LOW); digitalWrite(num_LED, HIGH); } // Number Keypad
// Get the custom key depending on the selected keypad type - letter or number.
char customKey;
if(letter == true) customKey = letterKeypad.getKey();
if(number == true) customKey = numberKeypad.getKey();
// Write the custom key.
if (customKey){
Keyboard.write(customKey);
}
}
// Arduino Pro Micro :
// JoyStick (Left)
// A0 --------------------------- VRX
// A1 --------------------------- VRY
// D14 --------------------------- SW
// 5V --------------------------- 5V
// GND --------------------------- GND
// JoyStick (Right)
// A2 --------------------------- VRX
// A3 --------------------------- VRY
// D16 --------------------------- SW
// 5V --------------------------- 5V
// GND --------------------------- GND
// KeyPad
// D2 --------------------------- C1
// D3 --------------------------- C2
// D4 --------------------------- C3
// D5 --------------------------- C4
// D6 --------------------------- R1
// D7 --------------------------- R2
// D8 --------------------------- R3
// D9 --------------------------- R4
// Letter Keypad LED
// D15 --------------------------- +
// Number Keypad LED
// D10 --------------------------- +
在完成并上传代码到 Arduino Pro Micro 后,插入 PCB 的排座中。
手柄让用户可以通过左摇杆(J1)移动光标和通过按左(J1)或右(J2)摇杆按钮实现单击。
- J1 > 向左 > 光标向左
- J1> 向右 > 光标向右
- J1 > 向上 > 光标向上
- J1 > 向下 > 光标向下
- J1 > 按钮 > 鼠标左键单击
- J2> 按钮 > 鼠标右键单击
用户可以在动态键盘的选项(字母和数字)间进行选择,并通过移动右摇杆(J2)发送修改键。
- J2 > 向左 > 字母键盘
- J2 > 向右 > 数字键盘
- J2 > 向上 > 返回
- J2 > 向下 > 退格
手柄包括一个集成的 4x4 矩形键盘。通过动态键盘选项,手柄最多可支持32个键盘键。
键盘按钮上的默认键盘键:
- K1 > e,1
- K2 > a,2
- K3 > r,3
- K4 > i,+
- K5 > o,4
- K6 > t,5
- K7 > n,6
- K8 > s,-
- K9 > w,%
- K10 > h,+
- K11 > m,o
- K12 > p,#
- K13 > d,/
- K14 > u,9
- K15 > c,8
- K16 > I,7
项目所用的代码在本项目文件库中可以下载:
https://make.quwj.com/project/355