【雕爷学编程】MicroPython手册之低功耗模式 machine 模块

在这里插入图片描述

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的machine是一个与硬件相关的模块,它提供了对特定板上的硬件块(如CPU、定时器、总线等)的直接和无限制的访问和控制。

machine模块的主要特点是:

它包含了一些与重置、中断、电源、内存等系统功能相关的函数,可以实现对设备的低级管理和控制。
它包含了一些与I/O引脚、信号、ADC、PWM、UART、SPI、I2C、I2S、RTC、定时器、WDT、SD卡等硬件设备相关的类,可以实现对这些设备的配置和操作。
它尽可能地与普通Python兼容,让用户可以轻松地将代码从桌面传输到微控制器或嵌入式系统。
它针对不同的硬件平台进行了优化和定制,因此在不同的端口上可能有不同的可用性和行为。

machine模块的应用场景是:

在MicroPython中实现与硬件设备的交互,如控制LED灯、电机、传感器等。
在MicroPython中实现基于硬件设备的应用,如物联网设备、远程控制、消息推送等。
在MicroPython中实现对系统性能和功耗的优化,如调整CPU频率、进入低功耗模式等。

machine模块需注意事项是:

使用machine模块时要注意硬件设备的规格和限制,避免造成电路板故障、锁定、崩溃或硬件损坏。
使用machine模块时要注意中断处理函数的编写,避免在中断上下文中执行过长或过复杂的代码,影响系统正常运行。
使用machine模块时要注意不同端口之间的差异和兼容性问题,避免在移植代码时出现错误或异常。

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

案例一:使用machine.Pin类控制LED灯闪烁。

import machine
import time

# 创建一个Pin对象,连接到GPIO2引脚,并设置为输出模式
led = machine.Pin(2, machine.Pin.OUT)
# 循环10次
for i in range(10):
    # 将引脚输出设置为高电平,点亮LED灯
    led.value(1)
    # 延时0.5秒
    time.sleep(0.5)
    # 将引脚输出设置为低电平,熄灭LED灯
    led.value(0)
    # 延时0.5秒
    time.sleep(0.5)

案例二:使用machine.ADC类读取光敏电阻的模拟值。

import machine

# 创建一个ADC对象,连接到GPIO34引脚,并设置为12位分辨率
adc = machine.ADC(machine.Pin(34))
adc.atten(machine.ADC.ATTN_11DB) # 设置衰减为11dB,输入范围为0~3.6V
adc.width(machine.ADC.WIDTH_12BIT) # 设置宽度为12位,输出范围为0~4095

# 读取ADC对象的值,并打印
value = adc.read()
print(value)

案例三:使用machine.PWM类控制舵机角度。

import machine

# 创建一个PWM对象,连接到GPIO18引脚,并设置频率为50Hz
pwm = machine.PWM(machine.Pin(18))
pwm.freq(50)

# 定义一个函数,根据角度计算占空比(百分比)
def duty(angle):
    return int((angle / 180) * 1023 + 40)

# 设置PWM对象的占空比为0度对应的值
pwm.duty(duty(0))
# 延时1秒
time.sleep(1)
# 设置PWM对象的占空比为90度对应的值
pwm.duty(duty(90))
# 延时1秒
time.sleep(1)
# 设置PWM对象的占空比为180度对应的值
pwm.duty(duty(180))
# 延时1秒
time.sleep(1)

案例四:控制LED灯:

from machine import Pin
import time

# 将LED连接到GPIO引脚
led_pin = Pin(2, Pin.OUT)

# 循环控制LED灯的亮灭
while True:
    led_pin.on()
    time.sleep(1)
    led_pin.off()
    time.sleep(1)

在这个例子中,我们使用machine模块的Pin类将LED连接到GPIO引脚。我们指定了引脚号和引脚模式(输出)。然后,我们使用on()方法将LED点亮,使用off()方法将LED熄灭。通过使用time.sleep()函数,我们可以控制LED的亮灭间隔时间。

案例五:读取温度传感器数据:

from machine import ADC

# 将温度传感器连接到ADC引脚
temp_sensor_pin = ADC(0)

# 读取温度传感器数据
sensor_value = temp_sensor_pin.read()

# 转换为摄氏度
temperature = (sensor_value * 3.3 / 1024 - 0.5) * 100

print("当前温度:", temperature, "℃")

在这个例子中,我们使用machine模块的ADC类将温度传感器连接到ADC引脚。我们指定了引脚号。然后,我们使用read()方法读取ADC引脚的值。根据温度传感器的特性,我们可以通过一些转换公式将读取到的值转换为摄氏度温度。最后,我们打印出当前的温度。

案例六:控制舵机:

from machine import Pin, PWM

# 将舵机连接到GPIO引脚
servo_pin = Pin(5)
servo_pwm = PWM(servo_pin)

# 设置舵机的位置
servo_pwm.duty(512)

# 控制舵机旋转
servo_pwm.duty(256)  # 逆时针旋转
time.sleep(1)
servo_pwm.duty(768)  # 顺时针旋转
time.sleep(1)
servo_pwm.duty(512)  # 停止旋转

在这个例子中,我们使用machine模块的Pin类和PWM类将舵机连接到GPIO引脚。我们指定了引脚号和引脚模式(输出)。然后,我们使用duty()方法设置舵机的位置。通过调整duty值,我们可以控制舵机的旋转方向和速度。在这个例子中,我们将舵机旋转到中间位置(512),然后逆时针旋转(256),顺时针旋转(768),最后停止旋转(512)。

案例七:控制 LED 灯闪烁

import time
from machine import Pin

led_pin = Pin(2, Pin.OUT)  # 使用 GPIO 2 控制 LED 灯

while True:
    led_pin.on()  # 点亮 LED
    time.sleep(1)  # 延时 1 秒
    led_pin.off()  # 熄灭 LED
    time.sleep(1)  # 延时 1 秒

在这个例子中,我们使用 machine.Pin 类创建了一个引脚对象 led_pin,并将 GPIO 2 设置为输出模式控制 LED 灯。在一个无限循环中,通过调用 on() 方法点亮 LED,然后使用 time.sleep() 方法进行延时,再调用 off() 方法熄灭 LED,再进行延时,从而实现 LED 灯的闪烁效果。

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

from machine import ADC

adc_pin = ADC(0)  # 使用 ADC 0 引脚读取模拟传感器的数值

while True:
    sensor_value = adc_pin.read()  # 读取模拟传感器的数值
    print("Sensor value:", sensor_value)

在这个例子中,我们使用 machine.ADC 类创建了一个 ADC 对象 adc_pin,并将 ADC 0 引脚用于读取模拟传感器的数值。在一个无限循环中,通过调用 read() 方法读取模拟传感器的数值,并使用 print() 方法打印数值到终端。

案例九:使用定时器控制任务执行

import time
from machine import Timer

def task(timer):
    print("Task executed")

timer = Timer(-1)  # 创建一个定时器对象

# 每隔 1 秒执行一次任务
timer.init(period=1000, mode=Timer.PERIODIC, callback=task)

while True:
    time.sleep(1)

在这个例子中,我们使用 machine.Timer 类创建了一个定时器对象 timer。然后,定义了一个任务函数 task,该函数会在定时器触发时执行。通过调用 init() 方法初始化定时器,设置定时周期为 1 秒,并指定任务回调函数为 task。在一个无限循环中,使用 time.sleep() 方法进行延时。

这些案例展示了 MicroPython 中 machine 模块的一些实际应用,用于控制硬件设备、读取传感器数据和调度任务执行。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值