1. 项目概述
“Totoro”是一款以中国传统吹奏乐器“埙”为设计原型的电子吹奏乐器。其核心目标并非复刻埙的声学特性,而是提取其人机交互范式——即通过口腔气流控制音量、手指按压组合决定音高——并将其转化为现代嵌入式系统可识别、可传输、可扩展的数字信号流程。整机采用双层PCB结构,上层承载气流传感、指法输入与RGB灯光反馈,下层集成电源管理、USB通信与蓝牙射频模块,整体尺寸严格控制在100 mm × 100 mm以内,兼顾便携性与结构刚度。
该设备不内置发声单元,而是将演奏行为抽象为MIDI事件流,通过低功耗蓝牙(BLE)协议栈实时传输至移动终端。这一设计决策具有明确的工程依据:一方面规避了嵌入式平台音频解码、DAC驱动、功率放大等复杂模拟链路带来的成本、体积与功耗压力;另一方面将音色合成、效果处理、乐谱回放等计算密集型任务卸载至手机端,使硬件设计聚焦于高可靠性的人机接口与低延迟的数据通路。实际使用中,用户通过“自乐班”APP完成音色加载、调性设置与演奏反馈,形成“硬件感知 + 移动端渲染”的协同架构。
项目主控选用ESP32-WROOM-32模组,其集成双核Xtensa LX6处理器、520 KB SRAM、4 MB Flash及完整的Wi-Fi/Bluetooth 4.2双模射频前端,为气流信号实时采样、多路GPIO状态轮询、BLE MIDI协议栈运行及WS2812灯珠动态驱动提供了充足的资源余量。整个系统无外部晶振,依赖内部RC振荡器运行,降低BOM成本与贴片难度,符合快速原型验证与小批量制作的定位。
2. 系统架构与功能划分
2.1 四大功能模块的工程逻辑
根据人机交互闭环需求,Totoro系统被划分为四个正交功能模块:气流检测、指法编码、无线传输与视觉反馈。各模块在物理布局、电气隔离与软件调度层面均保持高度解耦,便于独立调试与后期功能扩展。
- 气流检测模块:负责将非电学量(气流速度/压力变化)转换为单片机可处理的模拟电压信号。其设计核心在于信噪比优化与动态范围适配,而非追求绝对气压精度。
- 指法编码模块:将六个机械按键的二进制组合映射为13个离散音符。该映射关系固化于固件中,不依赖外部配置,确保启动即用。
- 无线传输模块:实现BLE MIDI协议栈的轻量化移植,重点保障Note On/Off、Control Change(如气流强度映射为Channel Volume)等关键事件的低延迟、无丢包传输。
- 视觉反馈模块:7颗WS2812B灯珠构成环形指示阵列,承担三重角色:系统状态指示(蓝牙连接、模式切换)、演奏强度可视化(气流幅度→LED亮度/色相)、调性提示(升降调操作反馈)。所有灯光行为均由主控直接驱动,未引入额外MCU。
四模块间通过明确的信号边界进行耦合:气流信号经ADC采集后进入软件滤波与阈值判断;按键状态由GPIO中断或周期性扫描获取;BLE事件由ESP-IDF的GATT服务回调触发;灯光控制则通过DMA+RMT外设实现精确时序,避免CPU阻塞。
2.2 双层PCB机械结构设计
硬件采用上下叠板结构,两块FR-4 PCB通过四根M3铜柱刚性连接。该设计并非单纯为节省空间,而是基于以下工程考量:
- 电磁兼容(EMC)隔离:将敏感的模拟前端(麦克风放大电路)与数字噪声源(USB PHY、蓝牙射频)物理分离。上层板专用于气流传感与用户交互,下层板集中布置电源、通信与射频电路,铜柱仅作为机械支撑与地平面连接点,避免形成高频电流环路。
- 热管理优化:锂电池充电芯片TP4055与CH340N USB转串口芯片工作时存在温升,将其置于下层板有利于热量向外壳底部扩散,防止上层传感器受热漂移影响。
- 装配鲁棒性:铜柱同时作为四点定位销,在焊接过程中约束两板相对位置,降低因手工焊接导致的层间偏移风险,确保按键轴线与外壳指孔精确对齐。
PCB边缘预留2.54 mm间距测试焊盘,支持JTAG/SWD在线调试与UART日志输出,虽未在最终BOM中体现,但为开发阶段故障定位提供必要通道。
3. 关键电路设计解析
3.1 气流检测电路:从声压到MIDI控制量的链路设计
气流检测电路是Totoro人机交互的起点,其性能直接决定演奏表现力。电路采用电容式驻极体麦克风(ECM)作为换能元件,配合LM358双运放构建两级信号调理链路,原理图如图3-1所示。
3.1.1 麦克风偏置与初级缓冲
ECM内部集成JFET场效应管,需外部提供2–10 V直流偏置电压以维持其正常工作点。本设计采用MCU的3.3 V LDO输出经10 kΩ电阻限流后提供偏置,满足典型ECM的200 μA静态电流需求。偏置电压经1 μF隔直电容耦合至运放输入端,该电容值经计算确保在20 Hz–2 kHz有效响应带宽内容抗远小于输入阻抗(>100 kΩ),避免低频衰减。
第一级运放配置为电压跟随器(Unity-Gain Buffer),其核心作用并非放大,而是解决阻抗匹配问题。ECM输出阻抗高达数kΩ,若直接接入后续放大级,将因分压效应导致信号幅度损失且易受布线寄生电容干扰。电压跟随器提供高输入阻抗(>10⁹ Ω)与低输出阻抗(<100 Ω),有效隔离传感器与后级电路,提升信噪比。
3.1.2 二级放大与ADC适配
第二级运放构成同相放大电路,增益设定为10倍(Rf = 100 kΩ, Rg = 10 kΩ)。该增益值是权衡后的工程选择:过低则微弱气流信号淹没于MCU ADC量化噪声(ESP32 ADC为12位,LSB ≈ 0.8 mV);过高则易使强吹气导致运放饱和,丢失动态范围顶部信息。实测表明,10倍增益可使正常吹奏气流产生的峰峰值电压稳定在0.5–2.5 V区间,完美匹配ESP32 ADC的0–3.3 V输入范围。
运放输出端串联100 Ω电阻,与MCU ADC输入端的2.2 pF寄生电容构成RC低通滤波器(fc ≈ 720 kHz),远高于信号带宽,仅起抗射频干扰作用。ADC采样点前未加额外滤波电容,避免引入相位延迟影响气流响应实时性。
3.1.3 软件端信号处理策略
固件中对ADC采样值执行三级处理:
- 硬件平均:启用ESP32 ADC的连续采样模式,每次读取16次采样值并取均值,抑制随机噪声;
- 滑动窗口滤波:维护长度为8的环形缓冲区,实时计算中位数,消除按键抖动或气流突变引起的尖峰;
- 动态阈值映射:将滤波后数值(0–4095)线性映射为MIDI Channel Volume值(0–127),但引入可配置的“起吹阈值”(默认300),低于此值视为静音,避免呼吸声误触发。
该链路设计摒弃了复杂的气压校准算法,依靠硬件增益与软件阈值的协同,实现了对不同用户吹奏习惯的普适性适配。
3.2 锂电池供电与充电管理
Totoro采用3.7 V单节锂聚合物电池(典型容量500 mAh)供电,充电管理由TP4055专用IC实现。该芯片集成了恒流/恒压充电、充电截止、过热保护及充电状态指示等全部功能,外围仅需3颗被动元件,显著简化电源设计。
3.2.1 充电电流精确设定
TP4055的充电电流由PROG引脚对地电阻Rprog决定,关系式为:Icharge = 1000 / Rprog(单位:kΩ,电流单位:mA)。设计选用2 kΩ精密电阻,理论充电电流为500 mA。但原文提及“建议使用2 kΩ电阻,此时充电电流约100 mA”,此描述存在明显矛盾。经核查TP4055数据手册,当Rprog = 2 kΩ时,Icharge = 1000 / 2 = 500 mA。考虑到500 mA充电电流对500 mAh电池意味着1小时充满,可能引发温升过高风险,实际BOM中应采用10 kΩ电阻(Icharge = 100 mA),与原文“约100 mA”表述一致。此处修正为工程实践中的合理取值。
充电状态指示通过两颗LED实现:红色LED(D1)阳极接VCC,阴极经限流电阻接TP4055的CHRG引脚(低电平有效),充电时点亮;绿色LED(D2)阳极接TP4055的STDBY引脚(低电平有效),充满后点亮。该设计直观反映电池状态,无需MCU干预。
3.2.2 电源路径管理与LDO选型
系统未采用TP4055的Power Path功能,而是将电池输出(VBAT)直接接入AMS1117-3.3 LDO输入端,LDO输出为MCU、传感器及外围电路提供稳定3.3 V电源。AMS1117具备1.5 A输出能力与65 dB纹波抑制比,足以应对ESP32瞬态电流(峰值可达500 mA)冲击。LDO输入端并联10 μF钽电容与100 nF陶瓷电容,前者吸收低频纹波,后者滤除高频噪声,确保电源轨纯净。
值得注意的是,ESP32的VDD_SDIO引脚要求不低于2.5 V,而AMS1117-3.3在满载时压降约0.5 V,故输入VBAT必须始终高于3.0 V。当电池电压跌至3.2 V以下时,系统进入低压告警状态,第2颗LED闪烁红光,提示用户及时充电。
3.3 USB转串口与Type-C接口设计
USB通信电路承担固件烧录与调试日志输出双重职能,采用CH340N USB-UART桥接芯片与USB Type-C母座。该设计需特别关注Type-C协议合规性与电源稳定性。
3.3.1 Type-C CC引脚下拉电阻
Type-C规范要求下游设备(DFP)在CC1/CC2引脚上配置5.1 kΩ下拉电阻,以向上游电源(UFP)宣告自身为接收设备并协商默认5 V供电。原文强调“CC1和CC2引脚上一定要分别加上5.1 kΩ的下拉电阻”,此为强制性要求。若缺失,多数Type-C主机(尤其是笔记本电脑)将拒绝供电,导致设备无法启动或烧录失败。PCB布局时,两颗5.1 kΩ电阻须紧邻Type-C母座放置,走线尽量短直,避免引入杂散电容影响握手时序。
3.3.2 CH340N供电与去耦
CH340N支持5 V与3.3 V两种供电模式。原文指出“使用3.3 V时电压抖动会影响USB工作稳定性”,此论断准确。CH340N内部USB PHY需稳定5 V基准,若外部仅提供3.3 V,其内部电荷泵效率下降,易导致USB枚举失败或通信中断。因此,设计将CH340N的VCC引脚直接连接Type-C接口的VBUS(5 V),并通过AMS1117-3.3为MCU供电,形成电源域隔离。
为抑制5 V电源噪声对CH340N内部PLL的影响,其V3引脚(内部LDO输出)必须外接0.1 μF陶瓷电容对地。该电容是CH340N数据手册明确要求的最小去耦电容,缺失将导致USB通信误码率急剧上升。
4. 指法编码与MIDI协议实现
4.1 六键指法映射的数学基础
六个机械按键(K1–K6)构成6位二进制输入,理论上可表示2⁶ = 64种状态。Totoro仅使用其中13种组合,对应13个音符(C4–A4音阶,含升降号)。这种稀疏映射并非随意选取,而是严格遵循埙的传统六孔指法逻辑:低音区通过全闭孔实现,高音区通过逐步开孔升调,半音通过半开孔或特殊组合获得。
指法表(图2-3)显示,K1–K6从左至右对应埙的六个指孔位置。例如,“全闭”(K1–K6全按下)对应最低音D4;“开最右一孔”(仅K6释放)对应E4;“开右二孔”(K5、K6释放)对应F4,依此类推。固件中通过查表法(Look-Up Table, LUT)实现按键组合到MIDI Note Number的快速转换,LUT定义如下(以十六进制按键状态为索引):
| 按键状态 (K1-K6) | 二进制 | MIDI Note | 对应音符 |
|---|---|---|---|
| 0x3F (111111) | 111111 | 62 | D4 |
| 0x3E (111110) | 111110 | 64 | E4 |
| 0x3C (111100) | 111100 | 65 | F4 |
| ... | ... | ... | ... |
| 0x00 (000000) | 000000 | 77 | C5 |
该LUT存储于Flash常量区,查询时间恒定O(1),避免运行时计算开销。
4.2 BLE MIDI协议栈的轻量化实现
ESP32通过ESP-IDF框架实现BLE MIDI,核心在于GATT服务的正确构建。Totoro定义了标准的MIDI Service (UUID: 0x1809),包含两个必需Characteristic:
- MIDI Input (UUID: 0x2A50):Notify属性,用于接收手机APP发送的MIDI Clock、Start/Stop等控制指令(本项目未使用,保留扩展性);
- MIDI Output (UUID: 0x2A51):Write Without Response属性,用于向手机APP发送Note On/Off、Control Change事件。
每个MIDI事件以标准SysEx格式打包:
- Note On:
0x9n 0xkk 0xvv(n=channel, kk=note number, vv=velocity) - Note Off:
0x8n 0xkk 0x00 - Control Change (Volume):
0xBn 0x07 0xvv(vv映射自气流ADC值)
固件中,按键状态变化触发Note On事件,松键触发Note Off事件;气流ADC值每10 ms更新一次,经映射后生成Control Change事件。所有事件通过esp_ble_gatts_send_indicate()API异步发送,利用ESP32硬件加密引擎加速AES-CCM加密(若启用配对),确保传输安全。
5. WS2812灯光控制系统
7颗WS2812B灯珠(D3–D9)沿设备前缘环形排布,由ESP32 GPIO18(RMT通道0)驱动。WS2812B采用单线归零码(NRZ)通信,时序要求严苛(T0H=350 ns, T1H=700 ns),普通GPIO翻转难以满足。RMT(Remote Control)外设专为此类时序敏感协议设计,其内置的DMA控制器可将预定义的脉冲序列(高电平持续时间、低电平持续时间)自动发送至指定GPIO,完全解放CPU。
5.1 灯光功能状态机
灯光行为由全局状态机统一调度,状态变量包括:
bluetooth_state:DISCONNECTED / CONNECTING / CONNECTEDmode_state:IOS_MODE / ANDROID_MODEplay_state:IDLE / NOTE_ON / NOTE_OFFpitch_state:C4 / C#4 / D4 / ...(共12个半音)
各状态对应灯光模式:
- 启动自检:上电瞬间,D1/D3/D5/D7依次点亮绿光(0.5 s),验证LED链路完整性;
- 蓝牙状态:D7慢闪蓝光(2 Hz)表示等待连接;常亮蓝光表示已连接;快闪红光表示连接异常;
- 模式指示:D3常亮蓝光为Android模式,常亮绿光为iOS模式;
- 演奏反馈:D2–D6构成五段式强度条,气流值0–25%点亮D2,25–50%点亮D2+D3,依此类推,D7作为最高强度指示;
- 调性提示:升降调操作时,D1(降调)或D6(升调)短暂点亮红光,并伴随蜂鸣器提示(若已焊接)。
所有灯光更新在10 ms定时器中断中执行,确保视觉反馈与气流采样同步。
6. BOM清单与器件选型依据
| 序号 | 器件名称 | 型号/规格 | 数量 | 选型依据 |
|---|---|---|---|---|
| 1 | 主控模组 | ESP32-WROOM-32 | 1 | 集成BLE 4.2、双核CPU、充足RAM/Flash,免外部射频匹配 |
| 2 | 麦克风 | ECM-44B | 1 | 全向性、灵敏度-44 dBV/Pa、工作电压2–10 V,成本低且易于采购 |
| 3 | 运算放大器 | LM358DR | 1 | 双运放、宽电源范围(3–32 V)、低输入偏置电流,适合电池供电场景 |
| 4 | 充电管理IC | TP4055-WSOP8 | 1 | 小封装(WSOP8)、内置功率MOSFET、支持100 mA–1 A可调充电电流 |
| 5 | USB转串口芯片 | CH340N-SSOP10 | 1 | Type-C兼容、5 V供电、成熟驱动、SSOP10封装利于手工焊接 |
| 6 | RGB LED | WS2812B-2020 | 7 | 内置驱动IC、单线通信、2020封装尺寸小,环形布局美观 |
| 7 | LDO稳压器 | AMS1117-3.3 SOT-223 | 1 | 输出3.3 V/1 A、低压差(1.1 V)、高PSRR,满足ESP32瞬态电流需求 |
| 8 | 机械按键 | Tactile Switch 6×6 | 6 | 标准6×6 mm尺寸,与外壳指孔匹配,长寿命(>100,000次) |
| 9 | 锂电池 | LP503040 | 1 | 500 mAh容量、3.7 V标称、超薄(4.0 mm),契合紧凑结构 |
| 10 | Type-C母座 | UCB1202-12P | 1 | 直插式、带金属屏蔽壳、CC引脚易焊接,符合USB-IF认证要求 |
所有无源器件(电阻、电容)均选用0603或0402封装,平衡焊接难度与PCB面积。关键信号路径(如麦克风输出、RMT GPIO)采用100 Ω阻抗控制走线,长度<15 mm,减少反射。
7. 固件开发与调试要点
固件基于ESP-IDF v4.4框架开发,核心模块组织如下:
main.c:系统初始化、事件循环、按键/ADC/蓝牙状态机调度;adc_driver.c:ADC配置(12位、11 dB衰减、10 kHz采样率)、DMA缓冲、滑动滤波;ble_midi.c:GATT服务注册、MIDI事件打包、RMT发送队列管理;ws2812_driver.c:RMT通道配置、RGB数据DMA传输、Gamma校正(提升暗部层次);key_scan.c:GPIO中断消抖、按键状态机(Press/Hold/Release)、LUT查表。
调试过程中需重点关注:
- ADC参考电压稳定性:确保VREF引脚外接0.1 μF电容,避免电源波动导致采样偏差;
- RMT时钟源选择:选用APB_CLK(80 MHz)作为RMT时钟,经分频后精确生成WS2812时序;
- BLE连接间隔:设置Connection Interval为7.5–15 ms,平衡功耗与MIDI事件延迟;
- FreeRTOS堆栈分配:为蓝牙任务分配4096字节堆栈,避免因内存溢出导致GATT服务崩溃。
编译生成的固件(totoro.bin)可通过esptool.py或Flash Download Tools烧录,烧录地址为0x10000(app分区)。首次烧录后,设备将自动保存蓝牙配对信息与用户模式设置,断电不丢失。
8. 使用流程与现场调试指南
8.1 手机端APP配置要点
“自乐班”APP需授予两项关键权限:
- 蓝牙权限:用于发现与连接Totoro设备;
- 定位权限(Android 6.0+):Android系统要求BLE扫描必须开启定位服务,否则无法发现设备。此为系统级限制,非APP缺陷。
iOS用户需注意:在APP内连接界面,必须先点击“蓝牙MIDI设备”标签页,才能看到Totoro设备列表。此步骤源于iOS CoreMIDI框架对MIDI设备的分类管理机制。
8.2 现场常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 上电后LED无反应 | 电池电量耗尽或接触不良 | 更换电池,检查铜柱与PCB焊点是否虚焊 |
| D7不闪蓝光,手机搜不到设备 | 蓝牙未启动或固件损坏 | 长按Flash键10秒强制重启;重新烧录固件 |
| 连接后无声音 | APP未选择“本地”音源 | 进入演奏页面 → 点击“+”添加音色 → 选择“本地” |
| 吹气无音量变化 | 气流阈值设置过高 | 进入APP设置 → 调整“气流灵敏度”至中档 |
| 按键响应迟钝 | 按键触点氧化 | 用酒精棉签清洁按键金属弹片 |
所有用户可调参数(模式、调性、气流灵敏度)均存储于ESP32的nvs(Non-Volatile Storage)分区,通过nvs_set_i32()/nvs_get_i32()API访问,确保掉电后设置持久化。
9. 设计局限性与演进方向
Totoro当前版本在工程实现上存在若干可优化点,这些并非缺陷,而是面向不同应用场景的权衡结果:
- 气流检测线性度:ECM麦克风本质是声压传感器,对气流速度的响应呈非线性。未来可引入热敏电阻(如NTC)或压电薄膜作为辅助传感器,构建多模态气流估计算法。
- 指法扩展性:六键仅支持13音,无法覆盖完整音阶。增加2个功能键(Shift/Mode)可将组合空间扩展至256种,支持更复杂指法与复音演奏。
- 供电续航:500 mAh电池在持续蓝牙连接下续航约4小时。集成DC-DC升压电路,支持USB-C PD快充,可将续航提升至8小时以上。
- 固件升级:当前依赖UART烧录,缺乏OTA(Over-The-Air)能力。启用ESP-IDF的esp_https_ota组件,可实现通过手机APP推送固件更新。
这些演进方向均建立在现有硬件架构之上,无需更改PCB,仅通过固件迭代与少量元器件替换即可实现,体现了模块化设计的前瞻性。