如何判断外围设备是否连接到GPIO?

时间:2017-01-21 23:21:07

标签: android-things

我希望能够检测外围传感器何时没有连接到我的Raspberry Pi 3.

例如,如果我有一个GPIO被动红外传感器。

我可以像这样获得所有GPIO端口:

PeripheralManagerService manager = new PeripheralManagerService();
List<String> portList = manager.getGpioList();
if (portList.isEmpty()) {
    Log.i(TAG, "No GPIO port available on this device.");
} else {
    Log.i(TAG, "List of available ports: " + portList);
}

然后我可以连接到这样的端口:

 try {
     Gpio pir = new PeripheralManagerService().openGpio("BCM4")
     } catch (IOException e) {
         // not thrown in the case of an empty pin
     }

然而,即使引脚是空的,我仍然可以连接到它(技术上有意义,因为gpio只是二进制打开或关闭)。似乎没有任何api,我无法合理地从逻辑上思考如何区分连接外围传感器的引脚和#34;空的&#34;。< / p>

因此,目前我无法以编程方式断言我的传感器和电路设置正确。

任何人都有任何想法?从电子学的角度来看,它是否可能?

参考文档:

https://developer.android.com/things/sdk/pio/gpio.html

2 个答案:

答案 0 :(得分:6)

有很多方法可以做&#34;存在检测&#34;电气,但你在SoC中本质上找不到任何东西。你通常不会问一个GPIO引脚是否有附件 - 它无法告诉你。

额外的GPIO引脚通常用于检测外围设备是否连接到连接器。例如,用于某些传感器的插头可能包括短路接地的“检测”线,并在连接传感器时将GPIO拉低。 USB和SDIO与接口中的某些专用电路类似。

您还可以使用电流感应等方法构建更精细的检测电路,但它们不可避免地需要输出通过专用GPIO捕获的二进制信号。

这对于串行外围设备来说更容易实现,因为您通常可以发送基本命令并验证您是否得到了响应。

答案 1 :(得分:2)

仅使用输入线进行检测可能很困难。首先,您要缩小问题的范围。将传感器未连接,传感器连接但未响应,或传感器以不寻常的方式响应,视为不存在。

因此,如果它是数字传感器,那么与传感器通信可能足以判断它是否存在(特别是如果涉及校验和或奇偶校验位)。 某些模拟传感器还具有触发时其行为方式的特定规格。您可以利用这些规格的偏差来确定传感器是否不存在。

如果你有一个数字传感器,没有任何错误检查它的输出,你输出数据(所有0或全1有效)或它只是一个二进制1或0输出,那么你需要外部帮助。对于大多数模拟传感器也是如此。

这个外部帮助可以让您将系统置于已知的受控状态,按下按钮,然后检查传感器是否在特定范围内输出。为了绝对确定,您需要至少两种不同的状态,以确保您的数字或模拟输入不会卡在正确的测试状态。

几乎任何其他方法都是系统外部的。使用额外的IO来“检测”传感器可以帮助提高传感器在那里的可信度,但是你可能会得到误报,你所学到的只是“有些东西” - 不一定是你期望的传感器。