프로그래밍/IoT

[IoT] Windows IoT Core 라즈베리파이 3 - PWM

흔한티벳여우 2022. 4. 18. 22:06
반응형

2022.04.07 - [프로그래밍/IoT] - [IoT] Windows IoT Core 라즈베리파이 3 개발환경 구축 - 1

 

[IoT] Windows IoT Core 라즈베리파이 3 개발환경 구축 - 1

 이번 포스트는 라즈베리파이3와 Windows IoT Core를 이용하여 IoT Device를 개발하기 위한 개발 환경 구축 해보자! 준비물 Raspberry Pi 2 or 3 (반드시 Model B 까지 버전만 사용해야한다. Model B+ 부터는 지..

nonstop-antoine.tistory.com

2022.04.12 - [프로그래밍/IoT] - [IoT] Windows IoT Core 라즈베리파이 3 개발환경 구축 - 2

 

[IoT] Windows IoT Core 라즈베리파이 3 개발환경 구축 - 2

2022.04.07 - [프로그래밍/IoT] - [IoT] Windows IoT Core 라즈베리파이 3 개발환경 구축 - 1 [IoT] Windows IoT Core 라즈베리파이 3 개발환경 구축 - 1  이번 포스트는 라즈베리파이3와 Windows IoT Core를 이..

nonstop-antoine.tistory.com

 

 지난 포스트에서는 Visual Studio & 라즈베리파이3 & Windows IoT Core를 이용한 개발 환경을 셋팅을 해보았습니다.

이번에 해볼 일은 PWM 제어를 해보려고 합니다.

 

먼저 PWM을 사용하기 위해 Microsoft.IoT.Lightning 패키지를 사용하려합니다. 이것을 사용하기 위해서는 몇 가지 준비가 필요합니다. 

 

먼저 Windows SDK가 10.0.10586이상 되어야합니다.

1. Windows SDK를 설치

 

https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/

 

Windows SDK - Windows app development

What's new The Windows SDK for Windows 11 lets you update your apps for the latest version of the Windows OS. Learn more about the new features in Windows 11. To see the new APIs introduced with Windows 11, see New APIs in Windows 11 build 22000. Rebuilt t

developer.microsoft.com

 

2. NuGet에서 패키지 설치

3. 오른쪽 버튼 -> 코드보기 선택

아래의 코드 추가

 <Capabilities>
    <iot:Capability Name="lowLevelDevices" />
    <DeviceCapability Name="109b86ad-f53d-4b76-aa5f-821e2ddf2141"/>
  </Capabilities>

4. IoT Dashboard -> 내장치 -> 장치포탈에서 열기

비밀번호를 요구한다면 아이디는 administrator 이며, 암호는 개발환경 구축 1 포스트에서 설정한 암호가 될것입니다.

그리고 아래와 같이 드라이버 셋팅

 

이제 준비 완료.

 

코딩을 하기전에 라즈베리에 PWM 전용 핀이 어떤 것인지 확인해봅시다.

http://raspberrypi.stackexchange.com/questions/40812/raspberry-pi-2-b-gpio-pwm-and-interrupt-pins

 

Raspberry Pi 2 B GPIO pwm and interrupt pins

Good day! I would like to use pwm and interrupt on raspberry GPIO pins but i don't know which GPIO pins are actually dedicated for pwm output and which is for hardware interrupts, is there a way fo...

raspberrypi.stackexchange.com

 

여러 핀중 18번으로 해봅시다.

이제 코드를 작성해봅시다.

 

간단한 설명으로 다음과 같습니다.

1. 시작 버튼과 동작 버튼을 배치한다.

2. SetActiveDutyCyclePercentage(값) 값을 0~1로 변경해가며 PWM을 제어한다.

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

using Windows.Devices.Pwm;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.UI.Core;
using Microsoft.IoT.Lightning.Providers;

namespace PWM
{
    /// <summary>
    /// 자체적으로 사용하거나 프레임 내에서 탐색할 수 있는 빈 페이지입니다.
    /// </summary>
    public sealed partial class MainPage : Page
    {

        #region PWM
        private PwmPin _pwmPin;
        private double percent = 0;
        #endregion
        
        public MainPage()
        {
            this.InitializeComponent();

            btnPowerUp.Click += BtnPowerUp_Click;
            btnPowerDown.Click += BtnPowerDown_Click;

            btnStart.Click += BtnStart_Click;
        }
        
        private async void BtnStart_Click(object sender, RoutedEventArgs e)
        {
            if (LightningProvider.IsLightningEnabled)
            {
                // PWM Pins http://raspberrypi.stackexchange.com/questions/40812/raspberry-pi-2-b-gpio-pwm-and-interrupt-pins
                var pwmControllers = await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider());
                var pwmController = pwmControllers[1]; // use the on-device controller
                pwmController.SetDesiredFrequency(50); // try to match 50Hz
                _pwmPin = pwmController.OpenPin(18);
                _pwmPin.SetActiveDutyCyclePercentage(.0);
                _pwmPin.Start();
            }

            _pwmPin.SetActiveDutyCyclePercentage(percent);
        }
        
        private void BtnPowerUp_Click(object sender, RoutedEventArgs e)
        {
			percent += 0.1;
            _pwmPin.SetActiveDutyCyclePercentage(percent);
        }
        private void BtnPowerDown_Click(object sender, RoutedEventArgs e)
        {
			percent -= 0.1;
            _pwmPin.SetActiveDutyCyclePercentage(percent);
        }
	}
}

 

끝!!

반응형