摘要

这片文章主要是记录自己的整活过程,涉及到的技术包括.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. 如何使用helm优雅安装prometheus-operator,并监控k8s集群微服务

    前言:随着云原生概念盛行,对于容器.服务.节点以及集群的监控变得越来越重要.Prometheus 作为 Kubernetes 监控的事实标准,有着强大的功能和良好的生态.但是它不支持分布式,不支持数据 ...

  2. .net程序集强签名

    要想得到强签名的dll有两种情况: 1.给项目添加强命名 在你的项目右键->属性->签名,勾选"为程序集签名",新建 或 浏览已经新建过的.pfx文件,然后重新buil ...

  3. Kubernetes 多租户:资源配额

    资源配额用于管理命名空间中对象使用的资源量,我们可以按 CPU 和内存用量或对象数量来设置配额.通过资源配额,可以确保租户不会使用超过其分配份额的集群资源. 资源配额是通过 ResourceQuota ...

  4. Elasticsearch 快照生命周期管理 (SLM) 实战指南

    文章转载自:https://mp.weixin.qq.com/s/PSfgPJc4dKN2pOZd0Y02wA 1.Elasticsearch 保证高可用性的方式 Elasticsearch 保证集群 ...

  5. Compose 模板文件

    模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多.但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的. 默认的模板文件名称为 docker-compo ...

  6. 监控告警之elastalert部署及配置全解

    一.安装elastalert 1.环境 CentOS:7.4 Python:3.6.9 pip:19.3 elastalert:0.2.1 elk:7.3.2 2.配置Python3.6.9环境 安装 ...

  7. MySQL之安装(linux两种版本版本安装)

    LinuxMySQL安装(Mysql5.5版本) 第一种 有安装包的安装方式 1.下载地址: http://dev.mysql.com/downloads/mysql 2.检查当前系统是否安装过mys ...

  8. 虚拟机安装Linux系统的网络配置

    1. 进入配置文件配置.如果不知道ifcfg 后的内容.使用ifconfig vi /etc/sysconfig/network-scripts/ifcfg-ens33 如果不知道网关怎样配置就找到这 ...

  9. java中获取当前执行线程的名称

    Thread.currentThread().getName()

  10. SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

    项目依赖 SpringBoot 2.5.5 SpringCloud 2020.0.4 Alibaba Spring Cloud 2021.1 Mybatis Plus 3.4.0 Seata 1.4. ...