资源 Arduino的64键自定义键盘矩阵
需要的元件 Arduino UNO 1N4148 –通用快速开关 x64 按动开关 x64 74HC595移位寄存器 排针 Arduino IDE 原理及流程 我目前正在开发一个带有集成键盘的项目,这带来了一个问题:如何在开发板原型中包含键盘?我不能使用USB键盘或现有的基于Arduino的键盘,因为实际项目中的键盘直接连接到处理所有其他功能的微控制器。因此,我设计了这种基于PCB的基本64键原型键盘矩阵。 该PCB不包含任何IC(集成电路)。键盘矩阵的行和列直接连接到引脚接头,以便键盘可以连接到Arduino或任何其他微控制器。它是为你的项目原型制作的完美选择,其中包括集成键盘。 我已经写了包含了详细的、经过注释的代码,以使其与任何具有足够I / O引脚可用的Arduino兼容开发板一起使用,仅需要11个引脚。键盘有64个键,包括shift,caps,ctrl,alt,fn和“ special”的修饰符。还有六个其他键可用于任何你喜欢的操作。每个单个键的功能都可以单独定义,包括激活修饰符时每个键的功能。我认为,这比现有的键盘代码明显有用,后者严重限制了你自定义按键行为的能力。 提供的代码将文本打印到串行。如果你希望文本移至其他位置,则可以轻松更改。 关于程序大小的注意事项: 我提供的代码很大,因为它不使用任何现有的库。我完全从头开始编写此代码,以实现所需的可定制性。在Arduino UNO上,这将使用9100字节(28%)的程序存储空间,而全局变量使用394字节(19%)的动态内存。 我的代码可能会更高效,并且键盘的库和草图肯定会更小,但这是我可以设计的唯一方法,可以为每个键和每个修饰符提供完全的灵活性。它还考虑了实际的键盘使用情况。例如,在启用Caps Lock的情况下,按我的代码的同时按Shift键,将按原样生成小写字母。默认情况下,在按ESC的同时按住FN键不会执行任何操作。但是该行为是完全可定制的,因此你可以根据自己的喜好进行更改。 耗材: 定制PCB 6x6x5mm触觉瞬时按钮(x64) 1N4148开关二极管(x64) 1x8排针,母或公(x2) 74HC595移位寄存器 跳线 面包板 Arduino Uno或任何Arduino兼容的微控制器开发板 步骤1:键盘矩阵的工作方式 为什么需要键盘矩阵? 此键盘有64个按键。如果要将每个按钮中的每个按钮直接连接到开发板上,则需要64个I / O引脚。这是很多引脚,比大多数开发板都可用。为了使这个数字更合理,我们可以使用键盘矩阵,该矩阵只需要数量等于键数平方根(四舍五入)的引脚即可。 设置了键盘矩阵,因此连接了行中的每个键开关,并且连接了列中的每个键开关。当我们想查看按下了哪些键时,我们“激活”第一行,然后检查每一列。如果特定的列处于活动状态,我们知道该列和第1行中的键已被按下。然后,我们停用第1行并激活第2行,然后再次检查所有列。激活所有行之后,我们只需从第一行重新开始。 我们如何扫描键盘矩阵: 因为我们正在使用微控制器,所以“激活”意味着将该行设置为LOW或HIGH。在这种情况下,我们将行设置为LOW,因为我们在列输入引脚上使用了微控制器的内置上拉电阻。如果没有上拉或下拉电阻,则输入引脚将由于接口而发生不可预测的反应,这将导致错误的按钮按下。 Arduino UNO中使用的ATmega328P微控制器没有内置的下拉电阻,只有上拉电阻。因此,我们正在使用这些。上拉电阻将每个输入引脚连接到5V,确保在按下按钮之前,它们始终读为HIGH。 通常,所有行也都设置为HIGH,这样可以防止无论是否按下按钮,列引脚都无法连接到行引脚。但是,当我们准备检查一行时,可以将该行设置为LOW 。如果按下该行中的按钮,这将为将输入引脚拉至地面提供一条路径-导致该列现在显示为LOW 。 因此,总结一下:我们将一行设置为LOW,然后检查看看哪些列引脚现在正在读取LOW。这些对应于按下的按钮。这个过程非常迅速,因此我们每秒可以扫描整个键盘很多次。我的代码将其限制为每秒200次,这样可以平衡性能,弹跳并确保抓住每个按键。 二极管,重影和n键过渡: 当按下某些按钮组合时,电路中的二极管可以防止意外按键。二极管仅允许电流沿一个方向流动,从而防止出现重影。如果我们不使用二极管,那么当电流流过相邻的开关时,按下某些键可能会导致另一个未按下的键被记录下来。这在简化的图形中得以显示,其中按下了三个相邻的键,即使没有按下,也会导致第四个角的键被注册。二极管可以防止这种情况,并启用“ n键翻转”,这意味着我们可以按任意组合按任意数量按任意键,而不会出现任何问题。 用移位寄存器保存引脚: 你们当中的精明人士可能注意到我说一个键盘矩阵需要的针脚数量等于键数目的平方根,但是我也说我的键盘设计只需要11个针脚。应该是16,对吧?不,因为我们使用的是74HC595移位寄存器。该移位寄存器使我们仅使用Arduino I / O引脚中的三个即可控制多达八个输出引脚。这三个引脚使我们可以向移位寄存器发送一个字节(八位),移位寄存器将其八个输出引脚设置为HIGH或LOW。通过将移位寄存器用于输出行引脚,我们节省了5个整个I / O引脚! “那为什么不也对输入引脚使用移位寄存器呢?” 你问。最简单的答案是输入需要使用另一种类型的移位寄存器,而我手头上没有该类型。但是,使用移位寄存器进行输入也会使我们读取列的方式复杂化,并可能导致噪声和“弹跳”问题。可以说,在这种情况下,我不需要头痛。 步骤2:PCB设计 原理图设计 现在你了解了键盘矩阵的工作原理,我的PCB设计应该很简单。我在KiCAD(抱歉,Eagle评委)中设计了PCB,并从原理图开始。我只需放置一个按钮符号和一个二极管符号,然后复制并粘贴这些符号,直到获得64个键的网格。然后,我添加了两个1x8引脚标题符号,一个用于行,一个用于列。按钮的一侧连接成列,按钮的另一侧连接成行。 下一步是为每个原理图符号分配PCB封装。KiCAD包含的足迹库具有内置的必要足迹。在设计自己的PCB时,必须非常小心,以选择正确的封装,因为这些实际上将最终出现在PCB上。有许多组件的占位面积非常相似,但间距或其他却略有不同。确保选择与你的实际组件匹配的组件。 占地面积和引脚号 请特别注意引脚号。KiCAD有一个奇怪的问题,原理图二极管符号的引脚号与封装的引脚号不匹配。这导致二极管向后,鉴于其极性,这是一个严重的问题。我没有发现那个错误,不得不扔掉了我订购的第一批PCB。为了在第二个版本中解决此问题,我必须创建一个自定义二极管封装,并交换引脚号。 PCB布局 完成原理图并分配好封装后,我转到了实际的PCB布局。电路板轮廓是在Autodesk Fusion 360中创建的,以DXF格式导出,然后导入到Edge Cuts图层的KiCAD中。之后的绝大多数工作只是简单地排列按钮,使它们的布局类似于普通键盘。 然后,所有迹线都被布线。因为实际的按钮布局与原理图中的整洁矩阵不匹配,所以该部分有些混乱,我不得不在某些地方使用过孔。通过过孔,你可以将走线从一层布线到另一层,这在使用具有很多重叠走线的2层板时非常有用。最后,我添加了填充区域,因为这是一种很好的做法。 PCB制作 设计好木板后,我只需绘制所有图层并将其添加到zip文件夹中即可。该文件夹在此处提供,可以直接上传到JLCPCB等PCB制造服务。 这是PCB Gerber文件的链接:https://drive.google.com/file/d/10YriLLtghV0Sb84Wm ... 步骤3:PCB组装 这是整个项目中最简单但最乏味的步骤。只需将所有组件焊接到位。它们都是通孔元件,易于焊接。要特别注意二极管的方向。二极管上的标记应与PCB上的标记匹配。 以我的经验,最简单的方法是用第三只手将PCB固定在位,然后将所有二极管放在第一位。然后翻转电路板并将其全部焊接,然后夹住引线。然后放置所有按钮并焊接。然后将针座焊接到位。你可以使用母头或母头,这完全取决于你。如果使用公头,然后将其放在板子下面,则正确的间距是将其直接粘贴到面包板上。 步骤4:将键盘连接到Arduino 接线看起来很复杂,但是当你注意细节时,它其实很简单。 八根跳线将从列标题直接进入以下Arduino引脚: 列1> A0 列2> A1 列3> A2 列4> A3 列5> A4 列6> A5 列7> 5 列8> 6 接下来,将74HC595移位寄存器跨过中间中断放在你的面包板上。注意芯片的方向,点表示引脚1。 查看接线图,查看5V和接地连接的位置。移位寄存器的两个引脚连接到5V,两个引脚连接到地。 仅需要三根线即可将移位寄存器连接到Arduino。他们是: Shift(时钟)11> 4 Shift(锁存)12> 3 Shift(数据)14> 2 由于某些愚蠢的原因,移位寄存器的输出引脚以违反直觉的方式排列。将那些连接到行引脚时,请特别注意移位寄存器的引脚图。他们是: 第1行> Shift(Q0)15 第2行> Shift(Q1)1 第3行> Shift(Q2)2 第4行> Shift(Q3)3 第5行> Shift(Q4)4 第6行> Shift(Q5)5 Shift 7> Shift(Q6)6 Shift 8> Shift(Q7)7 没有将任何东西连接到Arduino 0或1引脚,因为它们也用于串行端口并引起冲突。 步骤5:刷新Arduino代码 使用此处提供的代码刷新Arduino。对此没有什么特别的,只需像上任何其他Arduino项目一样上传代码即可。 代码中的所有内容都具有详细的注释,你可以阅读这些注释,因此在此不再赘述。基本上,这些引脚被设置为输入和输出。主循环仅包含一个计时器函数。每隔5毫秒,它将调用一次功能以扫描键盘。该函数调用一个单独的函数来在检查每一列之前设置移位寄存器。按下的键会将其值打印到串行。 如果要更改按下键时的打印内容,只需更改**Serial.print(“ _”);即可。**在与条件相对应的if语句中。例如,你可以设置按住FN并按N时要打印的内容。带有其他修饰符的每个其他键也是如此。 该代码中的许多键根本不执行任何操作,因为它只是打印到串行。这意味着退格键无效,因为你无法从“串行”监视器中删除-数据已被接收。但是,你可以随意使用自己喜欢的更改。 在自己的项目中使用键盘 打印到串行很不错,但这并不是键盘的重点。该键盘的目的是为更复杂的项目制作原型。这就是为什么容易更改功能的原因。例如,如果你要将打印的文本打印到OLED屏幕,则可以简单地将每个**Serial.print(替换为display.print(**或你的特定显示器所需的任何东西。)Arduino IDE的Replace All工具非常适合替换所有的一步操作。 最后 所有需要的文件在下载区均可找到。 via:https://www.hackster.io/cameroncoward/64-key-prototyping-keyboard-matrix-for-arduino-4c9531