我正在做一些项目,我正在使用 Arduino 进行原型设计,我必须使用 10 个按钮(以及更多的东西)而且我没有足够的引脚。
我能想到的一种解决方案是使用模拟引脚并将它们中的每一个用于两个按钮,如下所示:
这样我就可以读取引脚 A0 并通过查看电压是 5V 还是该电压的一半来知道它们中的哪一个被推动。
这是一个好主意吗?永远不应该同时按下不同的按钮,这是我能想到的唯一问题。
有没有更好的方法?
我正在做一些项目,我正在使用 Arduino 进行原型设计,我必须使用 10 个按钮(以及更多的东西)而且我没有足够的引脚。
我能想到的一种解决方案是使用模拟引脚并将它们中的每一个用于两个按钮,如下所示:
这样我就可以读取引脚 A0 并通过查看电压是 5V 还是该电压的一半来知道它们中的哪一个被推动。
这是一个好主意吗?永远不应该同时按下不同的按钮,这是我能想到的唯一问题。
有没有更好的方法?
当您可以在单个模拟引脚上执行任意数量的按钮时,为什么要为每个两个开关浪费多个模拟引脚?
有两种方法。一个是串联的,另一个是并联的。
这就是一些汽车方向盘音频控制的方式。以及一些较旧的 ipod 内联控制器是如何工作的。
根据您使用的电阻器,如果您需要同时按下多个按钮,以及您的模拟输入有多敏感,您可以将所有 10 个按钮都放在一个引脚上。
这会起作用,但更好的方法是使用matrix。这与使用矩阵多路复用 LED 的概念相同,但使用开关。
这是一个 2x2 矩阵。有用的矩阵更大,因为在这个尺寸下,您不会在单独连接开关时节省任何引脚。
使用 3x3 矩阵,您可以获得 9 个开关。您需要 10 个,因此您可以再添加一行或一列并支持 12 个开关,或者将第 10 个开关放在它自己的引脚上。
这里的好处是您可以使用数字 IO,它比模拟 IO 更便宜且通常更丰富。如果用完,移位寄存器是添加更多数字 IO 的一种廉价方法。
如果您想要更少的引脚,您可以使用charlieplexing来增加复杂性。除了开关之外,您还必须添加二极管,这些二极管的成本可能与移位寄存器一样多。但是,如果成本不是您主要关心的问题,那么它可能具有一些优势。使用这种方法,您可以用四个引脚读取所有开关(实际上最多 12 个)。
模拟输入是一种有效的方法,你应该可以有几个按钮。我还想建议使用像MCP23017这样的 IO 扩展器芯片。它有 16 个引脚,可以输入和输出,并使用两个引脚通过 I2C 控制。Adafruit 有一个 Arduino 库。
是的,这似乎是个好主意,但无论如何,我将提出一个我刚刚想到的替代方案。
如果您可以访问逻辑门,则可以通过布尔逻辑将许多n
按钮映射到ceil(log2(n + 1))
引脚。例如,如果您有 4 个按钮,但只有 2 个引脚,您可以创建如下配置:
Buttons | Pins
---- | --
0123 | 01
---- | --
0001 | 00
0010 | 01
0100 | 10
1000 | 11
即button0
按应有pin0
和pin1
低;button1
,pin0
低和pin1
高; button2
,pin0
高一pin1
低;和button3
,pin0
和pin1
高。
由此产生以下布尔表达式
pin0 = button2 OR button3
pin1 = button1 OR button3
因此,只需 2 个 OR 门就可以实现 4 个按钮到 2 个引脚的映射。不过,您需要一个额外的引脚和一些额外的逻辑来指示是否有任何按钮被按下。
当然,如果同时按下几个按钮,还是会有问题的。
此外,如果您仍将使用电阻器方法,请考虑在电阻器上使用更大的值,而不是 100 欧姆,因为 5 V 通过大约 100 欧姆的电阻器会产生大约 10 毫安的电流,这是种不必要的高。我想更合理的值是 10k Ohm 或 47k Ohm。