俄勒冈州立大学!键盘

一万四千一百六十八

104

十一

:你好,我是Thomas,荷兰ICT学生,毕业于机电一体化工程师。我喜欢做项目,看电影和连续剧,有时阅读和尝试玩键盘。

我最近开始玩一个叫osu的节奏游戏!看了一段商用迷你键盘的视频后,我觉得自己设计一个键盘会很有趣。在那之后不久,我决定把它作为我的第一个项目放在教学表上是个好主意。

如果你想把这个项目完全复制到最后一条指令上,那就请便吧。但是我做的一些决定不是基于最低的价格或最好的质量。一些组件的选择几乎完全是因为我让它们到处都是。如果你能处理好,我建议你定制你的项目。

注1:SMD组件(小型电子产品)被使用,所以如果你复制这个项目焊接技能是必需的。可能会增加一个易于焊接的版本,但这些LED不会出现在槽孔封装中。

注2:当前项目是版本1,我计划制作版本2

第一步:材料和解释

根据项目的制作方式,您可能需要不同的组件,但是这些分量是我用过的。如果你有时间并且想省钱,从全球速卖通订购,不要订购PCB。

1 . Arduino pro micro + USB数据线

3个Kailh Box红色开关

3个10千电阻(0805 SMD)

100nF电容(0805 SMD)

4个APA102 RGB LED(5050 SMD)

3键帽

本项目提供1块印刷电路板(PCB)

本项目提供1个3D打印箱

为什么我要使用Arduino pro micro?

大多数Arduino板(如UNO(ATMega328))不支持USB通信。是的,你可以很容易地通过USB编程,我认为有解决办法,但我喜欢在USB通信方面保持简单,我不知道解决方法是否具有响应性。这些电路板使用外部芯片使USB通信成为可能,而Arduino pro micro (Atmega32U4)内置了这种芯片。

开关

你可以使用许多机械开关。线性的,来自Kailh或Cherry MX的触觉或点击。你喜欢哪个就选哪个。我使用凯莱开关是因为它们在Ailexpress上很便宜。如果你选择使用PCB,你将需要凯盒开关。颜色决定感觉。

电子元件

在这一章中没有太多的解释,但是如果你不使用PCB,我建议你使用普通的槽孔组件,以便于焊接。不幸的是,使用的led在槽孔封装中是不可用的。我也不建议在SMD包装上使用电线,除非你对自己的焊接技术非常有信心。即使是在PCB上的SMD,也需要“高级”的焊接技能。

房地产

我确实在这个项目中提供住房,但现在它有缺陷。需要对螺栓进行修改,led的开口不是最佳的,Arduino暴露在外,需要切割出一个零件以便安装USB。将来可能会增加一套新房子。如果你有一台3D打印机,请继续打印,但是,如果你不打印这个有缺陷的案例,请不要特意使用某种项目框。

第二步:示意图

这个项目的示意图相当简单,但是我想为那些对这个实现感兴趣但不了解它的人解释这些组件。

切换到Arduino的连接

开关连接到Arduino引脚0,2和3,因为这些插脚可以用作外部中断。这在代码部分有进一步的解释。

防反跳电路

示意图左侧是一个复制了3次的电路。这个电路是用来断开开关的。要知道什么是跳脱,你需要理解开关弹跳,这并不难理解。

首先看一下这个模拟来绘制第一幅图(快速单击开关并查看下面的信号)http://tinyurl.com/yajdtndw

当你按下或释放开关时,它会弹跳,信号会在几毫秒内在高信号和低信号之间交替几次。阿杜尼奥真的很快,在这短短的时间里,每一个高低都能读到。每次读到高或低时,程序都会发送按键或释放,因此每次按下时,计算机都会收到多个按键。对于节奏游戏来说并不理想。

这种去缓冲电路将减慢信号的下降沿。Arduino的信号不会随着弹跳的发生而改变,因此它将被读取为一次按下。不要担心它会在下一次真正的媒体面前减速,因为它会的。

高级:

Atmaga32U4读取0.2Vcc - 0.1V = 0.9伏特的数字低电压。电容器的电压在任何时间在其放电Vcc * e ^(- t / RC)。如果你在你的开关上测量一个不同的释放时间,你可以计算你的电阻和电容值。

公式形式https://www.electronics-tutorials.ws/rc/rc_2.html

发光二极管的

RGB LED是APA102 LED,可以使用时钟和数据线单独寻址。不需要外部组件来使它们工作。对于许多led,你应该使用一个平行于5伏和地面的电容,但只有4个led,你不需要它。

第3步:电路板设计

该电路板采用JLCPCB设计。我不是由他们赞助的,而是为了廉价的原型,他们制造出优秀的印刷电路板。2块钱你可以得到同一块板的10块,但我的运费是11美元。如果你不需要rgb照明,并计划只做一个,你应该考虑不用PCB制作键盘。

董事会的设计非常直接。我只需要为交换机添加一个组件,但是看了一些视频之后,我掌握了窍门。我意识到的唯一缺陷是孔的位置太靠近开关了。

订购PCB到https://jlcpcb.com/并选择2分层选项。它会要求你提供一个Gerber文件。下载“.zip”文件并将其拖动到窗口。你不需要解压。设置应该是好的,您可以继续并完成订单。

步骤4:案例设计和组装技巧

设计

正如之前的尺寸的,我的设计有缺陷,但如果你愿意的话,你仍然可以打印出来。该设计是在Fusion 360中完成的。它是一个免费的三维建模软件,根据我在Inventor和SolidWorks的经验,它非常容易使用。箱子角上的圆圈是为了防止从印刷床上剥落。

如果你提出自己的观点,只有一件事是真正重要的。您的开关需要放置牢固,不能移动。我已经提供了方形切口的尺寸图片,这样你就可以用它来设计你自己的设计,假设你使用凯尔盒开关。

组装

现在您有了所有需要组装的组件。因为开关是焊接的,所以组装第一个版本是有顺序的。

1。焊接SMD部件。这些是电阻,电容和发光二极管。

2。焊接Arduino Pro Micro。

3.焊接前将3个开关放入3D打印盖板中。开关焊接后,盖板不能拆下。不建议拆焊开关,可能会破坏它们。

4.现在把开关焊接好。尽可能快地这样做,因为塑料开关可能会融化并破坏它们,或者大大减少它们的点击次数。

5.将组装好的盖板放在3D打印盒中,用胶带或螺栓固定,如果它们不影响键帽。

6.把键帽放在开关上,就完成了。

Recomendations

上传你的代码后,清除或屏蔽arduino上的led灯。如果你的代码没有上传,led是很好的,但不作为一个成品来看很好。技能和尖镊子是必需的。

还有一些抓地力脚在底部是很好的防滑,让rgb光通过。

步骤5:代码(硬件剥离)

这个项目的代码对初学者不友好,所以如果您刚刚开始使用arduino编程,那么这段代码可能会吓到您。不过,我将尽我所能来解释到底发生了什么。本教材稍后会解释一些内容,如有问题,请先通读全文。

上传代码

首先下载所有3个“.ino”文件并将它们放在一个文件夹中。如果您没有Arduino IDE,可以在官方Arduino站点上免费下载。https://www.arduino.cc/en/main/software网站

连接您的Arduino到您的PC上并打开“OSU_Keyboard_code_V1.ino”。在Tools—> Board中选择“Arduino/Genuino Micro”。同样在工具中选择正确的COM端口。这有时会改变。要将代码上载到您的Arduino,只需单击屏幕左上角的箭头,等待它在左下角告诉您代码已完成。

OSU_键盘_代码_v1

包括和定义

首先,您需要包含键盘库。这使得使用Arduino作为键盘成为可能。

接下来我定义一些值。Define就像一个变量,但是在程序运行时是不能改变的。
前9个是键盘字符,arduino pin数和端口位。

然后是LED数据和时钟的端口位。

此外,还定义了LED的数量和色轮角度的变量。

安装程序

当Arduino插入时,这部分代码只执行一次。

首先,LED的时钟和数据针设置为输出,开关针设置为输入。这是pinMode()的高级版本。如果您感兴趣,请搜索“直接端口操作”。https://www.arduino.cc/en/Reference/PortManipulati..。

begin()简单地将usb连接作为键盘启动。

接下来的3个中断被连接到开关插脚上。每次在开关管脚上检测到变化时,就会执行一个小程序。这个小程序还会继续。

循环

这部分将不断重复,而arduino是电源。

我只用它来改变和更新led的颜色。

中断

这里的小程序,只有在检测到开关引脚上有变化时才会执行,是由。它们是相同的,除了它们对哪根针起反应。

首先,它检查按钮是否被按下或释放,并发送正确的键盘命令。

领导(以不同顺序解释)

如果您想知道led是如何控制的,您应该看看APA102数据表。https://cdn-shop.adafruit.com/datasheets/APA102.pd..。

OneBit

这也是数字写操作的直接端口版本。

首先,它检查是否应该发送0或1,并分别将数据针拉低或拉高。然后它将时钟针写得很高很短,然后再写得很低。

OneByte

用for循环重复1位8次。它读取字节中的第一个位,并将其值传递给oneBit函数,然后对接下来的7位执行相同的操作。

LedData

这将重复一个字节4次,以提供一个led所需的数据。第一个字节以111XXXX开头,在XXXX的位置上有一个5位的亮度值。亮度可以设置为0到31(2^5=32级)。

接下来的3个字节是蓝色的,绿色和红色的值。每个颜色对应一个字节。

ColorWheelThisLed

此函数调用leddata,根据色盘中的角度为其提供RGB颜色。

16位值在6个等距的60度部分中被除数。看这些图片可以帮助你更好地理解。

(还提供了一个8位版本,但是注释掉了,因为太不稳定)

StartEndFrame

每次你想要给led发送新颜色并想要更新led的实际颜色时,都需要使用开始帧

我只使用开始帧,因为结束帧是不需要的。起始帧是4字节的0。结束帧是4字节255(11111111)。

第6步:代码(软件解卷)

玩了一段时间后,我注意到硬件崩溃时出现了一些双击问题。这可以用其他值电阻或电容来固定,但由于按钮和盖子是不可拆卸的,我认为软件去块是一个很好的解决方案。无论硬件去核化是否实现,软件去核化都应该是有效的。在我目前的设置,我不能删除的盖子,所以我只是留下电阻和电容器的地方。

我不会像以前的版本那样详细地解释代码,因为解释起来有点困难。

基本上大部分代码的工作原理是一样的,led代码是不变的。改变的是外部中断不再使用Arduino函数。现在它在纯C代码中工作。现在添加的是软件中断。为此,我使用AVR定时器等待一定的时间,直到反弹停止。因为计时器是基于中断的,所以递减时间不受循环中发生的任何事情的影响。

我能想到的唯一缺点是arduino延迟函数不能再使用了。因为延迟函数使用定时器0,而这个程序使用定时器0来取消。

在图像中,您可以看到代码大致是如何工作的。MEM位指示计时器是否正在运行。没有描述的情况是,在按钮结束时按下的输入是低的。在这种情况下,当按钮已经释放时,只会发送一个按键。这就意味着只要涉及到电脑,钥匙就会被按下。对于这种罕见的异常,将在计时器到期时预制一个检查。如果在计时器结束时按钮没有被按下,将发送一个keyrelease命令。

第七步:结果

如果一切顺利,你现在应该有一个工作键盘来玩Osu!上。我个人没有注意到任何延迟。如果有,请告诉我。如果有任何问题,请随便问。

前面提到的v2并不意味着承诺,所以不要因为您想等待v2而推迟这个项目。

希望你喜欢你的键盘!

俄勒冈州立大学!名称:THOMAZZ3

故障排除

如果你觉得你的键盘有问题,首先打开一个文本编辑器,短时间按下每个键一次。

  • 一个或多个键不起作用吗?

你可能在焊接时内部损坏了开关。如果你有万用表,把它调到连续/哔哔声,当Arduino未连接时,将其与开关平行并按下按键。它应该发出哔哔声。

  • 您刚刚键入的字符是否与您在Osu中配置的密钥匹配?吗?

更改前3个定义中的arduino代码中的字符(' ' is nessecary! ')。

或者改变你的Osu!使用配置的密钥的设置。

  • 一个或多个键重复几次?

脱扣电路可能不适合你的开关或焊接不正确。检查你的焊点。如果仍然发生,请尝试将电容值设置为1uF。这对印刷电路板用户来说非常困难。

如果您的LED有问题

  • led会闪烁吗?

焊料连接可能松动。如果你使用印刷电路板,确认焊锡真的在印刷板上流动。

  • 是否所有的led都不工作或从一定数量的led停止工作?

检查第一个LED(跟踪轨道)的转换之间的短路,并检查Arduino和第一个LED的输出是否连接良好。如果确认正确,仍然有缺陷,你可能需要更换第一个LED。

如果这修复了它重复为下一个led如果需要。

分享

    建议

    • 大大小小的比赛

      大大小小的比赛
    • 2018年辉光竞赛

      2018年辉光竞赛
    • 印制电路板竞赛

      印制电路板竞赛

    11日讨论

    0
    没有
    HerlanderA

    2个月前

    美好的一天!你能分享一个好地方为Kaihl开关获得钥匙帽吗?我拿到了凯尔铜。我还想知道,如果有必要添加任何二极管到构建。谢谢你!

    1回复
    0
    没有
    Thomazzz3 HerlanderA

    2个月前回复

    对于键帽,任何MX兼容的帽都可以。我是从全球速卖通买的,但我不会说那是个“好地方”。我更喜欢低价。
    https://s.click.aliexpress.com/e/WZq0KN6

    至于二极管,我不清楚你们在电路的什么地方需要它们,以及它们的用途是什么。为此我需要更多的信息。

    0
    没有
    MakersBox

    3个月前

    喜欢揭穿的解释和模拟器。为什么是RGB(它们是由游戏或击键控制还是仅仅是为了好玩)?

    1回复
    0
    没有
    Thomazzz3 MakersBox

    3个月前答复

    谢谢。
    目前,RGB只是为了好玩。它们可以被编程来响应按键,但就目前而言,这只是一个彩虹周期。我写了一些辅助函数来控制led,这样你就可以自由定制了。创造者的创造性是极限。如果有人想要帮助创建特定的模式或响应,他们应该在注释中询问。我很乐意帮忙!

    0
    没有
    Thorondor95

    问题3个月前

    跑题了,我知道,但是你认为这里使用的Arduino可以在5.8GHz的FPV信号上进行OSD操作吗?就像在FPV地面站?

    还有4个答案
    0
    没有
    Thomazzz3 Thorondor95

    3个月前答复

    你好,这确实离题了,但仍然是一个非常有趣的项目。我没有任何FPV或模拟视频信号的经验,但我刚刚做了一些研究。如果我是正确的,这个OSD应该连接在相机和VTX之间。

    一开始我觉得用Arduino读取所有的视频输入是个好主意,修改它并输出arduino的信号,但我怀疑arduino太慢了(不确定)。但后来我遇到了arduino的RCA护盾。当然你不会想要无人机上有一个Uno +盾牌,但这表明这是可能的。

    https://nootropicdesign.com/ve/
    也许可以设计一些类似但更小的东西。

    如果你需要进一步的帮助,我很感兴趣。(接下来的几天我要去参加某个音乐节,可能反应没那么快)

    0
    没有
    Thorondor95 Thomazzz3

    3个月前答复

    很抱歉告诉你,你浪费了这么深入的评论和几分钟的研究,但那不是我的意思。我想在接收模块和地面监视器之间建立Arduino。在音乐节上玩得开心!

    0
    没有
    Thomazzz3 Thorondor95

    3个月前答复

    没有问题。但是接收机和显示器之间的信号应该还是RCA,对吗?在这种情况下,可以使用相同的电路板。

    0
    没有
    Thorondor95 Thomazzz3

    3个月前答复

    在我的地面站,

    //www.sledutah.com/id/DIY-FPV-Ground-St..。

    是的(RCA指的是难看的红/黄/白电缆,对吧?)。

    如果我要用我的护目镜(Kylin Vision/JJPRO),那么我就必须做一些焊接和电子分析。我想我能做到,但可能不是,所以我还是用RCA地面站吧。我只能用它来录音,因为它造成的延迟会使它无法实际飞行。