使用 3.5 毫米插孔添加无源硬件令牌

电器工程 树莓派 输入 插头 无源元件 热插拔
2022-01-23 09:09:03

我有一个为我侄女制作的盒子,可以让她和我交换语音信息。它由 Raspberry Pi 供电,具有两个按钮、一个 LED、一个麦克风和一个扬声器。

盒子

现在,在圣诞节,我希望我的侄女能够通过将硬件令牌插入设备,与不同的朋友(4 岁、8 岁或 16 岁)和亲戚交换这些语音消息,其中包含那个人的照片。

我现在正在寻找添加此功能的最简单方法。

  • 最好使用 3.5 毫米插孔,因为它们很容易从使用过的设备/耳机中获得
  • 首选无源器件(电容器+电阻器)
  • 最好将其直接连接到 Raspberry Pi
  • 最好不使用 AD 转换器,因为 Raspberry Pi 没有内置此功能。
  • 3岁小孩也能轻松上手

因此,使用带有 3 个引脚的 3.5 毫米插头,我可以将电源添加到一个引脚,然后将另外两个与该引脚连接或断开,这将给我留下两个位,导致 4 个人(除了我作为默认值,如果插座在插入插头时提供开关)。

如果我有一个模数转换器,我可以在三个引脚上添加一个分压器并将电压用作指示器。但是,Raspberry Pi 没有内置的,所以我正在寻找一种智能方法来使用其中一个 GPIO 引脚来实现这一点。

亲戚插头

4个回答

使用 1-wire 总线和按钮内部的任何 1-wire 芯片。我写了“any”,因为每个 1-wire 芯片都有自己唯一的硬件地址,所以您在 RPi 端需要的只是检查芯片是否被检测到,例如使用 bash 命令:

ls /sys/bus/w1/devices/

并检查它的输出是否存在与此硬件地址完全相同的子目录。

在 RPi HW 端,您只需将额外的插孔插座连接到正确的 I/O 引脚(GND + DATA)。这里不需要使用任何电源连接,因此对于 RPi 来说,它看起来比使用 I2C 的类似解决方案最安全(I2C 需要有专用的电源线,这会导致短路时损坏 RPi 的风险)。

编辑:为了可靠的工作,您应该在 DATA 线和 Vcc (3.3V) 之间添加上拉电阻 4.7kOhm。

您可以使用最流行和最便宜的 DS18B20 芯片,它还提供了测量室温的可能性;),或者 DS2401,它还提供了唯一的序列号。

我会让每个“令牌”成为 I2C 设备。使用尖-环-环-柄式插孔将为您提供 4 个导体——接地、电源、数据和时钟。每个令牌都需要有自己的 I2C 地址,并且您将编写一个函数来嗅探 I2C 总线上的设备。

这可以通过一组并联的电阻器和电容器来完成,每对具有不同的 RC 产品。您可以将 gpio 输出拉高足够长的时间,然后将其转换为输入并测量电容放电所需的时间。时间常数可能从微秒到毫秒不等,您可以区分任意数量的人。

要晶莹剔透。我不讨厌 1-wire 令牌的想法。我其实很喜欢。以这种方式使用 1-wire 正是 1-wire 总线的用途。我担心的是这个项目是玩具级的;低安全性/预算。然后,当您添加耐用性考虑因素时,很明显可能需要其他不涉及专用芯片的选项。这带来了以下内容。


正如其他人所说,几乎最佳的答案是使用 RC 时间延迟。唯一的组件令牌侧将是一个电容器。

示意图

模拟此电路- 使用CircuitLab创建的原理图

为什么?因为 RC 代币...

  • 不易受到 ESD 的影响。(编辑:如果我们诚实和实际)
  • 可以只使用两根电线。
  • 将非常便宜和简单。
  • 有足够的空间容纳 8 人以上。

对于 Pi 端电子设备,您只需要两个 GPIO 引脚;充电引脚和感应引脚。您还需要/需要一个快速充电电路,我将在图表后解释。

示意图

模拟这个电路

快速充电电路用一个小得多的电阻绕过定时电阻。这允许令牌中的电容器几乎立即充电(好吧,就用户将看到的任何方式而言)。它还使得感应引脚不会直接看到充电引脚。相反,它将严格查看电容器电压。值并不重要,但是,二极管确实需要是肖特基/小信号二极管,否则它将从 3.3v 的顶部切断很多。这也可以用一个 5v 的晶体管代替,但可能需要保护输入引脚。

在那之后,都是代码,这也很简单。

(注意:当场想出这个。它完全未经测试。标准免责声明适用;风险自负,调整口味等)

import RPi.GPIO as GPIO
import time

#Setup some pins
GPIO.setup(<charging_pin>, GPIO.OUT)
GPIO.setup(<sensing_pin>, GPIO.IN)

# Set "charging" pin to 3.3v
GPIO.output(<charging_pin>,TRUE)

# Wait some time for the capacitor to be fully charged
time.sleep(1.0)

# Set the charging pin to 0v
GPIO.output(<charging_pin>,FALSE)

#count how long the sense pin stays high
counter=0
while GPIO.input(<sensing_pin>) == GPIO.HIGH:
    counter += 1
    time.sleep(0.01)

# Finally our counter is going to have a value proportional to the RC
# time delay of our token. Window match it to bounds, and we're golden.

if (counter > a) and (counter < b):
    print "Is person X"

if (counter > b) and (counter < c):
    print "Is person Y"

[...]

最后(并且只是作为一个旁白/事后考虑)同样的事情不会太糟糕重新用作电容器测试仪/仪表,因为这基本上就是我们在这里所做的一切。


批评

这比 1-wire 解决方案要困难得多。1-wire 解决方案即插即用。RC会有一堆接线和焊接等等。单独的 Pi 侧电路将非常复杂,以至于总成本将高于仅使用 1 线。

一点也不真实。

我想我已经在上面展示了 RC 解决方案是多么微不足道;约 13 行代码,3 个组件 Pi 侧,每人 1 个电容器。其实很简单。

不可否认,1-wire 的设置同样相当简单,但那是因为您正在购买自己的出路。每个 1-wire 代币增加了一个 0.5 美元的芯片,而每个 RC 代币添加的只是一个 0.01 美元的电容器。

几乎一样简单,但只是成本的一​​小部分。很清楚谁是赢家。

你的想法很容易受到静电的影响。Raspberry Pi 容易受到静电的影响。这很容易受到静电的影响。那很容易受到静电的影响。你的狗容易受到静电的影响。等等等等等等

新闻快讯!从技术上讲,一切都容易受到静电/ESD的影响,即使是你!不相信我?拿着雨伞在空旷的地方脱颖而出,证明我是对的。(PS。不要​​这样做)

但是,如果我们不聪明@$$,那么我们会画出明显的线条。常识点是在 CMOS IC 上,因为从非常真实和实际的意义上说,这实际上很容易受到静电的影响。有趣的是,我们完全不用 IC 就可以完全解决这个问题!

无源器件对于所提出的任务几乎同样简单,并且对 ESD 更稳健。时期。这就是为什么人们可能要重新考虑其他方法的原因。

现在,当然,树莓派总是容易受到静电的影响,除非你移除树莓派,否则无法解决这个问题。当然,这也不实用。所以,我们能做的最好的就是做其他人用这些柠檬做的事情。首先,我们将带有适当保护环的 Pi 侧的插座接地。其次,我们可以疯狂使用 TVS 二极管等。底线在这里...

我们现在只需对一 (1) 个设备进行 ESD 保护,所以如果您愿意,请发疯!

简单的无源是不安全的。它们很容易伪造/复制/破解/等。

(-_-) ...这是儿童玩具 FFS ...我们为什么要在其中引入信息安全?即便如此,您真的认为 1-wire 硬件地址(或者更糟的是 SPI/I2C 地址)是一种很好的安全机制吗?真的吗?你是认真的吗!?

好的,那么这个怎么样......把这个想法带到security.SE。看看他们怎么说。(提示:带上绷带,你会被撕破一个新的。)

不,唯一一次 1-wire 是安全的,是如果您使用的是实际的安全令牌/身份验证器[ 1 ]然后它可以是国家安全的......除了攻击者肯定可以物理访问身份验证设备的事实......

安全性在这里不是问题,这完全是题外话。


编辑:将其余部分分解为自己的答案,因为它就是这样;一个不同的答案。