共用方式為


使用 GPIO 進行二進位輸入

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

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

小提示

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

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

一張顯示 Raspberry Pi GPIO 接頭腳位的示意圖。圖片由Raspberry Pi基金會提供。
圖片由Raspberry Pi基金會提供

建立應用程式

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

  1. 請使用 .NET CLIVisual Studio 建立一個新的 .NET 控制台應用程式。 叫它 InputTutorial

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. System.Device.Gpio 套件加入專案。 請使用專案目錄中的 .NET CLIVisual Studio

    dotnet package add System.Device.Gpio --version 4.0.1
    
  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)}");
    }
    

    在上述程式碼中:

    • 使用宣告 會產生 一個 GpioController 的實例。 宣 using 告確保物件被處置,硬體資源被正確釋放。
      • GpioController 實例化時沒有參數,表示它應該偵測所運行的硬體平台並使用 邏輯腳位編號方案
    • GPIO 腳位 21 已被 PinMode.InputPullUp 開啟。
      • 這會打開引腳,同時啟用一個上拉電阻。 在此模式下,當腳位接地時,會返回 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 作為獨立應用程式。 相關說明請參考 Deploy .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 來偵測輸入! 此類型的輸入有許多用途。 這個範例可以與交換器連接或中斷線路的任何案例搭配使用。 以下是將它與磁力開關搭配使用的範例,通常用來偵測打開的門或窗戶。

動畫GIF示範磁簧片開關的開關開關。開關會接觸到磁鐵,應用程式會顯示「準備好了」。磁鐵被移除後,應用程式顯示「警報」。接著重複這個動作。

雷射絆索

進一步擴充先前的範例概念,讓我們來探討這如何應用於建立雷射感應線。 製作鐳射絆線(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,展示雷射絆線的示範。雷射發射器點亮雷射感應模組,應用程式顯示「就緒」。雷射光束壞掉了,應用程式顯示警報。接著重複這個動作。

取得原始程式碼

本教學的原始碼為 可於 GitHub 取得。

後續步驟