【雕爷学编程】MicroPython手册之 pyboard 的 I2S总线

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
MicroPython的pyboard是一种基于STM32F405RG微控制器的开发板,它可以运行MicroPython语言,实现各种有趣和有用的功能。它的主要特点有:

体积小巧,采用邮票孔设计,方便嵌入各种项目中。
内置了4个LED灯,1个开关,1个复位按钮,1个用户按钮,1个USB接口,1个SD卡插槽,1个RTC电池座等。
内置了三轴加速度计(MMA7660),可以检测板子的运动和倾斜。
支持完整的MicroPython语言功能,包括REPL交互模式,内置模块,文件系统操作等。
支持多种通信协议,如UART,SPI,I2C,CAN等。
支持多种外设和传感器的接入和控制,如LCD屏幕,音频放大器,温湿度传感器等。

在这里插入图片描述
MicroPython的pyboard I2S总线,是一种可以实现双工同步串行通信协议的功能,它可以用于与其他设备或电脑进行音频数据的交换。pyboard I2S总线的主要特点、应用场景,以及需要注意的事项如下:

主要特点:

pyboard I2S总线可以使用machine.I2S类来创建I2S对象,连接到一个特定的总线。总线可以是1或2,分别对应X和Y位置的引脚。
pyboard I2S总线可以设置通信的参数,如时钟引脚、帧同步引脚、数据引脚、模式、位数、格式、采样率、缓冲区大小等。模式可以是I2S.TX或I2S.RX,分别表示发送或接收。
pyboard I2S总线可以使用write()方法或write_readinto()方法来发送或接收音频数据。write()方法是将一个缓冲区中的数据写入到I2S设备,write_readinto()方法是同时写入和读取一个缓冲区中的数据。
pyboard I2S总线还可以使用init()方法或deinit()方法来初始化或反初始化I2S对象。init()方法是重新配置I2S对象的参数,deinit()方法是释放I2S对象占用的资源。

应用场景:

pyboard I2S总线可以用于与其他设备进行音频数据的交换,如麦克风、扬声器、耳机等 ,这些设备可以提供录音、播放、监听等功能。
pyboard I2S总线可以用于与电脑进行音频数据的交换,如通过USB转I2S模块或无线I2S模块 ,这些模块可以实现pyboard与电脑之间的音频传输和控制。
pyboard I2S总线可以用于实现简单的音频处理,如滤波、混音、编解码等3,这些处理可以用于增强或变化音频效果。

需要注意的事项:

pyboard I2S总线的输入输出电压范围是0~3.3V,如果与其他设备通信时电压不匹配,可能会损坏芯片或引脚。因此,在接入外部信号时,需要注意信号的幅值和极性,并使用电平转换电路或保护电路来适配或隔离信号。
pyboard I2S总线的通信频率受到芯片时钟、闪存访问速度和编程模式等因素的影响。在高通信频率下,可能会出现数据丢失或时序不准确的情况。因此,在使用I2S时,需要根据实际需求选择合适的参数,并测试其性能和稳定性。
pyboard I2S总线的引脚分配和物理位置因不同型号的pyboard而异。在使用I2S时,需要注意选择正确的引脚,并避免与其他功能冲突。

实际运用程序参考代码案例:

案例1:使用machine.I2S类从麦克风(INMP441)接收音频数据,并将其写入到文件中。

import machine
import uos

#创建I2S对象,连接到总线2,设置为接收模式,位数为32,格式为左对齐,采样率为44100,缓冲区大小为40000
i2s = machine.I2S(2, sck=machine.Pin('Y6'), ws=machine.Pin('Y5'), sd=machine.Pin('Y8'), mode=machine.I2S.RX, bits=32, format=machine.I2S.LEFT_JUSTIFIED, rate=44100, ibuf=40000)

#创建一个字节数组,用于存储音频数据
buf = bytearray(1024)

#创建一个文件对象,用于写入音频数据
f = uos.open('audio.wav', 'wb')

#循环读取音频数据,并写入到文件中
for _ in range(1000):
    #从I2S设备读取音频数据到缓冲区
    i2s.readinto(buf)
    #将缓冲区中的音频数据写入到文件中
    f.write(buf)

#关闭文件对象
f.close()

案例2:使用machine.I2S类从文件中读取音频数据,并将其发送到扬声器(MAX98357A)。

import machine
import uos

#创建I2S对象,连接到总线1,设置为发送模式,位数为16,格式为标准I2S,采样率为44100,缓冲区大小为40000
i2s = machine.I2S(1, sck=machine.Pin('X5'), ws=machine.Pin('X6'), sd=machine.Pin('Y4'), mode=machine.I2S.TX, bits=16, format=machine.I2S.STANDARD, rate=44100, ibuf=40000)

#创建一个字节数组,用于存储音频数据
buf = bytearray(1024)

#创建一个文件对象,用于读取音频数据
f = uos.open('audio.wav', 'rb')

#循环读取音频数据,并发送到I2S设备
while True:
    #从文件中读取音频数据到缓冲区
    n = f.readinto(buf)
    #如果没有读取到数据,表示文件结束,退出循环
    if n == 0:
        break
    #将缓冲区中的音频数据发送到I2S设备
    i2s.write(buf)

#关闭文件对象
f.close()

案例3:使用machine.I2S类实现一个简单的回声效果。

import machine

#创建两个I2S对象,分别用于接收和发送音频数据
i2s_rx = machine.I2S(1, sck=machine.Pin('X5'), ws=machine.Pin('X6'), sd=machine.Pin('Y4'), mode=machine.I2S.RX, bits=16, format=machine.I2S.STANDARD, rate=44100, ibuf=40000)
i2s_tx = machine.I2S(2, sck=machine.Pin('Y6'), ws=machine.Pin('Y5'), sd=machine.Pin('Y8'), mode=machine.I2S.TX, bits=16, format=machine.I2S.STANDARD, rate=44100, ibuf=40000)

#创建两个字节数组,分别用于存储接收和发送的音频数据
buf_rx = bytearray(1024)
buf_tx = bytearray(1024)

#初始化发送缓冲区为全零
for i in range(len(buf_tx)):
    buf_tx[i] = 0

#定义一个混响系数(0~1之间)
alpha = 0.5

#循环接收和发送音频数据,并实现回声效果
while True:
    #从I2S设备接收音频数据到接收缓冲区
    i2s_rx.readinto(buf_rx)
    #遍历接收缓冲区中的每个字节
    for i in range(len(buf_rx)):
        #将接收缓冲区中的字节与发送缓冲区中的字节按比例混合,并存储到发送缓冲区中
        buf_tx[i] = int((1 - alpha) * buf_rx[i] + alpha * buf_tx[i])
    #将发送缓冲区中的音频数据发送到I2S设备
    i2s_tx.write(buf_tx)

案例4:使用I2S总线录制音频:

import pyb

i2s = pyb.I2S(1)  # 初始化I2S对象,使用I2S 1

i2s.init(pyb.I2S.MASTER | pyb.I2S.RX)  # I2S初始化为主模式和接收模式

buffer = bytearray(1024)  # 缓冲区

while True:
    i2s.readinto(buffer)  # 从I2S总线读取音频数据
    
    # 处理音频数据
    # ...

这个程序使用 MicroPython 在 pyboard 上配置 I2S 对象,并使用 I2S 总线录制音频。使用 I2S 对象 i2s 初始化 I2S 1,并设置为主模式和接收模式。然后在一个循环中,使用 i2s.readinto() 方法从 I2S 总线读取音频数据,并将数据存储在缓冲区 buffer 中。接收到的音频数据可以进行进一步的处理。

案例5:使用I2S总线播放音频::

import pyb

i2s = pyb.I2S(1)  # 初始化I2S对象,使用I2S 

i2s.init(pyb.I2S.MASTER | pyb.I2S.TX)  # I2S初始化为主模式和发送模式

buffer = bytearray(1024)  # 缓冲区

while True:
    # 生成音频数据
    # ...
    
    i2s.write(buffer)  # 向I2S总线写入音频数据
    
    # 等待音频播放完成
    # ...

这个程序使用 MicroPython 在 pyboard 上配置 I2S 对象,并使用 I2S 总线播放音频。使用 I2S 对象 i2s 初始化 I2S 1,并设置为主模式和发送模式。然后在一个循环中,生成音频数据,并将数据存储在缓冲区 buffer 中。使用 i2s.write() 方法将音频数据写入 I2S 总线进行播放。可以通过适当的方式等待音频播放完成。

案例6:使用I2S总线与外部音频编解码器交互::

import pyb

i2s = pyb.I2S(1)  # 初始化I2S对象,使用I2S 1

i2s.init(pyb.I2S.MASTER | pyb.I2S.TX)  # I2S初始化为主模式和发送模式

while True:
    # 生成音频数据
    # ...
    
    i2s.write_timed(buffer, len(buffer), 0)  # 向I2S总线写入音频数据,并控制编解码器的时钟
    
    # 处理音频数据
    # ...

这个程序使用 MicroPython 在 pyboard 上配置 I2S 对象,并使用 I2S 总线与外部音频编解码器进行交互。使用 I2S 对象 i2s 初始化 I2S ,并设置为主模式和发送模式。然后在一个循环中,生成音频数据,并将数据存储在缓冲区 buffer 中。使用 i2s.write_timed() 方法将音频数据写入 I2S 总线进行发送,并控制编解码器的时钟。接收到的音频数据可以进行进一步的处理。请注意,以上代码仅为示例,具体的配置和使用方法可能需要根据实际的硬件设备和需求进行调整。

MicroPython的pyboard I2S总线是一种用于音频数据传输的接口,通常用于音频输入和输出。然而,pyboard并不直接支持I2S总线。因此,我无法为你提供在pyboard上使用MicroPython进行I2S总线通信的实际运用程序参考代码案例。请注意,虽然pyboard可能具有一些用于音频处理的功能,但它并没有专门的I2S接口。如果你需要在MicroPython中使用I2S总线进行音频数据传输,你可能需要考虑使用其他硬件平台,如ESP32或Raspberry Pi等,这些平台提供了对I2S总线的直接支持。

对于pyboard上的音频处理,你可以考虑使用其它接口,例如ADC(模数转换器)和DAC(数模转换器)。pyboard上有ADC和DAC接口可用于音频输入和输出,你可以通过这些接口进行音频采集和播放。以下是在pyboard上使用ADC和DAC进行音频输入和输出的示例代码:

案例7:音频输入(使用ADC):

import pyb

adc = pyb.ADC('X12')  # 初始化ADC对象,使用引脚X12

while True:
    value = adc.read()  # 读取ADC值
    # 对读取的值进行音频处理操作
    # ...

案例8:音频输出(使用DAC):

import pyb

dac = pyb.DAC('X5')  # 初始化DAC对象,使用引脚X5

audio_data = [0, 100, 200, 300, 400, 500, 600, 700]  # 音频数据

while True:
    for value in audio_data:
        dac.write(value)  # 写入DAC值
        # 等待适当的时间以控制音频播放速度

上述示例仅展示了在pyboard上使用ADC和DAC接口进行音频输入和输出的基本用法。具体的音频处理操作和音频数据格式将根据你的应用需求而有所不同。你可以根据实际情况进行修改和扩展。

请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值