2023 年,作为软件开发出身的我,做了两款智能硬件产品,注册了两个专利,「硬」气了一把。
你是否也喜欢鼓捣些硬件,是否对电路板是如何做出来的感到好奇?欢迎跟我一起,揭开硬件开发的神秘面纱,看看硬件工程师如何零基础入门。
首先声明,这里所说的硬件,更偏向于 ARM 单片机及嵌入式开发。我不是硬件工程师出身,属于边学边干;可正是如此,我的视角可能更贴近真实、更容易帮你上手。如果哪个环节有更好的做法,欢迎行业内的朋友指正。
硬件领域很大,又很繁杂,从何说起呢?这是个问题。
首先,还是从需求出发。明确产品要实现哪些功能、有哪些约束条件,有了这些硬性标准,问题的边界就被大大缩小了。
这里,以它适智能跑轮为例,从头到尾,走一遍硬件研发的历程。先说一点,产品的研发不是一条直线,而是不断迭代、甚至重头再来的过程。为了描述方便,这里假设一切是一帆风顺的,只按最终的方案来描述。不过,考虑到商业性,一些地方不会说太细。
它适智能跑轮,核心的需求,是记录数据,然后通过蓝牙传递出来;主要的约束,是低功耗、长待机。那么这颗芯片:
然后,就是其他核心元件,包括蓝牙芯片、霍尔传感器等。
之后,就是确定产品的交互方式,比如显示、按键、声音等。
再之后,就是确定电源方案。电源对于整个电路设计,是非常重要的。事实上,对最终的电路来说,有一小半的元件,都是电源相关的。具体到这个产品,要支持锂电池供电、Type C 充电、LDO 降压稳压、测量锂电池电压等等。
到这里,主要的芯片及方案就基本确定了。接下来,就是搭建具体的电路、设计 PCB 。
这时,就要面临 EDA 的选择。所谓 EDA ,类似于软件开发中的 IDE ,就是电路设计所需要用到的软件。这里我选择的是 立创 EDA,它是国产的、免费的,简单易用。这对于个人或小团队开发来说,非常重要。商业 EDA 是非常昂贵的;当然,我知道有所谓特别版。但作为软件开发出身的我,对正版、免费有天然的亲切感。
确定好工具后,可以开始设计电路图了。
设计电路图,主要靠两样:电路基础知识、芯片数据手册。基础知识自不必说,比如电阻、电容、三极管、MOS 管等基础元件的使用。对于复杂的芯片,主要是参考其数据手册的典型电路,针对自己具体的场景进行调整。
这一步还挺好玩的,把一堆元件摆出来,然后用线连啊连,像正极连正极、负极连接地,连着连着就好了。当然,步骤是这么个步骤,实际不会这么容易。
一般的电路图,大概长这样:
电路图设计好之后,就是设计 PCB ,也就是印刷电路板。这一步同样考验功力,也更加耗时。事实上,不考虑芯片选型的话,PCB 布板所花费的时间,比电路图长很多。
这一步,说简单也简单。就是确定后电路板的外尺寸后,把所有元件排排好;并参照电路图,把各元件通过走线连接起来。
最直接的难点是布线。不考虑多层板的话,电路板相当于一个平面,而平面上的线是不能交叉的。这使得必须很恰当地摆放元件,才能避免交叉。有时,还得反向修改电路图。当然,多层板可以改善这一点,但成本高,且设计难度加大。如非必要,常见的还是用双层板,也就是有正反两个面可以走线。
当然,PCB 板还有很多其他难点和要注意的地方,比如要适配外尺寸及开孔、天线及电磁屏蔽、散热、避免回路、差分信号线等等,这里就不展开了。
一般的 PCB 板,大概长这样:
电路板设计好之后,就可以 制作 PCB,俗称打板。这里依然推荐嘉立创,每月有两次免费打板的机会,付费也只是 20 元起;而且很快,最快隔天就可以收到。
打板之后,就要焊接元件。这里又面临一个选择,要么是让嘉立创这样的工厂替你完成 SMT 贴片,要么自己焊接。二者的优缺点很明显:自己焊,省钱、灵活、不用等,但花时间,且一些很小、引脚很多的元件,不好焊;第三方 SMT 则刚好相反。
一般来讲,前期、以及简单的电路板,可以自己焊;后期还是倾向于 SMT 服务。
焊接好元件后,就类似这样:
电路板制作好后,就要刷固件。当然,有些简单的电路,是不需要刷固件的。刷固件,就相当于给硬件装个操作系统。这里暂时略去固件的开发。
具体的,电路板上留刷机接口,配合专用的刷机工具、上位机,就可以将固件写入芯片的 Flash 存储。
刷好固件后,就要开始测试。简单的,就是先测试下正负极电阻,看有没有短路。没问题可以上电,看电路有没有按预期工作。如果有预留测试点,就测量测试点的电压等。也可以借助示波器等工具进行测量。
如果遇到问题,不要慌,这太正常了。一般来讲,就是先缩小问题的范围。可以用拆焊等方式,去掉不必要电路的影响,只看出问题的那部分,方便排查。
对于固件的测试,可以像黑盒一样观察硬件是否按预期工作,也可以像白盒一样进行调试。只是硬件的调试,远没有软件随便加断点那么轻松。
定位问题,找出解决方案,就可以进行下一次制板。当然,也可以根据实际使用中的不便或问题,对电路进行改进。
经过几轮迭代,电路板基本稳定,可以组装成原型机,开始使用场景的测试。
这时,通常要制作产品的外壳。最好自己有一定建模能力,这样可以设计产品的外壳、3D 打印,方便很多。
如果只是简单的外壳,可以用嘉立创的工具,可以比较简单地生成 3D 模型。如果有团队,可以和同事一起配合进行设计。如果已经有外观设计,就可以进行结构设计。比如,如何固定电路板、如何暴露交互接口等。
假设经过一段时间测试,原型通过了,产品也到了规模化生产阶段,就要开始批量生产电路板了。
通常,不是重新上传设计文件下单,而是返单上一次被验证过的电路板。这样更可靠,避免手抖出错,导致批量生产的电路板报废。
电路板批量生产完后,还面临一个繁琐的流程:刷固件。之所以说繁琐,主要还是量。
试想一下,如果刷一个电路板需要 1 分钟,听起来不多吧?可要刷 1000 片呢,那就是 16 小时。不吃不喝,从早上 6 点,刷到晚上 10 点,吓人不。当然,实际没这么慢,但基本是这个数量级,快不了太多。
然后,就可以交付给工厂,进行包装生产了。继而转发至仓库,用户在电商平台下单后,就可以快递出去了。
等用户收到后开始使用,这时能做的,就是 双手合十,祈祷不要出问题。因为一旦出问题,大概率不像软件一样,升级个版本就能解决,很可能要召回。
说到这里,就要提一个话题:OTA ,就是用户可以远程升级固件,来解决问题、或增加功能。这个其实很重要,尤其是在前期、尚未经过大规模用户实测时。OTA 可以在不召回的情况下,解决一部分问题,减少损失。
如果一切顺利,用户用起来很开心,满足了实际需求,带来正面评价时,就是 产品人最开心的时刻。
至此,就是硬件产品的基本流程。
上面只是走马观花地介绍硬件的基本流程,挂一漏万。下面补充一些细节,解释下为什么 硬件工程师通常发量不多。
玩芯片的第一步,都是点亮一颗灯;这个操作,相当于软件领域中打印出 Hello World。当然,做得多了,总有「点亮」芯片 的时候,哈哈。
最好边学边练,做些小东西练手。
总之,制作自己用得上的小工具,是不错的开始。
从软件和生态上来讲,可以从 Arduino 入手。相对复杂的,就是树莓派以及各种衍生派。
芯片选型非常重要,最考虑经验、能力。而且一旦定了,之后基本不太可能会改;如果改,意味着要兼容两套方案、非常恰当地处理芯片及产品库存,总之很麻烦。
芯片的生态很重要。如果一家公司的芯片被广泛使用,通常意味着它更成熟,隐藏的问题更少。如果选一家小厂的芯片,可能看起来更便宜,但配套的开发软件不好用,市场上不容易找到使用该芯片的开源方案,等等。更关键的,可能有隐藏的问题。而这个问题,一旦量产后才发现,将是非常痛苦的:召回的话,血亏;不召回的话,会有持续不断的用户问题。像 STM32 、兆易创新 GD32 这些系列,都是比较成熟的选择。
还有一个问题,就是 开发效率与运行效率的平衡。对于电脑或手机上的软件开发,通常不需要担心性能问题,CPU 、内存、电量管够。而单片机开发,则没这么幸运了。通常,嵌入式使用 C 语言开发。可惜,实在不想这把年纪了,再去啃 C 语言。
最后选择了 合宙 Air101 这颗主芯片。很大的原因,是它支持 LuatOS 开发。简单地说,就是在芯片上运行了一个 Lua 虚拟机,或者说运行环境。接下来,使用 Lua 这门脚本语言,就可以调用库函数,快速完成生产代码的开发。关键的,它还支持 OTA 升级。主流嵌入式操作系统 RTOS ,包括μClinux 、FreeRTOS 等。
有时感觉,硬件产品不是做出来的,是攒出来的;从巨大的元件库中选型,各种排列组合,最后出产品。
芯片的采购也比较关键。尤其到后期,产品已经上市,准备批量返单时,如果发现一个关键的元件缺货了、涨价了,就很头痛。如果换芯片,又要有比较长周期的测试。
延伸来说,在硬件众多配件中,哪怕缺少一个螺丝,也会决定最终产品能否量产。过多屯货,又会压资金;之后如果换方案,很可能屯的芯片就无用了。因此,供应链管理很关键。比如,对于汽车这种有 N 多配件的产品来说,供应链管理的难度极大。
做硬件,手工焊接是基本功。虽然嘉立创这类平台,打样已经比较便宜了。但在开发阶段,频繁测试,花费还是不小。更关键,来来回回比较花时间、影响效率。很多时候,还是得撸起袖子自己焊。
焊接中,植锡、放元件,是很枯燥的。风枪一吹,爬锡过程很解压。小元件、多引脚的连锡,是最头痛的。
当然,还有 焊台最佳伴侣:烫伤膏,别问我是怎么知道的…
硬件佬有很多配件、工具,比如各种型号的电容电阻等元件,万用表、示波器、功率计、焊台等。
电压电流这些,肉眼是看不见的,需要工具来测量。
对于一款硬件产品,电路板只是其中一个环节,作为一款完整的产品,要考虑的东西还有很多。比如,包装、说明书、宣传文案配图视频、生产备货、等等。
产品原型做出来,离规模化上市,还差很远。什么东西一上量,性质就变了。
工厂生产,有很多不可控的因素,有很多妥协。事实上,初期设计 100 分的产品,最终批量上市时,能妥协到 70 分以上,已经很不错了。
第一次批量生产固件,还是很慌的。可能电路设计有问题,也可能生产过程中有缺陷,担心投入的真金白银,变成无用的电子垃圾。
做了硬件,真的相信,第一代产品通常是有问题的。硬件比较复杂,使用环境和方式多种多样;很多问题,只有在用户使用过程中才能发现。而发现了问题,很多时候无法通过固件升级来解决,只能寄希望下一代硬件改进。
当然,如果大家都不支持第一代产品,也就不会有第二代。这世界总需要有人第一个吃螃蟹,也时常奖励吃螃蟹的人,看大家怎么选择了。
抄袭哪都有,硬件也一样,术语叫 抄板。怎么应对呢?很难。
打磨丝印,算是比较基础的操作。更有效的,是开发有固件的硬件,也就是硬件里是有代码、有固件的,这种就不好直接抄。
硬件很难避免物理开关。本来想,硬件做得优雅,就不需要物理开关。现在看,意外情况总是有,还是要考虑售后的问题。认怂,给智能模块加个物理 Reset 开关。其实,很多硬件设备上都有此类开关,比如路由器就比较常见。
软件与硬件的视角不同。
在软件人眼里,0 就是 0 ,1 就是 1 ,这不是再清楚明白不过的(当然,这里考虑的是整形数、不是浮点数)。进而,这也是一般人的理解。
在硬件人眼里,还真不是。像浮点数,1 可能是 0.998 ,也可能是 1.02 ,也可能是 > 0.5 。或者说,所有的值都有波动、有误差、有范围的。
比如,在存储空间很小的芯片中写代码,会遇到这样的问题:需要考虑 2100 年后的事吗?
如果需要,则需要存储完整的年份,比如 2023 ;如果不需要,则可以省点存储,比如只存 23 。
BLE 蓝牙传输比较慢。实测有一次通过蓝牙传输 552KB 的文件,用时 7 分钟(436s)。并且,蓝牙不稳定、传输的可靠性不高;传输过程中,很容易出现丢数据、传错的情况。
由于看不见摸不着,而电路又以光速运行,很容易产生诡异的问题。
这些问题,很多是自己经验不足(当然,没有谁天生经验就足,都一个一个坑踩过来的),有的是芯片本身有问题,有的数据手册压根没介绍,等等。
不同颜色 LED 的功耗差异非常大。单从电流上看,R/G/B 三者的电流大概是:1.5mA/1mA/0.8mA 。但事实上,在此电流下,三者亮度大概是 G >>> B > R 。相同亮度下,绿色 LED 是最省电的。
和已有能力组合,可以增加很多可能性。
兴趣归兴趣、炫技归炫技,作为一个产品,满足真实需求,才是最重要的。
和纯软件开发相比,硬件有不一样的乐趣。入门并没那么难,值得你来尝试,欢迎入坑。
101
helloeather 324 天前
不错,学习了!
|
103
huoxing9888888 324 天前
@quietjosen 学习能力真强,全职搞吗?
|
104
quietjosen OP @huoxing9888888 工作的一部分。
|
105
quietjosen OP @xieren58 是,硬件确实利润低,除非上规模,或者小众的定制化,但那上限太低。
|
106
zhaodong 324 天前
厉害,虽然看不懂,但还是认真看完了。
|
107
SmallPlus 324 天前
本科自动化,焊板子是基本功,毕业转码了。当时考虑硬件工程师没软件发展好
|
108
darkengine 324 天前
入门从打板开始太难了, 搞个 Adrino 或者树莓派, 从折腾各种外设/传感器/显示屏开始
|
109
quietjosen OP @SmallPlus 其实,三十年河东,三十年河西。现在软件开发裁员挺多。
|
110
quietjosen OP @darkengine 恩,从开发板点灯开始,比较合适。
|
111
yongzhenchen682 324 天前
想起当初 89c51 手撕面包板 画 pcb 仿真 的时代,一眨眼 10 几年过去了。
|
112
quietjosen OP @yongzhenchen682 51 啊,那确实有年代感了。
|
113
silentsky 324 天前 via Android
学习了 有点用
|
114
mrfox 324 天前
再提个问题,比如拆解一个成品,有没有可能将芯片中的固件提取出来(有个旧阅读器应该电池死了,想把它的屏幕单独拿出来用(原系统是 linux 系)
|
115
hytirrb 324 天前
哥你开始是咋入门的,感觉硬件调试还挺麻烦的
|
116
quietjosen OP |
117
quietjosen OP |
118
SantinoSong 324 天前
感谢楼主,收获颇多。我有点想入手这个方向,做一些小物件。可否请教一下?
我自己想做一个小的电动模型,大小大概是一本书那么大,模型上面有两个组件,一个彩色的灯(比如紫色),我希望可以控制它间歇亮起;一个转盘,可以节奏转动比如隔 3 秒转一圈,然后希望的效果是,转盘转一次,上面的灯就亮一次。对功耗没有什么太大要求,能够用电池或者可以充电最好。 我是硬件小白,我该怎么入手比较好呢? |
119
rouwann 324 天前
电子专业表示大学课程都学过
|
120
quietjosen OP |
121
SantinoSong 324 天前
@quietjosen #120 我希望整个流程是自动的,所以肯定希望是电机,就是希望转盘隔几秒转 360°,然后旁边的灯同时闪一下。我是完全不懂,这个东西用你上面提的 Arduino 开发板可以实现吗?
|
122
quietjosen OP @SantinoSong Arduino 可以,用步进电机驱动。
|
123
hawei 324 天前 via iPhone
太强了…我打算入坑了
|
124
leirenbb 324 天前
赞 从硬件转到软件的路过。。。
|
125
Mde 324 天前 via Android
以兴趣的目的入坑了硬件开发,硬件开发还是挺有意思的,为自己的想法提供一个实物载体,不过目前水平也就画画两层板而已😂
|
126
firemeteor 324 天前
手抖的人真的玩不转烙铁,一直只敢小打小闹,不敢正经入坑。曾经修一个 micro usb 座子焊到我要崩溃...
|
127
GeruzoniAnsasu 324 天前
@sankooc 这种东西做起来倒是不难,不过淘宝搜了一圈还真没卖的。 假如做一个这样的产品,你觉得自己肯出多少钱来买?
|
128
no13bus 324 天前
|
129
quietjosen OP @hawei 哈哈,欢迎入坑😀
|
130
quietjosen OP @Mde 两层板可以了呀,能干很多事情了。我也是两层板水平,哈哈 [Shake]
|
131
quietjosen OP @firemeteor Type C 母座,开发我也焊不好;后来用焊䯧,就好多了。
|
132
quietjosen OP @no13bus 这个网站介绍得挺详细的,可以跟着看看。难不难这各问题,答案是相对的。
|
134
mrfox 323 天前
|
135
Geo200 323 天前
写的很好,想离线保存这个文章,有什么好办法吗
|
136
quietjosen OP @Geo200 不敢当。文章没了,直接找我也行 😂
或者,可以在微信公众号里查看、收藏、保存到腾讯文档等、导出 PDF ,总之方法挺多。 https://mp.weixin.qq.com/s/FFtgswdjZ1zuHerD7K-4-w |
137
LamKingTak 323 天前
顶一个!
|
138
morgan1freeman 323 天前 1
@mrfox #45 esp32 上网找一下 usb 或者 蓝牙 模拟键盘的代码,然后把几个 io 跟按键 面包板连接起来,触发 IO 中断的时候 让 mcu 的蓝牙 发消息给电脑就行
这里有一个 chatgpt 的例子 |
139
wraithcorps11 323 天前
点赞
|
140
morgan1freeman 323 天前
https://github.com/fqdeng/esp32-pc-remote-switch-button
这里分享一下我的远程 button 因为黑苹果没法远程唤醒 所以 usb 连着电源搞了一个 远程按钮 其实这么多年来,c51 stm32 esp32 都玩过,说到底嵌入式入门成本高,还是工具链跟软件抽象的问题 mcu 跟外围通信一直没有好的封装,一堆的 CAN I2C 没法像软件一样封装好给上层应用,几乎每一个 mcu ,一个公司都是各自为战,没有好的 sdk 跟封装,很多东西一摸索,啥资料都没有,早一点 c51 的 datasheet 都是乱写的,全靠老师傅自己摸索,在 08 年那个年代,很多 c51 的资料 几乎都是没有的,老师傅都是一个一个祖传的 c 文件 手把手相传 不像 pc 软件 从链路层 ip 层 tcp upd 应用层 到 nginx 写一个 php 应用 每一层都有良好的封装跟抽象。 去年玩了一会 esp32 , 算我看到的示例 跟工具链 比较多的一款 mcu ,资料文档都挺详细的,除了这款 mcu 本身有一些性能问题,例如高精度的 AD/DC 采样不行,这个是硬件本身的因素,但是拿来做点玩具 没有什么高精要求,什么的还是比较合适的。 |
141
fantastM 323 天前
大赞,读完之后收获很多
|
142
quietjosen OP @morgan1freeman 确实,软件抽象得比较好,每层都能干每层的事。如果对底层、性能什么的不关心,直接跑最上层的脚本,省心很多。好在,嵌入式也开始有类似 python/lua 这类脚本语言,入门简单多了。
也确实,关于接口、库这些本该通用的东西,也是各个芯片厂各自为战。好在,如果不同芯片厂用相同的 RTOS ,理论上有一定的可迁移性。 对于 AD/DC ,MCU 内置的就是一般可用的。专门的 AD/DC 芯片,可能比 MCU 本身还贵。 |
143
morgan1freeman 323 天前
@quietjosen #142 是的,但是那些 python/lua ,目前做教学 diy 用还是可以的,实际上成品不太现实,批量出货,几百万套的硬件,rom 能省则省,不会给 python lua 留空间放解释器的,能有一套好用的 C/C++ SDK 就不错了,不过 esp32 这款 资料是做的真不错
|
144
quietjosen OP @morgan1freeman 对,脚本语言,对于 DIY 挺好;既方便入门,性能什么的又不是问题。
工业领域,确实是按字节扣 RAM/ROM 的,C/C++ 才是最优解。 这两者都是需要的,才能支撑硬件在多方面都能很好地发展。没有 Hello World ,也就没有火箭科学。 |
145
maxxfire 323 天前
你居然放弃了 C 语言去折腾硬件,勇气
|
146
quietjosen OP @maxxfire 事实上,一个硬件用的是 Lua ,一个用的是 Arduino
|
147
jwesthaverr 323 天前
高质量分享,收藏了,OPNB !
|
148
maxxfire 323 天前
@quietjosen 根据互联网思维,硬件是不赚钱的
|
149
lingex 323 天前 via Android
对了,现在的 LED 技术发展可能有点出乎我们意料。我做的东西一般喜欢用大一些的限流电阻让亮度降低。比如 5V 电压时用 3k 限流电阻。还是我上面说的那个 DIY 的下载器,由于封装选错了,于是在垃圾板卡里找了一颗替代,发现它超级的亮,最后换成了 11k 限流电阻,它还是比普通 LED 亮很多…
|
150
xieren58 323 天前
玩嵌入式入门, rust + stm32 最优解了... 开发快, 又现代化...
|
151
quietjosen OP @lingex 5/11 = 0.45mA ,确实比典型的 LED 电流要小。
|
152
quietjosen OP @xieren58 恩,但凡用脚本语言,开发效率都比 C 高很多。
|
153
lingex 323 天前 via Android
@quietjosen LED 还有压降,实际应该比这还要小
|
154
L5411 323 天前
刚在少数派上看到
|
155
hanguofu 322 天前
软件工程师折腾硬件,能做到量产就很牛了~~~ 好奇问问: 楼主做的是智能音箱吗 ?哪里有卖的啊 ?
|
156
quietjosen OP |
157
xiaomageit 322 天前
@quietjosen 我现在需求每年近百 W 的芯片,现在用最多的是 NXP 的 PCF7926A 。我现在想怎么能降低这个成本,如果自己研发好或者 得到芯片的设计数据然后让工厂代工生产是不是可以降低一些。 不懂说的不对的地方还望见谅 。谢谢回复
|
158
quietjosen OP @xiaomageit 你这比我玩得大多了,你这是专业人士问业余玩家啊 😂
以我不专业的了解,一些小的芯片品牌,基本都是公版方案稍微改改、加点内存 Flash ,然后工厂代工的。 但我相信,代工有代工的坑,且起订量肯定不低。 |
159
uxff 320 天前
真专业。赞。
|