一般用途 I/O(GPIO)引腳可以設定為接收電信號作為輸入。 在最基本的層級,這適用於偵測線路的開啟/關閉案例。 這類線路可能包括按鈕、切換開關、簧片開關、壓力開關和其他裝置,這些裝置通過完成電路來表示二進位(開/關)值。
在本教學課程中,您將使用 .NET 和 Raspberry Pi 的 GPIO 針腳來偵測線路的開頭和結尾。
先決條件
- ARM 型 (ARMv7 或更新版本) 單板電腦 (SBC)
- 跳線
- 麵包板(選擇性)
- Raspberry Pi GPIO 擴展板(選用)
- .NET SDK 8 或更新版本
備註
本教學課程是以Raspberry Pi為目標裝置所撰寫。 不過,本教學課程可用於支援 .NET 的任何 Linux 型 SBC,例如 Orange Pi、ODROID 等等。
確定您的裝置上已啟用 SSH。 針對Raspberry Pi,請參閱Raspberry Pi檔中的設定 SSH 伺服器。
準備硬體
使用硬體元件來建置線路,如下圖所示:
上圖描述接地針腳與針腳 21 之間的直接連線。
小提示
此圖描述了一個麵包板和 GPIO 拓展板用於說明,但可以直接在 Raspberry Pi 上使用跳線線隨意連接接地針腳和針腳 21。
請視需要參閱下列接腳配置圖:
圖片由Raspberry Pi Foundation 提供。
建立應用程式
在慣用的開發環境中完成下列步驟:
使用 .NET CLI 或 Visual Studio 建立新的 .NET 控制台應用程式。 將它命名為 InputTutorial。
dotnet new console -o InputTutorial cd InputTutorial
將 System.Device.Gpio 套件新增至專案。 從項目目錄或Visual Studio使用 .NET CLI。
dotnet add package System.Device.Gpio --version 3.2.0-*
使用下列程式碼取代 Program.cs 的內容:
using System.Device.Gpio; using System.Threading.Tasks; const int Pin = 21; const string Alert = "ALERT 🚨"; const string Ready = "READY ✅"; using var controller = new GpioController(); controller.OpenPin(Pin, PinMode.InputPullUp); Console.WriteLine( $"Initial status ({DateTime.Now}): {(controller.Read(Pin) == PinValue.High ? Alert : Ready)}"); controller.RegisterCallbackForPinValueChangedEvent( Pin, PinEventTypes.Falling | PinEventTypes.Rising, OnPinEvent); await Task.Delay(Timeout.Infinite); static void OnPinEvent(object sender, PinValueChangedEventArgs args) { Console.WriteLine( $"({DateTime.Now}) {(args.ChangeType is PinEventTypes.Rising ? Alert : Ready)}"); }
在上述程式碼中:
-
using 宣告會建立
GpioController
的實例。 宣告using
確保物件被處置且硬體資源被正確釋放。-
GpioController
實例化時沒有包含任何參數,表示它應該偵測所運行的硬體平台,並使用 邏輯針腳編號配置。
-
- GPIO 針腳 21 是使用
PinMode.InputPullUp
開啟的。- 這會啟用連接有PullUp電阻的引腳。 在此模式下,當針腳連線到接地時,它會傳回
PinValue.Low
。 當針腳與接地中斷連線且線路斷路時,針腳會傳回PinValue.High
。
- 這會啟用連接有PullUp電阻的引腳。 在此模式下,當針腳連線到接地時,它會傳回
- 初始狀態會使用三元表示式寫入主控台。 使用
Read()
讀取針腳的目前狀態。PinValue.High
如果是 ,它會將Alert
字串寫入主控台。 否則,它會寫入Ready
字串。 -
RegisterCallbackForPinValueChangedEvent()
註冊了一個回呼函數,用於針腳上的PinEventTypes.Rising
和PinEventTypes.Falling
事件。 這些事件分別對應至PinValue.High
和PinValue.Low
的針腳狀態。 - 回呼函式指向稱為
OnPinEvent()
的方法。OnPinEvent()
使用另一個三元表達式來寫入對應的Alert
或Ready
字串。 - 主線程在等候引腳事件時會無限期地睡眠。
-
using 宣告會建立
建置應用程式。 如果使用 .NET CLI,請執行
dotnet build
。 若要在 Visual Studio 中建置,請按 Ctrl+Shift+B。將應用程式部署至 SBC 作為獨立應用程式。 如需指示,請參閱 將 .NET 應用程式部署至Raspberry Pi。 請務必使用 提供可執行檔
chmod +x
許可權。切換至部署目錄並執行可執行檔,在Raspberry Pi上執行應用程式。
./InputTutorial
主控台會顯示類似下列的文字:
Initial status (05/10/2022 15:59:25): READY ✅
斷開針腳 21 與接地的連接。 主控台會顯示類似下列的文字:
(05/10/2022 15:59:59) ALERT 🚨
重新連接針腳 21 和接地。 主控台會顯示類似下列的文字:
(05/10/2022 16:00:25) READY ✅
按 Ctrl+C 終止程式。
祝賀! 您已使用 NuGet 套件來透過 GPIO 偵測 System.Device.Gpio
輸入! 此類型的輸入有許多用途。 這個範例可以與交換器連接或中斷線路的任何案例搭配使用。 以下是將它與磁力開關搭配使用的範例,通常用來偵測打開的門或窗戶。
雷射絆索
進一步擴充先前的範例概念,讓我們來探討這如何應用於建立雷射感應線。 製作鐳射絆線(tripwire)需要下列額外的元件:
- KY-008 激光發射模組
- 鐳射接收器感測器模組 (請參閱下方附註)
- 2 10K Ω電阻
備註
鐳射接收器感測器模組 是套用至許多因特網零售商找到的通用模組的一般名稱。 裝置的名稱或製造商可能會有所不同,但應該類似此映像。
連接雷射絆線裝置硬體
請依照下圖所示連接元件。
密切關注 10K Ω電阻。 這些會實作 分壓器。 這是因為雷射接收器模組輸出 5V 來表示光束已中斷。 Raspberry Pi 只支援最多 3.3V 的 GPIO 輸入。 由於將完整的 5V 傳送到針腳可能會損壞 Raspberry Pi,因此接收器模組的電流會通過電壓分流器,將電壓減半至 2.5V。
套用原始程式碼更新
您 幾乎 可以使用與先前相同的程序代碼,但有一個例外狀況。 在其他範例中,當針腳與接地斷開且電路開路時,我們使用 PinMode.InputPullUp
讓針腳回傳 PinValue.High
狀態。
不過,在鐳射接收器模塊的情況下,我們不會偵測到開放式電路。 相反地,我們希望引腳作為電流從雷射接收器模組洩入的途徑。 在此情況下,我們會使用 PinMode.InputPullDown
打開釘選。 如此一來,針腳會在未收到電流時傳回PinValue.Low
,以及從鐳射接收器模組接收電流時傳回PinValue.High
。
controller.OpenPin(pin, PinMode.InputPullDown);
這很重要
在測試鐳射 tripwire 之前,請確定部署在 Raspberry Pi 上的程式碼包含這項變更。 程式 確實 可以運作,但使用錯誤的輸入模式可能會損害您的Raspberry Pi!
取得原始程式碼
本教學課程的來源 可在 GitHub 上取得。