基础资料
基于Air105开发板:Air105 - LuatOS 文档
参考博文:
合宙Air103|AHT10|测温|I2C|数据手册|指令分析|官方demo|学习(5-1):AHT10测温模组_打酱油的工程师的博客-CSDN博客_aht10传感器手册
探讨重点
对官方LuatOS-SOC接口文档中audio - 多媒体-音频demo功能的复现,进行相关内容的学习及探讨,并实现了了Air105 MP3及环境温湿度实时监测功能。
实现功能
功能1:mp3播放及其他信息,实时显示在lcd屏幕上(st7789);
功能2:2x2 矩阵键盘自制及控制mp3播放,实现上下切歌以及播放暂停功能;
功能3:读取sd卡/music目录中的音频文件(.mp3或.wav);
功能4: ATH10模块实时温湿度显示;
功能5:DAC功放模块音频播放捕捉图片并通过Serial 串口接收数据存入电脑;
硬件准备
Air105开发板1块,面包板1块,TFTLCD 屏幕(st7789),Micro SD卡模块(SPI)接口1个, pam8403音频功放板/可调功放板, 2X2自制矩阵键盘, AHT10温湿度模块,8欧0.5w扬声器,导线若干。
Air105开发板
TFTLCD 屏幕
SD卡模块(SPI)
2X2自制矩阵键盘
pam8403音频功放板/可调功放板
AHT10温湿度模块
软件版本
AIR105:LuatOS@AIR105 base 22.12 bsp V0014 32bit
参考源代码仓库地址:
合宙luatos AIR105 媒体播放库 MP3 demo
>git remote -v
origin https://gitee.com/yingfumei96/Air105-MP3-demo.git (fetch)
origin https://gitee.com/yingfumei96/Air105-MP3-demo.git (push)
软件使用
接口文档可参考:audio - 多媒体-音频
接线示意图
2X2自制矩阵键盘
键盘正面及反面连接
电路原理及接线引脚(air105适用)
正常初始化log文件
功能1:mp3播放及其他信息,实时显示在lcd屏幕上(st7789)
lcd初始化
spi_lcd = spi.deviceSetup(5,pin.PC14,0,0,8,48*1000*1000,spi.MSB,1,1)
--debug信息:显示芯片类型st7789
log.info("lcd.init", --HSPI接口管脚对应连接
lcd.init("st7735",{port = "device",pin_dc = pin.PE08 ,pin_rst = pin.PC12,pin_pwr = pin.PE09,direction = 0,w = 128,h = 160,xoffset = 2,yoffset = 1},spi_lcd))
显示音频文件信息:
--显示正在播放音频部分
lcd.fill(0,70,320,100,0Xe3f9fd)
lcd.drawStr(0,90,"播放中"..(curPlay+1).."/"..tFiles..":"..playList[curPlay],0XFF9999)
lcd_music_munt()
其他详见music_demo.lua。
功能2:2x2 矩阵键盘自制及控制mp3播放,实现上下切歌以及播放暂停功能;
接线见以上硬件连接部分。
初始化代码:
--初始化矩阵键盘部分
key_in = {pin.PD13, pin.PD12}
key_out = {pin.PC5, pin.PC4}
softkb.init(0, key_in, key_out)
按键功能实例
功能3:挂在并读取sd卡/music目录中的音频文件;
--初始化SD卡部分,SD卡初始部分我是用的底部SPI2接线,具体情况根据自己使用修改
local tagLen = 0
local frameLen = 1152 * 4
local spiId = 2
local nowPlay
local result = spi.setup(
spiId,--串口id
255, -- 不使用默认CS脚
0,--CPHA
0,--CPOL
8,--数据宽度
400*1000 -- 初始化时使用较低的频率
)
local isMP3 = false
local TF_CS = pin.PB3
gpio.setup(TF_CS, 1)
-- fatfs.debug(1) -- 若挂载失败,可以尝试打开调试信息,查找原因
fatfs.mount("SD", spiId, TF_CS, 24000000)
-- fatfs.mount("SD", 0, TF_CS, 24000000)
读取音频文件:
if data then
log.info("fatfs", "getfree", json.encode(data))
local dir_nums, dir_info = fatfs.lsdir(musicDir)
for k,v in pairs(dir_info) do
if k:find(".mp3") or k:find(".MP3") or k:find(".wav") or k:find(".WAV") then
log.info("找到",k)
playList[tFiles] = k
tFiles = tFiles + 1
end
end
log.info("总共", tFiles)
prePlay = tFiles - 1
log.info("等待切换歌曲")
其他详见music_demo.lua。
功能4: ATH10模块实时温湿度显示;
i2c接线:
VCC ——》3.3V
GND——》GND
SCL——》PE6
SDA——》PE7
初始化代码:
function aht10.init(i2c_id)
i2cid = i2c_id
sys.wait(40)--40 毫秒等待设备稳定
i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, AHT10_SOFT_RESET)--软复位
sys.wait(20)
i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, AHT10_STATE)
local data = i2c.recv(i2cid, AHT10_ADDRESS_ADR_LOW, 1)
local _,state = pack.unpack(data, "b")
if bit.isclear(state,3) then
i2c.send(i2cid, AHT10_ADDRESS_ADR_LOW, {AHT10_INIT,0x08,0x00})--初始化
end
sys.wait(20)
log.info("aht10 init_ok")
return true
end
其他详见aht10.lua
功能5:DAC功放模块音频播放mp3音频
接线:
Audioin + ——》PC1
VCC ——》vbus(外接电源独立供电或开发板vbus引脚供电均可)
Audioin- ——》gnd
AudioOut——》扬声器+
DAC功放模块(不可调版,外接电源独立供电)
注意:左右声道输出端的“负极”不可以并接在一起,否则会烧IC,并且通电前应先接好喇叭(负载)。额定工作电压2.5-5V,极限工作电压5.5V。
DAC功放模块(可调版,开发板vbus引脚供电)
PAM8403芯片端口
注意:左右声道输出端的“负极”不可以并接在一起,否则会烧IC,并且通电前应先接好喇叭(负载)。额定工作电压5V,电压过低不能正常驱动。
整体连接
PS: DAC数字模拟
1、DAC是一种将数字信号转换为模拟信号的设备,电脑对声音这种信号不能直接处理,先把它转化成电脑能识别的数字信号,就要用到声卡中的DAC,它把声音信号转换成数字信号,要分两步进行即采样和转换,即数/模转换器,一种将数字信号转换成模拟信号的装置。
2、数字信号是用于将数据表示为离散值序列的信号,在任何给定时间它只能取有限数量值中的一个,这与代表连续值的模拟信号形成对比,在任何给定时间,它代表一个连续数值范围内的实数, 单的数字信号代表模拟电平离散带中的信息,一定范围内的所有值代表相同的信息状态。
3、就PC和数字播放器/数字转盘而言,音频源文件通常为MP3,FLAC等,其中绝大多数音源文件均属于压缩文件,即便是FLAC和APE也属于压缩文件格式,只不过属于无损压缩而MP3则属于有损压缩。