查看原文
其他

万字长文,一个软件工程师的 2023 电子 DIY 总结

ohdarling 欧大的自留地 2024-07-04

在去年这个时候,总结了一下 2022 年重新拾起电子 DIY 的经历《一个软件工程师的 2022 电子 DIY 小结》,翻了翻嘉立创 PCB 订单,今年也打了不少板子,虽然也有一些是取消的订单,但是总体还是打了不少板子,有一些旧的东西,也有一些新的东西。

相比去年,今年在电子 DIY 上又学习了一些新东西,再来总结一下在 2023 年得到的经验。当然这些都是我作为一个新手村玩家得到的经验,只能说在 DIY 这个领域,可以用来应付一些需求,与实际商业化产品开发过程中需要的经验,还是会有比较大的距离,因此这些经验也仅供大家参考。

经过这一年,看见什么数码产品,都想着自己能不能做一个,找找开源项目,找找对应芯片,然后搞出一个半成品 😆。

复刻项目

作为一个新手,2023 年整体还是以复刻为主,得益于立创硬件开源平台,总是可以看到各种很有意思的项目,这其中有一些算是玩具,有一些是开发相关的,有一些则是实际生活中会使用到的数码产品。

在复刻项目过程中,现在能更多地去理解原理图,知道每个部分的作用是什么,以及在它的基础上,是否可以做出一些符合自己需求的修改,例如以下这些基础的修改:

  • 元件封装是否方便手焊,0402 替换为 0603 或 0805

  • 布局是否方便使用加热台一次焊接,双面贴片变更为单片贴片

  • 元件选型是否和现在元件库存匹配,LDO、DCDC 等替换为库存已有型号

  • 主控是否可以替换为更熟悉的型号,例如 ATMEGA 替换为 ESP32

在经历过几个开源项目的复刻过程后,会逐渐对硬件项目的构成有一个更清晰的概念,也能对硬件项目中可能包含的功能模块了解更多一点,例如电源模块、充电模块、电机驱动等。

在知道和了解了硬件项目中的这些模块之后,在后续想要做自己的项目时,就可以参考和使用了,这跟在软件项目中使用开源库的原理也差不多。

SmartKnob - 基于 SimpleFOC 的无刷电机模拟旋钮

项目地址:https://github.com/scottbez1/smartknob

关键词:无刷电机,SimpleFOC,PID,ESP32,TMC6300,磁编码器,SK6812

SmartKnob 是一个国外工程师使用无刷电机来模拟各种旋钮手感的带屏旋钮项目,通过 PID 控制电机的位置和旋转力度,就可以模拟像齿轮、段落开关、无级调节等各种效果,可以用在智能家居控制等场景,或者作为电脑的智能副屏使用,可以显示状态以及控制音乐播放等。

现在淘宝上也有一些类似的带屏旋钮,但是应该都是固定类型手感,而不是像这个项目通过 PID 控制无刷电机,可以根据控制场景的不同,去模拟不同的手感。

通过这个项目可以学习到无刷电机的控制 SimpleFOC、磁编码器 TMC6300 等功能模块的使用。

支持 QMK 的模块组合键盘

项目地址:https://oshwhub.com/iqirtryi/pkb16x4-atmega32a

关键词:QMK,vial,ATmeta32A,客制化键盘,Planck

复刻这个项目是想学习一下键盘的制作,毕竟客制化键盘这么火,不如从头自己做一把。

通过这个项目可以了解到键盘的扫描矩阵大概是怎么一回事,以及在和 QMK 固件的配置中,去如何将按钮与行线、列线对应起来。

另外这个开源项目使用了 ATmega32A,默认的 bootloader 不支持 USB 烧录,需要先烧录一个增加 USB 支持的 bootloader,这一步相比使用 ESP32 等模块开发就麻烦了一些,当然也可能是因为之前一起在使用 ESP32 系列,配合 CH340 USB2TTL 芯片已经很熟悉了。

在刷入新的 bootloader 之后,ATmega32A 用起来就比较方便了,在 macOS 上也有对应的 App 进行固件烧录,不需要进入 Windows。

当然这个键盘在复刻完之后并没有用起来,键盘还是太难适应了……以后再看看能不能做一把 ErgoDox 看看,试试更符合人体工程学的键盘。

SnailPi - 基于全志 V3S 的开发板

项目地址:https://oshwhub.com/ftwtwzy/snaillpi_copy

关键词:嵌入式 Linux,以太网,USB OTG,V3S,Device Tree,DDR

我是通过这个项目开始接触到 SoC 这一块的内容,之前没想到 20 几块人民币就可以买一个 V3S 这样配备了 1.2GHz CPU、64MB DDR 内存的 SoC,能直接跑 Linux,作为了一个标准的电脑主机来使用。

对比起来,一个 ESP32-S3 N16R8 模块也要 20 几块,只有双核 240MHz 以及 512KB SRAM 和 8M PSRAM,虽然 ESP32-S3 集成了 Wi-Fi 以及蓝牙功能,但是 V3S 能跑 Linux 还是有很大吸引力的。

通过这个项目,可以了解到 Linux 嵌入式开发,包括 Deivce Tree 配置、u-boot、rootfs 等,也可以大概了解常用外设如何在 Linux 中驱动起来,例如 SPI 屏幕、I2C 设备、UART 通信等。

在掌握了 Linux 嵌入式开发之后,可以玩的东西就很多了,现在有很多价格便宜性能强大的 ARM 类 SoC,也有 RISC-V 类 SoC,基本上都拥有 1GHz 以上 CPU 以及 64MB 以上 DDR 内存,再贵一点,就可以上到多核以及 512MB 内存的 SoC 了,这类 SoC 已经可以跑 Linux 桌面或者 Android 系统了,例如这个 基于全志 A133 的一款平板 项目,就可以开发出自己的平台。

TPA6120 耳放

原作视频:https://www.bilibili.com/video/BV1PE411p7F8/

开源项目地址:https://oshwhub.com/xyzDIY/tpa6120-zhuo-mian-er-fang

关键词:模拟电路,运算放大器,TPA6120,NJM4580

这个项目算是模拟电路的项目了,对这块内容并不熟悉,以前的模拟电路也没有学好,到现在也没有掌握运放的使用,复刻这个项目主要就是体验一下,使用电脑直接推耳机,跟使用耳放推会有什么不同。

然而实际听下来并不能听出区别……木耳实锤了。

智融 SW3538/SW3536 USB PD 快充模块

项目地址:https://oshwhub.com/wqlll/sw3538

关键词:快充,USB Power Delivery 协议,USB Type-C,智融,DC-DC Buck,SW3538,SW3536

现在使用 USB Type-C PD 充电的设备越来越多,之前看到过另外一个项目 大功率微型桌面充电坞,本来想复刻一个,但是它设计得有点复杂,理解起来比较困难,在后来看到这个 140W 的单芯片充电模块的时候,就决定复刻一个来学习一下 PD 快充模块的开发。

SW3538 是智融出品的一个支持多种快充芯片的充电管理芯片,支持 PD、QC、VOOC 等公开或私有快充协议,这个本身只支持降压,也就是输入电压需要高于输出电压,例如如果想要支持 PD 20V5A 充电,输入电压就需要大于 20V。

其实 SW3538 芯片本身跟常用的 DC-DC Buck 电路区别不是很大,它更多是支持通过 CC1、CC2 数据线来与充电设备通信,从而自动的调整充电电压、电流,理论上如果通过单片机实现 PD 协议的处理,也可以自己实现一个 PD 充电器,但是在有专用芯片的情况下,也没有必要这么做了。

在复刻完单个快充模块之后,直接将几个模块拼起来,搞了个桌面充电站,1x140W + 3x65W,配上一个大功率开关电源,就可以满足常见充电需求了。

不过复刻的快充模块最后还是碰到点问题,在持续满功率运行的时候,电感和 MOS 管都发热厉害,查了半天也没弄明白什么原因,可能是 MOS 管 Gate 信号存在振铃导致的,但是并不能确认,后来复刻 SW3526 这款内置了 MOS 管的快充芯片时,也存在同样发热大的问题,终究还是没有太能深入理解到模拟电路的原理。

ASM2362 NVME 10Gbps 硬盘盒

项目地址:https://oshwhub.com/xyzdiy/nvme-type-c-ying-pan-he

关键词:ASM2362,NVME,PCI-E,高速电路,USB Type-C MUX,USB 3.0

之前买了个零刻 SER 7 小主机,另外买了块 2T NVME 装上了,自带的 NVME 就闲置下来,刚好在立创开源平台看过几个 NVME 硬盘盒项目,最后找了个基于 ASM2362 支持 USB 3.1 Gen 2 10Gbps 的方案,整体 PCB 体积相比另外基于 JMS583 以及 RTL9210 的更小,更符合匹配商业化产品的想象,配合这个 PCB 再 3D 打印一个盒子直接当成品用也不是不行。

选择这个项目也为后来调试埋了一些坑,这个项目更多采用了 USON、DFN、QFN 类型封装的芯片,这导致在焊接的时候出现了较多返工,中间碰到 SSD 主供电 3.3V 一直没有出来,排查半天以为芯片损坏,直接从主控供电飞了根线来测试,最后发现还是焊接问题。

回头再看这个项目,其实没有特别难的地方,主控芯片几乎包办了所有功能,USB Type-C 的 MUX 也由 ASM2362 完成了,不需要额外的 MUX 芯片,例如 VL160。仅有的几个外部模块就是供电以及 SPI FLASH 了,供电其实可以根据元件库存替换为 EA3036 或者其他类似单路供电 DC-DC 芯片,但是不想花更多时间就没有做更多修改,直接使用原版工程打样了。USB 应用中,类似芯片的功能都相当强大,差不多都是 All in 1,因此整体电路不会特别复杂,复刻起来还是比较简单的。

总的来说,还是需要多练习一下 QFN 类芯片的焊接技术,之前也出现过好几次焊接不良导致的问题排查。

最终使用英睿达 P3 Plus 测试,读写也基本符合预期吧。

Yuzuki Chameleon - 基于 H616 的卡片电脑

项目地址:https://oshwhub.com/gloomyghost/yuzukih616

关键词:全志,H616,DDR,eMMC,AXP313,高速电路,BGA 封装

前面所有项目中,只有 ASM2362 硬盘盒算是涉及到高速线路,其他几个都没有比较高速线路布线的需求,因此为了让 2023 能感觉到 DIY 水平的提升,在末尾的时候选择了挑战一下这块 6 层板全志 H616 开发板。

这块块的难点在于,作者使用了大量 0402 的元件,以及包含了好几个 BGA 封装的芯片,这在手工焊接的时候就会有一定的挑战。不过经过一年的练习,现在对于 0402 封装的阻容,已经可以比较轻松应对了,反而是从来没有碰过的 BGA 封装翻车了。

一开始拿加热台 + 热风枪焊接内存,加热了大概 90 秒,芯片本身已经固定住了取不下来,上电也没有短路大电流,觉得没啥问题了,就把 H616 也一起焊接了上去。上电之后,发现晶振不起振,这下懵了,查都没法查……

没办法就尝试把内存取下来看看有没有什么问题,也是拆了半天,拆下来之后发现,PCB 焊盘掉了两个点 😂,这还没出师就要学习针线活了。然后内存颗粒上的锡球也需要重植,上某宝买了钢网之后拿低温焊锡值了个球重新上热风枪,这回简单多了,感受到了推动芯片再复位的过程。

然而这事还没有结束,在经历了主控找不到 PMIC、给 AXP313 加焊、又给主控加焊、启动 HDMI 还是无信号后再检查发现,H616 的串口输出了内存无法初始化的错误,于是无法判断是 H616 同样由于出厂高温锡球没有熔化导致焊接问题,还是内存颗粒焊盘掉点导致通信问题,只能先放一边了。

这个项目算是 2023 年复刻唯一失败的了,等有空了再去买一套 H616 + AXP313 重新尝试一下 🙈。

在能完成这个项目之后,应该会在新一年继续尝试一些使用 BGA 封装芯片的项目,也去了解一下诸如 eMMC、DDR 这样元件的布线。

复刻小结

当然,复刻并不是单纯为了复刻,复刻一个开源项目是为了去熟悉这个项目中所用到的模块、芯片、线路,以及借助于这些项目的实际应用,来了解在电子 DIY 中可以用到的内容,毕竟不是在学校里学习,正向慢慢从基础打起,而是反向推演,以实际项目来了解在电子 DIY 这个领域中,可以掌握哪些内容,需要了解哪些知识。

原创项目

除了复刻立创开源平台的项目,在 2023 年也从头设计开发了一些自己用的东西,总是复制粘贴也不能检验学到的知识是否已经实际掌握并运用自如了,所以还是需要从功能设计、元件选型、设计原理图、PCB 布线完整地走一遍,来将复刻开源项目中学到的经验巩固下来。

作为一个新手玩家,从头设计也只能从简单的开始,都是一些功能比较简单的产品,希望明年能做一些更复杂的东西。

ESP32-S3 最小开发板

项目地址:https://oshwhub.com/wandaeda/dan-pian-ji-esp32-s3-kai-fa-ban

关键词:ESP32-S3,开发板,扩展板,TFT LCD,多功能按键,I2C,SPI,LVGL

作为乐鑫 ESP32-S3 的重度用户,之前一直用淘宝上买的开发板,但是这些购买的成品在使用时总有这样那样的不便,因此作为刚开始准备从头画原理图的新手,准备第一个自主设计项目就拿这个练手了。刚好嘉立创还在搞开发板训练营活动,能白嫖打样 + 元件,妥妥地免费学习了。

作为第一个练手的板子,方便手工焊接,阻容都选择了 0805 封装,除了自动下载的三极管,为了节省整个空间,用了一个 SOT-363 封装的元件,直接集成了 2 个 NPN 和电阻,在极限的面积下能保障了还有 ESP32-S3 的自动下载功能。

因为 ESP32-S3 支持 USB Host & Device,因此双 USB 接口也是必需的了,这样可以在测试 USB Host & Device 功能时,可以同时通过串口进行调试。

通过这个项目可以大概了解到 LDO 的使用,CH340C USB 转串口芯片的使用,总体外围元件相当少,虽然面积比较小,2 层板布线也不是很宽裕,但是总体来说,也还算是一个比较简单的板子。

SL2.1A USB 2.0 Hub

项目地址:https://oshwhub.com/wandaeda/sl2-1a-usb-hub

关键词:USB 2.0,USB 集线器,高速电路,USB Hub

USB 作为最常用的接口,并且平时经常连接 MCU 这类低速设备,电脑上的 USB 2.0 接口不太够用了,这不得安排上来练习一下制作一个。在立创开源平台对比了好多 USB 2.0 Hub 的芯片,最后选了 SL2.1A 这个芯片,支持 USB 2.0 一分四。

SL2.1A 的使用相当简单,外围电路几乎只需要滤波电容,内部集成了晶振,但是第一次练习,还是尝试使用了一个外置 12MHz 晶振。另外为了使用现有线材来连接 USB Hub,这个 USB Hub 的输入接口选择了 USB Type-C。另外 USB 2.0 标准下每个接口电流供应能力限制为 500mA,因此也额外添加了一个 2A 的保险丝来保障主机接口的安全。

在焊接这个 USB Hub 的时候还踩了一个坑,本想每个口输出接口加上一个电容来给连接设备稳定供电,堆料上了 1000uF 的电容,没想到一接上主机直接提示功率过大了,查了资料才发现这些电容并联之后,在接上电脑的瞬间充电电流会特别大,因此后来都把这个输出稳压电容替换成了 100uF。

最后成品测试了一下,差不多可以跑满 USB 2.0 的带宽,说明阻抗控制、差分对布线啥的应该没问题,基本上可以算是掌握了 USB 2.0 这个速度级别的产品开发能力。

USB 2.0 Hub 也还有不少其他选择,如果不要求更多功能例如 LED 灯什么的,基本上外围电路都很简单,例如 FE2.1、CH334 等,最终选择哪个可以根据实际要几个输出口、PCB 面积等来考虑。

TP5400 锂电池充放电管理模块

项目地址:https://oshwhub.com/wandaeda/tp5400-li-dian-chi-chong-fang-yi-ti-dai-di-ya-bao-hu-dian-yuan-mo-kuai

关键词:电源管理,电池管理,锂电池充放电,DC-DC

现在锂电池已经是数码产品中不可或缺的部分,如果一个产品以可移动使用的场景去开发,那必然要面临锂电池充电管理的问题。在立创开源平台,常用的充电方案都是使用的 TP4056,但是这个芯片只有充电管理。

在 2022 年复刻其他项目时,已经使用过 TOPPOWER 还有另外一款芯片 TP5400,同时支持单节锂电池充电管理以及 5V 升压支持,在不了解单片机供电特性以及某些元件可能需要 5V 供电的情况下,能带有升压到 5V 从而实现与 USB 供电条件一致可以更能保障最终运行效果。

一开始这个充放电电路只是在另外一个产品中使用,但是在做了 AirCube 之后,也想给这个产品增加移动使用支持。但是因为 AirCube 是一个基于各种功能模块开发的产品,并不是一个全部贴片的 PCB,这就需要一个独立的充放电管理模块来完成锂电池的充电和升压,并且同时支持通过一个 USB 接口同时支持 USB 供电和充电。在淘宝上搜索了一遍之后没有找到特别合适的模块,因此就想到之前用过的 TP5400,并且自己来制作一个小电源模块。

这个基于 TP5400 的电源模块没有特别的地方,基本上是按照官方数据手册的典型应用画的,为了方便手焊也基本上都使用的 0805 封装的元件。

不过这个模块有个特殊的地方,是为了防止锂电池过放增加了一个低电压放电截止电路。至于为什么要加这个电路,是因为 TP5400 典型应用中,在电池电压低于 3V 时,TP5400 的确会保护锂电池然后停止升压,但是锂电池本身还是会通过二极管直接连接到用电端,如果用电端有例如 LED 这样对电压并不敏感的设备,会持续放电,从而导致锂电池过放。

我目前也没有搞清楚为什么锂电池保护板没有起应有的作用,但是为了防止这个情况的发生,就增加了一个电压过低断电的电路,主要借助于 PMOS 打开需要有一定的压差来实现,在 TP5400 不升压时,TP5400 5V 没有输出,电池电压经过分压电路后,PMOS Gate 电压与 Source 电压压差小于 Vgsth,PMOS 关闭,这样后端电路就不会消耗任何电流了。

目前这个模块已经用在了其他的项目中,可以省去不少时间,也算是实现了第一个复用的模块。

USB Type-C 电压电流功率表

项目地址:https://oshwhub.com/wandaeda/ji-yu-ch32v003-de-usb-dian-liu-biao

关键词:INA219,CH32V003,RISC-V,采样电阻,OLED,DC-DC,USB Power Delivery

做这个项目的起因是因为在电子 DIY 爱好者群里看到有人发了 WCH 一个特别便宜的 MCU CH32V003,只要 7 毛钱一颗,16K Flash + 2K RAM,并且有国外爱好者做了一个开源 CH32V003 GameConsole。平时做小东西都是用的 ESP32,但是 ESP32 相对而言体积大、功耗高,而且在有些场景也不是一定需要 Wi-Fi、蓝牙等功能,只是需要一个单片机来完成基本功能,因此就拿 USB 电流表这个已经有一大堆实现的产品来学习一下 CH32V003 的开发。

做一个 USB 电流表,需要的功能也没有特别多,OLED 屏幕驱动、按键检测、I2C 通信,基本上 GameConsole 项目里面都有了,可以直接拿来用,电压电流检测可以使用 INA219,最大支持 26V 电压输入和 3.2A 电流,通过修改采样电阻大小,还可以支持更大电流,对于 USB Type-C PD 充电来说,不考虑 PD 3.1 28V 的情况下,INA219 已经足够使用了,如果想支持更高电压,也可以将 INA219 替换为 INA226。

不同于一般使用 USB 供电的产品,这个 USB 电流表需要支持 USB PD 协议供电,因此有两个问题需要处理:

  1. USB PD 供电会超过 5V,USB PD 2.0 中最高可以到 20V,因此 MCU 供电部分选型耐压值要高,在立创商城找了半天,找了 LGS5145 这个型号,输入电压 4.5V~55V,输出电流最大值 1A,足够单片机和屏幕使用了。

  2. USB PD 充电协商需要使用 USB Type-C 接口,并且需要通过 CC1、CC2 两个配置引脚来通信,因此 USB 接口需要选择 16P 类型,这样才能支持将 USB PD 协议直通到后端用电设备。

因为 USB PD 充电在没有协商完成时,是不会供电的,因此这个电流表需要有后端用电设备才能启动,如果想要在没有后端用电设备的情况下也能启动,就需要实现 USB PD 诱骗了,这个比较复杂就不在这个简单的项目里去处理了。

另外后来发现还是有耐高压的 LDO 可以选择,例如 HT7533 这个型号,可以耐压 30V,而 CH32V003 + OLED 屏幕 + INA219 总共耗电大概在 5mA 左右,使用 LDO 供电完全可以负担并且不会发热太大,后续碰到类似场景就可以替换成 LDO,降低电路复杂度。

解决上面这几个问题之后,就是普通的单片机系统开发了,还有一个需要注意的就是 CH32V003 的内存只有 2KB,相对 ESP32 系列的 512KB,使用起来实在是捉襟见肘。并且 CH32V003 并没有硬件浮点功能,每使用一个浮点相关计算,例如乘法、除法,都会编译相关的软件浮点库进入固件,而这些代码就相当占体积了,会迅速占满 16KB 的 Flash 空间。因此在编写固件的时候,需要尽量避免浮点计算,可以选择将整型扩大 1000 倍当浮点数使用来保留三位小数精度。

CH32V003J4P6 使用下来除了 16KB Flash 和 2KB RAM 比较紧张,其他还是相当舒适的,GPIO 够多,也有硬件 I2C、SPI,功耗也不高,最重要是价格便宜,在每个需要代码逻辑的小节点放一个 MCU 都可以。

USB Type-C PD 诱骗器

项目地址:https://oshwhub.com/wandaeda/pd-power-supply-spoofing-based-on-ch32v003-and-ch224k

关键词:INA219,CH32V003,RISC-V,采样电阻,OLED,LDO,彩色丝印,USB PD 诱骗,CH224K,USB Power Delivery

之前在复刻完 SW3536 快充模块之后, 想要测试一下这个模块的持续输出能力,但是买的电子负载仪并不支持直接进行 PD 协商到 20V 5A 进行测试,这个时候就需要一个 USB PD 诱骗模块了。在淘宝上买了两个模块测试之后发现,这些模块本身能支持功率有限制,测试到 25W 左右就会进入保护状态然后直接重启了。因此就想着,不如自己做一个 USB PD 诱骗器。

搜了一个立创开源平台,发现 WCH 也有一款 USB PD 诱骗芯片 CH224K,使用比较简单,支持 USB PD 固定几档电压的诱骗,可以通过单个 GPIO 连接不同阻值的方式来调节,也可以通过多个 GPIO 组合状态来调节,最终就选择这个芯片来进行 USB PD 诱骗操作了。

在完成 USB Type-C 功率表之后,发现 CH32V003J4P6 的 GPIO 数量足够多,再分出 3 个 GPIO 用来操作 CH224K,也可以继续支持 OLED 屏幕显示以及 INA219 电压电流的采集,而且本身结构差不多,刚好可以节省重新设计 PCB 的时间。

这次为了精简整体电路,就将 DC-DC 降压电路换成了支持高压输入的 LDO,这样在电源输入部分可以更精简。

由于 CH224K 接管了与上游 USB PD 供电端的通信,因此这里的 LDO 就可以在连接到 USB PD 供电端就可以获得电压输入,从而直接对单片机进行供电,在没有连接到下游 USB PD 用电设备时,也可以通过按键来调节输出电压。

为了能测试大功率,PCB 在布线时也加宽了 VBUS 的走线,制作完成后,实测 20V 5A 测试 10 分钟整体 PCB 也只是温热,完全可以胜任长时间的 USB PD 100W 诱骗测试任务。

在这个项目制作完成后和淘宝上的一些产品对比后发现,好像成本上也没有特别大的优势,功能还是人家的更丰富,有空再去研究研究这些产品用的是什么方案。

原创项目小结

熟悉了硬件的一些基础知识之后,从头设计一个简单的硬件产品也不是很难,主要是找到适合的芯片,根据芯片的数据手册去画出它的原理图,根据模块之间的通信方式,例如 UART、I2C 或者 SPI 等,将各个芯片模块组合起来就可以了。

对于一般项目来说,掌握几种供电方式、电池管理、主控使用、外设连接之后,基本就可以拼凑出来完整的 PCB 了。

软件系统

ESP32-S3 扩展板示例工程,Type-C 诱骗器,Type-C 功率计

嵌入式项目不光是硬件,还需要有对应的软件系统开发,2023 年除了继续熟悉使用 Arduino,还尝试了解了一下 FreeRTOS 以及祼机开发和使用寄存器。

Arduino 和 FreeRTOS

在 2022 年开发嵌入式项目时,都是用的 Arudino 框架,直接使用了 arduino-esp32 封装的各种现成库,并且都是直接将业务逻辑写在 setup、loop 函数中,没有多任务处理,没有高级界面绘制,基本还是停留在修修改改开源代码状态。

在 2023 年,逐渐开始了解到 FreeRTOS,也了解到 ESP32 官方框架是基于 FreeRTOS,是可以直接使用 FreeRTOS 相关的方法,也开始尝试去通过 FreeRTOS 实现多任务运行,不再是一个死循环写到黑。

在这过程中主要学习了 WiFiManager 这个库的代码,并且尝试修改了一下来符合自己的需求,网上开源的 WiFiManager 基本上都是阻塞方式执行,在进行配网时,就无法执行自己的代码。在仔细学习了一下这些个 WiFiManager 库的代码之后,使用 FreeRTOS 的 xTaskCreate 来创建异步任务去执行配网任务,并且通过 Lambda 来回调配置进度,同时还可以在 loop 函数中执行自己的界面绘制代码,这样就可以随时展示当前配网进度。

从一个软件工程师的角度来看,这些库的代码质量不算高,主打一个功能实现就好,整体代码结构、封装程序都不算好,修改起来比较费劲,并且多个示例或者不同使用方法都是通过复制代码来实现的,很难看明白逻辑是如何处理的,要将多个例程中的功能合并在一起使用时就需要彻底理解整个库的逻辑。

当然还是要感谢这些开源库的作者,像我这样的新手能快速搭建一个像模像样的产品出来,并且能具备一个产品基础的功能。

ESP32-S3 扩展板示例工程

在搞完 ESP32-S3 最小开发板之后,刚好通过 SmartKnob 另外一个类似项目接触到 LVGL 这个跨平台的 GUI 开发框架,对于需要有界面的产品来说,这个框架使用起来还是相当方便的,对资源要求不高,并且还有相当多成熟的控件可以使用,如果不喜欢写代码,还有一些可视化编辑器可以使用,例如 NXP 推出的 GUI Guider。

对于一款开发板来说,如果要验证一些功能,光有 MCU 部分也是不够的,还是需要一些常用外设,这样在验证想法的时候,可以直接使用现成的外设而不用再去用面包板或者杜邦线连接各种外设,费心费力不说,还容易出错,万一出错短路就更不好了。因此在做完 ESP32-S3 最小开发板之后,就再根据这个开发板做了对应的扩展板, 包含各种常用外设和总线,例如屏幕、SD/TF 读卡器、多功能按钮、WS2812 LED 等。

通过开发这个扩展板的示例工程,就可以用来熟悉一下 LVGL 开发、屏幕驱动、SD/TF 卡文件存取等常见需求的开发了,这样以后在碰到类似需求时,就可以快速上手,如果产品本身需要的外设和这个扩展板一致,甚至都可以直接复用 PCB 和代码了。

LVGL 整体封装挺完善的,接入各种按键驱动、鼠标驱动也比较方便,但是对于控件还需要具体场景使用过后才能进一步熟悉,当然了解到框架整体思路之后,使用起来就是阅读文档的过程了,并不会太高的门槛。

但是 LVGL 本身还是主要面向过程的,对于各个界面生命周期的管理并不如像 iOS 开发那样简单,也有一些项目,例如 X-Track 码表项目,就封装了一套 MVC 的框架,后续想要更快速的完成一个带屏项目,可能也需要去封装一套更好用的 MVC 框架。

CH32V003 祼机开发

在大多数项目都使用 ESP32-S3 这个系列 MCU 的时候,都不用怎么关心 MCU 资源是否足够,毕竟最低 4M Flash + 512KB SRAM,在单片机这个场景怎么着也是够用的,但是在使用 CH32V003 这种低端 MCU 时,就开始需要仔细掂量各种资源的使用了。

在使用 CH32V003 开发 USB Type-C 电流表时,一开始想使用 Arduino 框架,GitHub 上已经有爱好者针对 CH32V003 封装好了常用的函数和库,例如 GPIO 操作、I2C 总线、UART 操作等,但是等到实际使用时才发现,光启用 GPIO + Serial.print 之后,就已经占了十几 K 的 Flash 空间,再一加 SSD1306 屏幕驱动,Flash 空间直接爆了。

因此这个时候只能考虑使用官方 SDK 进行开发了,刚好开源项目 GameConsole 算是使用了官方 SDK 进行开发的,甚至有一些部分比官方 SDK 还简单,是直接操作寄存器的。USB Type-C 电流表整体外设与 GameConsole 差不多,刚好可以借用它的代码框架。

但是就跟上面复刻项目时介绍的那样,CH32V003 没有硬件浮点支持,因此所有使用了浮点计算的代码都得想办法改成整型计算,并且还需要特别注意,在计算过程中是否会超过 32 位整型有效范围,要不然最后显示出来的结果又是不准确的。

为了调试以及屏幕输出数字,都还不能直接使用系统自带的 printf,要不然一不小心 Flash 空间又超了,因此需要自己封装对应的 printf 来将数字输出到 UART 以及 OLED 屏幕。

另外在实现功率、电压历史记录时,每种数据按一屏统计需要记录 128 个点,一个点使用 2 字节存储,这样一个历史曲线就需要 256 字节,但是 CH32V003 的 SRAM 只有 2KB,因此在开发完其他功能后,剩余 SRAM 已经不多,剩余 SRAM 的空间只够保存一个历史曲线,最终只能选择保留功率曲线。

在开发过程中,通过 PlatformIO 的 Inspect 功能可以快速分析整个项目的 Flash 占用、内存占用,我也是通过这个功能才发现浮点计算需要占用大量 Flash 空间,最终通过删除所有浮点计算代码来节省 Flash 空间。

软件系统小结

虽然对于现代 PC 软件项目来说,系统资源不再是考虑的重点,Electron 这类框架大行其道,但是对于嵌入式领域而言,由于成本限制,资源还是相当紧张的,因此在软件开发上所受的限制也相当大。

不过由于半导体工艺的发展,现在很多 MCU 的资源也越来越夸张,像 ESP32-S3 只需要 20 多块钱有 4M Flash 和 512KB RAM,甚至像 V3S 也只要 20 多块钱,有 64MB 内存,可能以后在成本没有特别敏感的场合,嵌入式开发也不用考虑太多资源限制,只有在极致成本考量的情况下,才会去祼机编程。

项目开源

2023 年,复刻了一些项目,原创了一些项目,虽然并不是什么复杂的项目,还是将其中一些在立创开源平台开源了,希望能对同样是新手村的朋友们有所帮助。

其中 AirCube 算是最敷衍的一样项目了,但是应该算是最实用的项目了,在几个开源项目中被查看的次数最多,在新的一年,也希望能把这个项目再次更新一下,优化一下布线,增加一下 TVOC 检测,以及优化一下外壳,使用一下立创面板定制服务,让它变得更像一个正经的产品。

作为一个没有太多创意的人,还是很喜欢 B 站上各种 DIY UP 主以及立创开源平台上的作者们,这些平台和项目让我有了在软件开发领域中通过 GItHub 学习开发的感觉,可以快速实现自己的想法,从虚拟的软件世界,到真实的硬件世界,从虚拟的二进制字节流,变成看得见摸得着的硬件产品,这种感觉还是很棒的。

高速电路

在 2023 年的电子 DIY 项目,相比 2022 年最大的区别就是多了很多高速电路相关的内容,从使用低速 UART、I2C 以及 SPI,到使用 USB 2.0、USB 3.0、PCI-E 以及 DDR 这些高速通信总线,也在慢慢接近现代的计算机体系。

祛魅

在 2022 年时,尝试复刻过一个 MS2130 USB 3.0 视频采集卡以及基于 VL817 的 USB 3.0 Hub,但是总是失败,一直没办法触发 USB 3.0 连接,只能通过 USB 2.0 使用,这导致我一直对 USB 3.0 有一些恐惧,觉得这是一个很大的门槛,在这一年都没有再去接触过相关的内容。

但是 2023 年,逐渐开始了解到高速电路中的等长、等距、阻抗等概念,也逐渐了解了什么是差分布线,看了好多视频,总算知道当初使用 GPS 模块时,GPS 天线布线要求 50 欧姆阻抗匹配是什么意思,也开始慢慢尝试去复刻一些相关的硬件。

大概掌握这些知识之后,就开始尝试复刻 SL2.1 USB 2.0 Hub,制作完成并且测试之后,速度也能跑满 USB 2.0 480Mbps 的最高速率,在这之后,总算觉得应该是入门了,扯下了高速电路的第一层面纱。

在这里不得不提嘉立创的 阻抗计算神器,使用嘉立创的 PCB 打样服务,配合这个阻抗计算神器,就可以在立创 EDA 里使用这些参数去给高速电路布线了,验证下来也基本上没有什么问题。

这也算是一个祛魅的过程,逐渐不会觉得高速电路是一个可望不可及的目标,也更有意愿去尝试一些更有难度的项目了,例如使用了 DDR 的 H616 开发板。

另外也感受了现代硬件通信协议的健壮性,可能 PCB 板材、布线参数等原因会导致实际指标达不到预期水平,但是主机芯片、从机芯片等还是能正常通信,只是不能跑满带宽,感谢全世界的大牛们打下这样坚实的基础,让我这样的新手也能摸一摸 10Gbps 的通信 🙈。

高速电路实践

在了解了高速电路的基础知识,并且也大概通过一些开源项目验证了 USB 2.0 之后,在 2023 年尾声的时候,终于重新尝试了 USB 3.0 的 Hub 以及 USB 3.0 的 NVME 硬盘盒。

这次 USB 3.0 Hub 使用了最新的 VL822 芯片,并且使用了 VL160 来实现 USB Type-C 接口的正反插识别,除了 VL160 整体外围电路只有电源供电,经过几次 QFN 焊接经历也能比较熟练的把 QFN 封装芯片焊接完成,最终测试下来这个 USB 3.0 Hub 连接了一个 RTL9210 NVME 硬盘盒,读取速度可以跑到 800MB/s,直接硬盘盒读取速度是 900MB/s,速度有一点损失,整体速率超过了 5Gbps 但是离 10Gbps 还差一点,不过也算是满足预期了。

另外这个焊接 USB 3.0 Hub 的过程中还踩了一个小坑,作者在画原理图的时候,忘记将 VL160 的供电连接了,导致在测试的时候在总线上一直无法显示 USB 3.0 Hub,在对比了另外一个 USB 3.0 Hub 之后才发现 VL160 没有供电,最后直接通过一根飞线解决了,也算是小小地体验了一把硬件 Debug。

另外一个就是基于 ASM2362 的 NVME 硬盘盒,同样是支持 USB 3.1 Gen 2 10Gbps 的芯片,相比 VL822 更省事,外围电路只有供电,连 USB Type-C 的正反插识别都已经内置了。虽然中间也因为焊接问题导致设备不识别排查了好久,但是最终也算是完成了。

另外就是 H616 开发板了,因为第一次焊接 BGA 导致验证失败,也没有再继续了,等今年再空些的时候,就继续把它验证完成吧。

10Gbps 级别的高速线路不再神秘之后,就想来综合做点东西了,准备在新的一年,看看能不能用这几个验证过的芯片,去 DIY 一个自己的 USB 3.0 扩展坞出来,毕竟之前写过一篇《六款便携 4K60Hz USB Type-C 扩展坞横向对比评测》,总觉得这些扩展坞有这样那样的不满意。

生产工具

嘉立创

在 2023 年,嘉立创服务群仍然是最大的帮手,立创开源平台,立创 EDA,PCB 打样、立创商城、SMT 等服务,包含了一个硬件产品从设计、开发、制造全流程的服务,并且清晰透明的价格,让个人电子 DIY 爱好者也能享受现代工业生产的强大。

自从开始接触更复杂的电路,逐渐在立创 EDA 里面更多地使用 4 层板,立创 EDA 专业版也能提供比较好的支持,虽然立创 EDA 在 macOS 上的性能兼容性总存在一些问题,但是在反馈后也能持续改进,并且还是免费使用的。希望后续在接触到 6 层板之后,立创 EDA 的性能能更近一步优化,让 PCB 布线更顺畅。

最值得一提的是,立创商城的面板打印服务,结合立创 EDA 专业版中的面板设计工具,可以很方便地去可视化设计亚克力面板,并且价格透明,没有起订门槛,实在是一个让产品显得更专业的好服务。

3D 打印机

在双 11 的时候,终于将服役一年多的创想三维 Sermoon V1 替换成了拓竹 P1S Combo,习惯高速 3D 打印机之后真的再也回不去了,以前需要晚上打印早上再查看结果的 3D 模型验证,现在可以晚上就打两次样来验证结构设计是否合理,大大提高了生产力。

结合拓竹 AMS,即使不使用多色打印的情况下,将它作为 3D 打印材料管理工具也是相当方便的,可以常年放置 4 卷不同材质或者颜色的材料在 AMS 中,在切片时选择需要的颜色或材质,完全不需要手动操作换料,节省了大量时间。

另外相比 Sermoon V1,拓竹 P1S 打印 PETG 的成功率也要高上很多,很多需要韧性的结构件,就可以选择使用 PETG 了。

激光雕刻机

自从用上嘉立创 PCB 打样服务,越来越多使用贴片元件之后, 手工焊接使用针管锡膏来点锡的方式效率也越来越跟不上需求。这个时候使用钢网刷锡膏是一个好选择,但是嘉立创开钢网费用比较高,某宝上卖家制作钢网要便宜不少,但是经常打样的话,光钢网费用也是一笔不小的支出了。

在 B 站上也学习过使用 3D 打印一个钢网,但是实验之后,这个精度实在难以控制,不管是厚度,还是后续要贴 0603、0402 封装的元件,都难以应付。

但是这个用法也启发了我,想起来之前买的 3020 CNC,同时配了一个激光头,再找个合适的材料通过激光雕刻的方式,就可以在家制作一个钢网了。

这种配的激光头并不足矣切割钢片,因此没办法实现真正的钢网,但是用来切割纸片足够了,在试验了很多次之后, 选择了 100g 的牛皮纸,使用下来厚度和精度都还算能接受,对于 0603、0402 封装的元件可以比较轻松的完全刷锡膏操作,对于一些引脚比较密集的元件,相邻引脚的开孔会连接到一起,最终形成一块连续的区域。不过这个问题也不大,使用加热台时加一些助焊剂来辅助焊接就可以了。

使用这种方式焊接贴片元件大大提升了效率,虽然摆元件这件事还是有点费眼睛,只能期待一下以后桌面贴片机能降价和减小体积了。

学习资源

社区

  • 立创开源硬件平台 https://oshwhub.com/

    • 不用多说了,复刻项目最大来源

  • 哇酷开发者社区 https://whycan.com/index.html

    • 主要是全志系列 SoC 的开发讨论

  • HACKADAY.IO https://hackaday.io/

    • 全世界硬件 DIY 爱好者的分享社区

B 站 UP 主

  • JT硬件乐趣 https://space.bilibili.com/33826835/

    • 各种电路底层知识

  • 安泰小课堂 https://space.bilibili.com/2032937667/

    • 示波器知识学习

  • 电子online https://space.bilibili.com/355426434/

    • 一个培训机构老师,有些培训内容挺有用

  • 嘉立创 https://space.bilibili.com/1020770905/

    • 大多是宣传视频

  • DigiKey得捷电子 https://space.bilibili.com/516262565/

    • 有一些元器件使用教程

  • 小鱼教你模数电 https://space.bilibili.com/626469107

    • 挺多单一电路的教学视频

  • 工科男孙老师 https://space.bilibili.com/43584648/

    • 基础知识和模块教学

总结和展望

2023 总结

电子 DIY 这个业余爱好,从 2022 年重搭,2023 年又折腾一年,感觉仍然还是在新手村打转,基本上还停留在复制粘贴的程度,但是相比 2022 年,从只会复制粘贴,到能看懂原理图,从 PCB 只能原版打样,到能改改符合自己需求,还是有一些进步。

在软件开发上,能逐渐突破 Arduino 的限制,了解到更底层的技术,开始去理解 MCU 运行的内部逻辑,掌握基础的嵌入式 OS 使用,例如 FreeRTOS,以及大概明白所谓的寄存器编程是怎么样一回事,毕竟从一个应用软件开发的角度来说,这些东西本来就应该是库存在的。

2023 年也有一些小小的遗憾,没有能完整的做一个产品出来,之前参考 TickrMeter 做的墨水屏产品,也因为 PCB 设计和固件开发问题,一直没能正式上线,坐等新的一年填坑了。

2024 展望

在新的一年,先挖好坑吧:

  • 继续学习高速电路,能把 H616 这个级别的开发板跑通,再看看能不能挑战 RK3399 这个级别的

  • 搞懂 USB PD 协议,实现 PD 电压协商和 DP Alt Mode 切换

  • 做一个 USB Type-C 扩展坞,支持 USB 3.0 10Gbps、2.5G 网卡、读卡器、HDMI 4K60 视频输出

  • 把墨水屏产品重新画一版,打磨成一个像样的产品

突然发现这个流水账已经两万字了,就这样吧,记录一下 2023 年的电子 DIY 历程,希望对同样有兴趣玩电子 DIY 的朋友们有所帮助。


阅读原文查看带链接的博客文章。

↓↓↓↓↓

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存