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

来源:http://www.cnblogs.com/zhanggaoxing/archive/2017/10/06/7633176.html
-Advertisement-
Play Games

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1》set集合:是一個無序且不重覆的元素集合;訪問速度快,解決了重覆的問題; s2 = set(["che","liu","haha"]) add():添加元素; difference():將前一個集合與後者的不同建立為一個新的集合;沒有改變當前集合,生成了新的集合; difference_upda ...
  • 一、源代碼管理 絕大多數開源軟體都是直接以源代碼形式發佈的,一般會被打包為 tar.gz 的歸檔壓縮文件。程式源代碼需要編譯為二進位可執行文件後才能夠運行使用。源代碼的基本編譯流程為: 源代碼形式的軟體使用起來較為麻煩,但是相容性和可控性較好。並且開源軟體一般會大量使用其他開源軟體的功能,所以開源軟 ...
  • 本文目錄:1. 背景2. 連接的具體過程分析 2.1 socket()函數 2.2 bind()函數 2.3 listen()函數和connect()函數 2.3.1 深入分析listen() 2.3.2 syn flood的影響 2.4 accept()函數 2.5 send()和recv()函數 ...
  • 操作系統筆記 1、批處理、分時、實時是操作系統的三種基本類型 2、分散式系統是由若幹個電腦經互連網路連接而成的,這些電腦既可以獨立工作,又能協同工作。可實現系統內的資源管理,任務動態分配,並能並行地運行分散式程式。分散式系統是網路操作系統的更高級的形式並保持了網路操作系統的全部功能。 3、核心態 ...
  • 一、系統啟動流程 一般來說,Linux 系統的啟動流程是這樣的: 1. 開機之後,位於電腦主板 ROM 晶元上的 BIOS 被最先讀取,在進行硬體和記憶體的校驗以及 CPU 的自檢沒有異常後, BIOS 將被載入到記憶體中。 2. BIOS 按照其存儲的啟動順序,依次嘗試載入含有 MBR 信息的可啟動 ...
  • 目前本人接觸過兩種模板導出的方式:(1)C#利用NPOI介面製作Excel模板,在服務端用數據渲染模板(2)在前端利用前人搭建好的框架,利用office編寫xml製作模板,在客戶端進行數據的渲染,導出的格式是word。在製作報表時兩種方式都可以滿足的基本需求,但excel模板更加強大,因為xml模板 ...
  • 首先我們知道了HTML和css用途,那麼今天就來看看HTML的一部分功能和用途。 簡單的說HTML就是靈活使用標簽,標簽就相當於一個網頁的骨架,有了這個骨架才能使網頁更能區域色彩化。 首先來說HTML術語 1.HTML文檔由許多個元素組成,所有的內容都是靠元素組織到頁面中。 2.元素的組成部分,簡單 ...
  • 寫在前面整個項目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp這一節內容可能會用到的庫文件有 Measurement 和 TestCase,同樣在 Github 上可以找到。善用 Ctrl + F... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...