同一引脚上有多个按钮


12

我正在做一些项目,并且我正在使用Arduino进行原型制作,我必须使用10个按钮(以及更多按钮),并且我没有足够的引脚。

我能想到的一种解决方案是使用模拟引脚并将它们分别用于两个按钮,如下所示:

原理图

模拟该电路 –使用CircuitLab创建的原理图

这样,我可以通过查看电压是5V还是一半电压来读取引脚A0并知道其中哪个被按下。

这是一个好主意吗?绝对不应同时按下不同的按钮,这是我唯一能想到的问题。

有更好的方法吗?


您尝试使用多少个引脚?
W5VO 2013年

@ W5VO我需要22,具有10个按钮,该板只有18 ...所以每个模拟销两个按钮我只需要5个模拟销和板具有6
MyUserIsThis

1
仅供参考,许多汽车制造商对音频系统的方向盘控制使用相同的方法。它们有8个按键,每个按键都有自己的电阻。这样一来,他们就可以将单根导线(或成对导线以确保干净返回)从转轮连接到音频头。这是一个非常好的方法。
DoxyLover

我相信您实际上可以使用三个引脚通过一些移位寄存器来输入无限数量的开关。也可以使用8个引脚通过多路复用器输入256个开关。
Alvin Wong

Answers:


22

当您可以在一个模拟引脚上做任意数量的按钮时,为什么还要为两个开关浪费多个模拟引脚?

两种方式。一个是串联的,另一个是并联的。

在此处输入图片说明

在此处输入图片说明

这就是某些汽车方向盘音频控件的方式。以及某些较旧的ipod内联控制器如何工作。

根据所使用的电阻,如果需要同时按下多个按钮,以及模拟输入的敏感程度,则可以将所有10个按钮都放在一个引脚上。


谢谢,我也考虑过这一点,但也认为电压读数可能不完全符合我需要的读数,以便能够依靠此方法。我也会尝试一下,看看它是如何工作的。
MyUserIs13年

由于我的电阻器网络分析基础知识还不够扎实,因此我尝试使用CircuitLab模拟串联电路,并绘制出真值表以用于模拟输入引脚上的电压测量。我发现,组合B2 + B3产生2.499V,而组合B1 + B4产生2.498V。有了如此接近的数字,我认为典型的10位ADC将无法正确地区分多输入组合。你说什么 ?当然,一次一把钥匙就可以完美地工作-毫无疑问。注意B1 = Button1。
icarus74

实际上,B2 + B4提供1.666V,而B2 + B3 + B4也提供1.666V!解决方案可能是对R1,R2,R3,R4使用不同的电阻值,而不是将所有电阻值都保持1K。说啥 ?
icarus74

7
旧的2R / R梯形图将按钮转换为D / A,并且每次按下按钮的组合都会具有唯一的值。我相信它可以与N-3个按钮配合使用,其中N是ADC分辨率
Scott Seidman

1
@ icarus74是的,使用不同的值而不是全部1k,将给出唯一的组合。尝试1k,2k,4k,8k,16k等(或更大范围的1k,4k,16k等)
Passerby 2013年

10

那会起作用,但是更好的方法是使用矩阵。这与将LED与矩阵多路复用但具有开关的概念相同。

在此处输入图片说明

这是一个2x2矩阵。一个有用的矩阵会更大,因为在这种大小下,您不必通过单独连接开关来节省任何引脚。

使用3x3矩阵,您可以获得9个开关。您需要10个,因此您可以添加多一行或多一列并支持12个开关,或者仅将第10个开关放在其自己的引脚上。

这样做的好处是您可以使用数字IO,它比模拟IO便宜,而且通常数量更多。一个移位寄存器是增加更多的数字IO,如果你用完了一种廉价的方式。

如果您想要更少的引脚,则可以使用charlieplexing来增加复杂度,以增加一些复杂度。除了开关之外,您还必须添加二极管,这些二极管的成本可能与移位寄存器一样高。但是,如果成本不是您的主要考虑因素,那么它可能会有一些优势。使用这种方法,您可以使用四个引脚读取所有开关(实际上最多12个)。


就一个问题。如果我需要更多的引脚,为什么会更好?这样,对于9x9矩阵,我将需要6个引脚,而对于第十个矩阵,我将需要一个以上的引脚,而在我所做的工作中,我只需要5个引脚。
MyUserIs13年

@MyUserIsThis随着开关总数的增加,可以更好地扩展。例如5x5矩阵可让您将25个开关连接到10个引脚。作为更一般的评论,以常规方式进行操作都可以使其他人更容易理解您的工作;并让您认识到其他人的功能(因为您已经对标准实现进行了培训)。
Dan在Firelight的抚养下

@MyUserIsThis见编辑。路人也有一个很好的答案。
Phil Frost

2

模拟输入是一种有效的方法,您应该可以在其上有多个按钮。我还建议使用IO扩展器芯片(如MCP23017)。它具有16个引脚,可以将其输入为输出,并使用两个引脚通过I2C进行控制。Adafruit有一个Arduino库。


2

是的,这似乎是一个好主意,但无论如何,我将提出一个我想到的替代方法。

如果您可以访问逻辑门,则可以通过布尔逻辑将许多n按钮映射到ceil(log2(n + 1))引脚。例如,如果您有4个按钮,但只有2个引脚,则可以创建如下配置:

Buttons | Pins
----    | --
0123    | 01
----    | --
0001    | 00
0010    | 01
0100    | 10
1000    | 11

也就是说,button0压应具有pin0pin1低;button1pin0低和pin1高;button2pin0高的pin1低; 并且button3pin0pin1高。

由此产生以下布尔表达式

pin0 = button2 OR button3
pin1 = button1 OR button3

因此,仅使用2个“或”门即可实现4个按钮到2个引脚的映射。但是,您将需要一个额外的引脚和一些额外的逻辑,以指示是否完全按下了任何按钮。

当然,如果同时按下多个按钮,仍然会有问题。

另外,如果您仍要使用电阻器方法,请考虑在电阻器上使用100欧姆以外的其他较大的值,因为5 V的电阻通过100欧姆的量级会产生大约10毫安的电流,这是一种好方法不必要的高。我猜更合理的值应该是10k Ohm或47k Ohm。


感谢您的方法。我也考虑过类似的事情,但是我没有逻辑门,并且有很多电阻。是的,我通常为此使用10k电阻,100欧姆只是电路编辑器的默认值。再次感谢你的帮助。
MyUserIs13年

我想我最终将使用电阻器方法,因为我不必购买逻辑门,再加上您的逻辑方法只为我节省了1个引脚,所以我不需要它。对于大型项目,我会牢记这一点。非常感谢你。
MyUserIs13年

好的!祝您的项目好运!
nijoakim

0

以下页面可能会有用:

http://txapuzas.blogspot.co.uk/2010/07/papertecladoanalogico-varios-pulsadores.html

它是用西班牙语编写的,但是基本要素已绘制成图表,我认为这对您来说是个好主意。

在此视频中,您可以看到最终结果,草图也在页面上,其封装的功能使在项目上的实现变得容易

YouTube视频:单个针脚上的10键键盘

这是上述站点的示意图:

在此处输入图片说明

在此处输入图片说明


2
请添加该链接包含的摘要,以防万一它死了,特别是当它是西班牙文并且是英语网站时。
PeterJ 2014年

抱歉,可能是在西班牙通常会参考英文出版物的正常情况。但是链接很有趣,它说了如何仅使用一个带有照片描述的针脚来构造10键键盘,如图所示制作板子和图像制作按钮的盖子。另外,用于管理键盘的代码也很容易理解。我认为尼斯发展了。
JohnnyDeauville 2014年

不仅仅是西班牙语方面的事情,我同意图表清晰,看起来不错,并且我可以基于此得出结论。但是Stack Exchange不鼓励仅回答链接,因为如果链接消失,它们将无用,想象一下如果明天关闭/删除该博客,答案将多么有用。也许您可以包括原理图以及有关原理图的一两个句子,只需留下链接作为参考即可获得更多信息。
PeterJ 2014年

我是这个论坛的新秀,我怎么能让你告诉我?一些特殊的部分...?感谢您的
宝贵

我只是包括了原理图和参考,但也有必要翻译一下页面内容,以提供一些背景信息,说明其工作原理以及ADC读数如何。
PeterJ 2014年
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.