DIY Arduino 宏键盘

使用 Arduino 为你的电脑打造一个功能强大的 12 键宏键盘

Make 趣无尽

喜欢

483
浏览
0
喜欢

> 更多图片

项目状态:已完成
开放度:公开
所属分类:电子
发布时间:2024-05-20
最近更新:2024-07-31

详细说明

在数字化工作日益普遍的今天,拥有一个宏键盘无疑是提升效率的得力助手。想象一下,只需轻触一键,即可快速触发你常用的快捷键和功能,这无疑会大大简化你的工作流程。

举个例子,你可以将宏键盘上的一个按键设置为 CTRL+C 快捷键的映射,这样,在需要复制文本或文件时,只需一键即可轻松完成。当你按下这个按键时,内置的 Arduino 会立即向电脑传达指令,模拟你同时按下了键盘上的 CTRL 和 C 键。

在这个教程中,我们将一同探索如何使用 Arduino 为你的电脑打造一个功能强大的 12 键宏键盘。

在我个人的案例中,我不仅添加了管理文件浏览器、播放音乐的快捷键,还整合了复制粘贴、保存、撤销和重复等经典功能。当然,这些按钮的映射并非一成不变,你可以根据自己的使用习惯和需求进行个性化定制。例如,如果你经常使用某个特定的软件,你可以为其设置专属的快捷键,进一步提高工作效率。

值得一提的是,我已经连续使用这款宏键盘超过两周,其便捷性和实用性让我深感满意。无论是视频编辑还是日常办公,它都能为我节省大量时间,让工作变得更加轻松高效。

接下来,我们将要制作的这款键盘拥有 12 个按键,你可以根据自己的喜好和需求,将这些按键与所需的快捷键进行关联。尽管这个项目听起来可能有些复杂,但实际上无论是电子部分还是软件部分,都非常易于上手和操作。

链接表


文件库

Wiring+diagram.pdf
[43022 Bytes at 2024-05-21, 6 次下载]

Lid.stl
[118684 Bytes at 2024-05-21, 7 次下载]

Case+v3.stl
[213984 Bytes at 2024-05-21, 7 次下载]

main.ino
[4165 Bytes at 2024-05-21, 3 次下载]



教程

组件清单
  • Arduino Pro Micro × 1
  • 机械键盘样式的按键 × 12
  • DSA 样式的键帽 × 12
  • 电线(26 AWG) × 1
  • 裸铜线 × 1
  • 黑色喷漆 × 1
  • 填充底漆(可选,但可以使喷漆更容易) × 1
  • M3x12 毫米螺丝 × 2
  • M3 螺纹嵌件 × 2
  • 这个项目用到的工具有: × 1
  • 带黑色 PLA 线材的 3D 打印机 × 1
  • 焊铁 × 1
  • 热熔胶 × 1
  • 砂纸(180、320、600和1200目) × 1
  • 螺丝刀、钳子和其他基本工具 × 1

设计方案

在受到多个创新项目的启发后,我精心设计了一个拥有 12 个按键的宏键盘设计,其布局巧妙融合了水平 4 键与垂直 3 键的排列方式。这款键盘的按键结构独具匠心,包含实际开关与位于顶部的键帽两部分。与传统键盘不同的是,我选择的键帽并未印有字母或数字。虽然我曾考虑过在按键上绘制图标以增强识别性,但实践后我发现这不仅挑战了我的手绘技能,更可能导致键帽设计显得过于繁琐,从而破坏整体键盘的简洁美感。因此,我最终决定让按键保持无图标状态,考虑到仅有 12 个按键,用户可以轻松记忆每个按键的位置。当然,另一种方案是在键帽上打印图标,但考虑到技术实现的复杂性和对键盘美观的潜在影响,我并未采纳此方案。

3D 打印零件

随着按键的选定,接下来便是打造键盘外观的关键环节——3D 打印外壳。外壳与按键共同构成了键盘的整体美感,因此设计过程需精心雕琢。在多次尝试与调整后,我最终选择了与我桌面上的 Mac Mini 相似的设计风格,即一个带有圆润边角的简洁矩形。

我利用黑色 PLA 材料,通过 3D 打印技术精心制作了键盘的外壳及其盖子。外壳上巧妙设置了一个网格,用于安装按键。内部空间则用于放置 Arduino 主板及连接线。此外,我特意在外壳背面预留了一个孔,以便 Arduino 的 USB 端口能够轻松连接至电脑。盖子采用从键盘底部插入的设计,通过两颗螺丝稳固固定,从而确保外壳与盖子之间的连接处完美隐藏,呈现出无可挑剔的整体美感。

你可以在项目文件库里下载 3D 打印的 STL 文件:
https://make.quwj.com/project/518

打磨外壳

尽管 3D 打印的部件在功能上表现出色,但其表面往往光亮且带有层痕,但置于桌面之上,我渴望一个更为细腻、干净的外观。因此,我决定对 3D 打印的部件进行涂饰。首先,我使用 180 号砂纸细致打磨,直至层痕完全消失。随后,我依次换用 320 号和 600 号砂纸,继续打磨,直至获得完美无瑕的平滑表面。这一过程虽耗时,但确保了涂漆的顺利进行。在涂漆之前,我选择了哑光黑色丙烯酸喷漆,为 3D 打印部件均匀喷涂三层,每层之间使用 1200 号砂纸轻微打磨,以达到更为均匀的喷涂效果。在绘制前,我虽未使用底漆,但出于完美效果的考量,建议加入此步骤以达到更佳效果。

待油漆完全干燥后,即便未使用底漆,成果依旧令人惊艳。从图片中,你可以清晰地看到 3D 打印原貌与喷涂后的精美对比。

组装

接下来,便是键盘的组装阶段。首先,我将 M3 螺纹嵌件精准地嵌入 3D 打印零件内侧的两个孔中,这些嵌件将用于后续通过 M3 螺钉将键盘盖紧密固定。

随后,我将 12 个键盘开关逐一插入 3D 打印键盘外壳的网格中。由于配合度极高,开关与3D打印部件紧密结合,无需额外使用胶水。

电路部分

此时,我们进入键盘开关与 Arduino 之间的电路连接阶段。这一过程简洁明了,每个按键都将连接在 GND 和 Arduino 的一个数字引脚之间,且这一连接模式将应用于所有 12 个按键。因此,我们需要将 Arduino 的 GND 引脚与所有开关的相应引脚相连。我使用了一根铜线,将其焊接到每个开关的一个引脚上,并准备了 12 根 10 厘米长的电线,逐一焊接到每个按钮的剩余引脚上。为了确保 Arduino 板能够顺利放入键盘内部,我拆除了原本焊接在 PCB 上的跳线连接器。接着,我在连接所有开关的铜线上焊接了一根电线,并将其与 Arduino 的 GND 引脚相连。随后,我将每个按钮的电线焊接到 Arduino 的一个数字引脚上,同时避开了用于串行通信的引脚 0 和 1。正如你所见,我们充分利用了 Arduino 的所有可用数字引脚,共连接了 12 个开关。若你希望为键盘添加更多按钮,可以考虑使用模拟引脚或尝试矩阵连接,但这将需要对代码进行相应的调整。

对于连接过程,我严格遵循了接线图,你可以在项目文件库找到详细的图示说明:
https://make.quwj.com/project/518

组装完成

在完成所有电路部分的连接之后,迎来了最后的关键环节。我细心地将 Arduino 沿着精心设计的塑料导轨轻轻放置在键盘盖板上,随后用适量的热胶进行稳固固定。这一步的精确度至关重要,因为需要确保USB端口与键盘外壳上的预留孔位完美对齐,以确保连接的顺畅与稳固。

随后,我轻轻合上键盘的盖子,用两颗 M3 螺钉将其牢牢固定,确保它们精准地拧入螺纹嵌件中。为了增添一丝实用性与美观,我在键盘底部添加了四个防滑脚垫。它们不仅将键盘微微抬高,形成了一道优雅的阴影,还确保了键盘在桌面上的稳定性,我对此设计颇为满意。

最后,我开始了键帽的装配工作。对于这款键盘,我特意设计了一个独特的图案——一侧采用三个绿色键帽,另一侧则选用灰色键帽,这样的搭配不仅美观大方,还帮助我轻松记忆每个键位的位置。当然,你也可以根据个人喜好选择你钟爱的图案和颜色。

经过精心组装,这款键盘终于完成了。我对它的最终效果非常满意,其简约而不失设计感的外形与我办公桌上的其他设备相得益彰。通过位于键盘背部的 Arduino USB端口,我可以轻松地将这款独一无二的键盘连接到电脑,享受个性化的打字体验。

编程

拥有功能键盘之前的最后一步是为 Arduino 编写代码。Arduino 需要被计算机检测为常规 USB 键盘。当我们按下宏键盘的某个开关(例如“复制”按钮)时,Arduino 实际上会向计算机发送与该按钮相关的组合键,在本例中为 CTRL+C。

以下是 Arduino 代码的逐步解释。最后你将找到要复制的完整代码。

#include "HID-Project.h"

为了使 Arduino 与计算机通信,我使用了“HID 项目”库。该库允许我们的计算机将 Arduino 检测为普通键盘。要查看所有函数的示例,请查看作者的 GitHub 页面

const int switch1 = 2;
const int switch2 = 3;
const int switch3 = 4;
const int switch4 = 5;
const int switch5 = 6;
const int switch6 = 7;
const int switch7 = 8;
const int switch8 = 9;
const int switch9 = 10;
const int switch10 = 16;
const int switch11 = 14;
const int switch12 = 15;

在草图的开头,我定义了键盘开关将连接到的引脚的变量。

void setup() {
  pinMode(switch1, INPUT_PULLUP);
  pinMode(switch2, INPUT_PULLUP);
  pinMode(switch3, INPUT_PULLUP);
  pinMode(switch4, INPUT_PULLUP);
  pinMode(switch5, INPUT_PULLUP);
  pinMode(switch6, INPUT_PULLUP);
  pinMode(switch7, INPUT_PULLUP);
  pinMode(switch8, INPUT_PULLUP);
  pinMode(switch9, INPUT_PULLUP);
  pinMode(switch10, INPUT_PULLUP);
  pinMode(switch11, INPUT_PULLUP);
  pinMode(switch12, INPUT_PULLUP);


  // 向主机发送干净的报告,这对于任何 Arduino 类型都很重要
  Keyboard.begin();
  Consumer.begin();
}

在设置中,我将按钮连接的引脚定义为输入。由于按钮连接在 GND 和 Arduino 引脚之间,因此我使用了 Arduino 的内部上拉电阻。然后我初始化了键盘库。

void loop() {

  if(!digitalRead(switch2)) { //屏幕截图 - cmd+shift+5(在 mac OS 上)

    Keyboard.press(KEY_LEFT_GUI); //命令
    Keyboard.press(KEY_LEFT_SHIFT); //shift
    Keyboard.press('5'); //5 key

    Keyboard.releaseAll(); //释放所有按下的按键

    delay(300);
  }

在循环中,我为每个按钮创建了一个 if 条件,以便在按下开关时执行功能。例如,对于键 2,我指定了截屏快捷键,在 Mac OS 上是 CMD+SHIFT+5。在if条件下,如果按下按钮,Arduino 将通过 Keyboard.press () 函数将三个按键发送到计算机。然后使用 Keyboard.releaseAll() 函数释放按键。我还添加了一个小的延迟,以防止重复命令(消除开关抖动)。Keyboard.press () 函数接受字母、数字(格式为'a')和修饰键(如 Command、CTRL、SHIFT、ALT...)。可以在此页面找到包含你可以使用的所有修饰键的表。

if (!digitalRead(switch5)) {  //保存 - cmd+s(在 mac OS 上)

    Keyboard.press(KEY_LEFT_GUI); //命令
    Keyboard.press('s'); //S key

    Keyboard.releaseAll(); //释放所有按下的按键

    delay(300);
  }

我为所有 12 个按钮编写了一个if条件,输入与键盘每个按钮关联的不同快捷键的按键。在此示例中,我们有“保存”键,它将 CMD+S(Windows 上的 CTRL+S)快捷方式发送到计算机。

 if (!digitalRead(switch1)) {  //媒体播放/暂停

    Consumer.write(MEDIA_PLAY_PAUSE); 

    delay(300);
  }

在另一个示例中,你可以看到如何使用键盘“消费者键”,其中包括播放和暂停音乐的键,例如用于跳到下一首曲目的键。在这里你可以看到这些命令的完整列表。

#include "HID-Project.h" 
... 

int FinderView = 0; 

void setup() { 
  ... 
} 
void loop() { 
  ... 

  if ((!digitalRead(switch6)) && FinderView == 0) { //将 Finder 视图更改为图库 - cmd+4(在 mac OS 上)

    Keyboard.press(KEY_LEFT_GUI); //command
    Keyboard.press('4'); //4 key

    Keyboard.releaseAll(); //释放所有按下的按键

    FinderView = 1; 

   delay(300);
  } 

  if ((!digitalRead(switch6)) && FinderView == 1) { //将 Finder 视图更改为图标 - cmd+1(在 mac OS 上)

   Keyboard.press(KEY_LEFT_GUI); //command
    Keyboard.press('1'); //1 key

    Keyboard.releaseAll(); //释放所有按下的按键

    FinderView = 2; 

    delay(300);
  } 

  if ((!digitalRead(switch6)) && FinderView == 2) { //将 Finder 视图更改为列表 - cmd+2(在 mac OS 上)

    Keyboard.press(KEY_LEFT_GUI); //命令
    Keyboard.press('2'); //2 key
    Keyboard.releaseAll(); //释放所有按下的按键

    FinderView = 0; 

   delay(300);
  }

此示例显示如何在每次按下宏键盘时通过不同的快捷键循环进行一次切换。为此,你需要在代码开头添加一个额外的变量。在if条件下,你都需要检查开关是否被按下以及变量的值是否正确。然后,在条件内将变量设置为要按下的下一个快捷方式的if条件中的值。就我而言,我使用该系统循环浏览文件资源管理器的不同视图(网格、列表、图库...)。在代码中你可以看到切换到不同视图的快捷方式。

这就是该项目的代码的工作原理。正如你所看到的,更改代码以插入要与键盘按键关联的快捷键非常简单。请注意,我的代码中编写的所有快捷方式都适用于 Mac OS。如果你拥有 Windows PC,则必须修改发送到计算机的 Arduino 代码中每个快捷方式的按键。

HID-Project 库有许多非常有趣的功能,因此我建议你查看Github 页面上的各种示例。

当你将代码编写或粘贴到 Arduino IDE 中后,你可以将 Arduino 连接到计算机来上传代码。上传完成后,键盘就可以使用了。

完整的代码可以在项目文件库中下载:
https://make.quwj.com/project/518

完成

总的来说,我非常满意这款宏键盘的制作成果,它在我的桌子上显得尤为精致。我已经使用这款宏键盘超过两周了,可以肯定地说,它确实能在电脑工作时节省不少时间,且对于视频编辑和日常使用都极为便利。我也希望你会觉得这篇指南既有趣又实用。