張高興的 Windows 10 IoT 開發筆記:使用 Lightning 中的軟體 PWM 驅動 RGB LED

來源:互聯網
上載者:User

標籤:rect   之間   lan   dir   建立   系統   amp   default   bre   

  感覺又幫 Windows 10 IoT 開荒了,所以呢,正兒八經的寫篇部落格吧。其實大概半年前就想寫的,那時候想做個基於 Windows 10 IoT 的小車,但樹莓派原生不支援 PWM 啊。百度也搜不到,上 GitHub 轉了一圈,在 @ms-iot 那發現了 Lightning ,再看最後的更新時間,還是2016中旬……Windows 10 IoT 在國內真慘,這麼長時間都沒人寫個教程……不說廢話了……

  本文樣本地址:https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/RgbLed

  Lightning 項目地址:https://github.com/ms-iot/lightning

  :

 

  一、 更改預設控制器驅動

  開啟樹莓派的 Windows Device Portal ,在 Devices 菜單中的 Default Controller Driver 選項,將預設的 Inbox Driver 更改為 Direct Memory Mapped Driver ,重啟。

 

 

  二、更改 Package.appxmanifest 配置

  建立一個 UWP 項目,本文這裡叫“RgbLedDemo”。以“查看代碼”的形式開啟 Package.appxmanifest 。

  在 Package 標籤下添加一個命名空間,並更改 IgnorableNamespaces 屬性。

xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"IgnorableNamespaces="uap mp iot"

  在 Capabilities 添加如下內容

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

 

  三、引用 Microsoft.Iot.Lightning

  在 NuGet 包管理器下搜尋 Lightning 即可。

  還有 Windows IoT Extensions for the UWP

 

  四、使用 Lightning

  注意引用

using Windows.Devices.Pwm;using Microsoft.IoT.Lightning.Providers;

  1. 判斷 Lightning 的啟用

  這一步是必要的,因為使用 Lightning 必須關閉系統預設的控制器驅動,沒啟用的話拋出個異常就好了。

if (!LightningProvider.IsLightningEnabled){    throw new NullReferenceException("Lightning isn‘t enabled !");}

  2. 擷取軟體 PWM 控制器

  一切正常的情況下就該擷取 Lightning 中的軟體 PWM 控制器了。Lightning 中也整合了其他硬體 PWM 的控制器,因此在調用 PwmController.GetControllersAsync() 時返回的是一個集合,其中第二項是我們需要的軟體 PWM 控制器。得到控制器後還需要設定 PWM 的頻率,這個軟體 PWM 控制器的頻率範圍在 40 - 1000 Hz 之間(低的可憐……),不在這個範圍內的數字會拋出異常。

PwmController controller = (await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider()))[1];controller.SetDesiredFrequency(1000);

  3. 設定 PWM 引腳

  以 Red 引腳為例。首先通過控制器來開啟引腳,這裡為 GPIO 17 位置的引腳。然後需要設定 Duty Cycle Percentage ,通俗點就是電壓的佔比,0 - 1 之間的小數。

PwmPin redPin = controller.OpenPin(17);redPin.SetActiveDutyCyclePercentage(0);redPin.Start(); 

  之後要改變 LED 的亮度還是要改變 SetActiveDutyCyclePercentage(value) 的 value 值。

  釋放的話要先關閉 PWM。

redPin.Stop();redPin.Dispose();

 

  五、注意

  使用 Lightning 後,之前基於預設控制器驅動編寫的I2C,SPI代碼會報錯。但 Lightning 中整合了 I2C、SPI、GPIO 等的控制器,將其替換一下即可。

 

  本文的項目解析部分就結束了。下面給一個呼吸燈的測試代碼,我用的是共陰極 RGB LED 。代碼在 GitHub 的項目中有。

/// <summary>/// Breathing LED/// </summary>/// <param name="delay">Delay Time</param>public async Task BreathingAsync(int delay){    double red = 255;    double green = 0;    double blue = 0;    while (red != 0 && green != 255)    {        redPin.SetActiveDutyCyclePercentage(red / 255.0);        greenPin.SetActiveDutyCyclePercentage(green / 255.0);        red--;        green++;        await Task.Delay(delay);    }    while (green != 0 && blue != 255)    {        greenPin.SetActiveDutyCyclePercentage(green / 255.0);        bluePin.SetActiveDutyCyclePercentage(blue / 255.0);        green--;        blue++;        await Task.Delay(delay);    }    while (blue != 0 && red != 255)    {        bluePin.SetActiveDutyCyclePercentage(blue / 255.0);        redPin.SetActiveDutyCyclePercentage(red / 255.0);        blue--;        red++;        await Task.Delay(delay);    }}

 

張高興的 Windows 10 IoT 開發筆記:使用 Lightning 中的軟體 PWM 驅動 RGB LED

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.