一般用途 I/O(GPIO)引腳可以設定為接收電信號作為輸入。 在最基本的層級,這適用於偵測線路的開啟/關閉案例。 這類線路可能包括按鈕、切換開關、簧片開關、壓力開關和其他裝置,這些裝置通過完成電路來表示二進位(開/關)值。
在這個教學中,你會使用 .NET 和 Raspberry Pi 的 GPIO 腳位來偵測電路的開合。
先決條件
- ARM 型 (ARMv7 或更新版本) 單板電腦 (SBC)
- 跳線
- 麵包板(選擇性)
- Raspberry Pi GPIO 擴展板(選用)
- .NET SDK 10 或更新版本
備註
本教學課程是以Raspberry Pi為目標裝置所撰寫。 不過,這個教學也可以用於任何支援 .NET 的 Linux 基礎 SBC,例如 Orange Pi、ODROID 等。
確定您的裝置上已啟用 SSH。 針對Raspberry Pi,請參閱Raspberry Pi檔中的設定 SSH 伺服器。
準備硬體
使用硬體元件來建置線路,如下圖所示:
上圖描述接地針腳與針腳 21 之間的直接連線。
小提示
此圖描述了一個麵包板和 GPIO 拓展板用於說明,但可以直接在 Raspberry Pi 上使用跳線線隨意連接接地針腳和針腳 21。
請視需要參閱下列接腳配置圖:
建立應用程式
在慣用的開發環境中完成下列步驟:
請使用 .NET CLI 或 Visual Studio 建立一個新的 .NET 控制台應用程式。 叫它 InputTutorial。
dotnet new console -o InputTutorial cd InputTutorial將 System.Device.Gpio 套件加入專案。 請使用專案目錄中的 .NET CLI 或 Visual Studio。
dotnet package add System.Device.Gpio --version 4.0.1使用下列程式碼取代 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)}"); }在上述程式碼中:
- 使用宣告 會產生 一個
GpioController的實例。 宣using告確保物件被處置,硬體資源被正確釋放。-
GpioController實例化時沒有參數,表示它應該偵測所運行的硬體平台並使用 邏輯腳位編號方案。
-
- GPIO 腳位 21 已被
PinMode.InputPullUp開啟。- 這會打開引腳,同時啟用一個上拉電阻。 在此模式下,當腳位接地時,會返回
PinValue.Low。 當腳位與接地斷開且電路是開路狀態時,腳位返回到PinValue.High。
- 這會打開引腳,同時啟用一個上拉電阻。 在此模式下,當腳位接地時,會返回
- 初始狀態會使用三元表示式寫入主控台。 讀取腳位的當前狀態為
Read()。 如果是PinValue.High,會把Alert字串寫入主控台。 否則,它會寫入字串Ready。 -
RegisterCallbackForPinValueChangedEvent()為PinEventTypes.Rising和PinEventTypes.Falling事件在腳位上同時註冊回調函式。 這些事件分別對應於PinValue.High和PinValue.Low的腳位狀態。 - 回調函數指向一個稱為
OnPinEvent()的方法。OnPinEvent()使用另一個三元運算子,該運算子會寫出對應的Alert或Ready字串。 - 主線程在等候引腳事件時會無限期地睡眠。
- 使用宣告 會產生 一個
建置應用程式。 如果使用 .NET CLI,請執行
dotnet build。 要在Visual Studio中建構,請按 Ctrl+Shift+B。將應用程式部署至 SBC 作為獨立應用程式。 相關說明請參考 Deploy .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 來偵測輸入! 此類型的輸入有許多用途。 這個範例可以與交換器連接或中斷線路的任何案例搭配使用。 以下是將它與磁力開關搭配使用的範例,通常用來偵測打開的門或窗戶。
雷射絆索
進一步擴充先前的範例概念,讓我們來探討這如何應用於建立雷射感應線。 製作鐳射絆線(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 取得。