다음을 통해 공유


이진 입력에 GPIO 사용

GPIO(범용 I/O) 핀은 전기 신호를 입력으로 받도록 구성할 수 있습니다. 가장 기본적인 수준에서 회로의 열기/닫기를 감지하는 시나리오에 유용합니다. 이러한 회로에는 회로를 완료하여 이진(켜기/끄기) 값을 나타내는 누름 단추, 토글 스위치, 리드 스위치, 압력 스위치 및 기타 디바이스가 포함될 수 있습니다.

이 자습서에서는 .NET 및 Raspberry Pi의 GPIO 핀을 사용하여 회로의 열기 및 닫기를 감지합니다.

사전 요구 사항

  • ARM 기반(ARMv7 이상) SBC(단일 보드 컴퓨터)
  • 점퍼 와이어
  • 브레드보드(선택 사항)
  • Raspberry Pi GPIO 브레이크아웃 보드(선택 사항)
  • .NET SDK 7 이상

참고

이 자습서는 대상 디바이스가 Raspberry Pi라고 가정하여 작성되었습니다. 그러나 이 자습서는 Orange Pi, ODROID 등 .NET을 지원하는 모든 Linux 기반 SBC에 사용할 수 있습니다.

디바이스에서 SSH가 사용하도록 설정되어 있는지 확인합니다. Raspberry Pi의 경우 Raspberry Pi 설명서에서 SSH 서버 설정을 참조하세요.

하드웨어 준비

하드웨어 구성 요소를 사용하여 다음 다이어그램에 표시된 대로 회로를 빌드합니다.

접지 핀을 핀 21에 연결하는 회로를 보여 주는 다이어그램

위의 이미지는 접지 핀과 핀 21 사이의 직접 연결을 보여 줍니다.

이 다이어그램은 설명을 위해 브레드보드 및 GPIO 브레이크아웃을 보여 주지만 Raspberry Pi의 점퍼 와이어로 접지 핀과 핀 21을 자유롭게 연결할 수 있습니다.

필요한 경우 다음 핀 배치도 다이어그램을 참조하세요.

Raspberry Pi GPIO 헤더의 핀 배치도를 보여 주는 다이어그램. Raspberry Pi Foundation이 제공한 이미지
Raspberry Pi Foundation이 제공한 이미지.

앱 만들기

선호하는 개발 환경에서 다음 단계를 완료합니다.

  1. .NET CLI 또는 Visual 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 2.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를 반환합니다.
    • 초기 상태는 3항식을 사용하여 콘솔에 기록됩니다. 핀의 현재 상태는 Read()로 읽힙니다. PinValue.High이면 Alert 문자열을 콘솔에 씁니다. 그렇지 않으면 Ready 문자열을 씁니다.
    • RegisterCallbackForPinValueChangedEvent()PinEventTypes.RisingPinEventTypes.Falling 이벤트 둘 다에 대한 콜백 함수를 핀에 등록합니다. 이러한 이벤트는 각각 PinValue.HighPinValue.Low의 핀 상태에 해당합니다.
    • 콜백 함수는 OnPinEvent()라는 메서드를 가리킵니다. OnPinEvent()는 해당 Alert 또는 Ready 문자열을 작성하는 다른 3항식을 사용합니다.
    • 핀 이벤트를 기다리는 동안 주 스레드가 무기한 절전 모드로 전환됩니다.
  4. 앱을 빌드합니다. .NET CLI를 사용하는 경우를 dotnet build를 실행합니다. Visual Studio에서 빌드하려면 Ctrl+Shift+B를 누릅니다.

  5. SBC에 자체 포함 앱으로 앱을 배포합니다. 자세한 내용은 Raspberry Pi에 .NET 앱 배포를 참조하세요. 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를 눌러 프로그램을 종료합니다.

축하합니다! GPIO를 사용하여 System.Device.Gpio NuGet 패키지로 입력을 검색했습니다. 이러한 유형의 입력에는 여러 가지 용도가 있습니다. 이 예제는 스위치가 회로를 연결하거나 끊는 모든 시나리오에서 사용할 수 있습니다. 다음은 열린 문이나 창문을 감지하는 데 자주 사용되는 자기 리드 스위치와 함께 사용하는 예입니다.

자기 리드 스위치 열기 및 닫기를 보여 주는 애니메이션 GIF. 스위치가 자석에 노출되고 앱에 READY가 표시됩니다. 자석이 제거되고 앱에 ALERT가 표시됩니다. 그러면 작업이 반복됩니다.

레이저 트립와이어

이전 예제 개념을 좀 더 확장하여 레이저 트립와이어를 만드는 데 어떻게 적용할 수 있는지 살펴보겠습니다. 레이저 트립와이어를 빌드하려면 다음과 같은 추가 구성 요소가 필요합니다.

  • KY-008 레이저 송신기 모듈
  • 레이저 수신기 센서 모듈 (아래 참고 사항 참조)
  • 2 10K Ω 저항기

참고

‘레이저 수신기 센서 모듈’은 많은 인터넷 소매점에서 발견되는 일반 모듈에 적용되는 일반 이름입니다. 디바이스는 이름 또는 제조업체에 따라 다를 수 있지만 이 이미지와 유사해야 합니다.

레이저 수신기 센서 모듈의 이미지

레이저 트립와이어 하드웨어 연결

다음 다이어그램에 설명된 대로 구성 요소를 연결합니다.

레이저 수신기 센서 모듈에서 입력을 가져오는 회로를 보여 주는 다이어그램

10K Ω 저항기를 좀 더 주의해서 살펴보세요. 이러한 저항기는 전압 분배기를 구현합니다. 레이저 수신기 모듈이 빔이 중단되었음을 나타내기 위해 5V를 출력하기 때문입니다. Raspberry Pi는 GPIO 입력에 대해 최대 3.3V만 지원합니다. 핀에 전체 5V를 보내면 Raspberry Pi가 손상될 수 있으므로 수신기 모듈의 전류는 전압 분배기를 통과하며 전압이 절반인 2.5V로 줄어듭니다.

소스 코드 업데이트 적용

한 가지 예외가 있지만 이전과 ‘거의’ 동일한 코드를 사용할 수 있습니다. 다른 예제에서는 핀이 지면에서 연결이 끊어지고 회로가 열려 있으면 핀이 PinValue.High를 반환하도록 PinMode.InputPullUp을 사용했습니다.

그러나 레이저 수신기 모듈의 경우 열린 회로를 감지하지 않습니다. 대신, 핀이 레이저 수신기 모듈에서 나오는 전류의 싱크 역할을 하기 원합니다. 이 경우 PinMode.InputPullDown으로 핀을 엽니다. 이렇게 하면 핀은 전류를 받지 않을 때 PinValue.Low를 반환하고, 레이저 수신기 모듈에서 전류를 받을 때 PinValue.High를 반환합니다.

controller.OpenPin(pin, PinMode.InputPullDown);

중요

레이저 트립와이어를 테스트하기 전에 Raspberry Pi에 배포된 코드에 이 변경 내용이 포함되어 있는지 확인합니다. 이 프로그램은 이 기능 없이 ‘작동하지만’ 잘못된 입력 모드를 사용하면 Raspberry Pi가 손상될 수 있습니다.

레이저 트립와이어의 데모를 보여 주는 애니메이션 GIF. 레이저 방출기는 레이저 센서 모듈을 비추고 앱에 READY가 표시됩니다. 레이저 빔이 중단되고 앱에 ALERT가 표시됩니다. 그런 다음, 작업이 반복됩니다.

소스 코드 가져오기

이 자습서의 소스는 GitHub에서 제공됩니다.

다음 단계