共用方式為


使用 GPIO 進行二進位輸入

一般用途 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 的線路。

上圖描述接地針腳與針腳 21 之間的直接連線。

小提示

此圖描述了一個麵包板和 GPIO 拓展板用於說明,但可以直接在 Raspberry Pi 上使用跳線線隨意連接接地針腳和針腳 21。

請視需要參閱下列接腳配置圖:

此圖顯示 Raspberry Pi GPIO 標頭的引腳配置。圖片由 Raspberry Pi Foundation 提供。
圖片由Raspberry Pi Foundation 提供

建立應用程式

在慣用的開發環境中完成下列步驟:

  1. 使用 .NET CLIVisual Studio 建立新的 .NET 控制台應用程式。 將它命名為 InputTutorial

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. System.Device.Gpio 套件新增至專案。 從項目目錄或Visual Studio使用 .NET CLI

    dotnet add package System.Device.Gpio --version 3.2.0-*
    
  3. 使用下列程式碼取代 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
    • 初始狀態會使用三元表示式寫入主控台。 使用 Read() 讀取針腳的目前狀態。 PinValue.High如果是 ,它會將Alert字串寫入主控台。 否則,它會寫入 Ready 字串。
    • RegisterCallbackForPinValueChangedEvent() 註冊了一個回呼函數,用於針腳上的 PinEventTypes.RisingPinEventTypes.Falling 事件。 這些事件分別對應至PinValue.HighPinValue.Low的針腳狀態。
    • 回呼函式指向稱為 OnPinEvent()的方法。 OnPinEvent() 使用另一個三元表達式來寫入對應的 AlertReady 字串。
    • 主線程在等候引腳事件時會無限期地睡眠。
  4. 建置應用程式。 如果使用 .NET CLI,請執行 dotnet build。 若要在 Visual Studio 中建置,請按 Ctrl+Shift+B

  5. 將應用程式部署至 SBC 作為獨立應用程式。 如需指示,請參閱 將 .NET 應用程式部署至Raspberry Pi。 請務必使用 提供可執行檔chmod +x許可權。

  6. 切換至部署目錄並執行可執行檔,在Raspberry Pi上執行應用程式。

    ./InputTutorial
    

    主控台會顯示類似下列的文字:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. 斷開針腳 21 與接地的連接。 主控台會顯示類似下列的文字:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. 重新連接針腳 21 和接地。 主控台會顯示類似下列的文字:

    (05/10/2022 16:00:25) READY ✅
    
  9. Ctrl+C 終止程式。

祝賀! 您已使用 NuGet 套件來透過 GPIO 偵測 System.Device.Gpio 輸入! 此類型的輸入有許多用途。 這個範例可以與交換器連接或中斷線路的任何案例搭配使用。 以下是將它與磁力開關搭配使用的範例,通常用來偵測打開的門或窗戶。

動畫 GIF 示範磁力開關的開啟和關閉。開關會暴露在磁力中,而應用程式會顯示 READY。已移除磁石,且應用程式會顯示 ALERT。接著會重複此動作。

雷射絆索

進一步擴充先前的範例概念,讓我們來探討這如何應用於建立雷射感應線。 製作鐳射絆線(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!

動畫 GIF 顯示鐳射三線的示範。激光發射器會照亮鐳射感測器模組,而應用程式會顯示 READY。鐳射束已損壞,應用程式會顯示 ALERT。接著會重複此動作。

取得原始程式碼

本教學課程的來源 可在 GitHub 上取得

後續步驟