制作电子棋盘

电器工程 检测 矩阵
2022-01-31 05:53:41

我想制作一个木制棋盘,你可以在上面玩普通棋子(即,不是使用 RFID 代码、磁铁等修改过的棋子),但它连接到一个软件,该软件会注意到我的动作并充当第二个玩家。

我一直在考虑如何检测板上的棋子,并且我做出了不需要识别哪个棋子在哪里的决定:“真相”在软件中,所以如果我将棋子从 A 移到 B ,该软件能够找出被移动的部分。

于是,我萌生了在棋盘每个区域钻两个孔的想法,一个在中央,一个在右上角:

  • 中间的那个将用于亮度传感器,以检测一块是否站在场地上。
  • 角落里的一个将用作 LED,以显示用户必须为计算机移动哪一块,从而使现实世界的情况再次与软件情况相匹配。

我想使用 Raspberry Pi 作为软件运行的硬件基础,它将用 Node.js 编写(但这对于这个问题应该不重要)。

所以,我最终得到的是 64 个亮度传感器和 64 个 LED,我需要单独解决它们。换句话说:我需要 64 个输出和 64 个输入。当然,这是 Raspberry Pi 无法开箱即用的——我认为必须有比拥有 128 个 I/O 端口更好的方法。

由于我认为检测板的状态是更重要的任务,我开始在网上搜索如何处理 8x8 开关矩阵。我发现建议使用微控制器顺序扫描板的列,并在每一列中检测是否使用了一行(=一个字段)。

这会将复杂性降低到拥有 8 个输出和 8 个输入(以便能够读取电路板的状态)。

对此,我有几个问题:

  1. 我的想法是否正确,即这是正确的方法,还是有更好的选择,我应该注意?
  2. 由于我没有使用微控制器的经验,我需要注意什么?我只需要一个 16 针的微控制器,可以用我能写的语言编程,还是……?
  3. 有没有人建造过这样的板子,并且有一些建议或知道指导您完成整个过程的教程?
4个回答

是的,您所描述的多路复用是解决事物数组的常用方法。

最棘手的部分将是处理光传感器的模拟性质。在这种情况下,CdS LDR(光敏电阻)可能是最好的,因为它们灵敏、便宜,并且在人类亮度范围内产生易于测量的大响应。在电气上,它们是电阻器,在较亮的光线下电阻会降低。

如果您使用具有 8 个模拟输入的微控制器,它将简化多路复用。这意味着你的多路复用器的一半是内置在微控制器中的。例如,您启用一行 LDR,并直接使用 micro 读取 8 列信号。

用普通的微型计算机可以很容易地以人类的方式立即完成对 64 个模拟输入的顺序扫描。假设您可以每 100 µs 读取一次新读数。那是“长”的,即使对于小型且便宜的微型机也是如此。这意味着整个电路板将每 6.4 毫秒扫描一次,这比您感知到的延迟要快得多。

多路复用 LED 更加容易,因为这一切都是通过数字输出完成的。很多微控制器的数字输出远远超过 16 个,所以这没问题。还有其他事情必须发生,而且你会比现在预期的更快地用完针脚,但是 64 针微型应该真的足够好,如果不是 44 针的话。

我可能会专门用一个微控制器来处理板 I/O。这针对有足够的 I/O 引脚、A/D 输入等进行了优化。然后它通过 UART 连接到主计算引擎。该协议看起来像“点亮正方形 3,2”或“从正方形 5,4 中移除一块”。只要您保持协议相同,这也允许将来使用完全不同的硬件接口。

对于 LED,显而易见的方法是为棋盘的每一行和每一列提供一个输出:总共 8+8=16 个引脚。阳极将连接到行线,而阴极将连接到列线。对于要点亮的 LED,您可以使其阳极线为正极(逻辑 1),阴极线为负极(逻辑 0),同时将其他 LED 保持在反向状态(因此剩余的 LED 具有中性或反向偏置。)

我在这里假设微控制器提供足够高/低的电压,以便您能够将 LED 从一个桥接到另一个。如果不是这种情况,则每条线都需要一个晶体管或缓冲器。使用 5V 电源时,它很紧,考虑到 LED 下降约 2V,并且您希望在限流电阻上有一个合理的压降(请注意,您只需将它们安装在行线或列线中,而不是同时安装。)

如果您的输出是三态(也就是说,除了逻辑 0 和逻辑 1,它们还可以设置为高阻抗状态,也许可以通过临时将它们配置为输入),那么您可以变得聪明并使用带有 LED 的 4x8 网格以反平行对连接。在此设置中将未使用的输出设置为高阻抗非常重要,否则不需要的 LED 会亮起。

在任何一种情况下,您都必须考虑电流消耗,以及是否可以冒软件错误同时点亮一排所有 LED 的风险(如果不考虑,可能会使微控制器的行线过流.)


传感器的情况更复杂。我将假设您使用电阻传感器,尽管光电晶体管不一定保证仅在一个方向上传导。

您可以使用与点亮 LED 相同的 8 行输出,但您需要专门用于感应的 8 列输入。毫无疑问,你会看到这样的键盘电路。请记住,这些只是设计为一次按下一个键如果用户同时按下 1、3、7 和 9,则键盘无法检测到用户是否松开了这四个键中的任何一个,因为仍然存在通过其他三个开关的电流路径。

音乐键盘上使用的一种解决方案(设计为一次使多个矩阵元素导电)是在每个开关上串联一个二极管。

另一种解决方案是购买四个具有开路集电极输出(或开漏,如果使用 MOSFET IC)的 4 到 16 解码器 IC,例如:http ://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf集电极开路意味着 IC 的输出只会吸收电流,不会提供电流。因此,您可以将 16 个传感器连接到芯片的 16 个输出,并将另一端与一个上拉电阻共用(您也可以在此处连接您的 ADC)。您将一个输出拉低(导通),而其他 15 个保持高电平(不导通)。这与标准逻辑输出形成对比,其中其他 15 个输出将电流注入公共点。

这些 IC 的输入是 4 位二进制以选择 16 个输出之一,但它们还有一个额外的输入来启用/禁用芯片。因此,您可能有一个由 64 个集电极开路接收器组成的阵列,连接到 64 个传感器,传感器的另一端全部共用一个上拉电阻和模数转换器。为此,您的微控制器上总共需要 8 个输出:四个用于接收 4 到 16 选择信号(所有四个芯片通用),四个用于接收启用信号(每个芯片一个。)

编辑:3 到 8 个解码器(也称为 1 of 8 = 1 line out of 8)似乎比 4 到 16 个更可用,但 8 个 IC 比 4 个更混乱。另一种可能有用的 IC 是八进制计数器(及其更常见的表亲十进制计数器,可以通过将其第九个输出连接到复位线来将其配置为八进制计数器。)这些需要串行脉冲从一个输出推进到下一个输出,因此需要更少微控制器上的 I/O 引脚比解码器 IC 上的引脚。它们通常具有用于复位和启用的附加输入。还有一种叫做移位寄存器的IC ,它有两种类型:一种用于将串行转换为并行,另一种用于将并行转换为串行。最后,有buffers,你可以把它放在你的 Rasberry Pi 和你的棋盘之间,这样 Pi 在过流的情况下不会被破坏。所有这些都可用于多路复用电路。

因为一张图片值一千字,这里有一个LDM-24488NI的例子:一个 64-led 矩阵

在此处输入图像描述

对于您的应用,您需要一个用于 LED 的矩阵,另一个用于传感器,总共需要 32 个 IO 引脚。由于您的 RPi 没有那么多,您将不得不使用1 到 8 的 demux来选择单独的行和列:

在此处输入图像描述

对于 LED,您可以对行和列使用多路分解器,因为您一次只需要一个 LED。对于传感器,我建议对行使用解复用器,对列使用单独的行,以便能够在一行中检测多个活动传感器。这将使所需的引脚数达到 RPi 可以处理的 17 个引脚。

多路复用确实是一种常见的做法。

有几种方法可以让您从树莓派引脚中获得更多收益

一种是使用芯片为您完成一些繁重的工作。例如,如果您有 8 个输入和 8 个输出来读取电路板的状态,您可以使用计数器,一次将 8 个输入提高一个。为此,您将需要 Arduino 上的 2 个引脚 - 一个用于重置回第一个引脚,一个用于“转到下一行”。您刚刚保存了 6 个图钉!

节省 6 个引脚可能还不够——让我们看看我们可以从这里开始:如果你将 8x8 网格重新排列成 16x4 网格,你可以使用类似http://www.instructables.com/id/16-Stage -Decade-Counter-Chain-Using-two-4017-Chi/?ALLSTEPS(忽略上半部分,从上到下的两条线是您的“重置”,来自左上角,“转到下一行”,这里称为 CLK,用于时钟)。您现在可以数出棋盘左半边的 8,然后数棋盘右半边的 8;将 A 列和 E 列、B 列和 F 列、C 列和 G 列以及 D 列和 H 列连接在一起。

恭喜,您现在有两个输出引脚(复位和时钟)和 4 个输入引脚,总共 6 个 - 节省了 10 个引脚!请注意,树莓派没有模数转换器,因此您需要做一些额外的工作。

现在是 LED。您已经有一个受控电源(两个十年计数器) - 让我们重新使用它们。将 64 个 LED 从 16 个电源引脚通过一个电阻器(每个 LED 必须有自己的电阻器!)连接到其他 4 个导轨(与上述相同的布局:AE、BF、CG 和 DH)。将这 4 个电源轨通过 4 个晶体管连接到 4 个引脚,并将所有引脚置于“高电平” - 因为 LED 的两侧现在都处于 5 伏,LED 将关闭。然后,当你想点亮一个 LED 时,确保你的两个十年处于正确的位置(就像你正在读取那个正方形上的传感器一样),将 4 个导轨之一设置为低。电流现在应该从十年计数器的“高”流向该特定轨道的“低”。嘿presto,灯亮了!稍微延迟一下,然后在再次更改十年计数器之前将其关闭。

如果您确实想要更多控制,您可以使用 TLC5940 芯片之类的东西 - http://playground.arduino.cc/Learning/TLC5940 - 每个芯片可以将 16 个 LED(因此您需要其中 4 个)设置为亮度级别从 0(关闭)到 1024(完全打开),因此您可以轻松控制各个 LED 的淡入和淡出。从内存中,这些需要大约 4 个引脚,它们可以菊花链式连接,因此 4 个数字引脚(其中一个必须是 PWM - 这些引脚旁边有“~”符号)将控制任意数量的 LED。

祝你好运!