使用.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.mzph.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. …