【雕爷学编程】MicroPython手册之 Zephyr 硬件 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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
Zephyr是一款开源的实时操作系统(RTOS),专为嵌入式系统设计。下面将详细解释Zephyr的技术参数,包括其基本概念和定义。

1、支持的处理器架构:Zephyr支持多种处理器架构,包括ARM、x86、RISC-V等。这使得Zephyr可以运行在广泛的嵌入式系统上,从低功耗微控制器到高性能处理器。
2、内存需求:Zephyr的内存需求相对较低,可以适应资源受限的嵌入式系统。它提供了多种内存管理方案,包括静态内存分配和动态内存分配,可以根据应用需求进行灵活配置。
3、多任务支持:Zephyr支持多任务并发执行。它使用轻量级的线程(Thread)机制来实现任务的创建、调度和同步。Zephyr还提供了丰富的同步原语,如信号量、互斥锁和消息队列等,方便开发者进行任务间的通信和同步。
4、实时性能:作为实时操作系统,Zephyr具有良好的实时性能。它提供了可配置的优先级调度策略,可以确保关键任务的及时响应。此外,Zephyr还提供了硬实时和软实时两种调度模式,以满足不同实时性要求的应用场景。
5、硬件抽象层(HAL):Zephyr提供了硬件抽象层(HAL),用于屏蔽不同硬件平台之间的差异性。通过HAL,开发者可以使用统一的API接口来访问硬件资源,无需关注底层硬件的细节,从而提高了代码的可移植性和可重用性。
6、设备驱动支持:Zephyr提供了丰富的设备驱动支持,包括串口、SPI、I2C、GPIO等常见外设的驱动。这些设备驱动可以方便地与硬件交互,简化了对外设的控制和访问。
7、网络协议支持:Zephyr支持多种网络协议,如TCP/IP协议栈、Bluetooth、Wi-Fi等。这使得Zephyr适用于物联网和无线通信等应用场景,可以与其他设备进行网络通信和连接。
8、开发工具链:Zephyr提供了丰富的开发工具链,包括命令行工具、集成开发环境(IDE)插件和调试器支持等。这些工具可以帮助开发者进行应用程序的编译、调试和部署,提高开发效率。

在这里插入图片描述
MicroPython的Zephyr硬件I2C总线是在MicroPython和Zephyr操作系统结合使用时的相关特性。下面将以专业的眼界、教师的视角详细解释MicroPython的Zephyr硬件I2C总线,包括主要特点、应用场景以及需要注意的事项。

主要特点:

I2C通信协议支持:MicroPython的Zephyr硬件I2C总线支持I2C(Inter-Integrated Circuit)通信协议。I2C是一种串行通信协议,允许多个设备在同一总线上进行通信。通过I2C总线,开发者可以实现与各种I2C设备的交互,如传感器、存储器、显示器等。

多设备支持:Zephyr操作系统提供了对多个I2C设备的支持。开发者可以通过配置不同的I2C地址来与多个设备进行通信。这使得在同一I2C总线上连接多个设备成为可能,节省了硬件资源并简化了系统设计。

灵活的数据传输:MicroPython的Zephyr硬件I2C总线支持灵活的数据传输方式。开发者可以使用相关API来发送和接收不同大小的数据包,如单字节、多字节、连续数据等。这使得开发者可以根据实际需求进行数据传输的优化和处理。

应用场景:

传感器应用:MicroPython的Zephyr硬件I2C总线在传感器应用中非常常见。通过连接I2C传感器,如加速度计、陀螺仪、温度传感器等,开发者可以读取传感器数据,并进行相应的数据处理和决策。这对于物联网设备、嵌入式系统等应用非常有帮助。

存储器访问:Zephyr操作系统提供了对I2C存储器设备的支持。通过I2C总线,开发者可以与I2C存储器(如EEPROM)进行数据读写操作。这对于存储设备的配置、存储数据的备份等应用非常有用。

显示器控制:一些液晶显示器(LCD)模块使用I2C接口进行控制。通过MicroPython的Zephyr硬件I2C总线,开发者可以与这些显示器进行通信,实现文本、图形等内容的显示控制。

需要注意的事项:

I2C设备地址:在使用MicroPython的Zephyr硬件I2C总线时,需要注意配置正确的I2C设备地址。每个I2C设备都有唯一的地址,开发者需要确保与目标设备的地址匹配,才能正确地进行通信。

电平转换和电流限制:当连接不同电平的设备时,需要注意进行电平转换。I2C总线使用开漏架构,因此需要适当的电平转换电路来匹配不同设备的电平要求。另外,需要注意I2C总线上的电流限制,以防止损坏设备或导致通信故障。

时序和速率:I2C通信协议有特定的时序和速率要求。开发者需要根据设备的规格和要求,设置适当的时序和速率,以确保正常的通信和数据传输。

总之,MicroPython的Zephyr硬件I2C总线为开发者提供了与I2C设备进行通信的能力。它在传感器应用、存储器访问和显示器控制等场景中具有重要作用。在使用这一功能时时,开发者需要注意配置正确的设备地址、进行电平转换和电流限制、设置适当的时序和速率,以确保正常的通信和数据传输。

案例1:使用 I2C 总线读取传感器数据

from machine import Pin, I2C
import time

i2c = I2C(scl=Pin(5), sda=Pin(4))  # 创建 I2C 对象,使用 SDA 和 SCL 引脚
sensor_data = i2c.readfrom_mem(0x3f, 6)  # 从地址为 0x3f 的内存中读取 6 个字节的数据
print("温度:", sensor_data[0], "℃")

解读:这个程序首先创建了一个I2C对象,指定了使用的 SCL 和 SDA 引脚。然后使用readfrom_mem()方法从地址为 0x3f 的内存中读取 6 个字节的数据,并将结果存储在sensor_data变量中。最后打印出温度值。

案例2:使用 I2C 总线写入传感器数据

from machine import Pin, I2C
import time

i2c = I2C(scl=Pin(5), sda=Pin(4))  # 创建 I2C 对象,使用 SDA 和 SCL 引脚
sensor_data = [25, 26, 27]  # 要写入的数据
i2c.writeto_mem(0x3f, bytearray(sensor_data))  # 将数据写入到地址为 0x3f 的内存中

解读:这个程序首先创建了一个I2C对象,指定了使用的 SCL 和 SDA 引脚。然后定义了要写入的数据,并使用writeto_mem()方法将数据写入到地址为 0x3f 的内存中。

案例3:使用 I2C 总线控制舵机运动

from machine import Pin, I2C, Servo
import time

i2c = I2C(scl=Pin(5), sda=Pin(4))  # 创建 I2C 对象,使用 SDA 和 SCL 引脚
servo = Servo(Pin(17), 180)  # 创建舵机对象,使用 GPIO17 引脚,初始角度为 180 度

while True:
    servo.position(90)  # 将舵机转动到中间位置
    time.sleep(2)  # 等待 2 秒
    servo.position(0)  # 将舵机转动到最左侧位置
    time.sleep(2)  # 等待 2 秒
    servo.position(180)  # 将舵机转动回中间位置
    time.sleep(2)  # 等待 2 秒

解读:这个程序首先创建了一个I2C对象,指定了使用的 SCL 和 SDA 引脚。然后创建了一个Servo对象,指定了使用的引脚(GPIO17),以及初始角度为 180 度。然后进入一个无限循环,在循环中每次将舵机转动到最左侧、中间或最右侧位置,并等待 2 秒。

案例4:扫描I2C设备地址:

import machine

# 配置I2C总线
i2c = machine.I2C(0)

# 扫描设备地址
devices = i2c.scan()

# 打印扫描结果
for device in devices:
    print("找到设备地址:", hex(device))

要点解读:
使用machine.I2C()函数配置I2C总线,参数为总线号。
使用scan()方法扫描I2C总线上的设备地址,返回一个设备地址列表。
遍历设备地址列表,并打印每个设备的地址。

案例5:读取I2C设备的数据:

import machine

# 配置I2C总线
i2c = machine.I2C(0)

# 设置目标设备地址
device_address = 0x50

# 读取数据
data = i2c.readfrom(device_address, 4)

# 打印读取结果
print("读取到的数据:", data)

要点解读:
使用machine.I2C()函数配置I2C总线,参数为总线号。
使用readfrom()方法从指定设备地址读取数据,第一个参数是设备地址,第二个参数是要读取的字节数。
将读取的数据存储在data变量中。
打印读取结果。

案例6:向I2C设备写入数据:

import machine

# 配置I2C总线
i2c = machine.I2C(0)

# 设置目标设备地址
device_address = 0x50

# 要写入的数据
data = b'\x01\x02\x03\x04'

# 写入数据
i2c.writeto(device_address, data)

要点解读:
使用machine.I2C()函数配置I2C总线,参数为总线号。
使用writeto()方法向指定设备地址写入数据,第一个参数是设备地址,第二个参数是要写入的数据(以字节串形式表示)。这些示例代码展示了MicroPython在Zephyr上操作硬件I2C总线的常见用法。你可以根据具体的硬件平台和I2C设备进行进一步的修改和调整。请注意,具体的I2C总线操作可能因Zephyr的特定配置和硬件平台而有所不同,上述示例提供了一个基本的框架,你可以根据实际情况进行适当的调整和实现。

案例7:读取I2C设备寄存器值

from micropython import const  
import machine  
import utime  
import machine_i2c as i2c  
  
I2C_BUS = const(1)  
I2C_ADDR = const(0x48)  
REGISTER_ADDR = const(0x00)  
  
def main():  
    i2c.init(I2C_BUS, scl=machine.Pin(21), sda=machine.Pin(20), freq=100000)  
    sensor = i2c.I2CDevice(I2C_BUS, I2C_ADDR)  
    while True:  
        value = sensor.readfrom_mem(REGISTER_ADDR, 1)  
        print(value)  
        utime.sleep(1)  
  
main()

要点解读:此代码使用Zephyr的MicroPython运行时来读取一个I2C设备的寄存器值。代码中,我们首先导入必要的模块和常量,然后初始化I2C总线并定义一个I2C设备对象来连接设备。接着,我们使用sensor.readfrom_mem()函数来读取设备指定寄存器的值。最后在一个无限循环中重复读取并打印寄存器值。

案例8:向I2C设备寄存器写入值

from micropython import const  
import machine  
import utime  
import machine_i2c as i2c  
  
I2C_BUS = const(1)  
I2C_ADDR = const(0x48)  
REGISTER_ADDR = const(0x00)  
REGISTER_VALUE = const(0x55)  
  
def main():  
    i2c.init(I2C_BUS, scl=machine.Pin(21), sda=machine.Pin(20), freq=100000)  
    sensor = i2c.I2CDevice(I2C_BUS, I2C_ADDR)  
    while True:  
        sensor.writeto_mem(REGISTER_ADDR, bytearray([REGISTER_VALUE]))  
        utime.sleep(1)  
  
main()

要点解读:此代码使用Zephyr的MicroPython运行时来向一个I2C设备的寄存器写入值。代码中,我们首先导入必要的模块和常量,然后初始化I2C总线并定义一个I2C设备对象来连接设备。接着,我们使用sensor.writeto_mem()函数来向设备指定寄存器写入指定值。最后在一个无限循环中重复写入操作。

案例9:使用I2C设备进行数据传输

from micropython import const  
import machine  
import utime  
import machine_i2c as i2c  
  
I2C_BUS = const(1)  
I2C_ADDR = const(0x48)  
DATA_LENGTH = const(16)  
  
def main():  
    i2c.init(I2C_BUS, scl=machine.Pin(21), sda=machine.Pin(20), freq=100000)  
    sensor = i2c.I2CDevice(I2C_BUS, I2C_ADDR)  
    while True:  
        data = bytearray([i for i in range(DATA_LENGTH)])  # 生成测试数据  
        sensor.writeto(data)  # 写入数据到I2C设备  
        received_data = sensor.readto(DATA_LENGTH)  # 从I2C设备读取数据  
        print(received_data)  # 打印接收到的数据  
        utime.sleep(1)  # 延时1秒钟再进行下一次传输  
  
main()

要点解读:此代码使用Zephyr的MicroPython运行时来进行数据传输,通过I2C总线连接的设备进行数据传输。代码中,我们首先导入必要的模块和常量,然后初始化I2C总线并定义一个I2C设备对象来连接设备。接着,我们生成测试数据并使用sensor.writeto()函数将数据写入到I2C设备中。然后使用sensor.readto()函数从I2C设备中读取指定长度的数据。最后在一个无限循环中重复进行数据传输操作,并打印接收到的数据。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。确保正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/133542617