2017-01-21 86 views
6

我希望能夠檢測到外設傳感器未連接到我的Raspberry Pi 3.如何判斷外設是否連接到GPIO?

例如,如果我有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,我不能合理地想到如何區分具有外圍傳感器連接的引腳和「空」的引腳。

因此,目前,我無法通過程序斷言我的傳感器和電路設置正確。

任何人有任何想法?從電子的角度來看甚至是可能的嗎?

參考文檔:

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

回答

6

有很多方法可以做到「存在檢測」電,但沒有,你將在SoC本質上找到。如果連接了某個東西,你通常不會問GPIO引腳 - 它無法告訴你。

額外的GPIO引腳通常用於檢測外設是否連接到連接器。例如,某些傳感器的插頭可能包含一條「檢測」線,該線對地短路,並在傳感器連接時拉低GPIO。 USB和SDIO與接口中的某些專用電路類似。你也可以使用諸如電流感測之類的東西來構建更精細的檢測電路,但是它們不可避免地必須輸出通過專用GPIO捕獲的二進制信號。

這對於串行外設很容易實現,因爲您通常可以發送基本命令並驗證您是否收到響應。

2

僅使用輸入線檢測可能很困難。首先,你想要縮小問題的範圍。視爲未呈現傳感器未連接狀態,傳感器已連接但未響應,或傳感器以非特徵方式響應。因此,如果它是數字傳感器,那麼與傳感器進行通信可能足以判斷它是否存在(特別是如果涉及校驗和或奇偶校驗位)。 某些模擬傳感器在觸發時也具有特定規格。您可以利用這些規格的偏差來確定傳感器是否不存在。

如果你有一個數字傳感器沒有任何錯誤檢查它的輸出,你輸出數據(所有0或全1都是有效的),或者它只是一個二進制1或0的輸出,那麼你會需要外部幫助。大多數模擬傳感器也一樣。

這個外部幫助可以讓系統進入已知的受控狀態,按下一個按鈕,然後它檢查傳感器在特定範圍內的輸出。要絕對確定,您至少需要兩種不同的狀態,以確保您的數字或模擬輸入沒有碰巧處於測試的正確狀態。

幾乎任何其他方法都是系統外部的。使用額外的IO來「檢測」傳感器可能有助於提高傳感器的可靠性,但是您可能會得到誤報,您所學到的僅僅是「某些東西」 - 而不一定是您期望的傳感器。

相關問題