使用.Net驱动Jetson Nano的OLED显示屏

简介: 最近几年,边缘计算的需求急剧爆发。人工智能、物联网和 5G 的演进给边缘计算带来了无限的可能性。

因为工作原因,有幸在2019开始接触了英伟达 Jetson 家族的各种边缘计算设备:Nano,TX2,AGX,NX等,其操作系统使用的是 Ubuntu 18.02。我们可以作为独立的小型服务器使用,试问又有哪一个程序猿会拒绝拥有一台自己的小电脑呢?在其上,特别是拥有GPU的服务器上,我们可以折腾无限的可能。

Jetson

在Jetson设备的开发版载板上,一般都有一个40针引脚的SPIO与GPIO,通过它我们可以扩展出更多好玩的东西。比如说:一块I2C的OLED显示屏,然后通过.Net来驱动它显示一些好玩的东西(软件状态,设备状态,其他关键数据指标等)。

屏幕安装

屏幕这里选用的是一块0.96寸黄蓝双色OLED液晶屏模块,一共4个接口:3.3V正极VCC,负极GND,以及负责I2C通讯的SDA和SCL。

那么如何将显示器与Jetson设备相连呢?这里演示基于早期的Nano开发者套件的载板,其它系列官方载板的引脚基本类似,你也可以查找硬件说明书或参考官网的指引来找到I2C接口即可。

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 被特别突出显示。

I2C

用.NET驱动显示

驱动这个oled屏幕我们需要用到微软的IoT相关的库 "System.Device.Gpio" ,通过这个库我们可以实现和外接设备的I2C通讯,当然驱动OLED显示器需要用到熟悉其驱动芯片的各种指令,这里的驱动芯片是SSD1306,拥有最大128*64像素支持,广泛应用在小尺寸OLED显示屏的驱动中。

在这里我们不介绍相关的驱动和指令相关原理性的东西,我已经将相关指令封装为一个库,可以直接使用,库已开源,感兴趣的同学可自行查阅相关知识和源码。

下面我们通过在Jetson Nano上的使用演示如何使用 “Sang.IoT.SSD1306” 库来控制OLED显示画面。

安装.Net开发环境

因为 Jetson 是 arm64 的设备,我们直接前往.Net官网选择下载.Net6的 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 跨平台的图片处理库,关于跨平台的图片处理库,如果你也有相关需求,可以看这一篇文章来对比了解

这里演示用的图片为下图,我们将其在 OLED 显示屏上展示。

test img

using Sang.IoT.SSD1306;

using (var oled = new SSD1306_128_64(1)) {
    oled.Begin();
    oled.Image("assets/test.png");
    oled.Display();
}

效果如下:

图片效果

显示文字

那么,如何显示文字呢?当然,一样的思路,我们首先通过 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();
}

效果如下:

文字效果

清除显示

oled.Clear();

结语

如果对IoT这个领域比较感兴趣或者想折腾手头的开发板的话,可以前往官网了解更多.Net的IoT资源

刚刚到了一个SPI接口的LCD彩色显示屏,又有新玩具可以玩了。

相关文章
|
3月前
|
架构师 开发者
【悬念揭秘】DDD:那片隐藏在软件深处的业务乐土——.NET项目如何借力领域驱动设计,让复杂业务逻辑迎刃而解?
【8月更文挑战第28天】领域驱动设计(DDD)在.NET项目中的应用聚焦于将业务领域知识与软件开发紧密结合,通过构建清晰的领域模型管理复杂业务逻辑。DDD的核心概念包括限界上下文、聚合、实体等,确保模型与实现的统一。在.NET中,通过CQRS和事件源等模式提高系统响应性和可扩展性,实现业务事件驱动的解耦与协作。DDD不仅是一种设计方法,更是要求开发者深入理解业务的文化,助力.NET项目应对复杂挑战,实现业务与技术的融合。
64 6
|
6月前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
90 0
|
6月前
|
安全 Linux 开发者
【专栏】.NET 技术:驱动开发变革的力量
【4月更文挑战第29天】本文介绍了.NET技术的起源、核心特性和应用场景。始于2002年的.NET,旨在解决开发效率和兼容性问题,历经.NET Core和.NET 5的进化,实现了跨平台支持。其核心特性包括跨平台、面向对象、安全可靠及高效性能。广泛应用在企业级应用、互联网应用、游戏开发及科学计算等领域,持续推动软件开发创新与变革。
41 0
|
缓存 NoSQL 大数据
4款.NET开源的Redis客户端驱动库
4款.NET开源的Redis客户端驱动库
138 0
|
传感器 机器人 物联网
使用.NET IoT驱动超声波测距传感器
最近买的一堆传感器到货了,先来把玩一下超声波测距传感器。超声波传感器一般用于机器人,小车的避障,物体的测距,液位检测,停车检测等领域。
124 3
使用.NET IoT驱动超声波测距传感器
【.Net Micro Framework PortingKit - 08】GPIO驱动
要点亮LED灯或获得输入IO的状态应该是比较容易的,打开端口时钟,然后读写相关的GPIO寄存器就可以了,但是要实现一个输入中断,就要费些周折了
493 0
【.Net Micro Framework PortingKit – 09】串口驱动
虽然在PC机中,串口渐行渐远,但是在嵌入式领域,串口仍可以说是如日中天,因为它造价低廉、并且编程也比较方便,在没有显示屏或输入设备的系统上,串口更是不可或缺,和超级终端一道,共同解决了信息显示和输入问题。
559 0
|
内存技术 移动开发
【.Net Micro Framework PortingKit–11】NandFlash驱动开发
对.Net Micro Framework系统来说,正常情况下Flash(包括NandFlash和NORFlash)分为六个区
648 0
【.Net Micro Framework PortingKit – 12】SysTick驱动开发
SysTick驱动有三个功用,一是我们上面所说的多任务和多线程支持;二是获得系统当前Tick,以此实现延时等待
637 0
【.Net Micro Framework PortingKit – 13】LCD驱动开发
LCD的驱动开发还是比较繁琐一些的,因为LCD的驱动代码分散在三个目录中(题外话,我觉得针对.Net Micro Framework来说,最难的驱动是网卡驱动(特别是wifi驱动)、其次是USB驱动,和它们相比,LCD驱动就是小菜了)
762 0