다음을 통해 공유


이진 입력에 GPIO 사용

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

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

필수 조건

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

비고

이 자습서는 대상 디바이스가 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 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로 열립니다.
      • 그러면 풀업 저항기가 연결된 핀이 열립니다. 이 모드에서는 핀이 접지에 연결되면 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를 사용하는 경우 .NET CLI를 실행합니다 dotnet build. Visual Studio에서 빌드하려면 Ctrl+ ShiftB+ 누릅니다.

  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가 표시됩니다. 자석이 제거되고 앱에 경고가 표시됩니다. 그런 다음 작업이 반복됩니다.

레이저 트립와이어

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

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

비고

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

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

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

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

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

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

소스 코드 업데이트 적용

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

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

controller.OpenPin(pin, PinMode.InputPullDown);

중요합니다

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

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

소스 코드 가져오기

이 자습서의 원본은 GitHub에서 사용할 수 있습니다.

다음 단계