使用.Net驅動Jetson Nano的OLED顯示屏

背景

最近幾年,邊緣計算的需求急劇爆發。人工智能、物聯網和 5G 的演進給邊緣計算帶來了無限的可能性。因為工作原因,有幸在2019開始接觸了英偉達 Jetson 家族的各種邊緣計算設備:Nano,TX2,AGX,NX等,其操作系統使用的是 Ubuntu 18.02。我們可以作為獨立的小型服務器使用,試問又有哪一個程序猿會拒絕擁有一臺自己的小電腦呢?在其上,特別是擁有GPU的服務器上,我們可以折騰無限的可能。

de8fa9c040d1c10ce02200ca92a50e90.png

Jetson

在Jetson設備的開發版載板上,一般都有一個40針引腳的SPIO與GPIO,通過它我們可以擴展出更多好玩的東西。比如說:一塊I2C的OLED顯示屏,然后通過.Net來驅動它顯示一些好玩的東西(軟件狀態,設備狀態,其他關鍵數據指標等)。

屏幕安裝

屏幕這里選用的是一塊0.96寸黃藍雙色OLED液晶屏模塊,一共4個接口:3.3V正極VCC,負極GNG,以及負責I2C通訊的SDA和SCL。

那么如何將顯示器與Jetson設備相連呢?這里演示基于早期的Nano開發者套件的載板,其它系列官方載板的引腳基本類似,你也可以查找硬件說明書或參考官網的指引[1]來找到I2C接口即可。

7e12cce82e0eda5575c25670f633d8d9.png

Jetson Nano 40-pin

我使用的是I2C1,接的針腳是 1,3,5,6 ,按照定義安裝好OLED 顯示屏。

配置 I2C 總線

安裝好屏幕后,必須要配置I2C,我們自己登錄的賬戶才能在非Root權限下訪問I2C總線。

將下面命令的 username 改為你登錄的賬戶名

sudo usermod -aG i2c username

最好重啟一下設備,如果執行下面命令可以正常顯示,那就也沒啥問題。

i2cdetect -y -r 1

在下圖中,OLED 顯示屏的地址 3c 被特別突出顯示。

62310ec4106b01efb630ea20e8c60b23.png

I2C

用.NET驅動顯示

驅動這個oled屏幕我們需要用到微軟的IoT相關的庫 "System.Device.Gpio" ,通過這個庫我們可以實現和外接設備的I2C通訊,當然驅動OLED顯示器需要用到熟悉其驅動芯片的各種指令,這里的驅動芯片是SSD1306,擁有最大128*64像素支持,廣泛應用在小尺寸OLED顯示屏的驅動中。

在這里我們不介紹相關的驅動和指令相關原理性的東西,我已經將相關指令封裝為一個庫,可以直接使用,庫已開源,感興趣的同學可自行查閱相關知識和源碼。

下面我們通過在Jetson Nano上的使用演示如何使用 “Sang.IoT.SSD1306” 庫來控制OLED顯示畫面。

安裝.Net開發環境

因為 Jetson 是 arm64 的設備,我們直接前往.Net官網選擇下載.Net6[2]的 Arm64 版本。

執行安裝

mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-6.0.301-linux-arm64.tar.gz -C $HOME/dotnet

然后更改用戶目錄下``文件,在末尾加入以下環境配置:

export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

運行dotnet命令檢查安裝情況。

使用演示

創建控制臺程序

dotnet new console -o i2c_oled

添加驅動庫

dotnet add package Sang.IoT.SSD1306

修改代碼

using Sang.IoT.SSD1306;using (var oled = new SSD1306_128_64(1)) {oled.Begin();// 需要發往顯示器的顯示內容byte[] c = new byte[128*64]{...};oled.SetBuffer(c);oled.Display();
}

要想將數組數據顯示到屏幕,就需要將數據存入SSD1306的RAM。這里的RAM大小為128x64位,分為8頁,從0頁到7頁,用于單色128x64點矩陣顯示。

以上代碼可能平時也用不到,主要是自定義的內容顯示接口。

圖片顯示

這里類庫用到了微軟的 SkiaSharp 跨平臺的圖片處理庫,關于跨平臺的圖片處理庫,如果你也有相關需求,可以看這一篇文章來對比了解[3]?。

這里演示用的圖片為下圖,我們將其在 OLED 顯示屏上展示。

6f9c40d430a1e39a693d9c34570342f4.png
test img
using Sang.IoT.SSD1306;using (var oled = new SSD1306_128_64(1)) {oled.Begin();oled.Image("assets/test.png");oled.Display();
}

效果如下:

88effab62ab1f8864fa0c1484636dbe8.png

圖片效果

顯示文字

那么,如何顯示文字呢?當然,一樣的思路,我們首先通過 SkiaSharp 創建位圖,然后顯示出來就可以了,所以加載字體文件顯示中文字體也不是難事。

using Sang.IoT.SSD1306;
using SkiaSharp;using (var oled = new SSD1306_128_64(1)) {oled.Begin();oled.Clear();using(var bitmap = new SKBitmap(128, 64, true)){SKCanvas canvas = new SKCanvas(bitmap);SKPaint paint = new SKPaint() { Color = new SKColor(255, 255, 255),StrokeWidth = 1, //畫筆寬度Typeface = SKTypeface.FromFile("/home/sangsq/i2c_led/SourceHanSansCN-Normal.ttf"),TextSize = 13,  //字體大小Style = SKPaintStyle.Fill,};canvas.DrawText("公眾號:sangxiao99 ", 0, 13, paint);paint.TextSize = 30;canvas.DrawText("桑榆肖物 ", 0, 50, paint);oled.Image(bitmap.Encode(SKEncodedImageFormat.Png, 100).ToArray());}oled.Display();
}

效果如下:

1cf98a17858ac270760855a0ffa8e6c4.png

文字效果

清除顯示

oled.Clear();

結語

如果對IoT這個領域比較感興趣或者想折騰手頭的開發板的話,可以前往官網了解更多.Net的IoT資源[4]

剛剛到了一個SPI接口的LCD彩色顯示屏,又有新玩具可以玩了。

References

[1]?參考官網的指引:?https://developer.nvidia.com/embedded/learn/getting-started-jetson
[2]?.Net6:?https://dotnet.microsoft.com/en-us/download/dotnet/6.0
[3]?看這一篇文章來對比了解:?https://devblogs.microsoft.com/dotnet/net-core-image-processing/
[4]?.Net的IoT資源:?https://dotnet.microsoft.com/zh-cn/apps/iot

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285513.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

工程測量不用愁,120個視頻動畫幫你忙,簡單易學直觀明了!

工程測量不用愁,120個視頻動畫幫你忙,簡單易學直觀明了!文末提供下載地址。

2016-2017-2學期《程序設計與數據結構》教學進程

2016-2017-2學期《程序設計與數據結構》教學進程 目錄 考核方式課前準備教學進程 第00周學習任務和要求第01周學習任務和要求第02周學習任務和要求第03周學習任務和要求第04周學習任務和要求第05周學習任務和要求第06周學習任務和要求第07周學習任務和要求第08周學習任務和要求…

[轉]Spring SpringMVC SpringBoot SpringCloud概念、關系及區別

一、正面解讀: Spring主要是基于IOC反轉Beans管理Bean類,主要依存于SSH框架(StrutsSpringHibernate)這個MVC框架,所以定位很明確,Struts主要負責表示層的顯示,Spring利…

C語言試題121之輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。 分析:利用 w…

5.4 Spring AOP

2019獨角獸企業重金招聘Python工程師標準>>> 5.4.1 從代理機制初探AOP 來看一個簡單的例子,當需要在執行某些方法時留下日志信息,可能會這樣寫: import java.util.logging.*; public class HelloSpeaker{ pirvate Logger loggerL…

WPF 實現心電圖曲線繪制

本文經原作者授權以原創方式二次分享,歡迎轉載、分享。原文作者:流浪g原文地址:https://www.cnblogs.com/cong2312/p/16411637.html一、前言項目中之前涉及到胎兒心率圖曲線的繪制,最近項目中還需要添加心電曲線和血樣曲線的繪制功…

C語言試題110之利用條件運算符的嵌套來完成此題:學習成績大于等于90分的同學用 A 表示,60到89 分之間的用 B 表示, 60 分以下的用 C 表示。

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:C語言試題110之利用條件運算符的嵌套來完成此題:學習成績大于等于90分的同學用 A 表…

【NOIp 2015】【DFS】斗地主

題面 自己網上去搜吧… 代碼 #include <cstdio> #include <cstring> #include <algorithm> #define INF 10000000 #define maxn 40 using namespace std;int t,n,temp,a,zhang[maxn],ansINF;void dfs(int,int,int,int); void shunzi(int,int,int,int,int);vo…

[轉]從入門到精通,Java學習路線導航

引言 最近也有很多人來向我"請教"&#xff0c;他們大都是一些剛入門的新手&#xff0c;還不了解這個行業&#xff0c;也不知道從何學起&#xff0c;開始的時候非常迷茫&#xff0c;實在是每天回復很多人也很麻煩&#xff0c;所以在這里統一作個回復吧。 Java學習路線…

如何讓 Dapper 支持 DateOnly 類型

前言在上次的文章中&#xff0c;我們讓 EF Core 6 支持了 DateOnly 類型。那么&#xff0c;Dapper 是否支持 DateOnly 類型呢&#xff1f;public class User {public int Id { get; set; }public string Name { get; set; }public DateOnly Birthday { get; set; } }using (var…

HP proliant服務器從usb啟動

1&#xff0c;開機出現自檢畫面開始按F9進入設置&#xff0c;進入BIOS 選擇standard boot order&#xff08;rpl&#xff09;&#xff0c;把usb driver放在第一位&#xff0c;保存好 2&#xff0c;按F1開始啟動。 &#xff08;注&#xff1a;我使用ubuntu14.04&#xff0c;到啟…

VB常用內部函數大全一覽表(建議收藏)

VB提供了大量的內部函數供用戶在編程時調用。內部函數按其功能分為數學運算函數、字符串函數、轉換函數、日期與時間函數、判斷函數和格式輸出函數等。 文章目錄 算術函數字符串函數日期和時間函數數據類型轉換函數算術函數 字符串函數 日期和時間函數

數據庫分類介紹

在當今的互聯網中&#xff0c;最常見的數據庫模型主要是兩種&#xff0c;即“關系型數據庫”和“非關系型數據庫”。 一、關系型數據庫 1、關系型數據庫的由來 雖然網狀數據庫和層次數據庫已經很好的解決了數據的集中和共享問題&#xff0c;但是在數據庫獨立性和抽象級別上扔有…

BZOJ 1717 [Usaco2006 Dec]Milk Patterns 產奶的模式(后綴數組)

【題目鏈接】http://www.lydsy.com/JudgeOnline/problem.php?id1717 【題目大意】 求一個最長的串&#xff0c;使得其在母串中出現的次數達到要求 【題解】 二分答案&#xff0c;利用后綴數組求出的height數組進行檢驗 【代碼】 #include <cstdio> #include <cstring…

記一次 .NET 某物管后臺服務 卡死分析

一&#xff1a;背景 1. 講故事這幾個月經常被朋友問&#xff0c;為什么不更新這個系列了&#xff0c;哈哈&#xff0c;確實停了好久&#xff0c;主要還是打基礎去了&#xff0c;分析 dump 的能力不在于會靈活使用 windbg&#xff0c;而是對底層知識有一個深厚的理解&#xff0c…

【C#程序設計】教學講義——第三章:C#語言基礎

完整C#教學課件系列: 【C#程序設計】教學講義——第一章:C#語言概述 【C#程序設計】教學講義——第二章:簡單C#程序設計 【C#程序設計】教學講義——第三章:C#語言基礎 文章目錄 3.1 C#程序結構3.2 變量和常量3.3 常用數據類型3.4 運算符和表達式3.1 C#程序結構 3.1.1 組成…

直接在script里面換樣式IE6,7,8不兼容

1 <!DOCTYPE HTML>2 <html>3 <head>4 <meta http-equiv"Content-Type" content"text/html; charsetutf-8">5 <title>無標題文檔</title>6 </head>7 8 <body>9 10 <input id"inp1" type&quo…

C語言試題111之 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一個數字。例如 2+22+222+2222+22222(此時 共有 5 個數相加),幾個數相加有鍵盤控制。

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目: s=a+aa+aaa+aaaa+aa…a 的值,其中 a 是一個數字。例如 2+22+222+2222+22222(此時 共…

Redis常用配置參數詳解及查看修改命令

目錄 Redis常用配置參數 Redis配置參數查看命令 語法 舉例 說明&#xff1a; Redis配置參數修改命令 語法 舉例 說明&#xff1a; Redis常用配置參數 序號配置項說明1daemonize noRedis 默認不是以守護進程的方式運行&#xff0c;可以通過該配置項修改&#xff0c;使…

反射封裝工具類-----零SQL插入

V_1.0 需求&#xff1a;開發一個工具方法&#xff0c;輔助初級程序員在不需要掌握sql命令和JDBC的情況下&#xff0c;實現對數據庫的插入操作。 V_4.0 實現0sql插入操作需要解決的問題. 1. 如何確認當前【陌生對象】關聯的【表名】 2. 如何確認當前表中需要添加數據的字段 3. …