一台巴掌大的复古白色小电脑,安静躺在桌面上,你冲它说一句“小智小智,今天天气怎么样”,它屏幕亮起、声音从面板格栅后面透出来,顺便还能帮你控制一下家里智能灯。这不是概念视频,是我用一块ESP32-S3-N16R8加几个现成模块拼出来的桌面AI机器人,外壳复刻了经典麦金塔电脑的复古造型,跑的是开源的小智AI固件。
这个项目的魅力在于,硬件成本控制在一百多块,全程不需要自己画电路板,也不要求你会写代码。你要准备的主要是一块ESP32-S3-N16R8开发板、一块小屏幕、一颗全向麦克风、一个小喇叭、一块锂电池,再加上一个3D打印的外壳。固件方面可以刷官方编译好的版本,也可以用社区里分享的“完美固件”,刷进去、配好网、绑定一个大模型API,就能开口聊天。整个过程最花时间的地方其实是接线和排障,所以我把从选型、组装、烧录到踩坑的完整过程都写了出来,想照着做一个的话,可以直接抄作业。
1. 项目定位与整体思路
1.1 为什么是ESP32-S3-N16R8而不是普通ESP32
先把这个型号拆开看:ESP32-S3是乐鑫的WiFi+BLE双核芯片,主频最高240MHz,核心里带了用于AI加速的向量指令。N16R8是模组(或开发板)规格的简写,N16代表16MB Flash,R8代表8MB PSRAM。换成大白话:Flash就是“硬盘”,PSRAM就是“内存”。小智固件跑起来需要放字库、放唤醒词模型、放Web配网页面和各种资源,16MB Flash刚好装得下,不会出现下载完OTA升级包就提示“空间不足”的尴尬;8MB PSRAM则保证了TTS语音流的缓冲、WebSocket连接、屏幕刷新这些操作同时进行时不会爆内存。
我之前先用普通ESP32(双核240MHz、4MB Flash、320KB RAM)试过一版,结果到了需要在线语音合成的时候就卡顿,偶尔直接死机重启。问题就出在内存上:语音合成数据是一块一块推过来的,要开环形缓冲区,WiFi和MQTT/WebSocket还要占用不少RAM,在线对话时几个任务同时跑,320KB根本不够分。换成ESP32-S3-N16R8之后,语音回复、动画UI、联网更新同时工作,系统整体还是稳的。所以如果你要照着做,我建议不要省这十几块钱差价,直接买N16R8。
1.2 小智固件生态为什么省心
小智AI是开源项目,目标就是让ESP32这类低成本硬件变成能对话的AI语音助手。它把很多麻烦事都提前做好了:本地唤醒词检测、云端语音识别(ASR)、大模型对话、语音合成(TTS)、屏幕UI、LED控制、OTA升级,全都在固件里串成了一条流水线。作为DIY玩家,你要做的不是从零写语音算法,而是把硬件接对引脚、把固件烧进去、配好网络、绑定一个模型服务商的API Key,然后它就能跑了。
社区活跃度也很重要。小智的官方仓库在持续更新,很多板型都有对应的配置模板,你照着板子型号找配置就行。网上还有玩家编译好的“完美固件”包,比如有人分享的“lb2002完美固件”,把常用字库、语音模型、API模板都预置好了,刷完少折腾很多配置步骤。我的做法是先刷官方固件跑通全流程,确认硬件没问题,再换社区固件体验增强功能,这样出了问题也容易定位。
1.3 “麦金塔”外形:加分项还是必需品
麦金塔指的是经典Macintosh电脑的复古外观:米白色机身、方方正正、正面一块小屏幕、屏幕下方排满格栅。小智AI机器人套上这个壳子之后,放在桌面上的辨识度比裸奔的电路板高很多,而且那块小方形屏正好适合做语音交互界面,格栅后面也可以藏喇叭和麦克风孔位,算是美观和功能兼顾。
不过我要提醒一句:外壳不是第一步就要做的。一开始我直接打印了完整外壳,结果调试时反复拆装,卡扣都被我掰松了。正确顺序是先让开发板、屏幕、麦克风、功放在桌面或面包板上跑通,确认固件和接线没问题,再打印外壳做最终封装。外壳模型一般在小智社区的硬件分享帖或开源模型站都能找到,搜索“小智 麦金塔 外壳”或者“xiaozhi mactonish shell”都能看到玩家分享的STL文件。
2. 物料清单与工具准备
2.1 核心硬件清单
以下物料是我实际用到的,也是这个方案里比较标准的搭配。列成表格方便你照着采购:
| 组件 | 建议型号/规格 | 数量 | 说明 |
|---|---|---|---|
| 主控开发板 | ESP32-S3-N16R8开发板(合宙、立创或任意带USB口的) | 1块 | 务必确认是N16R8,别买成4MB Flash版本 |
| 屏幕 | 1.54寸TFT LCD,驱动芯片ST7789或GC9307,分辨率240x240 | 1块 | SPI接口,麦金塔面板常用尺寸 |
| 麦克风 | INMP441,I2S接口MEMS全向麦克风 | 1块 | 单麦方案性价比高,适合桌面距离 |
| 功放 | MAX98357A,I2S接口D类功放 | 1块 | 输出3W,直接驱动小喇叭 |
| 喇叭 | 3W/4Ω,直径40-50mm圆形喇叭 | 1个 | 别选太大,外壳空间有限 |
| 锂电池 | 3.7V软包电池,容量1000-2000mAh,带保护板 | 1块 | 容量越大续航越久,但体积也大 |
| 锂电池充电管理 | IP5306模块(可选) | 1个 | 如果你的开发板自带电池接口和充电电路,可以不买 |
| 可编程灯效 | WS2812灯珠或灯环,3-5颗 | 1组 | 用作状态灯和呼吸灯效果 |
| 轻触按键 | 6x6x5mm | 2个 | 一个复用BOOT做配网,一个自定义功能 |
| 外壳 | 3D打印麦金塔风格外壳套件 | 1套 | 包含机身、面板、底板等 |
| 线材 | 杜邦线、30AWG硅胶线、热缩管、焊锡 | 若干 | 调试用杜邦线,最终固定用焊接 |
如果你不想自己组装屏幕和功放,也可以直接买已经集成好这些外设的S3开发板,比如带屏幕的S3核心板。但那样就没法体验从零件到整机的乐趣了,而且灵活性差一些,后面想换接口、加传感器都不方便。我建议还是分模块买,成本可控,出了问题也清楚是哪一块的事。
2.2 每个零件怎么选
屏幕这块,重点是驱动芯片而不是分辨率。小智固件里对不同驱动芯片的初始化代码是分开的,ST7789和GC9307的初始化序列不一样,你买之前要看清楚商品页写的驱动型号。如果买到不支持的芯片,屏幕要么白屏要么花屏,这时候不是硬件坏了,是固件里没有对应驱动,只能换屏幕或者自己改固件。1.54寸240x240是麦金塔方案最常见的尺寸,因为外壳面板的开孔就是按这个尺寸设计的,换2.0寸屏幕就要改外壳模型。
麦克风我选了INMP441,因为它只有一根数据线,接线简单,价格也便宜。官方文档里还推荐过ES7210四麦克风阵列方案,拾音效果更好、支持语音打断,但四路I2S数据线加上去,对新手来说走线容易乱,我建议先把单麦方案跑通再说。功放MAX98357A也是I2S接口,它和INMP441正好可以共用时钟线,接线数量就控制住了。喇叭别贪大,4Ω 3W的小喇叭在桌面环境下音量已经够用,装进麦金塔外壳时也好固定。
电池和电源是整个项目里最容易翻车的部分。S3全速运行加WiFi通信的电流大约在300-500mA,所以1000mAh电池撑不到3小时,这一点要有心理准备。我实测过一台满电状态下待机加偶尔对话的麦金塔,大概四小时左右电量告警。续航焦虑严重的话,就把屏幕亮度调低,或者干脆让它一直插着充电器当桌面固定设备,电池拆掉,用USB供电最省心。
2.3 3D打印件和工具准备
外壳模型不复杂,但要注意打印参数。我用的是PETG材料,比PLA耐热,放在桌面上被阳光直晒也不会变形,打印层高0.2mm、填充12%就够了,外壳壁厚一般模型里已经设置好,不需要额外加厚。打印完成后需要在面板背面开几个小卡槽位置,用来固定屏幕和喇叭,这时候美工刀和锉刀就能派上用场。
焊接工具方面,烙铁最好用刀头或尖头,恒温烙铁设到320-350摄氏度,焊S3排针和功放模块都够用。助焊剂建议买一支笔式的,焊小焊点的时候点在焊盘上,焊点会饱满很多。万用表是必须的,排查虚焊和短路的时候全靠它。热熔胶枪用来固定屏幕、喇叭、电池,属于组装阶段的好帮手。如果你完全不想焊接,也可以全程用杜邦线先做验证,但壳子内部空间很紧凑,杜邦线插头一旦松动就会导致屏幕闪、喇叭不出声,最后封装时我建议至少把电源线、喇叭线、屏幕排线接头处用热缩管或胶固定好。
3. 硬件接线与结构组装
3.1 接线表与引脚规划
说了这么多,终于到动线的时候了。下面这张表是我手头这块S3开发板验证过的接线方式,屏幕、麦克风、功放通过SPI和I2S接口连接。这里要特别强调:小智固件对硬件引脚的配置是写死在编译配置里的,具体板型有对应的board配置。你买的开发板如果和我的不是同一款,请先到固件配置里查一下GPIO定义,或者按你实际接的引脚去改配置再编译,不然接了也没反应。
| 外设 | 信号 | ESP32-S3 GPIO | 备注 |
|---|---|---|---|
| 屏幕ST7789/GC9307 | SCK | GPIO12 | SPI时钟 |
| MOSI(SDA) | GPIO11 | SPI数据 | |
| CS | GPIO10 | 片选 | |
| DC | GPIO9 | 数据/命令选择 | |
| RST | GPIO8 | 复位 | |
| BL | GPIO13 | 背光控制 | |
| VCC / GND | 3.3V / GND | ||
| INMP441麦克风 | SCK(BCLK) | GPIO4 | 与功放共用 |
| WS(LRCLK) | GPIO5 | 与功放共用 | |
| SD(DOUT) | GPIO6 | 麦克风数据 | |
| VDD / GND | 3.3V / GND | 麦克风供电是3.3V | |
| MAX98357A功放 | BCLK | GPIO4 | 与麦克风共用 |
| LRCK | GPIO5 | 与麦克风共用 | |
| DIN | GPIO7 | 功放数据 | |
| VIN / GND | 5V / GND | 功放供电必须5V | |
| WS2812灯效 | DIN | GPIO14 | 数据线串接灯珠 |
| 按钮 | 左键 | GPIO0 | 板载BOOT键可复用 |
这个方案里麦克风和功放共用I2S的时钟与声道选择线,是一个非常经典的节省IO口的接法。接的时候注意麦克风的数据线叫SD,功放的数据线叫DIN,别搞混了,我一开始就把这两根线接反了,结果整机完全无声,排查了很久才发现是数据顺序错了。
3.2 组装顺序与固定技巧
等我确认面包板上所有功能都正常,才开始往3D打印壳里装。第一步是安装屏幕。屏幕排线特别薄,来回折叠容易断,我先把屏幕卡进面板预留的开孔里,背面用热熔胶点几个固定点,注意胶不要挤到排线和FPC连接器上,不然接触不良会让屏幕间歇性白屏。
第二步是固定喇叭和麦克风。喇叭最好用热熔胶粘在机身侧面或背面,出声孔朝外,别被面板压住。麦克风安装时有个小技巧:在麦克风硅胶套外面再包一圈薄海绵,减少外壳振动传导到麦克风,不然你对着它说话的时候,喇叭自己的回声会让唤醒失灵。固定好之后,把散热方向也考虑一下,S3芯片在持续对话时发热明显,我在外壳背板开了几个通风槽,效果立竿见影。
第三步是安装主板和电池。主板我用铜柱固定在底壳的支架上,接口朝外方便插拔;电池用双面胶粘在最底部,确保不会晃动。所有飞线需要先规划好路径,用热缩管或者扎带整理,千万不能让接线头挤压在主板和面板之间,长期使用会磨破绝缘皮导致短路。等所有硬件都装好,盖上面板之前,先不拧螺丝,再通电跑一轮完整测试,确认之后再锁紧。
3.3 电源与电池:最容易翻车的地方
电源部分是新手翻车重灾区,我在这里多啰嗦几句。S3开发板一般都有USB接口可以直接供电,接了USB之后板和屏幕都能工作。麦克风INMP441的VDD必须接3.3V,而功放MAX98357A的VIN要接5V或电池正极,很多玩家不看手册直接把功放接到3.3V,结果声音小得像蚊子叫,因为3.3V根本喂不饱D类功放。
锂电池接入前一定要确认正负极和是否有保护板。没有保护板的裸电芯千万不要用,S3运行电流波动大,没有保护板容易过放,一次过放就把电池废了。很多S3开发板自带电池充电管理芯片,插上USB就能给电池充电,这时你只需要把电池正负极接到板子的BAT+/BAT-接口就行。如果你买的是不带充电管理的标准开发板,就需要在电池和板子之间串一个TP4056或IP5306模块,注意IP5306需要短按按键才开机输出,装进外壳后记得把这个按键引出来,不然每次断电后都没法激活电池供电。
4. 固件烧录与首次配置
4.1 三种固件来源
固件是这台机器的大脑。获取方式无非三条路:官方预编译固件、社区“完美固件”、自己编译源码。
官方固件最稳定,在小智AI项目的GitHub Release页面能找到对应板型的固件包。缺点是不同板型对应不同固件,你得自己确认板子的board profile,选错了刷进去屏幕不亮或者麦克风没声音。社区里流传的“完美固件”一般是玩家把字库、唤醒词模型、常用大模型API配置都预装好的版本,下载解压后通常是bootloader.bin、partition-table.bin和app.bin三件套,甚至带一键烧录脚本。这类固件的好处是省心,坏处是适配机型有限,如果你买的开发板正好是作者用的同一款,体验会非常平滑,否则就要碰运气。自编译源码适合想改引脚的玩家,文档在官方仓库里写得很详细,安装ESP-IDF之后执行idf.py build就能生成固件,国内镜像源下载工具链速度也还可以,新手不建议一上来就选这条路。
4.2 烧录步骤
我用的烧录方式是乐鑫官方的Flash Download Tool,操作直观,适合Windows用户。第一步是安装板子驱动,S3内置了USB转串口功能,插上电脑正常会识别出一个COM口。如果识别不到,大概率是驱动问题,去乐鑫官网下载对应驱动安装即可。
第二步是进入下载模式。S3不像老ESP32那样自动识别,需要按住板子上的BOOT键(GPIO0)不松手,再插入USB,随后松开BOOT,这时候电脑里才会出现一个可供烧录的串口设备。不少人第一次卡在这一步,就是因为没按住BOOT键就直接插线了。
第三步是打开烧录工具配置烧录地址。固件三件套的地址是有讲究的:bootloader烧到0x0,partition-table烧到0x8000,app烧到0x10000。这三个地址不能填错,否则系统起不来。很多社区固件包里都带了烧录脚本,直接双击就能自动按地址写入,省去手动配置的麻烦。
第四步是擦除Flash。如果你之前刷过其他固件或版本混乱,烧录前先执行一次全擦除(Erase Flash),再重新烧录。这一步很多人会跳过,结果旧配置残留,新固件开机后要么卡循环重启,要么连不上WiFi。我在刷不同作者固件时吃过这个亏,后来养成习惯:每次换固件必全擦。
4.3 首次开机配网与绑定大模型
烧录完成后,按下复位键,屏幕应该亮起来。首次开机固件一般会进入配网模式,屏幕显示一个二维码或SSID热点的信息。小智固件的配网方式很成熟,手机装小智App扫码就能把家里的WiFi信息推给设备,也可以在手机WiFi列表里找到设备发出的热点进行网页配网。
配网成功之后,设备会自动连接小智云端或你指定的服务器。接着拿起小智App,在设备列表里添加这台新设备,系统会分配一个设备ID。然后你要选择对话使用的大模型供应商,国内可用的服务很多:讯飞星火、火山方舟(豆包)、阿里云百炼(通义千问)、百度千帆都可以,按App引导填上对应的API Key和模型名称,保存并重启设备。这一步完成后,屏幕会显示在线状态,就可以对它喊唤醒词测试了。默认唤醒词一般是“小智小智”,周边有噪音识别也还算灵敏。
5. 常见问题与排查技巧实录
5.1 启动白屏或屏幕不亮
屏幕不亮先别急着怀疑屏幕坏了,优先级最高的是背光引脚。很多屏幕模块的BL(背光)引脚要MCU拉高电平才会亮,如果固件里对应的GPIO不是高电平,屏幕就是暗的。我接的是GPIO13,如果换成其他引脚,需要在板级配置里改。
白屏则是典型的驱动芯片初始化失败。ST7789和GC9307虽然引脚兼容,但初始化代码不同,你要先确认固件里编译进去的是哪个驱动,再看看手里屏幕到底是谁家的货。还有一个隐蔽原因:屏幕和开发板之间电压不稳,3.3V供电被USB线损耗拉低,屏幕初始化到一半就卡住,这时候换一根粗短的USB线或者用外部3.3V供电视试。
5.2 没有声音、噪音大、唤醒不灵敏
没声音时先用串口看日志,如果能看到语音识别到了内容但喇叭不响,问题基本在功放。检查MAX98357A的VIN是不是5V,检查DIN是不是接到了GPIO7,检查LRCK和BCLK是不是和麦克风共用的那两路。我用万用表测过最离谱的一次,发现是功放模块的焊盘短路,重新补焊后一切正常。
噪音大很多时候是布线问题。喇叭线和大电流的电源线并行走排线,会产生电磁干扰,在音频里变成滋滋声。解决办法是让音频线远离电源线,尽量缩短喇叭线长度,必要时用屏蔽线或者把音频信号线绞合起来。唤醒不灵敏要排查麦克风位置,如果麦克风离喇叭太近,机器自己说话的声音会把唤醒词盖掉,这时要把音量调低,或者用海绵把麦克风包裹起来做声学隔离。
5.3 网络与API连接问题
设备能开机但连不上WiFi,先确认路由器是不是5G频段。S3只支持2.4G WiFi,如果你的路由器是双频合一,设备找不到5G信号,得进路由器后台把2.4G和5G分开,或者临时开一个2.4G的访客网络给它连。还有一种情况是路由器开了AP隔离,终端之间不能互通,这种配置下设备即使连上WiFi也访问不了外网,表现就是配网成功但在线状态一直离线。
能连上WiFi但问问题没反应,就要去查大模型API的配置了。API Key失效、模型名称填错、服务商没开通对应服务,都可能造成请求失败。串口日志里如果出现401或403,就是鉴权问题;如果是超时,就换一个节点或者检查网络。OTA升级失败的解决方案最粗暴有效:重新用烧录工具全擦后刷一次完整固件,比在线上反复尝试升成功率高很多。
5.4 续航、发热与稳定性
麦金塔这种封闭外壳里,S3长时间在线对话发热还是很明显的。摸外壳微烫是正常现象,但如果烫到不敢碰,就要考虑在背板加散热孔或贴散热片。电池续航短是这一类语音助手的通病,因为唤醒后一直在线,CPU不能深度睡眠。我的处理方式是让它常驻充电,电池拆掉,直接USB供电,这样既不用担心鼓包,也不用频繁充电。
如果出现运行几分钟自动重启,打开串口日志看有没有“stack overflow”或“task watchdog”字样,这类问题多半是固件本身的不稳定,或者某个外设驱动占用了太多栈空间。遇到这种直接换一个固件版本,或者把用不到的功能(比如屏幕动画、RGB灯效)在编译配置里关掉,一般都能解决。
6. 能继续玩什么
6.1 离线语音与私有化大模型
小智固件的本地唤醒词是离线运行的,所以不联网也能唤醒,只是唤醒后联网才能对话。如果你不想把语音数据送到云端,可以在局域网里跑一个本地大模型服务,比如用一台旧电脑装Ollama跑Qwen系列开源模型,让小智固件通过局域网API调用它。这样整个链路只有S3和你的电脑,不再依赖外部云端,延迟和隐私都可控,适合熟悉Linux和Docker的玩家继续折腾。
6.2 接入智能家居
让这个复古小电脑不只是聊天,还能动手干活,是我觉得这个项目最上头的扩展方向。小智固件本身支持Skill机制,通过对接Home Assistant或者米家,就能实现“小智小智,打开客厅灯”这样的语音控制。我目前已经把家里的几个灯和插座接进来了,体验比拿手机App操作顺手得多。接线层面不用动硬件,主要是配置层面的对接,按官方文档在小智后台配置一个技能脚本就行。
6.3 界面与外观的二次创作
如果你愿意改一点代码,这块240x240的小屏幕能做的事情非常多。小智固件使用LVGL做界面,你可以把默认的表情动画换成自己的图标,也可以加一个时钟页面、天气页面,甚至显示CPU温度和网络延迟。外观上,你可以在麦金塔外壳上加一圈呼吸灯、贴一个复古logo贴纸、把底部改成透明底座露出电路板,这个项目天生就是拿来被“魔改”的。改完代码重新编译烧录,你的机器就成了和网上任何人都不一样的那一台。
我在实际制作过程中最大的体会是,这个项目最大的成功因素是“模块化”。每个硬件部分都能单独测试替换,每个软件部分都有明确的配置入口,出了任何问题都能快速定位到具体环节。如果你也想动手做,先把官方文档里的默认模板抄好,确保屏幕亮、声音响、能联网,再开始加自己的想法。最后再分享一个小技巧:每次刷机前,把当前能正常工作的固件bin文件在本地存一份,命名成“202X-X-X可用”,别问我怎么知道的,稳定版固件被自己覆盖掉的感觉实在太难受了。这之后,你想在所有你熟悉的设备里都加上它的身影,很快就会变得自然起来。