硬件说明
今天仔细看了一下dan dock的硬件,发现有一个小的贴片mic。还有一个功放。
查看官方的手册,可以推动2*3W的扬声器,比较奈斯。下面来搞一下这个声音的录制吧。
后续有更高的需求的话,可以购买官方的mic阵列。
硬件
原理图分析
根据原理图可知:
mic接入引脚:
- data 31
- ws 30
- clk 32 喇叭引脚:
- data 34
- ws 33
- clk 35
焊接喇叭
硬件上,默认并没有焊接扬声器,我们找到扬声器的接口,L,R 接一个喇叭,如图:
焊接over:
录音
录音,初始化iis后,调整参数,录制的格式是wav格式。这个和正常的录音程序是一样的。
code
我并没有插入sd卡,所以我把录音的文件放到了同路径下。
import time
import audio
from Maix import GPIO, I2S
from fpioa_manager import fm
# user setting
sample_rate = 16000
record_time = 4
sample_points = 2048
wav_ch = 2
#禁用wifi
fm.register(8, fm.fpioa.GPIO0, force=True)
wifi_en = GPIO(GPIO.GPIO0, GPIO.OUT)
wifi_en.value(0)
#输入配置
fm.register(31,fm.fpioa.I2S0_IN_D0, force=True)
fm.register(30,fm.fpioa.I2S0_WS, force=True)
fm.register(32,fm.fpioa.I2S0_SCLK, force=True)
rx = I2S(I2S.DEVICE_0)
rx.channel_config(rx.CHANNEL_0, rx.RECEIVER, align_mode=I2S.STANDARD_MODE)
rx.set_sample_rate(sample_rate)
print(rx)
# init audio
recorder = audio.Audio(path="record.wav", is_create=True, samplerate=sample_rate)
queue = []
frame_cnt = record_time*sample_rate//sample_points
for i in range(frame_cnt):
tmp = rx.record(sample_points*wav_ch)
if len(queue) > 0:
ret = recorder.record(queue[0])
queue.pop(0)
rx.wait_record()
queue.append(tmp)
print(str(i) + ":" + str(time.ticks()))
recorder.finish()
结果
因为dan的调试并没有支持shell指令,那么我们还需要使用一个小的程序看一下我们当前目录下是否已经录制成功了。
code
import os
f=os.listdir()
print(f)
效果
采集声音并播放
from Maix import GPIO, I2S
import image, lcd, math
import audio
from fpioa_manager import fm
sample_rate = 22050
sample_points = 1024
fm.register(8, fm.fpioa.GPIO0, force=True)
wifi_en = GPIO(GPIO.GPIO0, GPIO.OUT)
wifi_en.value(0)
rx = I2S(I2S.DEVICE_0)
rx.channel_config(I2S.CHANNEL_0,
rx.RECEIVER,
resolution = I2S.RESOLUTION_16_BIT,
cycles = I2S.SCLK_CYCLES_32,
align_mode = I2S.STANDARD_MODE)
rx.set_sample_rate(sample_rate)
fm.fpioa.set_function(pin=31, func=fm.fpioa.I2S0_IN_D0)
fm.fpioa.set_function(pin=30, func=fm.fpioa.I2S0_WS)
fm.fpioa.set_function(pin=32, func=fm.fpioa.I2S0_SCLK)
tx = I2S(I2S.DEVICE_2)
tx.channel_config(I2S.CHANNEL_1,
I2S.TRANSMITTER,
resolution = I2S.RESOLUTION_16_BIT,
cycles = I2S.SCLK_CYCLES_32,
align_mode = I2S.RIGHT_JUSTIFYING_MODE)
tx.set_sample_rate(sample_rate)
fm.fpioa.set_function(pin=34, func=fm.fpioa.I2S2_OUT_D1)
fm.fpioa.set_function(pin=35, func=fm.fpioa.I2S2_SCLK)
fm.fpioa.set_function(pin=33, func=fm.fpioa.I2S2_WS)
while True:
tx.play(rx.record(sample_points))