我正在做一些项目,并且我正在使用Arduino进行原型制作,我必须使用10个按钮(以及更多按钮),并且我没有足够的引脚。
我能想到的一种解决方案是使用模拟引脚并将它们分别用于两个按钮,如下所示:
模拟该电路 –使用CircuitLab创建的原理图
这样,我可以通过查看电压是5V还是一半电压来读取引脚A0并知道其中哪个被按下。
这是一个好主意吗?绝对不应同时按下不同的按钮,这是我唯一能想到的问题。
有更好的方法吗?
我正在做一些项目,并且我正在使用Arduino进行原型制作,我必须使用10个按钮(以及更多按钮),并且我没有足够的引脚。
我能想到的一种解决方案是使用模拟引脚并将它们分别用于两个按钮,如下所示:
模拟该电路 –使用CircuitLab创建的原理图
这样,我可以通过查看电压是5V还是一半电压来读取引脚A0并知道其中哪个被按下。
这是一个好主意吗?绝对不应同时按下不同的按钮,这是我唯一能想到的问题。
有更好的方法吗?
Answers:
当您可以在一个模拟引脚上做任意数量的按钮时,为什么还要为两个开关浪费多个模拟引脚?
两种方式。一个是串联的,另一个是并联的。
这就是某些汽车方向盘音频控件的方式。以及某些较旧的ipod内联控制器如何工作。
根据所使用的电阻,如果需要同时按下多个按钮,以及模拟输入的敏感程度,则可以将所有10个按钮都放在一个引脚上。
那会起作用,但是更好的方法是使用矩阵。这与将LED与矩阵多路复用但具有开关的概念相同。
这是一个2x2矩阵。一个有用的矩阵会更大,因为在这种大小下,您不必通过单独连接开关来节省任何引脚。
使用3x3矩阵,您可以获得9个开关。您需要10个,因此您可以添加多一行或多一列并支持12个开关,或者仅将第10个开关放在其自己的引脚上。
这样做的好处是您可以使用数字IO,它比模拟IO便宜,而且通常数量更多。一个移位寄存器是增加更多的数字IO,如果你用完了一种廉价的方式。
如果您想要更少的引脚,则可以使用charlieplexing来增加复杂度,以增加一些复杂度。除了开关之外,您还必须添加二极管,这些二极管的成本可能与移位寄存器一样高。但是,如果成本不是您的主要考虑因素,那么它可能会有一些优势。使用这种方法,您可以使用四个引脚读取所有开关(实际上最多12个)。
是的,这似乎是一个好主意,但无论如何,我将提出一个我想到的替代方法。
如果您可以访问逻辑门,则可以通过布尔逻辑将许多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个“或”门即可实现4个按钮到2个引脚的映射。但是,您将需要一个额外的引脚和一些额外的逻辑,以指示是否完全按下了任何按钮。
当然,如果同时按下多个按钮,仍然会有问题。
另外,如果您仍要使用电阻器方法,请考虑在电阻器上使用100欧姆以外的其他较大的值,因为5 V的电阻通过100欧姆的量级会产生大约10毫安的电流,这是一种好方法不必要的高。我猜更合理的值应该是10k Ohm或47k Ohm。
以下页面可能会有用:
http://txapuzas.blogspot.co.uk/2010/07/papertecladoanalogico-varios-pulsadores.html
它是用西班牙语编写的,但是基本要素已绘制成图表,我认为这对您来说是个好主意。
在此视频中,您可以看到最终结果,草图也在页面上,其封装的功能使在项目上的实现变得容易
这是上述站点的示意图: