[项目]DIY小键盘 精华

2020-10-9 11:08:36 [显示全部楼层]
19970浏览
查看: 19970|回复: 8

[项目] DIY小键盘

[复制链接]

DIY小键盘

DIY小键盘图7

DIY小键盘图8 DIY小键盘图9 DIY小键盘图10

在这个教程中,我将全程指导你创建一个由Arduino控制的6键小键盘。我将告诉你:需要什么,如何组装,如何编程,以及如何改进或自己独立创新。

经过大量的研究,我真的没找到一个好的教程讲述如何制作一个小键盘或普通的有线键盘。因此我决定自己动手,用最简单的方法,不用二极管、电阻或其他任何东西。我打算把它做成一个独特的、模块化的键盘,可以与任何我需要的部件组合,这是许多其他模块化部件中的第一个。这个模块的灵感来自于键盘上的箭头键。如果你在旅途中需要一些额外的按键,可以装进口袋里随身携带。

说到如何制作这个小键盘,我强烈建议您在购买零部件之前先通篇阅读所有步骤。

我试图按逻辑顺序组织本教程,但实际上我没有完全按照这个逻辑顺序进行制作,因此最好根据自己的制作方式适当调整这些步骤的顺序。

第1步:获取零件

购买零部件是最花时间的一步,购买之后还要等待物流配送。您需要的零部件包括:

  1. 机械按键开关

    • 我从[这里]()选择具有清晰顶部的Gateron按键开关(透明顶部使下一步更容易操作,最常见的按键开关类型也有介绍)
    • 其它地方也可以买到,在[这里]()你最喜欢的按键开关部分
      • 我强烈建议您在这里的“感觉”部分仔细研究一下您想要什么按键开关
  2. 机械键帽

    • 确保它们与您选择的按键开关兼容!
      • 还要确保它们与背光兼容,这样你就可以改变颜色
    • 可以在[这里]()的“新奇按键(标准制造)”部分寻找供应商,除非你想要一套完整的键帽
  3. 可寻址RGB LED灯带(可选,但强烈建议)

    • 我从亚马逊买了与这款类似的东西
      • 确保LED是WS2812B LED,它们可以接受较低的电压。
      • 你也可以购买3毫米的普通LED,选择你喜欢的颜色,但你需要使用降压电阻
  4. 一个HID兼容的微型控制器(我选用Pro Micro)

    • 我从亚马逊购买了性价比高的的[这款]()
      • 你可以购买其它的微控制器,但要确保它们都是Arduino和HID(人类输入设备)兼容的
  5. 一个128x32 I2C显示器

    • 我从亚马逊买了[这款]()
  6. 3D打印

    • 看看你附近的当地图书馆或学校是否有3D打印机可用
    • 我个人从未使用过在线服务,但你也可以尝试使用这些服务(类似[这个]())
  7. 细导线

  8. 所需的通用工具

    • 烙铁和焊锡丝
    • 侧切钳
    • 小锉刀(可选)
    • 热熔胶枪和胶棒
    • 螺丝刀和螺丝

第2步:改装按键开关

开始拆卸你购买的按键开关。改装目的是为了让光线更好地照射在键帽的边缘上。如果选择不支持RGB的键帽,请跳过此步骤。

取2个小楔子(我使用2个一字螺丝刀头)并将其楔入开关侧面的凸耳下。然后在顶部和底部之间的缝隙塞一些东西,这样它就不会复原了。继续楔入另一侧的凸耳,这样就不会有凸耳将顶部固定住。最后弹出开关的顶部。通常有四个部分:外壳的顶部和底部、弹簧和阀杆(固定键帽的开关滑动部分)。

开始从外壳底部切下一些小碎片,让更多的光线能通过。首先剪断将开关固定在板上的凸耳。然后扩大一点原来的LED通孔(有4个孔的部分,这些孔是用于穿过LED引脚的)。慢慢地把凸耳里面剪掉,直到底部。然后继续往上切割到固定弹簧的开关的圆柱形中心。之后,用预先成型的支架支撑,慢慢地切割孔的边缘,使孔稍微变宽。另一个可选的步骤是用锉刀锉平,使它更加美观,减少锯齿。确保外壳内没有塑料碎片,以免开关被卡住。一定要缓慢地、一点一点切削,因为在这过程中我已经损坏了一些外壳。

如果你的开关的上半部分不够清晰,试着稍微改装一下,让光照进来。一点一点地尝试,不要损坏开关,以免阀杆脱落。一个可能的解决方案是剪切一块能容纳普通LED的塑料片,把保持灯杆封闭的塑料片留在一边,只把它往下面锉平。

第3步:3D打印

您需要下载下面其中一个zip文件,并进行3D打印。有不同的版本供你选择。有一个文件夹里面包含所有常规stl文件(KeybArrowSTLFiles),另一个文件夹包含Autodesk Inventor文件(KeybArrowSourceFiles),便于您修改文件进行按需定制。这些文件和我打印的有点不同,因为制作过程中发现了一些设计缺陷,我作了一些改进。例如,把我的外壳边缘有点太高,导致键帽不能完全按下。新的文件已经进行修正。

模型的设计相当复杂,有30多个步骤。我要说的是,如果你想设计一个不同尺寸的外壳,必须具备一些复杂的三维设计的经验。这真的不太适合刚接触3D设计的人。

注意两个外壳设计的角度都是3度,你应该把它们平放在键盘上。

3D打印模板:

下载附件KeybArrowSourceFiles.zip下载附件KeybArrowSTLFiles.zip

第4步:组装目前的所有零部件

既然我们有了所需的全部零件,还有3D打印的零件,是时候开始组装了!

把6个按键开关都放在平板上,然后用胶水粘住。由于我们切断了固定它的凸耳,所以需要把它们粘在一起。我建议你等胶水干了后再把OLED放进去,以免把它弄倾斜。

接下来,从LED灯带上剪下6个LED,并将它们放在LED板上。板上的方块有助于定位LED。方形的LED可以放在里面,所以你可以3D打印另一个用来帮助对齐,或者直接从背面排列。确保箭头指向其它LED,因为DO要焊接到DI上。用热熔胶把LED固定在适当的位置,等待热熔胶粘牢。

我用了一个原型板辅助按键开关来固定LED(在图片中),因为我不想浪费材料,所以决定继续使用旧的。新文件不会影响任何东西,只是让它更容易对齐。

第5步:设置OLED

我建议您使用这个教程进行完整的演练。教程解释得很好。

您需要下载并导入Adafruit的SSD1306库GFX库才能使代码工作。

所需库文件:

下载附件Adafruit_SSD1306.zip下载附件Adafruit-GFX-Library.zip

先按图把线接好。将VCC连接到VCC,GND连接到GND。然后连接SDA和SCL引脚。SDA和SCL引脚可能每个Arduino不尽相同,在Pro Micro上,SDA连接至引脚2,SCL连接至引脚3。如果您不确定SDA和SCL连接到哪个引脚,请参考控制器的引脚说明。

下一步是使它显示和生成图像。下面有如何让它工作的文件。第一步是使用屏幕扫描代码(原始版本由Arduino提供)。把代码上传到Pro Micro并打开串口监视器(在顶部的“工具”选项卡)。串口监视器会回显OLED的地址。如果您的地址是0x3C,那么您不需要做任何更改。如果不是,那么为了让它正常工作您需要更改ssd1306_128x32_i2c代码和最终代码(名为ArrowKeypad)中的地址。

现在测试Adafruit ssd1306库中包含的示例代码,该代码用于128x32 i2c代码(名为ssd1306_128x32_2c)

之后,让Arduino保持开启状态,并试着在按键开关板上对齐OLED,然后关闭电源并把它粘在适当的位置。你很可能不会一次成功,需要不断调整,使它对齐,这样完工时它就不会歪斜。我建议先把一边粘住一点,在粘另一边之前先检查一下,确保它没有歪斜。

现在下载代码,并使用本教程后面步骤8中的其它代码文件。

下载代码文件:下载附件InstructablesCode.zip

第6步:焊接

下面提供了Fritzing文件下载。有了Fritzing文件你就可以与电路进行交互,如果单击并一直按住,可以看到所有连接的电线(以黄色圆点突出显示)需要导入到Fritzing的文件将显示在下面(适用于Pro Micro和LED)。

确保标有“MOSI、MISO或SCLK”的引脚悬空,否则会导致OLED出现故障。

把6个发光二极管切成单独的一个后,把它们粘在LED板上。将烙铁放在铜焊盘上,并在每个焊盘上添加焊锡。把导线剪成小段,剥去一半,拧紧它,然后取下另一半,把它拧在一起。电线需要用钳子或一些助焊手来固定,而你要用焊锡把它固定在适当的位置上。添加更多焊锡,使其接触良好。将同一行的所有LED焊接在一起。剪取一根导线,将其焊接到第一行的LED末端,标签为“DO”或“D-”,然后将其连接到第二行的第一个LED上,标签为“DI”或“D+”。以类似的方式连接5v和GND,但如果每行的第一个LED 5v和GND连接在一起,就更容易了。在Arduino上,将5v导线连接到VCC,将Data针脚连接到任何数字引脚(代码已设置为引脚10),将GND连接到Arduino上的GND。

要使Arduino识别输入,开关需要将接地连接到数据引脚。所以,你可以焊接一根导线把6个开关都接地。把一根导线焊接到每个开关上,如果可能的话,用不同颜色的导线以便跟踪哪个开关是什么导线。将导线穿过LED板,并将其连接到Arduino上的一个数据引脚(我使用数据引脚5-9)

旁边的两个开关有不同的功能,一个是用于编程的复位开关,另一个是功能切换开关,它将在键盘的各个层之间切换,以快速改变按键的功能。顶部开关连接至reset(RST)和GND,当接通时,它会导致复位。底部开关连接至引脚18,在Pro Micro上标记为A0。让开关线有些松弛,因为仍然需要在板中滑动,而且导线太短将不允许按键板插入顶部。

Fritzing电路图:下载附件KeybArrowFritzingCircuitDiagram.zip

第7步:编程简介

在你扣上外壳之前,你需要测试它并确保它能正常工作。虽然你现在就可以跳到第11步进行组装,但我发现事先测试它有助于减少打开和扣上外壳的次数。尽管版本不会有太大的影响,但是我使用了ArduinoIDE 1.8.3版本,因此如果您遇到了问题,请尝试使用这个版本。代码在步骤5中,是一个zip文件,您需要把它解压并上传到Arduino。

下面将有多段代码。一个是最终代码,两个是测试OLED的代码(一个测试,一个查找地址),另一个是测试RGB。使用最终代码测试按键开关。

如果你想设计你自己的代码,我会在接下来的3个步骤中教你,但是你完全可以使用我的代码,或者在此基础上进行修改。

编程的一些基本知识:

  • 在“工具”菜单,然后是“电路板”子菜单,将其设置为Arduino Leonardo(除非您有与Pro Micro不同的微控制器)
  • 每次将代码上传到Pro Micro时,请使用重置开关。我发现,一旦编译栏满了,并且还在上传,这是按一下重置开关的好时机。(如果不这样做,上传将会失败。)
  • 必须安装并导入用到的所有库
    • 要导入,请转到“工具”菜单并单击“包含库”。(另请注意,我在网页上的代码示例需要在库名称周围加上“<>”,在接下来的几个步骤中,我无法在示例代码部分输入它们)
  • LED和OLED库将被初始化为对象,你可以随意命名它们,但为了演示起见,我将它们命名为stripdisplay
    • 要调用对象的方法,可以键入对象名称,加上英文句点,然后键入要使用的函数

接下来测试LED,上传代码,确保它们都能工作。如果没有工作,你可能漏掉了一个引脚,检查你的第一个LED的焊接。

最后,使用最终代码来测试的开关来测试代码。这应该是最容易做到的。注意,由于上传一些HID代码,每次上传代码时都需要重置Arduino。应该可以在上传过程中重置它。

步骤8:按键开关编程

在所有的编程中,开关是最不复杂的。要将其识别为键盘,只需使用Arduino键盘库和条件语句。如果你像我一样使用Pro Micro,请确保在“工具”菜单,“电路板”子菜单下选择Arduino Leonardo。

在我们开始使用条件语句之前,我们需要设置引脚模式。我们只需要进行一次,所以把它放入void setup()函数中。从pinMode(PinNum,INPUT_PULLUP)开始;这告诉Arduino PinNum用作一个输入,并且为它启用一个内置的上拉电阻(这样我们就不需要在硬件中连接了)

输入上拉有两种状态,低和高。当接地(GND)时,Arduino的读数为低,断开时,读数为高。为了找到pin的读数,我们使用digitalRead(PinNum)

从基础知识开始,我们使用条件if语句来确定是否按下了按键。我们希望这个循环不断重复,所以把这个语句放void loop()函数。如果该按键被注册为“低”,那么我们希望该按键被按下,并在输入为“高”时释放该按按键。为此,我们编写if (digitalRead(PinNum) == LOW) {[按下按键时要执行的代码]}if (digitalRead(PinNum) == HIGH) {[释放按键时要执行的代码]}

对于键盘的代码,请导入键盘库。在void setup()函数中增加语句keyboard.begin();然后在条件语句中,使用keyboard.press([key]);keyboard.release([key]);或者如果有多个按键按下的话keyboard.releaseAll(); 你也可以用keyboard.print([String]);以及keyboard.println([String]);打印字符串,例如密码。printprintln很相似,println只是在最后添加了一个ENTER,所以它会自动转到下一行。

步骤9:OLED编程

要开始OLED编程,您需要有基本的设置代码。基本上就是告诉计算机你的OLED在哪里、它的大小以及它是如何编程的。一旦有了OLED的设置代码,如果你只需要显示文本,那编程应该很简单。首先导入Wire和SSD1306库。

在代码中将OLED_RESET定义为4,并导入SSD1306库。在代码中添加语句Adafruit_SSD1306 display(OLED_RESET);以便开始使用Adafruit SSD1306库。

以语句Serial.begin(9600);开始,然后display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 用地址0x3C初始化I2C显示器(除非在步骤5中更改过地址)。把这两个语句都放在void setup()函数中,因为它们只需要运行一次。

在对显示器进行编程之前,应确保调用display.clearDisplay(). 如果不这样做,输入的内容将重叠,并且根据更改的内容,将不可读。您还需要设置原点,因此使用display.setCursor(0,0);将其设置在显示器上的某个点上,输入(0,0)将其重置回起始位置。要设置文本的大小,请使用display.setTextSize(1) 我不会使用比1大,因为它比预期的要大得多。

即使我们的显示器是单色的,我们也需要设置文本的颜色,所以我们使用语句display.setTextColor(WHITE);

既然已经导入了显示库和定义了显示对象,现在可以开始编程了。要添加文本,请使用display.print();以及display.println();打印字符串。重复一遍,print不添加回车,而println在再次打印时会自动转到下一行。

在能看到任何内容显示之前,您需要更新OLED,并告诉它进行更新,可以使用不带参数的display.display();函数,显示器将会刷新。

完整的代码现在应该是这样的:

//Code Made by Foster Phillips
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

void setup() {
  pinMode(SWITCH,INPUT_PULLUP);
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
}
void loop() {
  display.display();
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println("Hello World!");
  display.println("Hello Instructables!");
}

这个教程链接和这个Github链接都是很好的参考资料,可以帮助您进行故障排除,并进一步学习如何进行显示器编程。

步骤10:LED编程

LED编程也相当简单。我们将使用Adafruit Neopixel库。我个人认为,NeoPixel库非常类似于在Processing中编程。

这里有第一个设置代码,说明了我们使用的库,并设置了一个数组,基本上是声明显示管脚上有多少个LED,哪个管脚用于数据,以及它是如何编程的。这是通过一个例子来实现的,比如Adafruit_NeoPixel strip=Adafruit_NeoPixel(6, 10, NEO_GRB+NEO_KHZ800);这解释了有6个LED,引脚是编号10,即使用NEO_GRB+NEO_KZH800类型的可寻址灯带。通常不需要理会最后一个参数,我使用的LED灯带不需要改变。

之后你需要使用strip.begin();函数表明你准备好开始使用它们。括号内无需填写任何参数。

一旦你调用了begin()函数,你就可以用strip.[function]调用不同的函数。

其中一个你需要知道的函数是strip.setPixelColour(). 括号内有4个参数。LED在数组中的位置(记住,数组位置从0开始),对应的红色、绿色和蓝色值(介于0-255之间)。这将允许您通过混合红、绿、蓝调出所需的颜色。如果您希望第一个LED显示青色,代码应该是:strip.setPixelColour(0, 0, 255, 255);

还需要把数据发送给目标LED,这是strip.show();所做的工作。它将在你改变LED颜色后更新它们。括号里什么都不需要。

完整代码应如下所示:

//Code Made by Foster Phillips
#include <Adafruit_NeoPixel.h>
#define PIN 10
#define Num 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(Num, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show();
}
void loop() {
  strip.setPixelColor(0,255,0,0);
  strip.setPixelColor(1,255,0,0);
  strip.setPixelColor(2,255,0,0);
  strip.setPixelColor(4,255,0,0);
  strip.setPixelColor(3,0,0,255);
  strip.setPixelColor(5,0,0,255);
  strip.show();
}

可以在这里找到更多信息。

第11步:装配!

这可能是最简单、最酷的一步。

首先将Pro Micro放置并滑动到外壳上。用一些热熔胶把它粘在适当的地方。

外壳的设计使您可以从侧面滑入按键开关板和LED板。根据打印方式的不同,您可能需要锉平或切割滑槽内部,去除一些突起的塑料。

之后,把螺丝钉用力拧进塑料里面,做出自攻螺纹孔。我在设计文件时没有具体的螺纹,所以我只做了一个螺丝大小的洞,然后自己把螺丝拧进去。用打火机加热,可以帮助你把它做成适应你需要的螺丝,而且通常会加固相应的层。一定不要用力过猛,否则会把头部剥掉。我用内六角螺丝来减少这种风险。

然后把键帽按在按键开关上。这样就完工了!我的箭头键盘已经做成了!

第十二步:你自己的改进!

既然你了解了如何制作我这个版本,你就可以制作自己的了!键盘可以说是关于自我表达,所以仅仅拥有别人的设计是没有很多乐趣的,除非按你自己的需求进行改进!你可以做很多改进!下面是一些我要进行或想到的改进:

  • 编写俄罗斯方块和其他简单的游戏
  • 让它支持蓝牙
  • 允许它从幻灯片中读取数据并在OLED上显示(显示幻灯片编号和幻灯片名称)
  • 使用这些技术制作一个全尺寸的键盘或更大的小键盘
    • 你需要学习如何做一个按键开关矩阵
  • 支持更多颜色选项
  • 编写用于游戏、视频编辑等的宏。
  • 使用Autodesk Inventor源文件创建自己的外壳,或将其修改为独特的案例!
  • 增加一个音频板,让它拥有音乐播放器的双重功能

创作快乐!请随意添加提示或向我提问!

如果你想看到其他部件的进展,可以考虑查看我的Instagram。感谢您阅读我的教程!

英文链接:Custom Macro Mechanical Keypad
英文作者:FosterP
中文翻译:fibx

佛系唐法官  中级技师

发表于 2020-10-10 15:05:53

这个点子真棒!

回复

使用道具 举报

gray6666  初级技神

发表于 2020-10-10 21:12:48

好棒,赞一个
回复

使用道具 举报

安静的候车亭  学徒

发表于 2020-10-13 21:04:41

想给手机做一个,怎么做?
回复

使用道具 举报

梦之  学徒

发表于 2020-10-14 23:27:55

小巧又实用,谢谢楼主
回复

使用道具 举报

Etelnar  学徒

发表于 2020-10-23 01:39:49

感谢楼主的分享
回复

使用道具 举报

DFSytqLPp_w  学徒 来自手机

发表于 2020-11-2 19:07:47

fibx 发表于 2020-10-9 11:08
[md]# DIY小键盘



感谢楼主分享
回复

使用道具 举报

wery  学徒

发表于 2020-11-19 22:44:27

好棒,谢谢楼主分享
回复

使用道具 举报

wanglong126  学徒

发表于 2022-11-17 21:02:17

这个很赞,我也有类似的想法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail