张高兴的 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 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()))[];
controller.SetDesiredFrequency(1000);
3. 设置 PWM 引脚
以 Red 引脚为例。首先通过控制器来打开引脚,这里为 GPIO 17 位置的引脚。然后需要设置 Duty Cycle Percentage ,通俗点就是电压的占比,0 - 1 之间的小数。
PwmPin redPin = controller.OpenPin();
redPin.SetActiveDutyCyclePercentage();
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 = ;
double green = ;
double blue = ; while (red != && green != )
{
redPin.SetActiveDutyCyclePercentage(red / 255.0);
greenPin.SetActiveDutyCyclePercentage(green / 255.0); red--;
green++;
await Task.Delay(delay);
} while (green != && blue != )
{
greenPin.SetActiveDutyCyclePercentage(green / 255.0);
bluePin.SetActiveDutyCyclePercentage(blue / 255.0); green--;
blue++;
await Task.Delay(delay);
} while (blue != && red != )
{
bluePin.SetActiveDutyCyclePercentage(blue / 255.0);
redPin.SetActiveDutyCyclePercentage(red / 255.0); blue--;
red++;
await Task.Delay(delay);
}
}
张高兴的 Windows 10 IoT 开发笔记:使用 Lightning 中的软件 PWM 驱动 RGB LED的更多相关文章
- 张高兴的 Windows 10 IoT 开发笔记:使用 ADS1115 读取模拟信号
考虑到 Raspberry Pi 读取模拟信号是很烦人的事情,更何况是在没人玩的 Windows 10 IoT 下,所以准备正儿八经的写点东西. 需求:使用 Raspberry Pi 读取输出模拟信号 ...
- 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块
HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...
- 张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器
BH1750FVI 是一款 IIC 接口的数字型光强度传感器集成电路.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 ...
- 张高兴的 Windows 10 IoT 开发笔记:部署 ASP.NET Core 2 应用
今天是大年初二,都去走亲戚了吧,享受一下这难得的能和亲友相聚的时光.而我就不一样了,今天一回到家就又开始瞎折腾了,哈哈哈. 问题背景 最近花了点时间用 ASP.NET Core 2 写了个个人博客,中 ...
- 张高兴的 Windows 10 IoT 开发笔记:串口红外编解码模块 YS-IRTM
This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub: https://github.c ...
- 张高兴的 Windows 10 IoT 开发笔记:无线收发芯片 nRF24L01
This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...
- 张高兴的 Windows 10 IoT 开发笔记:FM 电台模块 KT0803L
This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...
- 张高兴的 Windows 10 IoT 开发笔记:0.96 寸 I2C OLED
This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...
- 张高兴的 Windows 10 IoT 开发笔记:使用 MAX7219 驱动数码管
This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...
随机推荐
- 为Ext添加下拉框和日期组件
Ext.onReady(function(){ var config = { fields:['module'], data:[['新建'],['删除'],['增加']}; var store = n ...
- jmeter日记
1.不要像loadrunner一样使用集合点,jmeter不需要 2.性能测试 线程组设置的时候 永远 3.启动jmeter之后,打开log 4.分布式的话 tps是多台电脑的tps之和 自动加好了的 ...
- HAproxy+varnish动静分离部署wordpress
author:JevonWei 版权声明:原创作品 实验背景:将wordpress应用部署在后端服务器上,使用HAProxy做代理服务器,Varnish做缓存服务器,后端有四台web服务器,web1和 ...
- JVM中锁优化,偏向锁、自旋锁、锁消除、锁膨胀
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt364 本文将简单介绍HotSpot虚拟机中用到的锁优化技术. 自旋锁 互斥同 ...
- springboot 入门二- 读取配置信息一
在上篇入门中简单介绍下springboot启动使用了大量的默认配置,在实际开发过程中,经常需要启动多个服务,那端口如何手动修改呢? 此篇就是简单介绍相关的配置文件信息. Spring Boot允许外部 ...
- 线性表之何时使用ArrayList、LinkedList?
前言 线性表不仅可以存储重复的元素,而且可以指定元素存储的位置并根据下表访问元素. List接口的两个具体实现:数组线性表类ArrayList.链表类LinkedList. ArrayList Arr ...
- poj 1014多重背包
题意:给出价值为1,2,3,4,5,6的6种物品数量,问是否能将物品分成两份,使两份的总价值相等. 思路:求出总价值除二,做多重背包,需要二进制优化. 代码: #include<iostream ...
- mysql时间戳的获取
时间戳函数:current_timestamp() 在此位置添加时间戳函数. 然后整体的写法就是下图这样: 根据当前时间戳更新有没有打钩将决定你的时间是什么时间(一个是数据完成写入的时间,一个时间戳回 ...
- GUI(JMenuBar+JMenu+JMenuItem)
public class WindowMenu extends JFrame { JMenuBar menubar; JMenu menu,subMenu; JMenuItem item1,item2 ...
- 201521123067 《Java程序设计》第7周学习总结
201521123067 <Java程序设计>第7周学习总结 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 Q1.ArrayList代码分析 ...