【雕爷学编程】MicroPython手册之 RP2(Pico)硬件 I2C 总线

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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
RP2(Pico)是树莓派基金会推出的一款微控制器开发板,基于自研的 RP2040 芯片,售价仅为 4 美元。它可以用 C/C++ 或 Python 语言编程,适合用于物联网、机器人、音乐等各种应用场景。技术参数:RP2(Pico)的技术参数如下:

1、搭载双核 ARM Cortex M0+ 处理器,运行频率 133 MHz
2、内置 264 KB 的片上 RAM,板载 2 MB 闪存
3、可通过专用 QSPI 总线支持最高 16 MB 的片外闪存
4、DMA 控制器
5、30 个 GPIO 引脚,其中 4 个可用作模拟输入
6、2 个 UART、2 个 SPI 控制器和 2 个 I2C 控制器
7、16 个 PWM 通道
8、USB 1.1 主机和设备支持
9、8 个树莓派可编程 I/O(PIO)状态机,用于自定义外围设备支持
10、支持 UF2 的 USB 大容量存储启动模式,用于拖放式编程

在这里插入图片描述

MicroPython的RP2(Pico)硬件I2C总线是通过硬件集成的I2C接口与外部设备进行通信的技术。下面我将从专业的眼界和教师的视角,详细解释RP2(Pico)硬件I2C总线的主要特点、应用场景以及需要注意的事项。

主要特点:

硬件支持:RP2(Pico)板载了硬件I2C控制器,可以直接连接各种支持I2C协议的外部设备。与软件模拟I2C相比,硬件I2C总线具有更高的性能和稳定性。

简化设计:RP2(Pico)硬件I2C总线的集成使得在嵌入式系统中使用I2C变得更加简单。开发者无需自行实现I2C通信协议的细节,只需通过相应的接口和库函数进行配置和操作。

多设备支持:RP2(Pico)硬件I2C总线支持多个设备连接到同一总线上,通过设备地址进行区分。这使得系统可以与多个I2C设备进行通信,实现丰富的功能扩展和数据交换。

应用场景:

传感器应用:RP2(Pico)硬件I2C总线广泛应用于各种传感器的接口与数据采集。通过连接传感器设备,可以读取环境参数(如温度、湿度、气压等)或其他物理量,并进行相应的数据处理和控制。

显示屏控制:RP2(Pico)硬件I2C总线可用于控制各种I2C接口的显示屏,如字符型LCD、OLED显示屏等。通过发送特定的命令和数据,可以实现文本、图形和动画在显示屏上的显示。

外设扩展:RP2(Pico)硬件I2C总线可以用于连接各种外设模块,如扩展板、电机驱动器、触摸控制器等。通过与这些外设模块进行I2C通信,可以实现系统的功能扩展和外设的控制。

需要注意的事项:

引脚配置:使用RP2(Pico)硬件I2C总线时,需要根据硬件设计和引脚分配规范,将正确的引脚连接到I2C接口。RP2(Pico)上有专门的引脚用于I2C通信(如GP0和GP1),确保正确连接。

设备地址:在与多个设备连接到同一I2C总线上时,每个设备都必须有唯一的地址。在使用硬件I2C总线时,需要确保设置每个设备的正确地址,并在程序中进行正确的指定。

时钟速度:RP2(Pico)硬件I2C总线的时钟速度可以通过相应的配置进行调整。根据所连接设备的要求和系统性能,选择适当的时钟速度以实现可靠的通信。

电平转换:在使用RP2(Pico)硬件I2C总线时,需要注意与外部设备的电平兼容性。如果设备使用的是非5V电平(如3.3V),则需要使用电平转换电路将RP2(Pico)的信号电平转换为设备所需的电平。

综上所述,MicroPython的RP2(Pico)硬件I2C总线具有硬件支持、简化设计和多设备支持等特点。它适用于传感器应用、显示屏控制以及外设扩展等场景。在使用时需要注意正确的引脚配置、设备地址设置、时钟速度选择和电平转换等事项,以确保可靠的通信和正常的设备操作。

在这里插入图片描述

以下是几个MicroPython的RP2(Pico)硬件I2C总线的实际运用程序参考代码案例:

案例1:读取温湿度传感器数据(例如DHT11):

import machine
import utime

i2c = machine.I2C(0, scl=machine.Pin(0), sda=machine.Pin(1))
address = 0x27  # 传感器的I2C地址

def read_temperature_humidity():
    i2c.writeto(address, bytes([0x01]))  # 向传感器发送读取数据的命令
    utime.sleep_ms(20)  # 等待传感器完成测量
    data = i2c.readfrom(address, 5)  # 从传感器读取5个字节的数据

    humidity = (data[0] << 8 | data[1]) / 10.0  # 解析湿度数据
    temperature = (data[2] << 8 | data[3]) / 10.0  # 解析温度数据

    return temperature, humidity

# 主程序
while True:
    temp, hum = read_temperature_humidity()
    print("Temperature: {}°C".format(temp))
    print("Humidity: {}%".format(hum))
    utime.sleep(2)  # 间隔2秒进行下一次读取

案例2:控制OLED显示屏显示文本:

import machine
import ssd1306

i2c = machine.I2C(0, scl=machine.Pin(0), sda=machine.Pin(1))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# 显示文本函数
def display_text(text):
    oled.fill(0)  # 清空屏幕
    oled.text(text, 0, 0)  # 在坐标(0, 0)处显示文本
    oled.show()  # 更新屏幕显示

# 主程序
display_text("Hello, World!")

案例3:与外设模块(例如PCF8574扩展板)交互:

import machine

i2c = machine.I2C(0, scl=machine.Pin(0), sda=machine.Pin(1))
address = 0x27  # PCF8574扩展板的I2C地址

def set_led_state(led_num, state):
    current_state = i2c.readfrom(address, 1)[0]  # 读取当前扩展板的状态
    if state:
        current_state |= (1 << led_num)  # 将对应的LED设置为高电平
    else:
        current_state &= ~(1 << led_num)  # 将对应的LED设置为低电平
    i2c.writeto(address, bytes([current_state]))  # 发送更新后的状态

# 主程序
for i in range(8):
    set_led_state(i, True)  # 打开所有LED灯

这些代码示例展示了MicroPython的RP2(Pico)硬件I2C总线在不同应用场景下的使用方式。第一个示例用于读取温湿度传感器的数据,第二个示例用于在OLED显示屏上显示文本,第三个示例用于与PCF8574扩展板进行交互控制。你可以根据具体的硬件设备和需求,修改和扩展这些示例代码。

案例4:使用RP2(Pico)I2C总线进行通信

from machine import Pin, I2C
import time

# 初始化I2C对象,设置主设备地址和从设备地址
i2c = I2C(scl=Pin(5), sda=Pin(4))

# 发送数据
data_to_send = [0x01, 0x02, 0x03]
i2c.writeto(0x00, data_to_send)

# 延时1秒
time.sleep_ms(1000)

# 读取从设备返回的数据
data_received = i2c.readfrom(0x00)
print('Received data:', data_received)

# 关闭I2C总线
i2c.deinit()

案例5:使用RP2(Pico)I2C总线同时发送和接收数据

from machine import Pin, I2C
import time

# 初始化I2C对象,设置主设备地址和从设备地址
i2c = I2C(scl=Pin(5), sda=Pin(4))

# 发送数据
data_to_send = [0x01, 0x02, 0x03]
i2c.writeto(0x00, data_to_send)

# 设置接收数据的回调函数
def rx_callback(rx):
    print('Received data:', rx)

# 启动I2C总线接收数据,并设置回调函数
i2c.start()
i2c.register_read_cb(rx_callback)

# 延时1秒
time.sleep_ms(1000)

# 停止I2C总线接收数据
i2c.stop()

# 关闭I2C总线
i2c.deinit()

案例6:使用RP2(Pico)I2C总线进行多个设备之间的通信

from machine import Pin, I2C
import time

# 初始化I2C对象,设置主设备地址和从设备地址
i2c = I2C(scl=Pin(5), sda=Pin(4))

# 发送数据到多个从设备
data_to_send = [0x01, 0x02, 0x03]
for i in range(3):
    i2c.writeto(i, data_to_send)

# 延时1秒
time.sleep_ms(1000)

# 读取从设备返回的数据
data_received = []
for i in range(3):
    data_received.append(i2c.readfrom(i))
print('Received data:', data_received)

# 关闭I2C总线
i2c.deinit()

案例7:读取BMP280气压传感器数据

import machine  
import utime  
import bmp280  
  
# 配置硬件I2C总线引脚  
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=400000)  
  
# 初始化BMP280传感器  
bmp = bmp280.BMP280(i2c)  
  
while True:  
    # 读取温度和气压数据  
    temperature = bmp.read_temperature()  
    pressure = bmp.read_pressure()  
      
    print("Temperature: ", temperature, "℃")  
    print("Pressure: ", pressure, "hPa")  
    utime.sleep(1)  # 等待1秒后再读取下一次数据

案例8:控制PCA9685 I2C LED驱动器

import machine  
import time_usleep as time  
import pca9685  
  
# 配置硬件I2C总线引脚  
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=400000)  
  
# 初始化PCA9685 LED驱动器  
pwm = pca9685.PCA9685(i2c)  
  
# 控制LED亮度  
pwm.set_pwm_freq(50)  # 设置PWM频率为50Hz  
pwm.set_all_pwm(0, 4095)  # 设置所有通道的PWM值为4095(最亮)  
time.sleep_ms(1000)  # 等待1秒钟让LED亮起来  
pwm.set_all_pwm(0, 0)  # 设置所有通道的PWM值为0(最暗)  
time.sleep_ms(1000)  # 等待1秒钟让LED熄灭

案例9:读取TCS34725颜色传感器数据

import machine  
import utime  
import tcs34725  
  
# 配置硬件I2C总线引脚  
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=400000)  
  
# 初始化TCS34725颜色传感器  
tcs = tcs34725.TCS34725(i2c)  
  
while True:  
    # 读取环境光强度、红色、绿色和蓝色数据  
    illuminance, red, green, blue = tcs.read_all()  
      
    print("Illuminance: ", illuminance, "lx")  
    print("Red: ", red, "%")  
    print("Green: ", green, "%")  
    print("Blue: ", blue, "%")  
    utime.sleep(1)  # 等待1秒后再读取下一次数据

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值