摘要

这片文章主要是记录自己的整活过程,涉及到的技术包括.NET IoT, .NET Web, .NET MAUI,框架采用的也是最新的.NET 7。

本人是用的树莓派Zero 2 W(ubuntu-22.04)进行开发测试,但是.NET IoT库也有社区张高兴提交的香橙派GPIO引脚的映射,香橙派型号对应的驱动。主要预算不够的.NET开发老哥可以尝试用香橙派改改代码跑跑看,回头我再实机测试。

项目开源地址-Verdure.Kame.DotNet

.NET IoT操作SPI编写屏幕驱动

有图有真相

关于什么是SPI大家可以先看完张高兴的一篇文章温习下:

张高兴的 .NET IoT 入门指南:(四)使用 SPI 进行通信

在知道什么是SPI之后,大概应该知道我们要做什么了,我们买的屏幕通讯协议有很多种,我呢恰好选择了这个SPI协议的屏幕,厂家的文档中心,会有详细介绍。

SPI初始化=>传输图片数据=>屏幕正常显示

屏幕使用文档

上图表示我们需要如何传输图片数据,才能正常使用,下面我引用文档的介绍。

本款LCD使用的内置控制器为ST7789V3,是一款240 x RGB x 320像素的LCD控制器,而本LCD本身的像素为172(H)RGB x 320(V),同时由于初始化控制可以初始化为横屏和竖屏两种,因此LCD的内部RAM并未完全使用。

该LCD支持12位,16位以及18位每像素的输入颜色格式,即RGB444,RGB565,RGB666三种颜色格式,本例程使用RGB565的颜色格式,这也是常用的RGB格式

LCD使用四线SPI通信接口,这样可以大大的节省GPIO口,同时通信是速度也会比较快

我买的屏幕分辨率是172 * 320的,支持16位色,一张图片传输的总数据为172 * 320 * 2字节。

大家可以参考文档里的python代码和我的实现进行学习屏幕驱动的简单编写,由于我不是专业的嵌入式我就不展开了。

屏幕芯片驱动程序的构造函数

        public ST7789V3(int dataCommandPin,
SpiDevice sensor,
int resetPin = -1,
PwmChannel? pwmBacklight = null,
PinNumberingScheme pinNumberingScheme = PinNumberingScheme.Logical,
GpioController? gpioController = null,
bool shouldDispose = true)
{
if (dataCommandPin < 0)
{
throw new ArgumentOutOfRangeException();
}
_dataCommandPin = dataCommandPin;
_pwmBacklight = pwmBacklight;
_pwmBacklight?.Start(); _sensor = sensor ?? throw new ArgumentNullException(nameof(sensor)); _gpio = gpioController ?? new GpioController(pinNumberingScheme);
_resetPin = resetPin;
_shouldDispose = shouldDispose || gpioController is null;
Initialize();
}

数据传输的代码如下:

      public void SpiWrite(bool isData, ReadOnlySpan<byte> writeData)
{
Console.WriteLine($"writeData length:{writeData.Length}"); _gpio.Write(_dataCommandPin, isData ? PinValue.High : PinValue.Low); if (writeData.Length > 4096)
{
for (int i = 0; i < 26; i++)
{
var query = writeData[(i * 4096)..((i * 4096) + 4096)];
_sensor.Write(query);
} var dataLcdList1 = writeData[(26 * 4096)..110080]; _sensor.Write(dataLcdList1);
}
else
{
_sensor.Write(writeData);
}
}

SPI对数据一次传输的长度有限制,也就是4096字节,所以大家要注意手动分段传输。

1.47寸显示屏c#驱动

目前驱动部分测试是OK的,但是由于图片数据转换到RGB565的时候会有问题,导致有些彩色不太正常,不过黑白ok,就暂时这样使用了。

.NET IoT操作I2C控制16路舵机驱动器

这个舵机驱动部分,社区已经有贡献了,所以我直接通过.NET IoT进行一次封装就可以控制16路舵机驱动器了,有兴趣的可以看下源码和我COPY官方的测试程序。

Pca9685 16路舵机驱动板测试程序

Pca9685 - I2C PWM Driver

服务端搭建

先来张架构图:

树莓派主要是用来跑用.NET编写的web服务,然后调用上面提到的驱动驱动屏幕和舵机驱动板,进行相关硬件的操作。

协议文件主要定义了播放图片到屏幕,播放视频到屏幕,四足机器人的舵机控制。

服务端很简单,只做简单的数据转发,不处理数据,数据处理放在客户端也就是MAUI程序里进行。

客户端搭建

客户端采用MAUI框架,用到了MAUI对应的windows的特有的库,比如opencvsharp,MAUI客户端的功能目前比较单一,还是等我测试完毕,再加新功能吧。

总结

对于使用.NET进行全场景的开发进行了实践,发现其实还是大有可为的,能够很快的实现一些功能,而不用再花很多的时间学习其他的技术栈。但是MAUI由于平台的不同,有些功能还是需要针对特定的平台进行单独处理,这个就增加了开发的复杂性。

来张四足机器人的全图吧,代码是实现完了,可惜因为疫情,有些零件快递收不到,先来张实体图吧,到时候会把屏幕也放上去,有比较感兴趣的话可以关注我B站账号,到时候放视频上去。

绿荫阿广

推荐项目

.NET IoT Libraries

nanoFramework IoT.Device Library repository

RaspberryPi-Minikame

Verdure.Kame.DotNet

树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)的更多相关文章

  1. 2022年写的香橙派 OrangePi Zero 用python获取dht11温度和湿度

    感谢网上资料和个人的不放弃,终于方便的解决了香橙派 OrangePi Zero用python获取dht11温湿度的问题. 网上关于香橙派的资料比起树莓派真是少之又少,现在香橙派zero能干的活暂时也只 ...

  2. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  3. 【完整篇】orangepi香橙派新手入门之被官方坑

    图片特意缩小,看不清请打开另一个窗口查看原图. 第一步:烧录系统,我烧录的是Ubuntu_Desktop[请注意!!!!用户名是错的!!用户名是错的!!用户名是错的!!] 正确的用户名是orangep ...

  4. linux驱动基础系列--Linux下Spi接口Wifi驱动分析

    前言 本文纯粹的纸上谈兵,我并未在实际开发过程中遇到需要编写或调试这类驱动的时候,本文仅仅是根据源码分析后的记录!基于内核版本:2.6.35.6 .主要是想对spi接口的wifi驱动框架有一个整体的把 ...

  5. SPI设备的驱动

    主要包括两个SPI设备步骤:register_chrdevspi_register_driver关键点1:spi_board_info可以去已经运行的板子下面找例子:/sys/bus/spi/driv ...

  6. 树莓派开发笔记(十三):入手研华ADVANTECH工控树莓派UNO-220套件(二):安装rtc等驱动

    前言   前面运行了系统,本篇是安装对应套装的驱动,使rtc等外设生效,树莓派本身是不带rtc外设的.   UNO-220-P4N1AE 驱动下载     官方下载:https://www.advan ...

  7. 合宙AIR105(四): SPI, MAX7219 8x8LED驱动

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 合宙 ...

  8. spi子系统之驱动SSD1306 OLED

    spi子系统之驱动SSD1306 OLED 接触Linux之前,曾以为读源码可以更快的学习软件,于是前几个博客都是一边读源码一边添加注释,甚至精读到每一行代码,实际上效果并不理想,看过之后就忘记了.主 ...

  9. I 2 C、 SPI、 USB驱动架构

    根据图12.4, Linux倾向于将主机端的驱动与外设端的驱动分离, 而通过一个核心层将某种总线的协议进行抽象, 外设端的驱动调用核心层API间接过渡到对主机驱动传输函数的调用. 对于I 2 C. S ...

  10. 关于树莓派 BOOBS 安装之后的初级操作

    以安装OpenCV 3.1.0为例 上一篇我们利用Raspberry 官方提供的工具 BOOBS安装了Raspbian 操作系统,下面让我们看一下如何简单的配置raspbian操作系统. 从树莓派官方 ...

随机推荐

  1. OpenHarmony3.0如何轻松连接华为云IoT设备接入平台?

    摘要:本文主要介绍基于OpenHarmony 3.0版本来对接华为云IoT设备接入IoTDA,以小熊派BearPi-HM_Nano开发板为例,使用huaweicloud_iot_link SDK对接华 ...

  2. 统一建模语言UML---类图

    什么是统一建模语言,来看看百科中的介绍统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明.可视化和编制文档的一种标准语言,是非专利的第三代建模 ...

  3. Linux配置系统yum源

    首先是需要你把需要使用的镜像挂载到系统上面,可以通过cd /dvd添加也可以直接上传到系统上 本文档是上传到系统上进行挂载 操作系统:Red Hat 7.6 挂载镜像:Red Hat 7.6 1.挂载 ...

  4. 0.web理解

    web前后端 网站的前端:通过用户肉眼看到的网站的布局内容,对网站的操作的功能,可以让用户可以直接接触与操作的部分. 用户通过访问前端的功能,前端分为 静态功能+动态功能 静态功能:静态功能则不会和后 ...

  5. kindeditor获取html内容之终极大法

    请允许我哔哔两句,真是难受啊,有问题去百度,结果百了一堆乱七八糟的内容,有头没尾,有尾没头的,搞得我晕头转向,现在把kindeditor获取HTML的终极打法无偿分享出来,这可是我配置查找了一下午的成 ...

  6. int和String的相互转化

    int和String的相互转化 将int转化为String 通过valueof( )方法进行转化 int a=100;String num1=String.valueOf(a);        Sys ...

  7. 使用 Dockerfile 的一些最佳实践

  8. k8s ingress-nginx 使用 snippet 添加自定义配置 (比如:新增请求头)

    比如在有些时候我们需要在 server 里或者 location 里添加一些参数,例如添加包体大小限制.添加跨域配置.添加自定义header.处理响应header等等.遇到这些需求的时候,我们开始怀念 ...

  9. 解决zeal离线文档下载慢问题

    zeal简介 编程过程中难免会遇到不会用的关键字和方法,对我而言,在windows下,我使用Zeal这个软件进行离线文档查询. 问题 但是,在软件中下载DocSet(文档)会出现下载慢,或者下载不了的 ...

  10. Keepalived + Nginx 实现高可用 Web 负载均衡

    一.Keepalived 简要介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前 ...