客制化带有键鼠功能的手柄

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

via

坐沙发

发表评论

你的邮件地址不会公开


*