【雕爷学编程】MicroPython手册之 pyboard 的 内部加速度计

在这里插入图片描述

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内部加速度计,是一种可以用来检测板子的角度和运动的功能,它使用了一个微小的弹簧上的微小质量作为传感器。pyboard内部加速度计的主要特点、应用场景,以及需要注意的事项如下:

主要特点:

pyboard内部加速度计可以使用pyb.Accel类来创建Accel对象,然后调用x(), y(), z()方法来获取x, y, z轴方向上的加速度值。
pyboard内部加速度计返回的加速度值是一个-30到30之间的有符号整数,表示与重力方向的夹角。例如,当板子水平放置时,z()方法返回30,表示与重力方向垂直;当板子竖直放置时,z()方法返回0,表示与重力方向平行。
pyboard内部加速度计还可以使用tilt()方法来获取倾斜角度,返回一个0到180之间的无符号整数,表示与水平面的夹角。例如,当板子水平放置时,tilt()方法返回0;当板子竖直放置时,tilt()方法返回90。

应用场景:

pyboard内部加速度计可以用于实现一些基于角度或运动的交互功能,例如点亮LED、控制游戏、模拟鼠标等。
pyboard内部加速度计可以用于实现一些基于倾斜或震动的检测功能,例如制作水平仪、检测摔落、实现闹钟等。
pyboard内部加速度计可以用于实现一些基于数据分析或可视化的功能,例如绘制图表、显示波形、进行傅里叶变换等。

需要注意的事项:

pyboard内部加速度计的测量结果可能会受到噪声或干扰的影响,导致数据不稳定或不准确。因此,在使用Accel对象时,需要对数据进行一些处理或过滤,例如取平均值、设置阈值、使用滑动窗口等。
pyboard内部加速度计的测量范围和精度是有限的,并且目前在MicroPython中无法更改。因此,在使用Accel对象时,需要注意数据的范围和单位,并根据实际需求进行适当的缩放或转换。
pyboard内部加速度计的引脚分配和物理位置因不同型号的pyboard而异。因此,在使用Accel对象时,需要注意选择正确的引脚,并避免与其他功能冲突。

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

案例1:使用pyb.Accel类点亮LED,并根据倾斜角度调节亮度。代码如下:

import pyb

# 创建 Accel 和 LED 对象
accel = pyb.Accel()
led = pyb.LED(4)

# 主循环
while True:
    # 获取 x 轴方向上的加速度值
    x = accel.x()
    # 将加速度值转换为 LED 的亮度(0~255)
    brightness = (x + 30) * 4
    # 设置 LED 的亮度
    led.intensity(brightness)

案例2:使用pyb.Accel类控制游戏,根据倾斜方向移动小球。代码如下:

import pyb
import lcd160cr

# 创建 Accel 和 LCD 对象
accel = pyb.Accel()
lcd = lcd160cr.LCD160CR('X')

# 定义小球的初始位置和半径
x = 80
y = 64
r = 10

# 主循环
while True:
    # 清除 LCD 屏幕
    lcd.erase()
    # 获取 x 和 y 轴方向上的加速度值
    dx = accel.x()
    dy = -accel.y()
    # 根据加速度值更新小球的位置,并限制在屏幕范围内
    x = max(min(x + dx, 160 - r), r)
    y = max(min(y + dy, 128 - r), r)
    # 在 LCD 上绘制小球
    lcd.set_pen(lcd.rgb(255, 0, 0), lcd.rgb(0, 0, 0))
    lcd.circle(x, y, r)
    # 延时一段时间,控制刷新速度
    pyb.delay(50)

案例3:使用pyb.Accel类绘制图表,显示 x, y, z 轴方向上的加速度值随时间的变化。代码如下:

import pyb
import lcd160cr

# 创建 Accel 和 LCD 对象
accel = pyb.Accel()
lcd = lcd160cr.LCD160CR('X')

# 定义图表的位置和大小
x0 = 10
y0 = 10
w = 140
h = 108

# 定义图表的颜色和标签
colors = [lcd.rgb(255, 0, 0), lcd.rgb(0, 255, 0), lcd.rgb(0, 0, 255)]
labels = ['x', 'y', 'z']

# 定义图表的缩放和偏移系数
scale = h / 60.0
offset = y0 + h / 2

# 创建一个列表,用于存储加速度值的历史记录
history = []

# 主循环
while True:
    # 获取 x, y, z 轴方向上的加速度值,并添加到历史记录中
    values = [accel.x(), accel.y(), accel.z()]
    history.append(values)
    # 如果历史记录的长度超过图表的宽度,删除最旧的一条记录
    if len(history) > w:
        history.pop(0)
    # 清除 LCD 屏幕
    lcd.erase()
    # 在 LCD 上绘制图表的边框和标签
    lcd.set_pen(lcd.rgb(255, 255, 255), lcd.rgb(0, 0, 0))
    lcd.rect(x0 - 1, y0 - 1, w + 2, h + 2)
    for i in range(3):
        lcd.set_text_color(colors[i], lcd.rgb(0, 0, 0))
        lcd.set_font(1)
        lcd.write(x0 + w + 5, y0 + i * (h // 3), labels[i])
    # 在 LCD 上绘制图表的曲线,分别表示 x, y, z 轴方向上的加速度值随时间的变化
    for i in range(3):
        lcd.set_pen(colors[i], lcd.rgb(0, 0, 0))
        for j in range(len(history) - 1):
            x1 = x0 + j
            y1 = int(offset - history[j][i] * scale)
            x2 = x1 + 1
            y2 = int(offset - history[j + 1][i] * scale)
            lcd.line(x1, y1, x2, y2)
    # 延时一段时间,控制刷新速度
    pyb.delay(100)

案例4:读取加速度计数据:

i

mport machine

accelerometer = machine.Accel()  # 初始化加速度计对象

while True:
    x, y, z = accelerometer.filtered_xyz()  # 读取加速度计数据
    
    # 处理加速度计数据
    # ...

这个程序使用 MicroPython 初始化内部加速度计对象 accelerometer。在一个循环中,使用 accelerometer.filtered_xyz() 方法读取加速度计的 X、Y 和 Z 轴数据,并将结果存储在变量 x、y 和 z 中。接收到的加速度计数据可以进行进一步的处理。

案例5:检测摇晃::

import machine

accelerometer = machine.Accel()  # 初始化加速度计对象

threshold = 2.0  # 摇晃检测阈值

while True:
    x, y, z = accelerometer.filtered_xyz()  # 读取加速度计数据
    
    if abs(x) > threshold or abs(y) > threshold or abs(z) > threshold:
        # 检测到摇晃
        # 执行相应的操作
        # ...

这个程序使用 MicroPython 初始化内部加速度计对象 accelerometer。在一个循环中,使用 accelerometer.filtered_xyz() 方法读取加速度计的 X、Y 和 Z 轴数据,并将结果存储在变量 x、y 和 z 中。然后通过比较加速度计数据和设定的阈值,判断是否检测到摇晃。如果检测到摇晃,可以执行相应的操作。

案例6:计算倾斜角度::

import machine
import math

accelerometer = machine.Accel()  # 初始化加速度计对象

while True:
    x, y, z = accelerometer.filtered_xyz()  # 读取加速度计数据
    
    roll = math.atan2(y, z) * 180 / math.pi  # 计算横滚角度
    pitch = math.atan2(-x, math.sqrt(y * y + z * z)) * 180 / math.pi  # 计算俯仰角度
    
    # 处理倾斜角度数据
    # ...

这个程序使用 MicroPython 初始化内部加速度计对象 accelerometer。在一个循环中,使用 accelerometer.filtered_xyz() 方法读取加速度计的 X、Y 和 Z 轴数据,并将结果存储在变量 x、y 和 z 中。然后使用数学函数和公式计算出横滚角度 roll 和俯仰角度 pitch。可以根据需要对倾斜角度数据进行进一步的处理。请注意,以上代码仅为示例,具体的配置和使用方法可能需要根据实际的硬件设备和需求进行调整。

案例7:读取加速度计数据:

import pyb

accel = pyb.Accel()  # 初始化内部加速度计对象

while True:
    x = accel.x()  # 获取X轴加速度值
    y = accel.y()  # 获取Y轴加速度值
    z = accel.z()  # 获取Z轴加速度值

    print("Accelerometer data: X={}, Y={}, Z={}".format(x, y, z))

在上述示例中,我们使用pyb.Accel()初始化一个内部加速度计对象。然后,使用accel.x()、accel.y()和accel.z()函数分别获取X轴、Y轴和Z轴的加速度值,并将其存储在变量x、y和z中。最后,使用print()函数打印输出获取的加速度计数据。

案例8:检测倾斜角度::

import pyb

accel = pyb.Accel()  # 初始化内部加速度计对象

while True:
    pitch = accel.pitch()  # 获取俯仰角(pitch)
    roll = accel.roll()  # 获取横滚角(roll)

    print("Pitch: {}, Roll: {}".format(pitch, roll))

在上述示例中,我们使用pyb.Accel()初始化一个内部加速度计对象。然后,使用accel.pitch()和accel.roll()函数分别获取俯仰角(pitch)和横滚角(roll),并将其存储在变量pitch和roll中。最后,使用print()函数打印输出获取的倾斜角度信息。

案例9:简单的运动检测::

import pyb

accel = pyb.Accel()  # 初始化内部加速度计对象

threshold = 100  # 运动检测的阈值

while True:
    x = accel.x()  # 获取X轴加速度值
    y = accel.y()  # 获取Y轴加速度值
    z = accel.z()  # 获取Z轴加速度值

    if abs(x) > threshold or abs(y) > threshold or abs(z) > threshold:
        print("Motion detected!")

在上述示例中,我们使用pyb.Accel()初始化一个内部加速度计对象。然后,使用accel.x()、accel.y()和accel.z()函数分别获取X轴、Y轴和Z轴的加速度值,并将其存储在变量x、y和z中。使用条件判断语句检查任何一个轴的加速度值是否超过预设的阈值。如果超过阈值,则打印输出"Motion detected!",表示检测到运动。这些示例提供了使用MicroPython操作内部加速度计的实际运用程序的参考代码。请注意,具体的API函数和调用方式可能会因不同的硬件平台和传感器型号而有所不同。在实际应用中,你需要根据所使用的硬件和传感器的规格说明进行适当的调整和配置。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值