• 전체강좌

    [WAD-MX6W] Windows 10 IoT 에서 GPIO 입력받기

    twitter facebook

    안녕하세요? 러찌입니다.


    이번 한 주는 4계절 날씨를 일주일에

    다 구경시켜 주는 것 같네요.
    봄이 왔지만, 일교차가 큰 이런 날씨에는

    감기에 안걸리게 따뜻한 옷을 꼭 챙기시기 바랍니다.


    이번 글에서는 지난 시간에 이어 GPIO에 대해 좀 더 알아 보려고 합니다.


    GPIO는 General Purpose Input Output의 약어이고
    "일반적인 목적으로 사용하도록 준비된 입출력 포트"라고

    정의하고 있습니다.


    지난 글에서는 Windows 10 IoT Core OS가 실행된
    WAD-MX6W 보드에서 GPIO를 Output 모드로 설정하여
    LED를 ON/OFF 해보았습니다.


    이번에는 GPIO를 입력(Input)으로 설정해서,
    인터럽트를 받아 특정 동작을 수행하도록 해보려 합니다.


    WAD-MX6W 보드에는 아래 그림과 같이 헤더 핀들이 제공됩니다.




    여기에 있는 대부분의 핀들은 IOMUX 설정을 통해

    GPIO로 설정할 수 있습니다.
    헤더 핀에서 제공되는 3.3V 전원과 GND,

    그리고 원하는 GPIO 핀으로 버튼 모듈을 연결하였습니다.

    같은 방식으로 LED 모듈도 함께 연결하였습니다.


    Windows 10 IoT OS에서 GPIO 핀을 제어하려면,
    해당 핀이 GPIO로 등록되어 있어야 합니다.
    그리고 GPIO Controller Driver가 i.MX6용으로 제공되어야 합니다.
    그러면, 어플리케이션에서는 해당 핀을

    GPIO로 사용할 수 있게 되는 것이죠.


    저는 버튼 모듈과 LED 모듈을 이용해서, 버튼이 눌릴 때
    LED를 ON/OFF 해보려고 합니다.


    그런데 위와 같은 동작을 해주는 테스트 샘플 소스가 있습니다.


    아래의 ms-iot github에 가보면,
    Windows 10 IoT Core용 GPIO를 테스트하기 위한

    샘플 소스가 제공됩니다.


    https://github.com/ms-iot


    Windows 10 IoT Core Samples라는 Repository에서
    PushButton 예제를 다운받으시기 바랍니다.


    해당 소스는 C# 언어로 구현된 UWP(Universal Windows Platform)

    샘플 소스입니다.


    소스를 잠깐 살펴볼까요?


    소스의 동작을 간단히 설명드리자면,

    버튼과 LED용 GPIO를 선언하고,
    버튼이 눌리거나 떨어질 때의 이벤트(인터럽트)를 받아서,
    LED를 ON/OFF 해주는 소스입니다.


    소스에 대한 세부 설명은 아래 주석글을 참고하시기 바랍니다.

    ----------------------------------------------------------------------------------------------

        public sealed partial class MainPage : Page
        {
            // GPIO 175번을 LED 제어용으로 GPIO 148번을

            // 버튼 입력용으로 사용하고자 아래와 같이 선언합니다.
            private const int LED_PIN = 175;
            private const int BUTTON_PIN = 148;
           
            // GpioPin 클래스 변수를 LED용과 버튼용으로 각각 선언합니다.
            private GpioPin ledPin;
            private GpioPin buttonPin;
           
            // LED GPIO 상태 값을 저장하기 위한 변수를 선언합니다.
            private GpioPinValue ledPinValue = GpioPinValue.Low;
           
            // 화면에 빨간색과 회색을 칠하기 위한 Brush를 준비합니다.
            private SolidColorBrush redBrush = new SolidColorBrush(Windows.UI.Colors.Red);
            private SolidColorBrush grayBrush = new SolidColorBrush(Windows.UI.Colors.LightGray);

            public MainPage()
            {
                this.InitializeComponent();
               
                // GPIO를 초기화 하기 위해 아래 함수를 호출합니다.
                InitGPIO();
            }

            private void InitGPIO()
            {
                // Windows 10 IoT Core 있는 Gpio Controller를 받아옵니다.
                var gpio = GpioController.GetDefault();

                // 만약 GPIO Controller가 존재하지 않으면 에러를 발생시킵니다.
                if (gpio == null)
                {
                    GpioStatus.Text = "There is no GPIO controller on this device.";
                    return;
                }


                // GPIO Controller로부터 버튼용 GPIO와 LED용 GPIO를 Open합니다.
                buttonPin = gpio.OpenPin(BUTTON_PIN);
                ledPin = gpio.OpenPin(LED_PIN);


                // LED GPIO의 핀 Level을 Low로 설정하고 Output 모드로 설정합니다.
                ledPin.Write(GpioPinValue.Low);
                ledPin.SetDriveMode(GpioPinDriveMode.Output);


                // Input pull-up 이 되어 있는지에 따라 DriveMode를 설정합니다.
                if (buttonPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
                    buttonPin.SetDriveMode(GpioPinDriveMode.InputPullUp);
                else
                    buttonPin.SetDriveMode(GpioPinDriveMode.Input);


                // 버튼이 눌릴 때, 노이즈에 대한 인터럽트를 방지하기 위해

                // 아래와 같이 DebounceTimeout을 설정합니다.
                buttonPin.DebounceTimeout = TimeSpan.FromMilliseconds(50);


                // 버튼이 눌렸을 때, buttonPin_ValueChanged 함수가

                // 호출되도록 하기 위해 ValueChanged event를 등록합니다.
                buttonPin.ValueChanged += buttonPin_ValueChanged;


                GpioStatus.Text = "GPIO pins initialized correctly.";
            }

            // 아래의 함수는 버튼의 상태가 변할 때마다 호출되는 함수입니다.
            private void buttonPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e)
            {
                // 버튼이 눌리고 떨어질 때 LED를 Toggle 하도록 조건문을 만듭니다.
                if (e.Edge == GpioPinEdge.FallingEdge)
                {
                    ledPinValue = (ledPinValue == GpioPinValue.Low) ?
                        GpioPinValue.High : GpioPinValue.Low;
                    ledPin.Write(ledPinValue);
                }

                // need to invoke UI updates on the UI thread because this event
                // handler gets invoked on a separate thread.
                var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {


                    // 버튼이 떨어질 때, 화면에 버튼 텍스트와 색상을 Toggle 합니다.
                    if (e.Edge == GpioPinEdge.FallingEdge)
                    {
                        ledEllipse.Fill = (ledPinValue == GpioPinValue.Low) ?
                            grayBrush : redBrush;
                        GpioStatus.Text = "Button Released";
                    }
                    else
                    {
                        GpioStatus.Text = "Button Pressed";
                    }
                });
            }

    ----------------------------------------------------------------------------------------------


    버튼의 입력을 받아서 LED를 제어하는 어플리케이션 소스는

    위와 같이 구현 하는데 어렵지 않습니다.


    WAD-MX6W 보드에서도 Windows 10 IoT OS에서 GPIO 제어가

    어렵지 않게 구현되었습니다.
    여러분들도 Windows 10 IoT OS가 실행되는 보드를 이용해서,
    테스트 해보실 수 있습니다.


    다만, GPIO를 테스트 할 때는 GPIO 핀 번호가
    Windows 10 IoT OS에 등록되어 있어야 합니다.
    그렇지 않으면, 실행시에 에러가 발생될 것입니다.


    대부분의 개발 보드에는 GPIO 핀을 제공하고 있습니다.

    함께 제공되는 매뉴얼을 참고하여 원하는 GPIO 핀을

    설정하면 어렵지 않게 구현하실 수 있을 것입니다.


    지금까지 Windows 10 IoT Core OS가 실행되고 있는

    WAD-MX6W 보드에서 버튼을 이용한 LED 제어를 해보았습니다.


    글 읽어주셔서 감사합니다.

    아래는 관련 영상입니다.


    꼭 한번씩 봐주시면 감사하겠습니다.



    유튜브 채널 구독 부탁 드립니다. 아래 주소에 가시면 쉽게 하실 수 있습니다.
    https://www.youtube.com/channel/UCZuDcO4s6m8lt916Nj5SjcA
    미리 감사드립니다.^^


    그럼 즐거운 주말 되시기 바랍니다.