数码之家

 找回密码
 立即注册
搜索
查看: 2903|回复: 130

[Arduino] 用Arduino理念玩屏:硬件精简化+软件抽象化+结构艺术化=让液晶屏不吃灰

    [复制链接]
发表于 2024-3-14 02:18:48 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一切的起始,要从某次入二手 19264 讲起,祸根系剁手所致。

应该是某地退役了一大批工业设备,才得以让这种屏比 12864 还便宜:

img1.jpg

在这个触摸彩屏盛行的年代,牛屎单色液晶显得很不上档次。

怎么看都是上世纪的显示效果,偏偏简单好用,让这屏承载了太多对于高端设备的回忆。

img2.JPG

Arduino 插上彩虹线,凑上对比度电位器,加载并行驱动。点亮没啥难度,甚至比插线过程还简单;

然这堆电线还外挂电位器着实不雅。于是决定折腾一下,让这些精巧的牛屎远离吃灰。


【硬件精简化】

大屏单色液晶采用 20 针并口通信,协议走 8080 或 6800 时序,部分型号支持 PSB 信号切换串行模式。
另需外挂一只电位器 RV 调节对比度,适配供电、温度差异下的最佳显示效果:

img3a.png

这么一套折腾下来,做固定功能的产品还算省事,有定制主板加持;
可到了日常随手连,密密麻麻排线加上外挂电位器,简直没法愉快玩耍。

反观同类并口 1602 字符屏,在 Arduino 生态下就有很好的改装方案:

img3b.jpg

图中黑色为 PCF8574 转接板,将 I2C 串行信号转到并行 1602,
同时集成灰度电位器、背光控制等一众功能;对外简单串行通信,方便连线,节省端口。

故而考虑在 19264 并行屏上引入类似机制,用于精简模块硬件连线。
虽然部分 19264 可通过 PSB 跳线改为串行模式,但为求通用性,统一当作并口液晶对待。

直接思路是 MPU 端使用三线 SPI 经 HC595 转为并口用于驱动 19264:

img4a.png

单加载数据端 D7:0 效率与直接的串口屏一致,单帧 SPI 就能加载 8bit 数据;
然而考虑到液晶 EN 线需要频繁的锁存脉冲,必须由额外的 SPI 帧来驱动,这会降低通信效率。

为此应适当放开部分 IO,将高频访问的控制线绕过串并扩展,直接交给 MPU 控制:

img4b.png

放开 IO 的设计,本质上又回归了并行通信的思路,因而必须谨慎对待。

手头几款并行液晶主控 KS0108、ST7920 默认采用 6800 总线,
每组指令/数据均为 EN 下降沿锁存,正好适配 HC595 的上升沿更新:

img5a.png

考虑到 LCM19264 的 6800-EN 信号需要频繁控制,不宜串行扩展,
故将 HC595 的 RCK 信号复用作 LCM19264 的 EN 信号,模块更为紧凑:

img5b.png

使用双 HC595 用作串并扩展,除 RCK 信号外共用 SPI 串行总线。
各自 RCK 信号用于区分 SPI 串并目标,实现数据、控制独立操作。

其中数据侧 D7:0 的 RCK_D 直接复用作 LCM19264 的写使能 EN 信号。
这样 RCK_D 上升沿 HC595 更新输出,下降沿液晶写入 D7:0 数据,两级完成无缝匹配。

先搞个万用板试下咸淡,除了外观巨大些,工作没毛病:

img6a.png

试好了赶紧打板,万用板辣么大不优雅:

img6b.png

装上蓝屏,跳线一连,顿时雅兴起:

img6c.jpg

至此基本确认双 HC595 硬件方案可行,并口屏无损直转四线串口,
板载灰度调节、背光控制,效果直追 1602 那个 I2C 驱动器。

比起直接 PSB 跳线改串行通信,兼容性和模块抽象是此次折腾的重点,
因而有必要深入到软件层面,继续折腾 HAL 封装,精简系统。


【软件抽象化】

玩 Arduino 图形编程怎能少了 U8g2 驱动库,一套代码几乎涵盖了所有单色点阵的场合,从液晶到 LED,简单粗暴疗效好。

本质上 U8g2 是一个多芯片的驱动合集,得益于 C++ 继承与派生特性,驱动库实现了 HAL 抽象封装,最高层 class U8G2 即为用户接口:

img7a.png

如果只是简单复制粘贴 U8g2 代码,就太浪费这个库的高层性能;
把新设计的串并转接板,连同 19264 液晶一同整合进 U8g2,才能玩的尽兴。

同样得益于 C++ 继承与派生,这种整合无需修改库文件,纯靠 “源码插件” 就能实现全部功能。
这样即使库文件定期升级更新,也不会影响到自制驱动效果:

img7b.png

如上图所示,绿色为 “源码插件”:在用户工程中添加全新派生类,编写底层 HC595 访问代码,最终实现与硬件完美匹配。
如下是驱动文件 Latch19264.h/.cpp 的编写预览:

img7c.png

驱动编写过程可以参考 U8g2 库里现成的液晶驱动类,除使用 C++ 语法实现 U8G2 派生类外,
着重移植 Display 和 Transfer 两个接口,前者对应液晶基础操作(含初始化代码),后者对应硬件基本传输(含串并转换)。

硬件驱动文件 Latch19264.h/.cpp 作为插件与用户工程一并编译,如下工程中定义了两套液晶,都是双 HC595 四线串并接口:

img7d.png

然后接上相应数据线,总计 4+4=8 (IO),实现单机双屏 19264 显示:

img8a.jpg

同为并口屏,顺手画了 12864 的串并转换单元,挂三个上来试试水:

img8b.JPG

一片只有 2KB 动态内存的 ATMEGA328 单片机,此时驱动了多片 19264、12864 进行独立图形显示,并且支持透明颜色绘图。
这在没有 U8G2 加持的时代,几乎是噩梦级的编程要求。

更进一步,需要综合测试上述【硬件精简】+【软件抽象】共同折腾出的显示单元帧率。
主控选用 Arduino 标准的 ATMEGA328,主频也为标准的 16MHz,以 Arduino 时基 millis( ) 作为计时单元。

实测单次 19264 全屏刷新时间约为 83ms,对应 12fps 帧率;
实测单次 12864 全屏刷新时间约为 70ms,对应 14fps 帧率。

这样的性能对于串行屏已然够用,毕竟重点关注的是简洁性与兼容性。


【结构艺术化】

家里领导是搞艺术的,对电路可谓一窍不通。串并虽然简化了连线,
但这种缺少日常使用场景的玩意,显然会被当成废品对待。

目前最大的问题在于,屏幕加上转接板没法自行站立显示,影响效果。
索性参考下美术生的画板架,屏支架就该这样搞:

img9a.jpg

屏幕尺寸简单量一量,CAD 左右夹持式支架画起来:

img9b.png

整体设计成前后左右上下倾斜到处可调,画好了凑方块拿去激光切割:

img9c.png

组装效果#1,窄版 12864,下排针插串并转接:

img9d.JPG

组装效果#2,宽版 19264,侧排针插串并转接:

img9e.JPG

至此,结构也成功艺术化了,终于可以光明正大摆桌面上被领导骂。


【不吃灰】

折腾这么久,就是防止剁手的液晶在箱子里吃灰。现在整机已然模块化,终于可以放开搭系统了。

先模拟个 MatrixOrbital,配合 AIDA64 玩个桌面副屏:

img10a.JPG

感谢 U8g2 的 GDI 加持,超大文字甚至不用自己取模,挑个喜欢的字体就有:

img10b.JPG

换个更随意的玩玩,AMG8833 红外热像仪,用像素抖动实现灰度,进而显示温度场:

img10c.gif

当然,喜闻乐见的刷妹纸环节不能少,这次用 Arduino 板载电池带一下:

img10d.jpg

至此,巨大的 12864、19264 并口屏,终于也像其他 Arduino 模块一样简洁高效;
随手插上核心板,电气系统随思路喷涌而出。

附上上述 Arduino 代码,整理不易,仅在本坛分享: Firmware(19264 12864).rar (35.48 KB, 下载次数: 11)

-----------------------------------------------------------------------------------------------------------------------------

以上,用 Arduino 理念对 19264、12864 这类并口屏进行了全方位精简设计:
硬件上实现了通用四线串行通信,软件上编写了插件式 U8g2 驱动,外形上设计了仿画板支架。

终于折腾成简单易玩的显示单元模块。

最后祝大家 DIY 愉快!


打赏

参与人数 13家元 +378 收起 理由
沙漠臭屁虫 + 30
yu2ff@126 + 60 謝謝分享
eeerrr + 30 優秀文章
azzajazz + 30
cat_li + 18 優秀文章
clbxclbx + 20 優秀文章
慕名而来 + 30 原創內容
cushion + 30 原創內容
vip2128 + 10 優秀文章
kkdkj + 30 加分了朋友

查看全部打赏

发表于 2024-3-14 07:02:57 | 显示全部楼层
论软件方面的抽象, esphome 的 lua 脚本就能搞定各种屏幕
回复 支持 反对

使用道具 举报

发表于 2024-3-14 07:23:54 来自手机浏览器 | 显示全部楼层
完全看不懂,但知道楼主忒厉害了!
回复 支持 2 反对 0

使用道具 举报

发表于 2024-3-14 07:57:30 来自手机浏览器 | 显示全部楼层
膜拜大佬,前排围观
回复 支持 反对

使用道具 举报

发表于 2024-3-14 08:18:34 | 显示全部楼层
这个做电子钟不错,屏幕够大。
回复 支持 反对

使用道具 举报

发表于 2024-3-14 09:02:07 | 显示全部楼层
确实改进很多,方便很多,对DIY更实用了。
回复 支持 反对

使用道具 举报

发表于 2024-3-14 09:08:27 | 显示全部楼层
这个好专业啊
回复 支持 反对

使用道具 举报

发表于 2024-3-14 09:35:16 | 显示全部楼层
围观羡慕下。。。。不会编程的路过。。。
回复 支持 反对

使用道具 举报

发表于 2024-3-14 09:38:17 | 显示全部楼层
楼主的19264应该是好久以前入手的吧,现在的价格不低的。
回复 支持 反对

使用道具 举报

发表于 2024-3-14 09:43:23 | 显示全部楼层
硬件上能不能直接设计成IIC的接口?现在没分了,等有分了给你补。
回复 支持 反对

使用道具 举报

发表于 2024-3-14 09:46:38 | 显示全部楼层
电子钟不错,工科就是会玩
回复 支持 反对

使用道具 举报

发表于 2024-3-14 09:49:42 | 显示全部楼层
白底背光比较好看。真佩服楼主的技术!请问电子钟架子是什么材料的?
回复 支持 反对

使用道具 举报

发表于 2024-3-14 10:05:28 | 显示全部楼层
这种单色并口屏比彩色液晶屏还贵,驱动也麻烦,除非一些特殊场合,否则早该被淘汰了。
回复 支持 反对

使用道具 举报

发表于 2024-3-14 10:45:44 | 显示全部楼层
有技术就是会搞花样繁多
回复 支持 反对

使用道具 举报

发表于 2024-3-14 11:05:31 | 显示全部楼层
抽象化能力:抽象是软件开发中的一个重要概念,它允许开发者将复杂的底层细节隐藏起来,只关注高层次的逻辑和功能
楼主老师,最低起码是哈工大硕士生导师
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-14 11:16:53 | 显示全部楼层
orsonzou 发表于 2024-3-14 07:02
论软件方面的抽象, esphome 的 lua 脚本就能搞定各种屏幕

没玩过 lua, 主力的 328 跑这个有点吃力
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-14 11:18:01 | 显示全部楼层
11651189 发表于 2024-3-14 07:23
完全看不懂,但知道楼主忒厉害了!

牺牲一些运行效率,换来系统+开发的便捷性,就是这么个思路
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-14 11:18:32 | 显示全部楼层
aacyxjz 发表于 2024-3-14 07:57
膜拜大佬,前排围观

感谢支持哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-14 11:20:31 | 显示全部楼层
leafchy 发表于 2024-3-14 08:18
这个做电子钟不错,屏幕够大。

这种老液晶,就是屏幕大看着舒心。

玩了诸多彩屏、OLED, 时间久了发现小屏除了便携设备,没啥亮点。
显示效果甚至不如这种大型的单色屏好看
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 17:58 , Processed in 0.171600 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表