感覺又幫 Windows 10 IoT 開荒了,所以呢,正兒八經的寫篇博客吧。其實大概半年前就想寫的,那時候想做個基於 Windows 10 IoT 的小車,但樹莓派原生不支持 PWM 啊。百度也搜不到,上 GitHub 轉了一圈,在 @ms-iot 那發現了 Lightning ,再看最後的更新時 ...
感覺又幫 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); } }