文章出處

  感覺又幫 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);
    }
}

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()