制作电子棋盘


14

我想制作一个木制棋盘,可以用普通棋子(例如,不是使用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. 有没有人建立过这样的委员会,并有一些建议或知识可以指导您完成该过程?

1
你有正确的主意。不过,在传感应用程序上需要一些改进。根据碎片的大小和重量,您可以使用遮光或触觉按钮的检测方案。真正的问题是,您将如何分辨是什么?可能还需要定制件。也许在每个标签上都贴上RFID标签,然后每个方格都有一个RFID扫描仪?矫kill过正,只是一个想法。
mcmiln 2015年

1
您描述的矩阵扫描路由将无法应付4行2行2列的情况。查看3-8行解码器(74138)并推断为5-64
Icy

2
片段的初始阵容始终是相同的,因此软件会知道哪个片段在哪里。如果您随后将一块从A移到B,则软件会知道哪一块已被移至何处。当然,这不允许以任意阵容开始,但是您也可以在软件中手动设置。
Golo Roden 2015年

1
这似乎很麻烦。我本来打算用软件视频方法。OpenCV和一个摄像头。还有投影仪。
路人2015年

2
就传感器/检测组织而言,本指南可能很有用
user2813274 2015年

Answers:


5

由于一幅图像值一千个单词,因此以下是LDM-24488NI的示例:64位矩阵

在此处输入图片说明

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

在此处输入图片说明

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


12

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

最棘手的部分将是处理光传感器的模拟性质。在这种情况下,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取下一块”。只要您保持协议不变,将来还可以使用完全不同的硬件接口。


7

对于LED而言,显而易见的方法是为棋盘的每一行和每一列提供一个输出:总共8 + 8 = 16个引脚。阳极将连接到行线,阴极将连接到列线。对于要点亮的LED,您可以使其阳极线为正(逻辑1),使其阴极线为负(逻辑0),同时使其他LED保持反向状态(这样,其余的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个输出将向公共点注入电流。

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

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


1
您提到了移位寄存器-它们也可以用于LED输出。如果另一个计数器加上一个可以三态的8位移位寄存器,只要它们的速度足够快,可以避免可见的闪烁,则可以仅用两个或三个以上的引脚来驱动整个阵列。
hobbs 2015年

@hobbs我认为闪烁不是问题,因为OP只想一次点亮一个或两个LED。如果只有一个直线和一个反相十进制/八进制计数器/移位寄存器来驱动LED,那么即使是三态也没有必要。完全可以实现3个引脚:通用复位,列超前,行超前。那可能是要走的路-保留所有其他引脚以解决更困难的传感器问题。
水平河圣

对于LED,也可以使用MAX7219 / 7221 LED驱动器。这样会将输入数减少到3-时钟,数据,锁存器。
jnovacho 2015年

4

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

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

一种是使用芯片为您完成一些繁重的工作。例如,如果您有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。您已经有一个受控的电源(两个十年计数器)-让它们重复使用。将16个电源引脚上的64个LED通过一个电阻器(每个LED必须具有自己的电阻器!)连接到其他4个导轨(与上述相同的布局:AE,BF,CG和DH)。通过4个晶体管的4个引脚将这4个电源轨连接到4个引脚,然后将所有引脚置于“高电平”-由于LED的两侧现在均为5伏,因此LED将熄灭。然后,当您要点亮LED时,请确保您的二十岁处于正确的位置(就像您在那个正方形上阅读传感器一样),将4个导轨之一设置为低。现在,电流应该从十进制计数器的“高”点流到该特定轨中的“低”点。嘿,请记住,灯亮了!稍稍延迟一下,然后再将其关闭,然后再次更改十年计数器。

如果你想要更多的控制,你可以使用像一个TLC5940芯片- http://playground.arduino.cc/Learning/TLC5940 -每个芯片可以设置16个LED(所以你需要这4)成一个亮度级从0(关闭)到1024(全开),因此您可以在控制的情况下淡入和淡出单个LED。从内存来看,这些需要大约4个引脚,并且可以通过菊花链方式连接,因此4个数字引脚(其中之一必须是PWM-该引脚旁边有“〜”符号)将控制任意数量的LED。

祝好运!


它是RPi,不是Arduino。
德米特里·格里戈里耶夫

抱歉,您是对的。我说的几乎所有内容仍然适用,因此我做了一些小的修改以使其起作用
AMADANON Inc. 2015年

0

我认为您不需要在右上角有一个LED。您所提到的在中间的传感器就足够了。整T部分将是国际象棋棋盘的代码。假设您有一个棋盘。该行将显示为“字母”,而列将显示为“数字”。

因此,首先需要一个程序来在初始位置编程样片的类型。稍后,当您移动棋子时,代码会将棋子的初始位置生成到最终位置。这将使您的输入减少一半。


5
也许我没有解释清楚……LED并不是要在当前状态下读取,而是要显示计算机想要做出的动作。因此,用户行动起来:亮度传感器告诉软件所使用的软件。软件会计算其下一个动作,并使两个LED闪烁,用户移动该物件,然后又轮到人类了。
Golo Roden 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.