UINK 墨水屏 U 盘+ 电子书
60 多年过去了,尽管辉光管已经停产,有很多工程师仍然对它情有独钟。我用 8 块液晶显示屏制作了一个拟辉光管时钟,感受复古元素的美感,表达对过去经典的敬意。
出于日常工作与计算机打交道的需要,上班族几乎每天都要随身携带U盘,于是我就想有没有可能设计一款属于自己与众不同的U盘呢?恰好之前做过墨水屏项目,于是我开始尝试把二者结合到一起,就这样UINK项目应运而生,其中的“U”代表U盘,而“INK”则是墨水屏的缩写。
硬件介绍
UINK 墨水屏 U 盘 + 电子书融合存储与阅读功能,采用双核主控驱动低功耗墨水屏,支持数周续航。集成 USB 3.0 高速接口与智能扩展芯片,兼容快充与大容量电池,满足多设备连接需求。支持 Micro SD 卡与即插 U 盘双模存储,实体按键搭配触感反馈优化电子书操作。紧凑结构整合阅读、存储与外设扩展功能,适配商务及户外场景,以超长续航、高兼容性和便携性为核心优势,突破传统设备功能边界。本项目中使用到的主要硬件,以及硬件间的连接关系如图 1所示,大家可以扫描目录页电子资源二维码获取电路图。
本项目使用的主要元器件清单见附表。
想要完成这个项目,需要用到一款大小接近普通 U 盘的墨水屏,经过寻找,我最终使用了一款0.97 英寸的黑白双色墨水屏。这款显示屏分辨率大小为 184 像素 ×88 像素,局部画面刷新时间为0.3s,全部画面刷新时间为 4s,通过 SPI 接口与主控进行通信,这款显示屏可以使用通用的墨水屏驱动电路进行驱动。
主控
为了能够通过 Wi-Fi 或者蓝牙连接的方式来设置显示内容和传递文件,我选择了同时支持 Wi-Fi和蓝牙通信的 ESP32 模块作为主控。ESP32 有很多型号,本项目选择了小巧的 ESP32-MINI-1,这款芯片是双核 32 位 240 MHz 的配置。
读卡芯片
UINK 选择 Micro SD 卡作为其存储介质,这是因为 Micro SD 卡有丰富的容量和速度可以做个性化的选择,且稳定性也比较好。随后,我顺其自然找了 GL3224 芯片作为 Micro SD 卡的读卡芯片。U 盘读写速度肯定是关键的指标之一,而 GL3224可以支持 Micro SD 卡且达到 USB 3.0 的传输速度,超过市面上大部分配备 USB2.0 接口的普通 U 盘。
USB转串口芯片
出 于 程 序 下 载 和 调 试 的 考 虑, 我 选 择 了CH340K 作为串口芯片。CH340K 内置了 3 个二极管,它们用于防止独立供电时 ESP32 通过 I/O 引脚对 CH340K 的电流倒灌,从而有效降低 UINK 在休眠状态下的功耗。当 CH340K 与三极管搭配时,可以实现自动下载程序。
HUB芯片
因为 UINK 只有一个 USB 接口,却需要实现U 盘和 ESP32 串口的同时挂载,采用 HUB 芯片SL2.1A 来生成两路 USB 通道,分别供给它们使用。这样的连接方式就能实现同时挂载 USB3.0 的Micro SD 卡和 USB2.0 的串口了。为了确保 HUB芯片的稳定运行,在电路设计上我还搭配了外置晶体振荡器。
充电和稳压芯片
UINK 选 择 了 TP4057 作 为 充 电 管 理 芯 片,TP4057 可以给电池提供最大 500mA 的充电电流,当输入电压断开时会进入睡眠低功耗状态,此时电池漏电流将降到 1μA 以下。同时搭配了 RT9013-33GB 芯片作为稳压芯片,它可以提供最大 500mA的输出电流,25μA 的静态电流也比较低。这样的组合足够给 UINK 提供工作所需的电压和电流了。
PCB设计
为了方便后续迭代升级,我把 PCB 分拆成 U 盘部分和墨水屏部分(见图 2)来设计,两个部分之间再通过板对板连接器进行连接。UINK 的 PCB 设计中,有 3 个需要注意的要点。第一,ESP32 模块的天线下方不能覆铜,也不要布线,否则会对天线的信号造成影响;第二,USB 接口的所有信号引脚都要做等长差分布线,否则会极大地影响 U 盘的读写速度;第三,12MHz 晶体振荡器下方尽量不要布线,而且要做“包地”处理,以免晶体振荡器工作的时候对其他线路上的信号造成干扰。
外壳设计
出于保护电器元器件的考虑,设计出与 PCB大小相匹配的外壳,我先导出了电路板的 3D 模型,然后使用 CREO 三维设计软件对比 PCB 大小对前后盖、USB 盖和按键帽进行了建模(见图 3)。避免拿着硌手,我把前后盖和 USB 盖都做了倒圆角处理。因为 U 盘工作的时候,GL3224 和 SL2.1A 等芯片发热较大,所以外壳侧边做了打孔处理,一方面可以增加散热,另一方面也可以增加摩擦。为了降低 USB 盖质量,除了侧面的打孔,内部也做了镂空处理。为了尽可能缩小体积,前后盖都没有设计螺钉孔,而是设计了微小的卡扣来进行连接。建立好的模型通过光固化 3D 打印出来后,经过测试,组装好的外壳连接得非常稳固。
界面设计
因为墨水屏较小,分辨率只有 184 像素 ×88像素,所以在设计桌面时,我把每个图标大小设计成 40 像素 ×40 像素,每屏默认显示 3 个图标。图标显示在显示屏中间区域,图标下方显示名称,上方则显示开启中的功能标志和电量信息,UINK 桌面如图 4 所示。我使用了线框来圈住被选中的 App,按下 UINK 上方按键切换选择 App,按下下方按键进入 App。
对于比较简单的 App,并没有设计专门的界面,而是通过弹窗来进行交互,比如运行“信息”App 后,会弹出弹窗(见图 5),显示 CPU 频率等基础信息。
重要的 App 打开后会进入对应的界面,比如“天气”App 在成功获取天气信息后会进入图 6 所示界面。因为显示屏大小限制,选择了地区、天气图标、天气信息和温度进行显示,并添加了背景壁纸来美化界面。
程序设计
UINK 项目的程序使用了 Arduino IDE 进行开发,在网络上能找到很多关于 ESP32 在 Arduino环境中编程的参考资料。本项目程序的基本框架如图 7 所示,主要由驱动层、通用层和调度层组成。驱动层封装了墨水屏等驱动,通用层封装了一些供各个 App 调用的基础功能,比如按键、NVS 存储等。而调度层主要负责各个 App 的阻塞、恢复和跳转等。
在这个项目中,可以基于 FreeRTOS 多线程实现了 UINK 新功能的开发。这样的好处是,当需要添加新功能时,几乎不用修改原程序,只需新建一个App 页面,再基于基础的 App 模板来编写新的功能即可。而UINK 在系统启动时会把新 App 的图标加载到桌面上,并自动创建对应的任务。为了实现上述的效果,我先编写了最基础的实现案例,具体如程序 1 所示,整个 UINK 项目都基于这个案例的框架扩展而来。
有了上面程序作为基础后,就可以在 App 页面快速编写出 App 的新应用程序了,案例如程序 2所示。
在以上的 App 应用程序中,系统启动时所有App 会同时运行。因此,当多个 App 尝试访问同一硬件资源或变量时,可能会引发冲突。FreeRTOS操作系统提供了互斥锁(Mutex)机制,专门用于处理这类问题。我针对上述程序进行了优化:引入了一个互斥锁。当桌面某个 App 被激活时,它将获得“钥匙”以“解锁”,并执行其程序,而其他App 则全部暂停执行,等待“钥匙”被释放。通过设计互斥锁,在 UINK 中始终只有一个 App 能拿到钥匙,从而避免了 App 之间出现冲突。
接下来请欣赏一下丰富有趣的 App 吧!其中“阅读”App(见图 8),可以随时随地读取格式为.txt 的文档或者小说,关闭界面会自动保存书签,下次打开时能够自动恢复阅读进度。“新闻”App(见图 9)则可以在联网状态下自动获取当日的新闻简报。“翻页笔”App 通过开启蓝牙并连接计算机,能够实现播放 PPT 或调节音量等功能。“辅屏”App 在连接计算机后,可以监控计算机CPU/GPU的工作情况。其他 App 还有“天气”“计时器”“网络”“相册”等,这些 App 极大地丰富了 UINK 的趣味性和实用性。
结语
在 UINK 项目的设计过程中,并不是一帆风顺,上述的方案其实已经是 UINK 的第二代设计。初代的 UINK 并没有集成电池和配套的充电、稳压电路,而是依赖计算机供电来驱动墨水屏。在测试过程中,我发现墨水屏刷新未完成时断开连接会导致显示异常,所以才引入了电池和对应的充 / 放电稳压电路。与初代相比,二代的设计上还有一个很大的区别。初代在设计时为了保证计算机和 ESP32 端都能访问 U 盘,但是 ESP32 在读取大容量和高速的Micro SD 卡时存在限制。为了实现高速大容量 U 盘的设计,不得不放弃了 ESP32 端对 U 盘内容的读写和管理功能。
尽管第二代 UINK 比起第一代有所进步,但也还有不少改进的空间。比如,电池续航能力不足,U 盘工作时的发热较大,以及 PCB 布局不合理导致的焊接困难等。我将继续优化这些方面,让 UINK 成为更加有趣又实用的作品。
热门跟贴