AI 编程课
完整教案
自学课件
11 课 · 共 11/48

让板子开口 ——扬声器怎样把数字变成声音

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
配套代码
见项目 demo 目录

自学读本:跟着读、照着做,卡住就问 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 秒)。
音与音之间不留空。音量中等偏低。帮我烧录。

参考频率("生日快乐"前四个音的频率):

音符频率
Sol392 Hz
La440 Hz
Si494 Hz
Do523 Hz

抄来的旋律不是你的作品,你选出来的频率和节奏才是。

九、故障排查:没声音怎么办

按顺序自查,别乱试:

现象先检查
完全没有声音串口有没有报 ES8311 初始化失败?功放使能了吗?
声音很小音量数值调高(只要不刺耳)
咔哒杂音缓冲区清零了吗?播放完等送完再退出?
播一半断大缓冲区要用 PSRAM,别开在栈上

把现象如实告诉 AI,一次让它教你查一件事。

十、过关检查

不看 AI,自己说:

  1. 扬声器为什么会动?(电压 → 纸盆 → 空气,按顺序)
  2. "播放声音"在程序里到底是什么操作?
  3. DAC 干什么的?在我们板上住在哪颗芯片里?
  4. 采样率是什么?440Hz 用 8000 采样率播,音调会怎样?为什么?
  5. 440 和 880 的听感差别是什么?
  6. 你的旋律每个音用了几个数字?你怎样验证播对了?

十一、还能玩什么

方向想法继续想
摩斯电码练习器短音 0.1s、长音 0.3s长短边界谁来定?
倒计时蜂鸣最后 5 秒每秒"滴",最后拉长声音和屏幕怎么分工?
门铃按 BOOT 响"叮咚"两声间隔多久才像门铃?
小乐器用第 8 课触摸当琴键触摸坐标怎么变成频率?

想做"板子听懂我说话"?那要把声音收进来——第 12 课,麦克风在等你。

本节配套资源 · 在线烧录

查看全部固件 →

下列演示程序已编译为可烧录固件。把你的 ESP32-S3 触摸屏板 用 USB 接上电脑(需 Chrome / Edge 浏览器),点「在线烧录」即可直接写入,无需安装任何软件。

第 11 课 · 第一次发声
可烧录

播放 440Hz 的滴声 0.8 秒。第 11 课第一个作品,理解播放声音等于按采样率送数字。

11 声音 扬声器
第 11 课 · 采样率实验
可烧录

同一段 440Hz 数据三种送法:正常、每个送两遍(变低)、隔一取一(变高)。数字没变,节奏变了音调就变。

11 采样率 实验
第 11 课 · 小星星旋律
可烧录

把频率和时长排成乐谱播放小星星前两句,屏幕显示当前音符。音高就是频率。

11 旋律 作品
第 11 课 · 门铃
可烧录

按 BOOT 响一声叮咚(988Hz 短音 + 784Hz 长音),屏幕计数。频率、时长、顺序都由你定。

11 门铃 作品