标签存档: DIY

全开源!使用 7 毛钱的单片机 DIY USB 电流表教程,入坑硬件设计、固件开发、外观建模

之前已经连载完了 DIY USB 电流表的所有章节,这里汇总介绍一下这个项目,希望对电子 DIY 感兴趣的朋友们有所帮助。

这个 DIY USB 电流表的所有内容都已经开源,包括:

  • 硬件原理图
  • 硬件 PCB 布局布线
  • MCU 固件代码
  • 外壳 3D 模型 STL 文件
  • 面板生产文件

在文末可以找到开源项目的所有资料,其中硬件部分在立创开源平台,其他部分在 GitHub 中。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

项目介绍

这是一个基于沁恒 CH32V003 和德州仪器 INA219 的 DIY USB 电流表,使用 CH32V003 作为主控 MCU 来读取和显示电压电流数据,INA219 作为电压电流监测计,并且通过两个按键来进行交互。

主要元件

  • MCU:CH32V003
  • 电压电流监测:INA219
  • 显示设备:SSD1306 OLED
  • 输入输出:USB Type-C
  • 采样电阻:10mR

功能设计



阅读全文 »

DIY USB 电流表(10):完结篇,外壳和面板设计

在截止到前一篇 《DIY USB 电流表(9):Flash 模拟 EEPROM 存储累计电量》 后,我们已经完成了 DIY USB 电流表的所有硬件和软件开发工作,接下来就需要设计一个稍微正经一点的外壳将 PCB 包装起来,除了更好看一点的同时,还可以防止裸露的 PCB 接触到导体之后造成意外短路的情况。

另外,为了体验一下嘉立创的亚克力面板定制服务,这次的 USB 电流表外壳采用面板 + 外壳的方式来完成,PCB 通过 M2 自攻螺丝固定在 3D 打印的外壳上,再将面板通过双面胶粘贴到外壳上。

当然我也是 3D 建模业余选手,只会基本的长方体布尔切割操作什么的,设计的外壳主打一个能用就行 🙈。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

导出 PCB 3D 模型

为了更好的确定外壳的尺寸和各个接口、按键的位置,可以先在立创 EDA 专业版中导出 PCB 的 3D 模型文件,这样在建模软件里可以有更直观的参考。

diy-usb-meter-10-1

外壳设计

最终外壳基本上就是根据 PCB 的外形设计了一个 1.7mm 厚,带圆角的边框,并且在两个按键的位置预置了两个和外壳一体的按钮。

diy-usb-meter-10-2

PCB 上的按键为了能给按键手柄留出行程空间,是突出 …

阅读全文 »

DIY USB 电流表番外篇:使用 PlatformIO Inspect 分析和优化固件体积

在前一篇 《DIY USB 电流表(8):绘制功率曲线》 的开发过程中,我还碰到一个额外的问题,在最终开源的代码中虽然已经解决了,但是在文章中并没有提到,这就是编译固件体积超出 Flash 限制的问题。

这里就分享一下碰到 CH32V003 固件编译后体积超过 Flash 如何查找原因、解决问题的过程。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

编译后固件体积超标

在定义了功率历史数据缓存的变量,添加数据存储、屏幕画点驱动、按键检测等代码之后,照常编译一下固件,检查一下代码有没有错误,却突然发现编译出错了:

diy-usb-meter-inspect-1

一看错误原因: region 'FLASH' overflowed by 772 bytes,这就意味着编译完的固件体积已经超过了 CH32V003 的限制,毕竟CH32V003 只有 16KB 的用户代码空间。

在前几篇中编译完成也可以发现,固件体积已经快到达极限了,没想到这么快就已经超出不够用了。

排查固体体积构成

幸好 PlatformIO 提供了 Inspect 功能,可以用于分析固件编译产物中的各种资源使用情况,包括 Flash 占用、内存使用、静态代码检查等,通过这个工具,就可以快速分析固件编译完后,哪块代码或资源占用的体积最大。

PlatformIO Inspect 文档可以参考这里: https://docs.platformio.org/en/latest/home/index.html#project-inspect

使用 Inspect

要使用 PlatformIO Inspect 功能很简单,直接在 PlatformIO 侧边栏中通过菜单打开 …

阅读全文 »

DIY USB 电流表(8):检测按键和绘制功率曲线

在前一篇 《DIY USB 电流表(7):读取和显示 INA219 电流电压数据》 中,我们已经基本完成了这个 DIY USB 电流表的核心功能开发,已经可以在屏幕上显示当前电源输入电压、负载的电流、功率以及累计电量等数据,如果不需要更多功能,已经可以结项了 😃。

但是如果想拿这个 USB 电流表在一些分析场景使用,那么还需要再增加一些功能,例如,是否可以通过这个 USB 电流表来记录给手机充电时的功率曲线,这样可以知道手机的快充是什么样的节奏来完成充电的。

这次我们就来完成这个功能,记录负载的功率历史,并绘制成曲线来显示功率趋势。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

准备工作

在开始绘制功率曲线之前,同样有一些准备工作需要进行,例如在多了一个功率曲线页面之后,原来的电压数据页面怎么办,怎么切换多个页面?

在最早的功能设计中,我们已经给这个 DIY USB 电流表添加了两个按键,现在就可以通过这两个按键来完成页面切换操作了。

按键检测

按键原理图

在原理图中可以看到,两个按键已经接到 CH32V003 的 PD2、PD3 引脚,在初始化代码中,加上初始化两个引脚为输入模式。

diy-usb-meter-8-1
diy-usb-meter-8-2

按键状态结构体

为了维护按键的状态,我们先定义一个结构体来维护状态。在 ButtonState 结构体中,定义了一个 ts 字段,这个用来记录按键状态变化时的时间戳,这样可以在状态变化时,例如从低电平变化为高电平时,计算出来按键按下去的持续时间,如果超过 3000 毫秒,就认为是长按事件。

#pragma once

#include "drivers/clock.h"
#include "drivers/gpio.h"

#define BTN_LEFT    0
#define 


阅读全文 »

DIY USB 电流表(6):点个屏,使用 I2C 驱动 0.96 寸 OLED

在前一篇 《DIY USB 电流表(5):使用 VSCode + PlatformIO 搭建固件开发环境》 中,我们已经完成了开发 USB 电流表固件的开发环境搭建,整个开发环境基于 Visual Studio Code + PlatformIO 来完成,并且跑通了一个基本的 Demo,验证了开发环境。

固件开发的第一步,我们先将最终输出数据的显示设备,0.96 寸 OLED 屏幕给点亮,这样在后续开发过程中,也可以通过屏幕来显示一个调试数据信息。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

准备工作

在开始开发之前,我们需要做一些准备工作,使用 PlatformIO 创建项目并不包含很多使用示例,例如如何使用 GPIO,如何使用 I2C 总线等,并且使用 platform-ch32v 时,它的函数定义与官方示例也不太相同,因此我们需要找一个类似的开源项目作为参考,从而可以更快速地完成 USB 电流表的固件开发。

参考项目 CH32V003-GameConsole

项目地址:https://github.com/wagiminator/CH32V003-GameConsole

diy-usb-meter-6-1

我就从 CH32V003-GameConsole 这个项目了解到 CH32V003 这款 MCU,并且开始尝试使用的,刚好这个项目本身包含了 0.96 寸 OLED 屏幕的驱动以及 GPIO、ADC …

阅读全文 »

电子 DIY 入门知识整理:电源芯片 LDO、DC-DC

在开始继续开始玩电子 DIY 之后,就逐渐转到自己制作 PCB 并且使用贴片元件代替模块来制作产品了。之前一直使用的分立元件,都是用杜邦线连接各个成品模块,在换成贴片元件之后,对这些元件的各种封装规格什么的完全是一脸迷糊。

前面一篇 《电子 DIY 入门知识整理:电阻、电容、电感》 介绍了电阻、电容、电感的介绍、封装和选型,这次继续来介绍电源相关的内容,主要是 LDO 和 DC-DC,分享给同样开始想使用贴片元件进行电子 DIY 的朋友们。

PS. 我作为一个新入门电子 DIY 玩家,以下都是从一个初学者的角度整理的,并且主要介绍我使用过,稍微了解一点的元件,如有错误还请指正。

前言

对于设计一个电子电路来说,可能三分之一工作内容都是在确定电源供应、电源对电路的干扰、电源的稳定性等相关的内容。

在接触过几款 Linux 开发板的原理图以及 PCB 设计后,大概总结了一下发现,其实这些开发板中相当一部分内容都是跟电源相关,例如对于电压会有 3.3V、2.5V、1.8V 等不同的需要,对于每一种电压,也会有不同的电流需求,有一些 SoC 甚至会对上电时序也有一定的要求,因此搞定电源的设计之后,一般 Linux 开发板三分之一的工作已经完成了。

当然对于简单的电路来说,基本上可以 AMS1117 3.3V 走天下,在一些特殊的场合再考虑使用 DC-DC 电路。

LDO 低压差稳压器

LDO 作为常见的电源器件在电子 DIY 还是很常用的,很多 MCU 或者芯片的工作电压都在 3.3V,如果使用 USB 或者电池供电,一般都会高于 3.3V,这个时候就可以使用 …

阅读全文 »

DIY USB 电流表(5):使用 VSCode + PlatformIO 搭建固件开发环境

在前一篇 《DIY USB 电流表(4):PCB 焊接与调试》 中,我们已经完成了 USB 电流表的焊接,有了硬件之后,就可以开始给它注入灵魂——开发固件了。

首先完成开发环境的搭建,由于我平时都是使用的 MacBook 作为开发机,因此这里以 macOS 作为开发平台来介绍开发环境的搭建。当然 Visual Studio、PlatformIO 这些本身也都是跨平台的,在其他系统配置这一套开发环境的步骤也类似,也可以参考。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

开发环境介绍

Visual Studio Code

diy-usbmeter-5-1

项目地址:https://code.visualstudio.com/

Visual Studio Code 是一款由微软开发且跨平台的免费源代码编辑器。该软件以扩展的方式支持语法高亮、代码自动补全、代码重构功能,并且内置了命令行工具和 Git 版本控制系统。用户可以更改主题和键盘快捷方式实现个性化设置,也可以通过内置的扩展程序商店安装其他扩展以拓展软件功能。

一般来说,做嵌入式固件开发工作,通常会在 Windows 系统上完成,并且有完整的 IDE 可以使用,例如像 Keil。或者像在这个项目中所使用的 MCU CH32V003,沁恒也提代了一个 IDE MounStudio。

但是因为现在很多嵌入式开发相关的工具链都提供了跨平台的平台,编译器、烧录程序等都可以直接在 macOS 平台上使用,因此现在使用 macOS 来作为嵌入式开发平台也并没有太大的阻碍。

我在 macOS 上使用的编辑器是 Visual Studio …

阅读全文 »

电子 DIY 入门知识整理:电阻、电容、电感

在去年接触到嘉立创免费打样,开始继续开始玩电子 DIY 之后,就逐渐转到自己制作 PCB 并且使用贴片元件代替模块来制作产品了。之前一直使用的分立元件,都是用杜邦线连接各个成品模块,在换成贴片元件之后,对这些元件的各种封装规格什么的完全是一脸迷糊。

现在玩了一年多,总算大概知道一些基础知识了,这里整理一下分享给同样开始想使用贴片元件进行电子 DIY 的朋友们。

PS. 我作为一个新入门电子 DIY 玩家,以下都是从一个初学者的角度整理的,并且主要介绍我使用过,稍微了解一点的元件,如有错误还请指正。

封装基础概念

diy101-package

在使用成品模块,或者分立元件时,一般都不用太考虑封装,它们的引脚可能本身就符合万用板上的引脚间距。

但是在使用 PCB 和贴片元件时,就需要了解每个元器件的封装了,一般画 PCB 时有一个重要的步骤就是给 PCB 中所使用的元器件画封装。幸好立创 EDA 结合立创商城,给大多数元器件已经画了封装,在立创 EDA 中可以直接使用。

元件封装(Footprint)或称为元件外形名称,其功能是提供电路板设计用,换言之,元件封装就是电路板的元件。 封装主要分为DIP双列直插和SMD贴片封装两种。

英制例如 0805、0603

对于常用元器件,例如电阻、电容,这些都是使用的 0805、0603、0402 这样的数字来表示封装大小,这里面的数字都是英制单位,例如一个 0805 封装的电阻就表示这个电阻的尺寸大约为 0.08 inch 0.05 inch,对应到公制单位大概是 2.0mm 1.25mm。

公制例如 3225、2520

另外一些元器件也会使用公制单位来表示封装尺寸,例如晶振中的 3225 表示大小为 3.2mm * 2.5mm …

阅读全文 »

DIY USB 电流表(4):PCB 焊接与调试

在前一篇 DIY USB 电流表(3):PCB 免费打样详解 中,我们已经完成了 PCB 的下单,坐等几天就可以将生产完成的 PCB 拿到手了。在 PCB 到手之前,可以先把焊接组装需要的元器件先采购起来,毕竟这个也需要两天时间才能快递到手。

等到焊接 PCB 所需要的元器件都到手之后,就可以将我们的 PCB 组装起来了。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

元器件采购

在采购元器件前,我们可以先在立创 EDA 中将物料清单(俗称 BOM)导出,在立创 EDA 中使用 导出》物料清单(BOM)... 菜单就可以导出 BOM。

物料清单 (BOM),也称为产品结构,是构建、制造或维修产品或服务所需的所有物料的列表。物料清单充当集中式源,包含从原材料阶段制造产品所需的所有信息。

diy-usbmeter-bom-1

BOM 导出后是一个 Excel 文件,打开后就可以看到它包含了这块 PCB 所需要的全部相关元器件:

diy-usbmeter-bom-2

如果直接在立创商城购买这些元器件,可以在导出 BOM 对话框中选择 元件下单,这样就会将 BOM 上传到立创商城,并开启 BOM 配单服务,可以自动根据 BOM 表中的内容匹配到合适的元器件,省去了一个一个查找并添加到购物车的过程。

diy-usbmeter-bom-3

当然立创商城购买元器件的价格并不一定是最优的,淘宝上很多商家也提供配单服务。不过立创商城的东西比较齐全,对于一些低价元器件,还是可以考虑直接在立创商城一站配齐的,对于差价比较大的元器件,我也都是选择在淘宝上购买。

例如这个 …

阅读全文 »

DIY USB 电流表(2):PCB 布局布线

在前一篇 《DIY USB 电流表(1):元件选型和原理图绘制》 中介绍了 DIY 一个 USB 电流表的需求列表,以及将它所需要的元件确定下来,并在立创 EDA 中将整体功能的原理图绘制完成,现在就可以开始在立创 EDA 中进行布局布线了。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

布局布线效果预览

pcb preview

转换原理图到 PCB

通过立创 EDA 的 设计>更新/转换原理图到PCB 菜单,就可以将原理图中所有元件放置到 PCB 设计页面中,并且已经都将每个元件的网络配置且连接好。

pcb design 1

布局布线

设计预期外形

我们首先需要做的就是将元件根据用途大概放置到对应的区域,先来根据目标的形态绘制一个草图。

pcb design 2

初步确定布局

首先使用放置板框功能,画一个 PCB 的边框,可以根据实际预期 PCB 大小,将板框设置成那个尺寸,例如这里先设置成 45mm*70mm。

这里可以使用立创 EDA 的交叉选择功能,在原理图中选择对应功能区域的元件,然后按 Shift+X,就可以在 PCB 设计页面中选择对应的元件,方便将归属于同一功能的元件都选中,然后放置到目标位置去。

pcb layout

这样就可以大概将整体布局确定下来,后续就可以在这个基础上进行布线了,当然最终效果会比这个紧凑很多,可以在布线过程中不断调整。

精细调整布局

在初步确定布局之后,就可以根据每个模块的功能,将它们目标的布局确定下来,例如这里 DC-DC 模块,就可以根据一般 DC-DC 模块布局的需求,先把相关电阻、电容、电感的位置放置完毕,再进行最后的布线。

像 …

阅读全文 »