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

在这里插入图片描述

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的pyboard特定端口库pyb是一个提供了与pyboard硬件相关的功能的模块。它包括了以下几个方面的主要特点:

时间相关的函数,如pyb.delay(), pyb.millis(), pyb.elapsed_millis()等,可以用来控制程序的执行速度和计算时间差。
复位相关的函数,如pyb.hard_reset(), pyb.bootloader()等,可以用来重启或进入引导模式。
中断相关的函数,如pyb.disable_irq(), pyb.enable_irq(), pyb.ExtInt()等,可以用来禁用或启用中断请求,或者设置外部中断的回调函数。
内部LED灯,可以用pyb.LED()类来创建LED对象,并通过on(), off(), toggle(), intensity()等方法来控制其状态和亮度。
内部开关,可以用pyb.Switch()类来创建Switch对象,并通过value(), callback()等方法来获取其状态或设置其回调函数。
引脚和GPIO,可以用pyb.Pin()类来创建Pin对象,并通过init(), value(), high(), low()等方法来设置其模式、电平、上拉/下拉等属性。
舵机控制,可以用pyb.Servo()类来创建Servo对象,并通过angle(), speed()等方法来控制其角度或速度。
定时器,可以用pyb.Timer()类来创建Timer对象,并通过init(), freq(), counter(), callback(), channel()等方法来设置其参数、频率、计数器、回调函数、通道等属性。
RTC(实时时钟),可以用pyb.RTC()类来创建RTC对象,并通过datetime(), calibration(), wakeup()等方法来设置或获取日期时间、校准值、唤醒时间等属性。
PWM(脉宽调制),可以用Timer类的channel()方法来创建PWM通道,并通过pulse_width(), pulse_width_percent()等方法来设置其脉宽或占空比。
ADC(模拟数字转换),可以用pyb.ADC()类来创建ADC对象,并通过read(), read_timed()等方法来读取模拟信号的值或采样数据。
pyb模块的应用场景主要是与pyboard硬件进行交互,实现各种传感器、执行器、显示器等外设的控制和通信。例如,可以使用pyboard和温湿度传感器DHT11来测量环境温湿度,并将结果显示在OLED屏幕上;或者使用pyboard和超声波传感器HC-SR04来测量距离,并根据距离控制舵机的转动角度;或者使用pyboard和红外遥控器IRremote来实现遥控灯光的开关和亮度调节。

使用pyb模块时需注意以下几点:

pyb模块是针对pyboard硬件设计的,不一定适用于其他MicroPython支持的硬件平台。如果要移植到其他平台,可能需要修改一些与硬件相关的代码或参数。
pyb模块中的一些函数会影响系统的正常运行,例如pyb.stop()会停止CPU,pyb.bootloader()会进入引导模式。在使用这些函数时要谨慎,避免造成不必要的麻烦或损失。
pyb模块中的一些函数会占用系统资源,例如定时器、中断、PWM等。在使用这些函数时要注意资源的分配和释放,避免造成冲突或浪费。

下面给出三个使用pyb模块的实际运用程序案例:

案例一:使用温湿度传感器DHT11和OLED屏幕SSD1306显示环境温湿度

# 导入所需模块
import pyb
import dht
import ssd1306

# 创建DHT11对象,连接到X1引脚
d = dht.DHT11(pyb.Pin('X1'))

# 创建OLED对象,使用I2C通信,地址为0x3c
i2c = pyb.I2C(1, pyb.I2C.MASTER)
oled = ssd1306.SSD1306_I2C(128, 64, i2c, 0x3c)

# 清屏并显示标题
oled.fill(0)
oled.text('Temp and Humi', 0, 0)
oled.show()

# 循环测量和显示温湿度
while True:
    # 读取温湿度数据
    d.measure()
    temp = d.temperature()
    humi = d.humidity()

    # 在OLED上显示温湿度数据
    oled.fill_rect(0, 16, 128, 48, 0) # 清除原有数据区域
    oled.text('Temp: {} C'.format(temp), 0, 16) # 显示温度
    oled.text('Humi: {} %'.format(humi), 0, 32) # 显示湿度
    oled.show()

    # 延时1秒
    pyb.delay(1000)

案例二:使用超声波传感器HC-SR04和舵机SG90测量距离并控制舵机转动

# 导入所需模块
import pyb

# 创建超声波传感器对象,连接到X1(触发引脚)和X2(回响引脚)
sonar = pyb.HCSR04('X1', 'X2')

# 创建舵机对象,连接到X3引脚
servo = pyb.Servo(1)

# 定义一个函数,根据距离计算舵机的角度
def distance_to_angle(distance):
    # 距离在10cm到100cm之间,舵机角度在-90度到90度之间,线性关系
    if distance < 10:
        return -90
    elif distance > 100:
        return 90
    else:
        return (distance - 10) * 1.8 - 90

# 循环测量距离并控制舵机转动
while True:
    # 测量距离,单位为厘米
    distance = sonar.distance_cm()

    # 计算舵机角度
    angle = distance_to_angle(distance)

    # 控制舵机转动到指定角度
    servo.angle(angle)

    # 延时100毫秒
    pyb.delay(100)

案例三:使用红外遥控器IRremote和内部LED灯实现遥控灯光的开关和亮度调节

# 导入所需模块
import pyb
import ir

# 创建红外接收器对象,连接到X1引脚
irrecv = ir.IRRecv(pyb.Pin('X1'))

# 创建内部LED灯对象,选择第4个(蓝色)LED灯,并设置初始亮度为0(关闭)
led = pyb.LED(4)
led.intensity(0)

# 定义一个函数,根据红外遥控器的按键来控制LED灯的状态和亮度
def ir_callback(data):
    global led # 使用全局变量led

    # 如果收到的数据是NEC编码格式,并且长度为4字节
    if data[0] == ir.NEC and len(data[1]) == 4:
        # 获取按键的值,只关注最后一个字节(用户代码)
        key = data[1][3]

        # 如果按键是数字键0,则关闭LED灯,亮度设为0
        if key == 0x00:
            led.intensity(0)

        # 如果按键是数字键1,则打开LED灯,亮度设为最大值255
        elif key == 0x01:
            led.intensity(255)

        # 如果按键是加号键,则增加LED灯的亮度,每次增加10
        elif key == 0x02:
            # 获取当前的亮度值
            intensity = led.intensity()

            # 如果亮度小于255,则增加10,否则保持不变
            if intensity < 255:
                intensity += 10
                led.intensity(intensity)

        # 如果按键是减号键,则减少LED灯的亮度,每次减少10
        elif key == 0x03:
            # 获取当前的亮度值
            intensity = led.intensity()

            # 如果亮度大于0,则减少10,否则保持不变
            if intensity > 0:
                intensity -= 10
                led.intensity(intensity)

# 设置红外接收器的回调函数为ir_callback
irrecv.callback(ir_callback)

# 循环等待红外信号
while True:
    pyb.delay(100)

案例四:控制LED灯:

import pyb

# 初始化LED对象
led = pyb.LED(1)  # 使用LED1

# 开启LED灯
led.on()

# 延时
pyb.delay(1000)

# 关闭LED灯
led.off()

在这个示例中,我们使用pyboard特定端口库中的pyb.LED类来控制LED灯。我们创建了一个LED对象,指定使用LED1。然后,通过调用on()方法来开启LED灯,使用delay()方法进行延时,最后通过off()方法关闭LED灯。

案例五:使用蜂鸣器发出声音:

import pyb

# 初始化蜂鸣器对象
buzzer = pyb.Buzzer(2)  # 使用Buzzer2

# 按照指定频率发出声音
buzzer.freq(1000)  # 设置频率为1000Hz

# 持续一段时间
pyb.delay(2000)

# 停止发声
buzzer.off()

在这个示例中,我们使用pyboard特定端口库中的pyb.Buzzer类来控制蜂鸣器。我们创建了一个蜂鸣器对象,指定使用Buzzer2。然后,通过调用freq()方法设置蜂鸣器的频率为1000Hz,使用delay()方法延时一段时间,最后通过off()方法停止发声。

案例六:使用定时器进行周期性任务:

import pyb

# 初始化定时器对象
timer = pyb.Timer(4)  # 使用Timer4

# 定义回调函数
def callback(timer):
    print("Timer callback")

# 设置定时器周期和回调函数
timer.init(freq=1, callback=callback)

# 延时一段时间
pyb.delay(5000)

# 停止定时器
timer.deinit()

在这个示例中,我们使用pyboard特定端口库中的pyb.Timer类来控制定时器。我们创建了一个定时器对象,指定使用Timer4。然后,我们定义了一个回调函数,在定时器触发时会被调用,并打印一条消息。通过调用init()方法设置定时器的频率为1Hz,并指定回调函数。使用delay()方法延时一段时间,最后通过deinit()方法停止定时器。这些示例展示了如何使用MicroPython的pyboard特定端口库进行LED控制、蜂鸣器控制和定时器操作。具体的应用取决于您所使用的pyboard版本和外设。请注意,实际的应用可能需要根据您的pyboard版本和外设的要求进行适当的设置和参数调整。

案例七:PWM控制舵机:使用pyb模块控制Pyboard上的PWM输出,实现舵机的角度控制。

import pyb

# 配置PWM输出
servo = pyb.Pin(2)  # 使用引脚2
pwm = pyb.Timer(4, freq=50)  # 配置定时器4,频率为50Hz
channel = pwm.channel(2, pyb.Timer.PWM, pin=servo)  # 配置PWM通道

# 控制舵机角度
def set_servo_angle(angle):
    duty = (angle / 180) * 2000 + 500
    channel.pulse_width(duty)

# 设置舵机角度为90度
set_servo_angle(90)

案例八:读取ADC值:使用pyb模块读取Pyboard上的模拟输入信号,例如光敏电阻的亮度值。

i

mport pyb

# 读取ADC值
adc = pyb.ADC(pyb.Pin(0))  # 使用引脚0作为模拟输入
while True:
    value = adc.read()  # 读取ADC值
    print("ADC:", value)
    pyb.delay(1000)    # 延迟1秒

案例九:使用I2C通信:使用pyb模块通过I2C总线与其他设备进行通信,例如与温度传感器进行数据交换。

import pyb

# I2C配置
i2c = pyb.I2C(1, pyb.I2C.MASTER)  # 使用I2C总线1,设置为主设备模式
i2c.init(pyb.I2C.MASTER, baudrate=100000)  # 初始化I2C总线,设置波特率为100kHz

# 读取温度传感器数据
def read_temperature():
    i2c.mem_write(0x00, 0x48, 0x00)  # 写入传感器命令
    pyb.delay(100)  # 延迟等待传感器转换
    data = i2c.mem_read(2, 0x48, 0x00)  # 读取传感器数据
    temperature = (data[0] << 8) | data[1]
    return temperature

# 读取温度
temp = read_temperature()
print("Temperature:", temp)

这些案例展示了pyb模块的一些实际运用程序。通过使用pyb模块,可以控制PWM输出、读取模拟输入信号(如ADC值)以及通过I2C总线与其他设备进行通信。请注意,具体的端口和功能可能因Pyboard版本和硬件配置而有所不同。在编写代码时,请参考相关的文档和示例以适配您的Pyboard版本和硬件设置。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值