感覺又幫 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 效果圖:![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUGZkR2YjJTMkdjMygjM2YGZ3UGMxYTZ5kTZ5AzMlVmMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
一、 更改預設控制器驅動
打開樹莓派的 Windows Device Portal ,在 Devices 菜單中的 Default Controller Driver 選項,将預設的 Inbox Driver 更改為 Direct Memory Mapped Driver ,重新開機。
二、更改 Package.appxmanifest 配置
建立一個 UWP 項目,本文這裡叫“RgbLedDemo”。以“檢視代碼”的形式打開 Package.appxmanifest 。
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);
}
}