MAKER: Kutluhan Aktar/译:趣无尽 Qiu(转载请注明出处)
长期以来,我需要一个允许我发送各种鼠标和键盘的命令去测试我的一些 Web 应用和浏览器上的游戏的简易设备。另外,我也可以利用这样的一个设备去测试新型单板电脑(如树莓派)的键盘与鼠标功能,而不必为缺乏一个合适的键盘与鼠标而烦恼。因此,我决定创建这个项目。
首先,为了能够通过 USB 发送键盘和鼠标的命令,我使用了一个基于 ATmega 32U4(一个与 Atmega328 非常相像的 8 位 AVR)的 Arduino Pro Micro,在 ATmega 32U4 上有配备着一个可以模拟任何 USB 设备的全速 USB 收发器。
之后,我利用 4×4 的矩阵键盘设计了支持多达 32 个键和两个动态键盘选项的发送键盘键。
最后,我使用了两个操纵杆作为一个多功能鼠标,而且其还可以控制动态键盘选项和修改键。
组件清单
客制化 PCB × 1
SparkFun Pro Micro 5V/16MHz × 1
模拟输出摇杆Joystick × 2
6*6按键 × 16
5mm 绿色发光二极管 × 1
5mm 蓝色发光二极管 × 1
220Ω 电阻器 × 2
电烙铁 × 1
焊锡丝(无铅) × 1
电路板焊接
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(6×6的按键)
D1(5毫米绿色发光二极管)
D2(5毫米蓝色发光二极管)
R1,R2(220Ω电阻器)
C1(外部键盘的接头)
设置 Arduino IDE
在编码之前,我们需要验证 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 > 向下 > 退格
手柄包括一个集成的 4×4 矩形键盘。通过动态键盘选项,手柄最多可支持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
发表评论