본문 바로가기

Programming/Windows10IoTCore

Windows 10 IoT Core에서 LED 켜고 끄기

반응형

라즈베리파이의 GPIO 제어를 통해서 간단하게 LED를 제어하는 방법입니다.

라즈베리파이의 Hello, world!와 같은 예제로 보면 됩니다.

GPIO 관련 API는 Windows 10 IoT Core에서만 동작하기 때문에 일반 PC에서는 실행되지 않습니다.


1. 사전 준비

라즈베리파이를 위한 프로그래밍을 위해서 먼저 Visual Studio를 설치하고 진행합니다.

2017/06/30 - [IT/Raspberry PI] - Windows 10 IoT Core를 위한 Visual Studio 설정

Visual Studio 2017 설치가 완료되면 프로젝트 진행이 가능합니다.

또한 실제 LED를 켜고 끄는 작업이기 때문에 다음 준비물이 필요합니다.

  • LED
  • 220Ω 저항
  • 브레드보드(빵판)와 연결 케이블

저항은 LED의 규격에 맞춰서 적절한 저항을 사용하면 됩니다.

테스트로 사용할 LED는 2.1V와 20mA 규격의 제품이라 다음과 같이 저항의 값을 계산할 수 있습니다.

(3.3V - 2.1V) / 0.02A = 60(저항값)

3.3V는 라즈베리파이의 입력 전원이기 때문에 위와 같이 계산하면 60Ω의 저항이 필요합니다.

60Ω 저항 대신 좀 더 큰 100Ω를 준비해서 다음과 같이 준비되었습니다.

이것으로 LED 제어를 위한 준비가 완료됩니다.


2. 라즈베리파이에 LED 연결

이제 준비된 부속을 라즈베리파이에 연결하면 됩니다.

빨간색 선은 3.3V 부분이며 파란색 선은 GPIO 5입니다.

다음은 라즈베리파이2, 3의 핀 구성입니다.

가장 위의 좌측 핀인 3.3V가 연결되고 GPIO 5가 연결된 것을 확인할 수 있습니다.


3. 샘플 프로그램 작성

Visual Studio 2017에서 프로젝트를 새로 생성하고 Visual C# > Windows Universal > Blank App을 선택합니다.

적당한 이름을 입력하고 프로젝트를 생성합니다.

앱이 동작할 타겟 버전과 최소 버전을 지정할 수 있습니다.

수정할 파일은 MainPage.xaml 파일과 MainPage.xaml.cs 파일입니다.

xaml 파일은 화면의 디자인을 주로 담당하게 되고 cs 파일에는 실제 동작 코드 등이 포함됩니다.

먼저 MainPage.xaml 파일의 <Grid></Grid> 사이에 다음과 같이 내용을 추가합니다.

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
    <Ellipse x:Name="LED" Fill="LightGray" Stroke="White" Width="100" Height="100" Margin="10"/>
    <TextBlock x:Name="GpioStatus" Text="Waiting to initialize GPIO..." Margin="10,50,10,10" TextAlignment="Center" FontSize="26.667" />
</StackPanel>

먼저 StackPanel은 내부에 요소들을 스택처럼 쌓기 위해서 사용됩니다.

그리고 내부가 LightGray 색상이면서 테두리가 흰색인 LED라는 이름의 원이 추가되있습니다.

마지막으로 상태를 표시해주는 GpioStatus라는 TextBlock으로 구성된 간단한 UI입니다.

MainPage.xaml.cs 파일의 전체 내용은 다음과 같습니다.

using System;
using Windows.Devices.Gpio;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;

namespace FirstLED
{
    public sealed partial class MainPage : Page
    {
        private const int PIN_NUM = 5;
        private GpioPin pin;
        private GpioPinValue pinValue;
        private DispatcherTimer timer;
        private SolidColorBrush redBrush = new SolidColorBrush(Windows.UI.Colors.Red);
        private SolidColorBrush grayBrush = new SolidColorBrush(Windows.UI.Colors.LightGray);

        public MainPage()
        {
            this.InitializeComponent();

            InitTimer();
            InitGPIO();

            if (null != pin)
            {
                timer.Start();
            }
        }

        private void InitTimer(int interval = 5000)
        {
            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(interval);
            timer.Tick += Timer_Tick;
        }

        private void InitGPIO()
        {
            var gpio = GpioController.GetDefault();

            if (null == gpio)
            {
                GpioStatus.Text = "There is no GPIO controller on this device.";
                return;
            }

            pin = gpio.OpenPin(PIN_NUM);
            pinValue = GpioPinValue.High;
            pin.Write(pinValue);
            pin.SetDriveMode(GpioPinDriveMode.Output);

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

        private void Timer_Tick(object sender, object e)
        {
            if (GpioPinValue.High == pinValue)
            {
                pinValue = GpioPinValue.Low;
                pin.Write(pinValue);
                LED.Fill = redBrush;
            }
            else
            {
                pinValue = GpioPinValue.High;
                pin.Write(pinValue);
                LED.Fill = grayBrush;
            }
        }
    }
}

먼저 InitTimer() 함수를 호출해서 타이머가 기본 설정 5초로 동작하도록 설정합니다.

그리고 InitGPIO() 함수를 통해 연결한 GPIO 핀인 5번을 초기화합니다.

당연히 일반 PC에는 GPIO 컨트롤러가 없기 때문에 앱이 실행되더라도 동작은 하지 않습니다.

타이머가 돌아가기 시작하면 5초마다 불이 켜지고 꺼지는 것이 반복됩니다.

Visual Studio 2017 상단의 메뉴를 통해 ARM 기반의 라즈베리파이에 배포해봅니다.

Remote Machine을 누르면 다음과 같이 라즈베리파이3를 직접 선택할 수 있습니다.

선택하고 실행하면 배포를 위한 약간의 시간이 소요되고 LED가 5초씩 켜졌다 꺼지면 성공입니다.

코드의 양이 많지 않기 때문에 쉽게 파악이 가능합니다.

참고로 GpioPinValue.Low는 LED를 켜고, GpioPinValue.High는 LED는 끕니다.

이것으로 간단히 GPIO를 통한 LED 제어가 가능해졌습니다.

반응형