首页 > 其他分享 >《DNK210使用指南 -CanMV版 V1.0》第二十八章 音频播放实验

《DNK210使用指南 -CanMV版 V1.0》第二十八章 音频播放实验

时间:2024-10-09 14:36:49浏览次数:1  
标签:play audio 音频 I2S dev V1.0 使用指南 DNK210 i2s

第二十八章 音频播放实验

1)实验平台:正点原子DNK210开发板

2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0

3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子K210技术交流企鹅群:605557868

本章将介绍CanMV下的音频播放,通过CanMV提供的模块便能快速实现音频播放。通过本章的学习,读者将学习到CanMV下控制I2S输出音频数据和audio模块的使用。
本章分为如下几个小节:
28.1 maix.I2S模块及audio模块介绍
28.2 硬件设计
28.3 程序设计
28.4 运行验证

28.1 maix.I2S模块及audio模块介绍
Kendryte K210拥有三个I2S标准接口,且都是Master模式,Kendryte K210上的I2S特点如下所示:

  1. 总线宽度可配置为8、16、32位
  2. 每个接口最多支持4个立体声通道
  3. 由于发送器和接收器的独立性,所以支持全双工通信
  4. APB总线和I2S sclk的异步时钟
  5. 音频数据分辨率为12、16、20、14、32位
  6. 可配置的FIFO深度为2、4、8、16字
  7. 可配置可编程的DMA寄存器
  8. 可编程FIFO阈值

在CanMV中可以使用CanMV提供的maix.I2S模块操作Kendryte K210上的I2S。maix.I2S模块可以配置I2S的通道传输模式、通道分辨率、采样率等参数。
maix.I2S模块提供了I2S构造函数,用于创建一个I2S对象,I2S构造函数如下所示:

class I2S(device_num, sample_points=1024, pll2=0, mclk=0)

通过I2S构造函数可以通过指定参数创建并初始化一个I2S对象。
device_num指的是I2S设备的编号,可以指I2S.DEVICE_0、I2S.DEVICE_1或I2S.DEVICE_2,它们分别对用了Kendryte K210硬件上的三个I2S接口设备。
sample_points指的是I2S设备的采样率,默认为1024,最大值为65536。
pll2指的是Kendryte K210 PLL2的频率,当为0时表示不对PLL2进行额外配置。
mclk指的是Kendryte K210 I2S设备输入时钟的分频系数,输入时钟来自PLL2,当为0时表示不对该分频系数进行额外配置。
I2S构造函数的使用示例如下所示:

from maix import I2S
i2s_dev = I2S(I2S.DEVICE_0)

maix.I2S为I2S对象提供了channel_config()方法,用于对I2S设备的通道进行配置,channel_config()方法如下所示:

I2S.channel_config(channel=I2S.CHANNEL_0, mode=I2S.RECEIVER, resolution=I2S.RESOLUTION_16_BIT,
 cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)

channel_config()方法用于配置I2S设备指定通道的各项参数,包括传输模式、分辨率、单个数据时钟数、对齐模式等。
channel指的是通道编号,可以是I2S.CHANNEL_0~I2S.CHANNEL_3,分别对应了Kendryte K210 I2S设备的通道0~通道3。
mode指的是I2S通道的传输模式,可以是I2S.TRANSMITTER或I2S.RECEIVER,分别对应了发送模式和接收模式,其中发送模式用于播放音频,而接收模式用于录制音频。
resolution指的是I2S通道的分辨率,即接收数据位数,可以是I2S.RESOLUTION_12_BIT、I2S.RESOLUTION_16_BIT、I2S.RESOLUTION_20_BIT、I2S.RESOLUTION_24_BIT或I2S.RESOLUTION_32_BIT。
cycles指的是I2S通道的单个数据占用的时钟数量,可以是I2S.SCLK_CYCLES_16、I2S.SCLK_CYCLES_24或I2S.SCLK_CYCLES_32。
align_mode指的是I2S通道的数据对齐模式,可以是I2S.STANDARD_MODE、I2S.RIGHT_JUSTIFYING_MODE或I2S.LEFT_JUSTIFYING_MODE。
channel_config()方法的使用示例如下所示:

from maix import I2S
i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT, 
cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)

maix.I2S为I2S对象提供了set_sample_rate()方法,用于配置I2S对象的采样率,set_sample_rate()方法如下所示:

I2S.set_sample_rate(sample_rate)

set_sample_rate()方法用于配置I2S对象的采样率,只有正确地配置了采样率,才能正确地播放音频。
sample_rate指的是采样率,最大值为4194304。
set_sample_rate()方法的使用示例如下所示:

from maix import I2S
i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT, 
cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)
i2s_dev.set_sample_rate(44100)

maix.I2S为I2S对象提供了record()方法,用于从I2S对象获取音频数据,record()方法如下所示:

I2S.record(points=0, time=0)

record()方法用于从I2S对象获取音频数据,获取数据的长度可以通过采样点或时间进行指定。
points指的是获取音频数据的采样点数量,默认为0。
time指的是获取音频数据的时间长度,单位为秒(S),默认为0。
record()的使用示例如下所示:

from maix import I2S
i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT, 
cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)
i2s_dev.set_sample_rate(44100)
i2s_dev.record(time=10)

maix.I2S模块仅仅是用于配置Kendryte K210硬件上的I2S接口设备,但对于音频文件的编解码以及数据流的处理,需要使用到CanMV提供的audio模块。
audio模块是CanMV内置的模块,audio模块用于音频的播放和录制,audio模块可以抽象出音频对象,该对象可以被当作参数传入,也可以直接只用该对象的方法来播放和录制音频。
audio模块提供了Audio构造函数,用于创建一个Audio对象,Audio构造函数如下所示:

class Audio(array=None, path=None, points=1024, is_creat=False, samplerate=44100)

通过Audio构造函数可以通过指定参数创建初始化一个Audio对象。
array指的是bytearray类型的音频数据,可以将该数据转换为音频对象,默认为None。
path指的是文件系统中的音频文件的路径,目前CanMV仅支持WAV格式的音频文件。
points指的是构造Audio对象时创建多少个采样点的音频缓冲区,一个采样点的大小为32bit,默认为1024。
is_creat指的是CanMV以什么样的方式打开path指定的音频文件,当为True时,CanMV将以只写方式打开音频文件,一般用于音频录制,当为False时,CanMV将以只读方式打开音频文件,一般用于音频播放,默认为False。
samplerate指的是采样率,默认为44100。
Audio构造函数的使用示例如下所示:

import audio
audio_player = audio.Audio(path="/sd/MUSIC/play.wav")

audio模块为Audio对象提供了play_process()方法,用于预处理音频对象,play_process()方法如下所示:

audio.play_process(i2s_dev)

play_process()方法用于预处理音频对象,在播放音频之前需要对音频文件进行解析,并且传入一个用于播放音频的I2S对象。
i2s_dev指的是使用maix.I2S模块提供的I2S构造函数构造的I2S对象。
play_process()方法会解析音频文件,并但会以list类型返回WAV文件的头部信息,包含numchannels(声道数)、samplerate(采样率)、byterate(每秒数据字节数 = samplerate * numchannels* bitspersample / 8)、blockalign(每个采样所需的字节数 = numchannels * bitspersample / 8)、bitspersample(每个采样存储的bit数,8:8bit,16:16bit,32:32bit),datasize(音频数据长度)。
play_process()方法的使用示例如下所示:

from maix import I2S
import audio
i2s_dev = I2S(I2S.DEVICE_0)
audio_player = audio.Audio(path="/sd/MUSIC/play.wav")
wav_info = audio_player.play_process(i2s_dev)

audio模块为Audio对象提供了play()方法,用于读取音频文件并解析播放,play()方法如下所示:

audio.play()

play()方法用于读取音频文件并解析播放,每次执行play()函数会读取并解析播放一小段音频文件,因此play()函数需要配合循环使用。
play()方法的使用示例如下所示:

from maix import I2S
import audio
i2s_dev = I2S(I2S.DEVICE_0)
audio_player = audio.Audio(path="/sd/MUSIC/play.wav")
wav_info = audio_player.play_process(i2s_dev)
i2s_dev.set_sample_rate(wav_info[1])
while audio_player.play():
    pass

audio模块为Audio对象提供了volume()方法,用于配置播放音频时的音量,volume()方法如下所示:

audio.volume(volume)

volume()方法用于配置播放音频时的音量。
volume指的是配置的音量,范围为[0, 100]。
volume()方法的使用示例如下所示:

from maix import I2S
import audio
i2s_dev = I2S(I2S.DEVICE_0)
audio_player = audio.Audio(path="/sd/MUSIC/play.wav")
audio_player.volume(30)

audio模块为Audio对象提供了record()方法,用于将从I2S对象获取到的音频数据使用WAV编码保存到文件系统中,record()方法如下所示:

audio.record(record)

record()方法用于将从I2S对象获取到的音频数据保存到构建Audio对象时指定的文件中。
record指的是从I2S对象获取到的音频数据。
record()方法的使用示例如下所示:

from maix import I2S
import audio
i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.RECEIVER, align_mode=I2S.STANDARD_MODE)
i2s_dev.set_sample_rate(11400)
audio_recorder = audio.Audio(path="/sd/record.wav", is_create=True, samplerate=11400)
data = i2s_dev.record(time=10)
audio_recorder.record(datas[0])

28.2 硬件设计
28.2.1 例程功能

  1. 使用maix.I2S模块和audio模块播放CanMV文件系统中指定的音频文件。

28.2.2 硬件资源

  1. 数字功放NS4168
    SPK_CTRL- IO21
    IIS_SDOUT- IO31
    IIS_BCK- IO32
    IIS_LRCK- IO33

28.2.3 原理图
本章实验内容,需要解析文件系统中的WAV文件,然后将音频数据通过I2S接口发送到数字功放NS4168,随后NS4168便可根据配置,控制板载的扬声器发声。
DNK210开发板上的数字功放NS4168的连接原理图,如下图所示:

图28.2.3.1 数字功放NS4168连接原理图

关于数字功放NS4168的使用方法,可参考NS4168的数据手册,NS4168的数据手册可通过网站获取,网址为:http://www.nsiway.com.cn/product/18.html。
这里简单对NS4168的CTRL引脚进行说明,当CTRL引脚上的电压为0V0.4V时,NS4168处于低功耗关断状态,当CTRL引脚上的电压为0.9V1.15V时,NS4168控制扬声器播放I2S接口接收到音频数据中的左声道数据,当CTRL引脚上的电压为1.5V~VDD时,NS4168控制扬声器播放I2S接口接收到的音频数据中的右声道数据。

28.3 程序设计
28.3.1 maix.I2S模块及audio模块介绍
有关maix.I2S模块及audio模块的介绍,请见第28.1小节《maix.I2S模块及audio模块介绍》。
28.3.2 程序流程图

图28.3.2.1 音频播放实验流程图

28.3.3 main.py代码
main.py中的脚本代码如下所示:

from board import board_info
from fpioa_manager import fm
from maix import GPIO
from maix import I2S
import audio
fm.register(board_info.SPK_CTRL, fm.fpioa.GPIO0)
fm.register(board_info.SPK_WS, fm.fpioa.I2S0_WS)
fm.register(board_info.SPK_SCLK, fm.fpioa.I2S0_SCLK)
fm.register(board_info.SPK_SDOUT, fm.fpioa.I2S0_OUT_D0)
# 控制数字功放播放右声道音频数据
spk_ctl = GPIO(GPIO.GPIO0, GPIO.OUT)
spk_ctl.value(1)
# 构造I2S对象并配置I2S通道
i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT, 
cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)
# 构造Audio对象并解析音频文件
audio_player = audio.Audio(path="/sd/MUSIC/play.wav")
wav_info = audio_player.play_process(i2s_dev)
# 根据解析数据配置I2S对象的采样率并配置播放音量
i2s_dev.set_sample_rate(wav_info[1])
audio_player.volume(30)
# 循环播放音频文件
while audio_player.play():
    pass
# 结束音频播放
audio_player.finish()

可以看到首先是为GPIO以及I2S分配IO,然后控制数字功放NS4168的CTRL引脚为高电平,此时NS4168被配置为控制扬声器播放音频数据中的右声道音频。
接着是构造了一个I2S对象,并配置了I2S对应的通道为发送模式,因为本实验需要播放音频数据。
再接着构造了一个Audio对象,Audio对象与文件系统中的音频文件进行绑定,然后解析音频文件,获取音频文件WAV的头部信息。
接下来根据WAV头部信息中的采样率配置I2S对象,同时配置好Audio对象输出音频的音量。
然后就是循环播放音频数据了,如果都没有问题的话,此时应该能听见DNK210开发板板载的扬声器发声了。
最后在音频文件播放完毕后,结束音频播放,释放音频播放占用的资源。
28.4 运行验证
将DNK210开发板连接CanMV IDE,同时将实验例程目录下的play.wav音频文件放入SD卡根目录下的media文件夹下后,点击CanMV IDE上的“开始(运行脚本)”按钮后,可以听到DNK210开发板板载的扬声器播放了play.wav音频。

标签:play,audio,音频,I2S,dev,V1.0,使用指南,DNK210,i2s
From: https://www.cnblogs.com/zdyz/p/18451148

相关文章

  • 民宿酒店预订系统V1.0.10
    多门店民宿酒店预订管理系统,快速部署属于自己民宿酒店的预订小程序,包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码,支持私有化部署。V1.0.10修复海报分享错误......
  • 谷歌收录查询工具,告诉你谷歌收录查询工具使用指南
    谷歌收录查询工具是网站管理员和SEO专家用于监控和管理网站在谷歌搜索结果中表现的重要工具。以下是一份详细的谷歌收录查询工具使用指南,旨在帮助你更好地了解和使用这些工具。一、GoogleSearchConsole(谷歌搜索控制台)GoogleSearchConsole是谷歌官方提供的免费工具,用于监控......
  • 沃德校友会管理系统V1.0.2
    校友会综合服务平台,即校友信息管理平台、活动管理平台、校友服务大厅、校友企业服务平台等,实现集中学校、学院、校友会于一体的基础服务平台的搭建,建设一个满足校友信息化长期发展的、可扩展的综合校友服务平台,提供全部无加密源代码,支持私有化部署。目前Uniapp仅支持编译微信小程序......
  • 智能名片V1.0.6
    在线介绍公司和个人名片,获取客户信息,让客户了解公司产品,尽可能达成成交。V1.0.6安全更新体验优化和代码规范更新1.更新已知bug和体验。2.代码安全更新。......
  • 沃德云商协系统v1.0.2
    “多组织”的云服务平台,打造总商会、总协会、总校友会、工商联等多组织无障碍沟通合作平台,让各大分会、各大分校友会、分组织实现轻松管理,线上宣传展示、商机挖掘、会员管理、会员服务、跨界交流等,借助沃德云商协平台系统,让总商会、总协会、总校友会、工商联插上互联网的翅膀,更好......
  • 重生之我要做商城 - 萌音商城V1.0上线
    萌音系列的第N+1个项目来了呢.这其实又是一个鸽了好几年的项目了,这回总算能把坑填上了.先上项目地址:https://MoeKoe.cn我为什么一直在做项目?这个问题就很有意思了,为什么一直在做各种项目,而且还是不挣钱的东西.接触过我之前一些项目的小伙伴都知道我开发什么项目都是本......
  • 【Docker】Docker 容器的使用指南:如何进入容器并运行命令
    目录1.什么是Docker容器?2.进入Docker容器的方法2.1使用`dockerexec`2.2使用`dockerattach`2.3使用`dockerrun`3.常见选项与参数4.退出容器5.进入容器的实际操作步骤步骤1:查看正在运行的容器步骤2:进入容器步骤3:在容器中运行命令步骤4:退出容器6.......
  • Capital许可证管理系统介绍及使用指南
    随着企业对软件依赖程度的不断加深,Capital许可证管理系统成为了确保软件合规使用和提升管理效率的重要工具。本文将为您详细介绍Capital许可证管理系统的功能和使用指南,帮助您轻松实现合规与高效管理。一、Capital许可证管理系统介绍Capital许可证管理系统是一款专为企业设计的......
  • 【数据库】Java 中 MongoDB 使用指南:步骤与方法介绍
    MongoDB是一个流行的NoSQL数据库,因其灵活性和高性能而广泛使用。在Java中使用MongoDB,可以通过MongoDB官方提供的Java驱动程序来实现。本文将详细介绍在Java中使用MongoDB的步骤以及相关方法。1.环境准备1.1安装MongoDB首先,确保你的系统中安装了Mongo......
  • Java的枚举类型使用指南
    测试代码:publicclassEnumTest{publicstaticvoidmain(String[]args){Sizes=Size.SMALL;Sizet=Size.LARGE;//s和t引用同一个对象?System.out.println(s==t);////是原始数据类型吗?System.out.println(s.getClass().isPrimitive());......