4. AMP 音频皮肤

焊接和使用 AMP 音频皮肤。

AMP skin AMP skin

以下视频展示了如何将接头、麦克风和扬声器焊接到 AMP 外壳上。

有关皮肤上组件的电路原理图和数据表,请参阅 pyboard 硬件

4.1. 示例代码

AMP 皮肤有一个扬声器,DAC(1) 通过一个小功率放大器连接到它。放大器的音量由数字电位器控制,数字电位器是总线上地址为 46 的 I2C 设备IC2(1)

要设置音量,请定义以下函数:

import pyb
def volume(val):
    pyb.I2C(1, pyb.I2C.MASTER).mem_write(val, 46, 0)

然后你可以这样做:

>>> volume(0)   # minimum volume
>>> volume(127) # maximum volume

要播放声音,请使用对象的write_timed 方法 DAC 。例如:

import math
from pyb import DAC

# create a buffer containing a sine-wave
buf = bytearray(100)
for i in range(len(buf)):
    buf[i] = 128 + int(127 * math.sin(2 * math.pi * i / len(buf)))

# output the sine-wave at 400Hz
dac = DAC(1)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

您还可以使用 Pythonwave模块播放 WAV 文件。您可以在此处 获取 wave 模块,您还需要 此处提供的 chunk 模块。将这些放在你的 pyboard 上(在闪存或顶级目录中的 SD 卡上)。您将需要一个 8 位 WAV 文件来播放,例如这个,或者使用以下命令转换您拥有的任何文件:

avconv -i original.wav -ar 22050 -codec pcm_u8 test.wav

然后你可以这样做:

>>> import wave
>>> from pyb import DAC
>>> dac = DAC(1)
>>> f = wave.open('test.wav')
>>> dac.write_timed(f.readframes(f.getnframes()), f.getframerate())

这应该播放 WAV 文件。请注意,这会将整个文件读入 RAM,因此它必须足够小以适应其中。

要播放更大的波形文件,您必须使用 micro-SD 卡来存储它。此外,必须读取文件并将其以适合微控制器 RAM 限制的小块发送到 DAC。这是一个示例函数,可以播放高达 16kHz 采样的 8 位波形文件:

import wave
from pyb import DAC
from pyb import delay
dac = DAC(1)

def play(filename):
    f = wave.open(filename, 'r')
    total_frames = f.getnframes()
    framerate = f.getframerate()

    for position in range(0, total_frames, framerate):
        f.setpos(position)
        dac.write_timed(f.readframes(framerate), framerate)
        delay(1000)

此函数读取一秒钟的数据并将其发送到 DAC。然后等待一秒钟并将文件光标移动到新位置,以在 for 循环的下一次迭代中读取下一秒的数据。它每隔一秒一次播放一秒的音频。