从零开始草履虫也能学会的开源小项目简易串口助手
有小伙伴让我出保姆式嵌入式项目教程。
你们真是太看得起我了,我其实就会装逼,水平真的是一般般。
不过既然大家有需求,那我就简单来一个吧,有手就行,新手小白也能跟着复刻
其实之前也出过简单小项目,感兴趣的可以回顾一下同一个合集里的。

简易移动串口助手,可以把接收到的串口数据打印到屏幕上。
通过这个小项目可以练习到
软件层面:ESP-IDF的UART(串口)、SPI(ST7735S驱动)、EXTI(外部中断)
硬件层面:ESP32C3外围电路、锂电池充电管理芯片外围电路(TP4056)、电源切换电路、升降压开关电源(TX4401)、一键下载电路(CH340K)
同名公众号私信回复“开源”可以免费下载所有软硬件资料。
今天这篇我从思路开始说起,提到的基本上每一点我都会附上对应内容的文章链接,真正做到保姆式教程,这样才是授人以渔,也方便你们根据自己的想法去修改和优化,我还是小白的时候去复刻人家的开源项目就因为不了解原理而一点都不敢改动。
先来看看硬件设计。
我们先明确我们的目标,我们要做的简易串口助手,就是把接收到的串口数据打印到屏幕上。
还需要有几个按键来进行一些简单操作,比如说修改波特率,发送数据什么的。
这对于单片机来说基本没什么要求,我出过教程的单片机都行,除了STC8不行,因为它连字符库都存不全。

我这边选的是ESP32C3-WROOM-02-N4,性能上是绰绰有余,而且严重冗余。
没关系,它的可拓展性强,使用它的话,后续你们要添加个蓝牙功能、联网功能,再写个微信小程序什么的,直接可以当个简陋的毕业设计了(甚至比一些混子都要好),而且硬件上还不用咋改。
如果是做着玩的,而且手上有其他芯片的也可以替换,这个问题不大,常见的STM32,STC32,GD32都是可以的。
主控芯片选完之后,我们下一个最重要的就是电源。
我们需要设备可移动,所以我们使用的是电池,常见的不是软包电池就是18650,但是我的需求是设备小巧一些,所以18650就被我淘汰了。

挑个便宜的大小合适的买就行。
这种电池额定电压一般都是3.7V,充满电是4.2V,带保护板,过放保护应该是2.7V左右。
因此电池的电压范围是2.7~4.2V,我们需要的是3.3V,所以我们要的是升降压芯片来帮助我们。
如果不太方便的话,用LDO也是可以的,我们要的是3.3V,使用LDO的话大概有个3.5V左右就行了,这样虽然没法榨干电池,但是也能用上个80%,也还能接受,而且外围电路能简单非常多。

不管是选用LDO还是DCDC开关电源,都可以到我的合集里找合适的芯片。
我用的是TX4401,实际上现在我自己做的小玩意,用电池供电的都是用这款,我用到的时候只需要把原理图复制过去就行。

能变压之后我们还需要注意一个问题,那就是电池是要充电的,所以接下来我们要选充电芯片。

我用的是TP4056,也是非常常用的一款锂电池充电管理芯片了。
这方面的芯片我现在写的比较少了,你们去随便搜一下都能搜到合适的芯片。

就比如我上面随便搜个“充电管理”出来的第一个我看咱就能用。
现在充电管理芯片有了,我们得给它充电电源了吧?
一般的选择有两种,一种是DC直插。

但是这种DC底座一般我们是用于直供电的,而不是带电池的。
这种DC底座供多少电,完全取决于我们前置的电源适配器给多少电压,常见的有5V、12V、24V。
就像下面这样。

如果非要用DC底座的话,我们选择5V的电源适配器比较合适。
但是我有更合适的选择,那就是USB。
再进一步,全称是USB Type-C
再搭配上CH340K,可以USB转UART,还能给我的ESP32C3烧程序。

这个时候我们就有了两种电源了,一种是电池,另一种是Type-C的5V。
那就需要有电源切换电路了,常见的而且好用的就是下面这种。

当Type-C没插入时,只有电池(VBAT),PMOS因为有个下拉电阻而默认导通,通过一个拨动开关提供给VIN给系统供电。
当Type-C插入时,PMOS关闭,5V通过肖特基二极管给VIN供电。
这个原理很简单,网上讲这个的很多。
所以我想从其他角度来重新讲一遍。
现在我们有两个电源,一个是5V,另一个是低于5V的VBAT,要求哪个有电就用哪个供电,优先使用5V来供电。
所以这个VBAT是有时候需要有时候又不需要的,因此我们需要一个开关去控制是否需要它。
机械按键肯定是不行,我们不能一直人为去控制是否需要它,所以我们要用的是电子开关。
说到电子开关,那么常规的不是三极管就是MOS管了,用作开关的话还是MOS管比较多,现在我们的关注点就是用哪种MOS管,以及怎么使用了。
再回顾一下需求,有5V则不要VBAT,无5V则需要VBAT,也就是说高电平(5V)不需要VBAT,低电平则需要VBAT。
这就很符合PMOS的低电平导通,高电平关闭(实际情况没那么简单,这里是简化了)。
因此我们可以把5V接到PMOS的G极,而把VIN和VBAT接到PMOS的S和D极上。
问题变成了S和D需要接到谁身上。
我们知道,MOS管的通断情况是G和S进行电压比较,所以理论上VBAT应该接到S极上,G极上的5V或者接上下拉电阻变成0V来和VBAT进行比较与开关PMOS。
但是实际上MOS管一旦导通之后D和S其实就没啥差别了,跟三极管有指定的电流流向不同,MOS管更像一个纯粹的开关。
VBAT接到S,VIN接到D上看起来没问题,但实际上有个问题,那就是PMOS自带的体二极管是从D指向S的,也就是说如果是5V给VIN供电,那么5V则会通过PMOS的体二极管倒灌进电池里。
然而给电池充电,我们是有专门的充电管理芯片的,如果被随意倒灌电流可能会出问题,但是出问题不太可能(因为电压不大,而且电池一般都有带保护板),但是我们不能冒险。
说到5V给VIN供电,此刻5V还没有路径能通到VIN,我们能不能直接把5V和VIN短接呢?这样默认就是5V直接通VIN给它供电。
如果这样的话如果是VBAT给VIN供电,那么VIN就会倒灌回5V,也就是PMOS的G极,那这种时候PMOS是关闭呢还是不关闭呢?
而且我们的充电管理芯片也会出问题。
所以我们的做法应该是将5V通过一个肖特基二极管(二极管也行,但是压降有0.7V,肖特基二极管可能只有0.3V)连接到VIN,这样即可以供电,也防止倒灌,可能有微小漏电流,但是因为有下拉电阻,所以问题不大。
所以一番推理之后,我们决定把5V接到PMOS的G极,VBAT接到D极,VIN(系统供电)接到S极,并且为了保证没有5V的情况下PMOS能正常开启,我们还需要在PMOS的G极上加个下拉电阻。并且通过一个肖特基二极管连通了5V和VIN。
电路方面其他就不讲了,上面每个芯片的内容部分下都有链接,里面有我专门讲解的文章,很详细了,这边就不再赘述。
就简单再提几点。
我是比较喜欢把板子做小一些,所以我的屏幕和板子的大小是差不多的。
因此在开始设计板框的时候我先搜了下屏幕的大小,把尺寸给定下来。

然后再根据某宝商品详情页里的数据自己看看屏幕放哪里,怎么放比较合适。

按键我选用了卧式的,这样方便我们去按。

效果就是上面这样的。

连接外部串口的我选用了3P的接线端子,它的另一面焊针比较长,要注意不要顶住屏幕了。

我是在底部留了一行出来,顺便在左下角留了Logo。
另外就是串口的T、R的丝印,我们的T,我们丝印就标T,我们的R,我们丝印就标R。

最后就是串口的T和R我们串联个电阻,用途是限流与阻抗匹配。
不过其实不加这个电阻也没问题,反正我们就留个焊点上去呗,连个0Ω的也行。
硬件部分不难,都是可以直接抄的。
接下来是软件,软件也不难,也都是可以直接抄的。
我之前讲过1.8寸TFT屏幕的驱动(ST7735S),基础的底层驱动都写好了,想自己写的可以看看之前的文章跟着玩,不想写的直接抄,网上也一抓一大把。
我们要做的就一点,那就是把接收到的数据打印到屏幕上。
基础的ESP-IDF使用方法我就不讲了,之前写过合集,遇到不懂的或者是忘记的往回翻翻就行。
我这边就讲讲思路,因为我自己写的代码也都是很不规范的,仅能做个参考。
我们接收数据,一般是每隔一段时间(短一些),去尝试获取接收到的数据,有就打印,没就忽略。
之前我是直接写在main函数的主循环里的,每隔10ms我就获取一次。
然后在写这篇文章的时候我想了一下,给改成单开一个freertos任务去获取了,本来是懒得改,让你们自己去改的,反正很简单,我寻思着既然很简单,干脆我自己花两分钟改掉得了。

串口方面的代码就很简单,扣掉初始化的和收发的之外基本就没有了。
我们来看看屏幕的驱动代码。
其实屏幕方面的代码也很简单,因为我直接把我之前写好的驱动拿过来用然后自己再根据项目特定需求改改就行了。

(上图的代码不一定要看,可以只看文字思路,也可以到网盘上把代码下载下来看比较全面)
在显示字符串的函数的基础上还需要再封装一层。
先计算出打印多少个字符,再计算出需要打印多少行,然后提前把所需位置上的内容清空(其实可以不清,因为正常运行不会出现内容覆盖的情况),如果现在需要三行的空间,但是剩余空间只有一行了,那么就全屏清空,从头开始输出。
这边就有了可以优化的点了,如果一次性显示的内容一屏幕显示不全,那么剩下的内容就显示不出来了。
我是懒得去优化了,但是你们可以去做分屏处理,反正我们有留出按钮,可以通过按钮来实现翻页功能,只需要划出一块空间作为缓冲区,把最近的一些数据存住就可以。

短暂回到TP4056,其中有俩引脚,CHRG和STDBY,俩正常都是高电平,CHRG是充电的时候会拉低电平,STDBY是充满的时候会拉低电平。
不用的话悬空就行,我这边是把这俩接到单片机上了。

简单判断一下这俩引脚的高低电平就可以得知充电的情况。

如果在充电的话我会显示一个小图标。
充满的话也可以在边上显示小图标,但是我懒得去找了,所以没搞,这也是你们后续可以优化的一个点,反正基础条件都有了。

按键也是,我留了两个,但是只用了一个,用来调整波特率的,而且我只设置了115200和9600这两个我认为比较常用的,你们后续自己再添加也是可以的。
另一个按钮我还没有任何打算,你们可以改成翻页按键来显示更多的内容。
关于软件部分就讲这么多吧,没有什么难点,自己琢磨琢磨都能自己写出来。
自己做一做改一改,对小白来说还是一个不错的练手小项目,起码后续自己也能用的上。
人家调试的时候搬着电脑跑来跑去,你从口袋里掏出个这,这不得迷死实验室里的小学妹(焊锡烟吸多了产生的幻觉罢了)。
说实话,我这玩意就是一破玩具,勉强算是个半成品,所以我再总结一下可优化的点,你们优化完可以当毕设用,鸣谢的时候别供出我就行。
1、屏幕太小,内容太多的话会出问题,可以配合按键进行分屏显示。
2、通过蓝牙传输到手机软件上,手机能存能显示的内容更多(主要是为了应付毕设,现在毕设都得要有手机软件,有个小程序也行)
【ESP-IDF+微信小程序】手把手教你编写可以进行蓝牙通信的小程序
3、充电状态的图标显示。
4、波特率调整设置。
5、有能力的整个3D打印的外壳,那就真可以拿去应付毕设了。
6、除了打印接收到的数据之外,也可以发送数据出去,具体发什么出去,什么时候发,你们就自己思考一下吧。
就先这样吧,我还是宠你们的,你们叫我整个保姆级嵌入式项目,我马上就连简历也不投了,应付了一个小玩意出来给你们。
你们还有什么想法可以告诉我,我看看能做就做,然后再出个教程出来。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)