【雕爷学编程】MicroPython手册之 pyboard 的 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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
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 I2C总线,是一种可以实现两线串行通信协议的功能,它可以用于与其他设备或电脑进行数据交换。pyboard I2C总线的主要特点、应用场景,以及需要注意的事项如下:

主要特点:

pyboard I2C总线可以使用pyb.I2C类来创建I2C对象,连接到一个特定的总线。总线可以是1或2,分别对应X和Y位置的引脚。
pyboard I2C总线可以设置通信的参数,如频率、地址、模式等。模式可以是I2C.MASTER或I2C.SLAVE,分别表示主机或从机。
pyboard I2C总线可以使用scan()方法来扫描总线上的从机地址,返回一个有效地址的列表。
pyboard I2C总线可以使用send()方法或writeto()方法来发送数据到指定的从机地址。send()方法不需要指定地址,但需要在发送前调用start()方法和在发送后调用stop()方法。writeto()方法会自动调用start()和stop()方法,并检查从机是否响应。
pyboard I2C总线可以使用recv()方法或readfrom()方法来接收数据从指定的从机地址。recv()方法不需要指定地址,但需要在接收前调用start()方法和在接收后调用stop()方法。readfrom()方法会自动调用start()和stop()方法,并检查从机是否响应。
pyboard I2C总线还可以使用mem_read()方法或mem_write()方法来读写从机的内部寄存器。这些方法需要指定从机地址、寄存器地址和寄存器地址的位数(8或16位)。

应用场景:

pyboard I2C总线可以用于与其他设备进行数据交换,如温湿度传感器、LCD显示屏、EEPROM存储器等,这些设备可以提供测量信息、显示效果、数据存储等功能。
pyboard I2C总线可以用于与电脑进行数据交换,如通过USB转I2C模块或无线I2C模块,这些模块可以实现pyboard与电脑之间的通信和控制。
pyboard I2C总线可以用于实现简单的通信协议,如SMBus、PMBus等,这些协议可以用于电源管理、系统监控等领域。

需要注意的事项:

pyboard I2C总线的输入输出电压范围是0~3.3V,如果与其他设备通信时电压不匹配,可能会损坏芯片或引脚。因此,在接入外部信号时,需要注意信号的幅值和极性,并使用电平转换电路或保护电路来适配或隔离信号。
pyboard I2C总线的通信频率受到芯片时钟、闪存访问速度和编程模式等因素的影响。在高通信频率下,可能会出现数据丢失或时序不准确的情况。因此,在使用I2C时,需要根据实际需求选择合适的参数,并测试其性能和稳定性。
pyboard I2C总线的引脚分配和物理位置因不同型号的pyboard而异。在使用I2C时,需要注意选择正确的引脚,并避免与其他功能冲突。

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

案例1:使用pyb.I2C类读取温湿度传感器(AM2320)的数据。

import pyb
from machine import Pin

#创建I2C对象
i2c = pyb.I2C(1, I2C.MASTER) #Pin='X9' and 'X10'

#定义传感器地址和命令
addr = 0x5c #传感器地址
cmd = 0x03 #读取寄存器命令
reg = 0x00 #寄存器起始地址
num = 0x04 #寄存器数量

#向传感器发送读取命令
i2c.writeto(addr, bytearray([cmd, reg, num]))

#等待一段时间,让传感器准备数据
pyb.delay(10)

#从传感器接收数据(8个字节)
data = i2c.readfrom(addr, 8)

#判断数据是否有效(长度、功能码、字节数等)
if len(data) == 8 and data[0] == cmd and data[1] == num:
    #计算并验证CRC校验码(低字节在前,高字节在后)
    crc = (data[7] << 8) | data[6]
    if crc == crc16(data[:6]):
        #获取温度和湿度的原始数据(高字节在前,低字节在后)
        temp_raw = (data[4] << 8) | data[5]
        humi_raw = (data[2] << 8) | data[3]
        #根据传感器的数据手册,将原始数据转换为真实数据
        temp = temp_raw * 0.1
        humi = humi_raw * 0.1
        #打印温度和湿度的值
        print('Temperature:', temp, 'C')
        print('Humidity:', humi, '%')

案例2:使用pyb.I2C类与电脑进行数据交换,通过USB转I2C模块。

import pyb
from machine import Pin

#创建I2C对象
i2c = pyb.I2C(1, I2C.SLAVE, addr=0x42) #Pin='X9' and 'X10'

while True:
    #尝试接收4个字节的数据
    try:
        data = i2c.recv(4)
    except OSError as e:
        pass #忽略错误
    else:
        #如果接收成功,打印接收到的数据
        print('Received:', data)
        #将接收到的数据加1后发送回电脑
        i2c.send(bytearray([x + 1 for x in data]))

例3:使用pyb.I2C类控制LCD显示屏(PCF8574)显示文字。

import pyb
from machine import Pin

#创建I2C对象
i2c = pyb.I2C(1, I2C.MASTER) #Pin='X9' and 'X10'

#定义LCD显示屏地址和命令
addr = 0x27 #LCD显示屏地址
cmd_clear = 0x01 #清屏命令
cmd_home = 0x02 #回到起始位置命令
cmd_line1 = 0x80 #第一行起始地址命令
cmd_line2 = 0xC0 #第二行起始地址命令

#定义一个函数,用于向LCD显示屏发送命令或数据
def lcd_send(data, rs):
    #将数据分为高四位和低四位
    high = data & 0xF0
    low = (data << 4) & 0xF0
    #根据rs参数设置寄存器选择位(RS),高电平为数据,低电平为命令
    if rs:
        high |= 0x01
        low |= 0x01
    else:
        high &= 0xFE
        low &= 0xFE
    #向LCD显示屏发送高四位,并产生脉冲信号(E)
    i2c.writeto(addr, bytearray([high | 0x04]))
    i2c.writeto(addr, bytearray([high & 0xFB]))
    #向LCD显示屏发送低四位,并产生脉冲信号(E)
    i2c.writeto(addr, bytearray([low | 0x04]))
    i2c.writeto(addr, bytearray([low & 0xFB]))

#定义一个函数,用于向LCD显示屏写入一行文字
def lcd_write(line, text):
    #根据行号选择对应的命令
    if line == 1:
        cmd = cmd_line1
    elif line == 2:
        cmd = cmd_line2
    else:
        return #如果行号不合法,直接返回
    #发送命令到LCD显示屏,设置光标位置
    lcd_send(cmd, 0)
    #遍历文字中的每个字符,发送数据到LCD显示屏,显示字符
    for char in text:
        lcd_send(ord(char), 1)

#初始化LCD显示屏,设置为4位模式、两行显示、5x8点阵字符
lcd_send(0x33, 0) #发送0011 0011
lcd_send(0x32, 0) #发送0011 0010
lcd_send(0x28, 0) #发送0010 1000
lcd_send(0x0C, 0) #发送0000 1100
lcd_send(0x06, 0) #发送0000 0110

#清除LCD显示屏,回到起始位置
lcd_send(cmd_clear, 0)
lcd_send(cmd_home, 0)

#向第一行写入"Hello World!"
lcd_write(1, "Hello World!")

#向第二行写入"MicroPython"
lcd_write(2, "MicroPython")

案例4:I2C通信与外设交互:

import pyb

i2c = pyb.I2C(1, pyb.I2C.MASTER)  # 初始化I2C对象,使用I2C 1,主模式

i2c.init(pyb.I2C.MASTER, baudrate=100000)  # I2C初始化

while True:
    # 与外设进行通信
    i2c.mem_write(0x55, 0x50, 0x10)  # 向地址为0x50的外设写入数据0x55
    
    data = i2c.mem_read(4, 0x50, 0x20)  # 从地址为0x50的外设读取4个字节的数据,起始地址为0x20
    
    # 处理接收到的数据
    # ...
    ```
这个程序使用 MicroPython 在 pyboard 上配置 I2C 对象,并与外设进行通信。使用 I2C 对象 i2c 初始化 I2C 1,并设置为主模式。然后使用 i2c.init() 方法进行 I2C 的初始化配置,包括波特率等参数。在一个循环中,使用 i2c.mem_write() 方法向地址为0x50的外设写入数据0x55。然后使用 i2c.mem_read() 方法从地址为0x50的外设读取4个字节的数据,起始地址为0x20。接收到的数据可以进行进一步的处理。

案例5:使用I2C总线与温湿度传感器进行数据交互::

```python
import pyb

i2c = pyb.I2C(1, pyb.I2C.MASTER)  # 初始化I2C对象,使用I2C 1,主模式

i2c.init(pyb.I2C.MASTER, baudrate=100000)  # I2C初始化

# 温湿度传感器初始化配置
# ...

while True:
    # 从温湿度传感器读取数据
    i2c.mem_write(0xE3, 0x40)  # 发送测量命令
    pyb.delay(50)  # 延时等待测量完成
    data = i2c.mem_read(2, 0x40)  # 读取2个字节的数据
    
    # 处理温湿度数据
    # ...

这个程序使用 MicroPython 在 pyboard 上配置 I2C 对象,并使用 I2C 总线与温湿度传感器进行数据交互。使用 I2C 对象 i2c 初始化 I2C 1,并设置为主模式。然后使用 i2c.init() 方法进行 I2C 的初始化配置,包括波特率等参数。在一个循环中,使用 i2c.mem_write() 方法向地址为0x40的传感器发送测量命令。然后通过延时等待测量完成,并使用 i2c.mem_read() 方法读取2个字节的数据。接收到的数据可以进行进一步的处理。

案例六:使用I2C总线控制外部设备,如显示屏:

import pyb

i2c = pyb.I2C(1, pyb.I2C.MASTER)  # 初始化I2C对象,使用I2C 1,主模式

i2c.init(pyb.I2C.MASTER, baudrate=100000)  # I2C初始化

# 显示屏初始化配置
# ...

while True:
    # 发送显示指令和数据
    i2c.mem_write(0x02, 0x72)  # 发送指令
    i2c.mem_write(0x48, 0x72)  # 发送数据
    
    # 更新显示
    # ...

案例7:扫描I2C设备:

import pyb

i2c = pyb.I2C(1, pyb.I2C.MASTER)  # 初始化I2C对象,使用I2C1,设置为主设备模式

devices = i2c.scan()  # 扫描连接到I2C总线上的设备

for device in devices:
    print("Device found at address: ", hex(device))

在上述示例中,我们使用pyb.I2C()初始化一个I2C对象,并指定使用I2C1,并将其设置为主设备模式。使用i2c.scan()函数扫描连接到I2C总线上的设备,并将设备的地址存储在列表devices中。然后,使用循环遍历列表,并使用print()函数打印输出每个设备的地址。

案例8:主设备发送数据::

import pyb

i2c = pyb.I2C(1, pyb.I2C.MASTER)  # 初始化I2C对象,使用I2C1,设置为主设备模式

device_address = 0x50  # I2C从设备的地址

data = b"Hello, I2C!"  # 要发送的数据,以字节串形式表示

i2c.send(data, device_address)  # 发送数据到指定地址的从设备

在上述示例中,我们使用pyb.I2C()初始化一个I2C对象,并指定使用I2C1,并将其设置为主设备模式。定义了要发送数据的I2C从设备地址device_address,以及要发送的数据,以字节串b"Hello, I2C!"表示。使用i2c.send()函数将数据发送到指定地址的从设备。

案例9:主设备接收数据::

import pyb

i2c = pyb.I2C(1, pyb.I2C.MASTER)  # 初始化I2C对象,使用I2C1,设置为主设备模式

device_address = 0x50  # I2C从设备的地址

response = i2c.recv(10, device_address)  # 从指定地址的从设备接收最多10个字节的数据

print(response)

在上述示例中,我们使用pyb.I2C()初始化一个I2C对象,并指定使用I2C1,并将其设置为主设备模式。定义了要接收数据的I2C从设备地址device_address。使用i2c.recv()函数从指定地址的从设备接收最多10个字节的数据,并将其存储在变量response中。最后,使用print()函数打印输出接收到的数据。这些示例提供了使用MicroPython在pyboard上进行I2C总线通信操作的实际运用程序的参考代码。你可以根据具体的需求和应用场景进行修改和扩展。

请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和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、付费专栏及课程。

余额充值