天天看點

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

  感覺又幫 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 10 IoT 開發筆記:使用 Lightning 中的軟體 PWM 驅動 RGB LED

  一、 更改預設控制器驅動

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

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

  二、更改 Package.appxmanifest 配置

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

張高興的 Windows 10 IoT 開發筆記:使用 Lightning 中的軟體 PWM 驅動 RGB LED
  在 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 10 IoT 開發筆記:使用 Lightning 中的軟體 PWM 驅動 RGB LED

  還有 Windows IoT Extensions for the UWP

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

  四、使用 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);
    }
}      

繼續閱讀