【雕爷学编程】MicroPython手册之 pyboard 特定端口库 pyb. ADC

在这里插入图片描述

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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述

pyboard是一个紧凑而强大的电子开发板,运行MicroPython。它通过USB连接到您的PC,为您提供一个USB闪存驱动器来保存Python脚本,以及用于即时编程的串行Python提示符(REPL)。需要微型 USB 电缆。适用于 Windows、Mac 和 Linux。

MicroPython是对Python(版本3.4)编程语言的完全重写,因此它适合并在微控制器上运行。它包括许多优化,因此它可以高效运行并使用很少的 RAM。

MicroPython在pyboard上运行裸机,本质上是一个Python操作系统。内置 pyb 模块包含用于控制板上可用外设的函数和类,例如 UART、I2C、SPI、ADC 和 DAC。观看此视频,了解 pyboard 的概述。

在这里插入图片描述

MicroPython 的 pyb. ADC 是一个用于进行模拟到数字转换的类,它可以让你从一个引脚上读取模拟值。它的基本定义如下:

你可以通过传入一个引脚对象来创建一个 pyb. ADC 的实例,例如 adc = pyb.ADC(pyb.Pin.board.X19)。
你可以使用 adc.read() 方法来读取引脚上的模拟值,返回值是一个介于 0 到 4095 之间的整数。
你还可以使用 adc.read_timed(buf, timer) 方法来以一定的频率读取模拟值,并将其存储在一个缓冲区中。这个方法需要传入一个字节数组或数组对象作为缓冲区,以及一个定时器对象或一个整数作为采样频率。
此外,你还可以使用 pyb.ADCAll 类来创建一个用于读取所有 ADC 通道的对象,包括 MCU 的温度、电池电压和参考电压等。你可以使用 adc.read_channel(channel) 方法来读取指定通道的值,或者使用其他方法来读取 MCU 的相关数据。

MicroPython 的 pyb. ADC 是一个用于进行模拟到数字转换的类,它可以让你从一个引脚上读取模拟值。它的主要特点、应用场景和注意事项如下:

它的主要特点是:

它可以支持多达 16 个 ADC 通道,其中 12 个是外部引脚,4 个是内部通道。
它可以提供 12 位的分辨率,即每个模拟值对应一个 0 到 4095 之间的整数。
它还可以使用定时器来实现定时采样,从而提高采样效率和精度。

它的应用场景有:
可以用来读取各种模拟传感器的输出,例如温度、湿度、光照、声音、压力等。
可以用来实现一些模拟信号的处理和分析,例如滤波、放大、调制、解调等。
可以用来实现一些有趣的项目或游戏,例如电子琴、心跳检测、声控灯等。

它的注意事项有:
在使用 pyb. ADC 时,应选择合适的引脚,并注意引脚的电压范围和输入阻抗。
在使用 pyb. ADCAll 时,应注意内部通道的编号和含义,并注意 MCU 的温度和电压会受到外界环境的影响。
在使用定时采样时,应注意缓冲区的大小和类型,并注意定时器的频率和分辨率。

以下是 MicroPython 的 pyb. ADC 的几个实际运用程序案例:

案例1:电子琴:通过连接不同的电阻到一个 ADC 引脚上,实现不同的音调。代码如下::

import pyb
import math

# 初始化 ADC 和蜂鸣器
adc = pyb.ADC(pyb.Pin.board.X19)
buzzer = pyb.Pin('X1', pyb.Pin.OUT_PP)

# 定义一个函数,根据 ADC 的值生成相应的频率
def get_freq(value):
    # 将 ADC 的值映射到一个八度音阶上
    # 假设 ADC 的最大值对应高 C,即 523.25 Hz
    # 假设 ADC 的最小值对应低 C,即 261.63 Hz
    # 使用对数函数来实现非线性映射
    return math.exp(math.log(261.63) + value / 4095 * math.log(2))

# 主循环
while True:
    # 读取 ADC 的值
    value = adc.read()
    # 获取相应的频率
    freq = get_freq(value)
    # 根据频率控制蜂鸣器的输出
    buzzer.value(1)
    pyb.delay(int(1000 / freq / 2)) # 延时半个周期
    buzzer.value(0)
    pyb.delay(int(1000 / freq / 2)) # 延时半个周期

案例2:心跳检测:通过连接一个光敏电阻到一个 ADC 引脚上,实现心跳信号的采集和显示。代码如下::

import pyb
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C

# 初始化 ADC 和 OLED 屏幕
adc = pyb.ADC(pyb.Pin.board.X19)
i2c = I2C(scl=Pin('X9'), sda=Pin('X10'))
oled = SSD1306_I2C(128, 64, i2c)

# 定义一个缓冲区,用于存储心跳信号的值
buffer = [0] * 128

# 主循环
while True:
    # 读取 ADC 的值,并将其添加到缓冲区的末尾
    value = adc.read()
    buffer.append(value)
    # 移除缓冲区的第一个值,实现滑动窗口的效果
    buffer.pop(0)
    # 清屏
    oled.fill(0)
    # 在屏幕上画出心跳信号的波形
    for i in range(1, 128):
        # 将缓冲区的值映射到屏幕的高度上
        y1 = 63 - buffer[i-1] * 64 // 4096
        y2 = 63 - buffer[i] * 64 // 4096
        # 画出两个相邻点之间的线段
        oled.line(i-1, y1, i, y2, 1)
    # 刷新屏幕
    oled.show()

案例3:声控灯:通过连接一个声音传感器到一个 ADC 引脚上,实现声音强度的检测和控制 LED 的亮度。代码如下:

import pyb

# 初始化 ADC 和 LED
adc = pyb.ADC(pyb.Pin.board.X19) # 假设声音传感器连接到 X19 引脚上
led = pyb.LED(1) # 假设使用板子上的第一个 LED

# 主循环
while True:
    # 读取 ADC 的值,并将其映射到 LED 的亮度上
    value = adc.read() # ADC 的值介于 0 到 4095 之间
    brightness = value * 255 // 4096 # LED 的亮度介于 0 到 255 之间
    # 设置 LED 的亮度
    led.intensity(brightness)

这个程序的原理是:声音传感器会根据声音的强度输出不同的电压,ADC 会将电压转换为数字值,LED 会根据数字值调节亮度。你可以尝试用不同的声音来控制 LED 的亮暗变化。

案例4:读取模拟传感器数值:

import pyb

# 初始化ADC对象
adc = pyb.ADC(pyb.Pin('X1'))

# 读取模拟传感器数值
sensor_value = adc.read()

# 输出传感器数值
print("模拟传感器数值:", sensor_value)

在这个例子中,我们使用pyb.ADC()函数初始化ADC对象,并指定要使用的引脚(在这里是X1引脚)。然后,我们使用ADC对象的read()方法读取模拟传感器的数值,并将其存储在sensor_value变量中。最后,我们输出传感器的数值。

案例5:电池电压监测::

import pyb

# 初始化ADC对象
adc = pyb.ADC(pyb.Pin('Y1'))

# 读取电池电压
battery_voltage = adc.read() * 3.3 / 4095

# 输出电池电压
print("电池电压:", battery_voltage, "V")

在这个例子中,我们使用pyb.ADC()函数初始化ADC对象,并指定要使用的引脚(在这里是Y1引脚)。然后,我们使用ADC对象的read()方法读取电池电压的数值,并将其存储在battery_voltage变量中。由于ADC的数值范围是0到4095,我们将其乘以3.3(电源电压)并除以4095,以获取电池的实际电压。最后,我们输出电池的电压。

案例6:光敏传感器读值::

import pyb

# 初始化ADC对象
adc = pyb.ADC(pyb.Pin('X2'))

# 读取光敏传感器数值
light_value = adc.read()

# 输出光敏传感器数值
print("光敏传感器数值:", light_value)

在这个例子中,我们使用pyb.ADC()函数初始化ADC对象,并指定要使用的引脚(在这里是X2引脚)。然后,我们使用ADC对象的read()方法读取光敏传感器的数值,并将其存储在light_value变量中。最后,我们输出光敏传感器的数值。

案例7:读取模拟输入电压

import pyb

# 创建ADC对象
adc = pyb.ADC(pyb.Pin("X1"))

# 读取模拟输入电压
voltage = adc.read()

print("Voltage: ", voltage)

这个示例程序创建了一个ADC对象adc,并将其连接到引脚"X1"。然后使用adc.read()方法读取模拟输入电压值,并将结果存储在变量voltage中。然后可以根据需要对读取的电压值进行后续处理和分析。

案例8:配置ADC参数并读取模拟输入电压

import pyb

# 创建ADC对象
adc = pyb.ADC(pyb.Pin("X1"))

# 配置ADC参数
adc.read_timed(1000, 10)  # 1000个采样,每个采样之间间隔10微秒

# 读取模拟输入电压
voltage = adc.read()

print("Voltage: ", voltage)

这个示例程序创建了一个ADC对象adc,并将其连接到引脚"X1"。然后使用adc.read_timed()方法配置ADC的参数,指定了采样数量和采样间隔。接下来使用adc.read()方法读取模拟输入电压值,并将结果存储在变量voltage中。

案例9:使用DMA进行连续的模拟输入采样

import pyb

# 创建ADC对象
adc = pyb.ADC(pyb.Pin("X1"))

# 创建DMA对象
dma = pyb.DMA(1, channel=1, callback=None, priority=1)

# 连续的模拟输入采样
buf = bytearray(1000)  # 用于存储采样数据的缓冲区
adc.read_timed(buf, 1000, 10, dma)

print("ADC values: ", buf)

这个示例程序创建了一个ADC对象adc,并将其连接到引脚"X1"。然后创建一个DMA对象dma,用于在连续的模拟输入采样过程中接收数据。通过调用adc.read_timed()方法,将采样数据存储到提供的缓冲区buf中,并使用DMA进行数据传输。最后,可以根据需要对采样数据进行处理和分析。

这些示例程序展示了pyb.ADC类的用法,可以通过ADC对象读取模拟输入电压,并根据需要配置参数、使用DMA进行连续采样等。具体的应用场景和使用方式会根据实际需求而有所不同。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值