使用 GPIO 進行二進位輸入
一般用途 I/O (GPIO) 針腳可以設定為接收電子訊號做為輸入。 在最基本的層級中,這適用於偵測線路開啟/關閉的案例。 這類線路可能包含按鈕、切換開關、Reed 開關、壓力開關,以及其他裝置,這些裝置透過完成線路來代表二進位 (開啟/關閉) 值。
在本教學課程中,您將使用 .NET 和 Raspberry Pi 的 GPIO 針腳來偵測線路的開啟和關閉。
必要條件
- ARM 型 (ARMv7 或更新版本) 單一面板電腦 (SBC)
- 跳線
- 試驗電路板 (選擇性)
- Raspberry Pi GPIO 擴充板 (選擇性)
- .NET SDK 7 或更新版本
注意
本教學課程是以 Raspberry Pi 為目標裝置所撰寫。 不過,本教學課程可用於支援 .NET 的任何 Linux 型 SBC,例如 Orange Pi、ODROID 等等。
確定您的裝置上已啟用 SSH。 如需 Raspberry Pi,請參閱 Raspberry Pi 文件中的設定 SSH 伺服器。
準備硬體
使用硬體元件來建置線路,如下圖所示:
上圖描述接地針腳與針腳 21 之間的直接連線。
提示
此圖描述做為說明用途的試驗電路板和 GPIO 中斷,但您可以隨意只將接地針腳和針腳 21 與 Raspberry Pi 上的跳接器線路。
視需要參閱下列封裝接腳圖:
影像由 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 2.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 以終止程式。
恭喜! 您已使用 GPIO 來偵測使用 System.Device.Gpio
NuGet 封裝的輸入! 此類型的輸入有許多用途。 這個範例可與交換器連線或中斷線路的任何案例搭配使用。 以下是搭配磁力開關使用的範例,這通常用來偵測開啟的門或視窗。
雷射感應線
進一步延伸先前的範例概念,讓我們看看如何套用此概念來建立雷射感應線。 建置雷射感應線需要下列額外元件:
- 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);
重要
請先確定在 Raspberry Pi 上部署的程式碼包含這項變更後,再測試雷射感應線。 此程式「沒有」作用,但使用錯誤的輸入模式可能會造成損害 Raspberry Pi 的風險!
取得原始程式碼
本教學課程中的來源位於 GitHub。