自学读本:跟着读、照着做,卡住就问 AI
你好,我是吴老师。
这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。
读完之后,你应该能:说出扬声器发声的完整链条;解释"播放声音 = 按固定节奏送数字";说出 DAC 和采样率是干什么的;亲手把 440Hz 的声音改成 880Hz,并预测听感变化。
用时:60–90 分钟。准备:板子、数据线、已经接入板卡 Skill 的 WorkBuddy。
一、从"看见"到"听见"
前八课,我们让板子做了很多事:灯变色、屏幕画画、动画跑起来。它们全都有一个共同点——都是让你看的。
今天做一件新事:让板子发出声音。
先想一个问题:板子上没有嘴巴,它怎么"说话"?
答案看起来简单:有喇叭。但这只是第一层。第二层问题才是真的:喇叭凭什么发出"滴——"的一声?
再往深一层:板子里没有声音,只有 0 和 1。你让 AI"播放一个声音",那些 0 和 1 是怎么变成你耳朵里听到的声音的?
今天这节课的目标很小:让板子响一声"滴",然后你改一个数值,让音调变高变低。
你会发现,声音一点都不神秘——它只是"被送得很快的数字"。
二、先让它响起来
请使用课程的 esp32s3-touchboard-hardware-dev Skill,
让板子通过扬声器播放一个 440Hz 的"滴"声,持续 0.8 秒,
音量用中等偏低的音量,播完就停。
播放前先检查板卡的音频芯片(ES8311)和功放初始化方式。
帮我新建程序并烧录。
烧录完,先别急着调来调去。把你听到的写下来:
| 我听到的现象 | 勾选 |
|---|---|
| 一声清晰的"滴" | |
| 声音很轻 | |
| 完全没有声音 | |
| 有咔哒杂音 |
三、声音是什么:一面看不见的鼓
声音不是"东西",是振动。
想象一面鼓:你推一下鼓面,它往下凹;弹回来时挤压前面的空气;空气再推下一层空气。这一层推一层的波动传到耳朵,撞上耳膜,你就"听到"了。
喇叭就是一面"电动的鼓":电压快速变化,纸盆就跟着快速振动,把空气推出一层层波。
| 名字 | 通俗说法 | 决定什么 |
|---|---|---|
| 频率 | 纸盆一秒来回推几次 | 音调(推得快 = 声音尖) |
| 振幅 | 推得多用力 | 响度(推得狠 = 声音大) |
| 波形 | 推的节奏长什么样 | 音色(钢琴 vs 小提琴) |
频率单位是 Hz,意思是"每秒多少次"。440Hz = 每秒推 440 次。
你肯定玩过这个实验:拨橡皮筋,绷得越紧,声音越尖——那就是频率变了。
⚠️ 比喻有边界:喇叭不是简单"推空气"。它里面有个线圈,靠电流在磁场里受力推动纸盆。这门课不钻这个,你记住链条就行:电压变 → 纸盆动 → 空气推 → 耳朵听。
四、板子里没有声音,只有数字
纸盆需要"快速变化的电压"才动。ESP32-S3 只会算数字,怎么造出会变化的电压?
靠一个小东西:DAC(数模转换器)。它只干一件事——把一个数字变成对应的电压。
数字大 → 电压高;数字小 → 电压低。
于是播放声音变成了一件简单的事:
按固定节奏送数字 → DAC 把数字变成电压 → 电压推纸盆 → 声音出来。
这块板上,DAC 不在 ESP32 里,而在另一颗芯片 ES8311 里。它叫音频"编解码芯片"(codec)。今天只用它一半的本事(DAC,把数字变电压);第 12 课我们会用到它另一半(ADC,把电压变数字)。
五、采样率:送数字的节奏
"按固定节奏"——多快?这个速度叫采样率。
16000Hz(16kHz)采样率 = 每秒送 16000 个数字。
先猜一猜,再实验:
同一段 440Hz 的声音数据,改成每秒只送 8000 个数字,听起来会怎样?
| 我改了什么 | 我预测 | 实际听到 |
|---|---|---|
| 采样率 16000 → 8000 | 自己填写 | 实验后填写 |
把这段发给 AI:
请做一个对照实验:
同一段 440Hz 的声音,先按 16000 采样率播放一次,
再按 8000 采样率播放一次,中间停 1 秒,循环两遍供我对比。
其余什么都不改。帮我烧录。
你八成会听到:第二次声音变沉、音调变低了。
数字一个字没改,只是送得慢了,音调就低了。
💡 这是本课最重要的发现:采样率直接决定音调。 真人的语音、电话、语音助手,常用 16kHz 采样率,不是随便选的。
六、一条完整的声音流水线
把学过的东西连起来:
你生成数字(正弦波采样)
↓ 把数字装进缓冲区
按节奏送出(采样率,比如 16000/秒)
↓
ES8311 的 DAC:数字 → 电压
↓
功放放大电压
↓
扬声器纸盆振动
↓
空气一层层推
↓
你的耳朵
用中文伪代码写同一件事:
准备"滴"声(440Hz,0.8 秒):
一共 0.8 × 16000 = 12800 个数字
第 i 个数字 = 正弦波在 i/16000 秒那一刻的高度
播放:
把这些数字按 16000 个/秒的节奏送出去
正弦波那行公式看不懂没关系,它只是"算出一个会上下起伏的数列"。真正要记住的是:数字攒好,按节奏送出,声音就有。
七、自己动手:让"滴"声变高
保持采样率、音量、时长都不动,只把 440 改成 880。
先预测,再发给 AI:
请把刚才的"滴"声从 440Hz 改成 880Hz,
其余(采样率、音量、时长)全部不变。帮我烧录。
| 频率 | 我预测 | 实际听到 |
|---|---|---|
| 440 Hz | ||
| 880 Hz |
880 是 440 的两倍,听起来就是高了一个八度(do 到高音 do 的关系)。音乐里的音高就是频率,不神秘。
八、作品:编一段你自己的旋律
单音会了,旋律就是把几个音按顺序、按时长排起来。
先自己填空,再发给 AI:
请让板子播放一小段旋律:
按顺序播放这些音:____Hz(0.4 秒)、____Hz(0.4 秒)、____Hz(0.8 秒)。
音与音之间不留空。音量中等偏低。帮我烧录。
参考频率("生日快乐"前四个音的频率):
| 音符 | 频率 |
|---|---|
| Sol | 392 Hz |
| La | 440 Hz |
| Si | 494 Hz |
| Do | 523 Hz |
抄来的旋律不是你的作品,你选出来的频率和节奏才是。
九、故障排查:没声音怎么办
按顺序自查,别乱试:
| 现象 | 先检查 |
|---|---|
| 完全没有声音 | 串口有没有报 ES8311 初始化失败?功放使能了吗? |
| 声音很小 | 音量数值调高(只要不刺耳) |
| 咔哒杂音 | 缓冲区清零了吗?播放完等送完再退出? |
| 播一半断 | 大缓冲区要用 PSRAM,别开在栈上 |
把现象如实告诉 AI,一次让它教你查一件事。
十、过关检查
不看 AI,自己说:
- 扬声器为什么会动?(电压 → 纸盆 → 空气,按顺序)
- "播放声音"在程序里到底是什么操作?
- DAC 干什么的?在我们板上住在哪颗芯片里?
- 采样率是什么?440Hz 用 8000 采样率播,音调会怎样?为什么?
- 440 和 880 的听感差别是什么?
- 你的旋律每个音用了几个数字?你怎样验证播对了?
十一、还能玩什么
| 方向 | 想法 | 继续想 |
|---|---|---|
| 摩斯电码练习器 | 短音 0.1s、长音 0.3s | 长短边界谁来定? |
| 倒计时蜂鸣 | 最后 5 秒每秒"滴",最后拉长 | 声音和屏幕怎么分工? |
| 门铃 | 按 BOOT 响"叮咚" | 两声间隔多久才像门铃? |
| 小乐器 | 用第 8 课触摸当琴键 | 触摸坐标怎么变成频率? |
想做"板子听懂我说话"?那要把声音收进来——第 12 课,麦克风在等你。