【雕爷学编程】MicroPython手册之 WiPy 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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
WiPy是一款基于MicroPython的无线微控制器模块,它提供了一个完整的硬件和软件解决方案,旨在简化物联网(IoT)设备的开发和部署。

1、微控制器模块:WiPy是一种集成了处理器、内存、无线通信模块和其他必要组件的微型计算机模块。它的设计目标是提供一个紧凑、低功耗的硬件平台,能够运行MicroPython这样的高级编程语言,并具备连接到互联网和其他设备的能力。
2、MicroPython:MicroPython是一种精简版的Python编程语言,专为嵌入式系统和微控制器设计而开发。它提供了Python语言的核心功能和语法,使得开发者能够使用熟悉的Python语法进行硬件控制和物联网应用开发。WiPy作为MicroPython的运行环境,能够直接解释和执行MicroPython代码。
3、物联网(IoT):物联网是指将各种物理设备(如传感器、执行器、嵌入式系统等)通过互联网连接起来,实现智能化、互联互通的网络。WiPy作为一种无线微控制器模块,具备无线通信能力,能够连接到物联网中的其他设备和云平台,实现远程控制和数据交换。
4、无线通信模块:WiPy内置了一种或多种无线通信模块,常见的包括Wi-Fi、蓝牙(Bluetooth)和LoRa等。这些无线通信模块使得WiPy能够通过无线网络与其他设备进行通信,实现数据传输、远程控制、云连接等功能。开发者可以根据具体需求选择适合的无线通信模块。
5、开发和部署:WiPy提供了一套方便的开发工具和开发环境,使得开发者能够快速进行应用程序的开发、调试和测试。开发完成后,WiPy可以直接部署到实际的物联网设备中,与其他设备进行通信和交互。WiPy的紧凑设计和低功耗特性,使得它非常适合嵌入式系统和物联网设备的部署。

在这里插入图片描述
MicroPython的WiPy I2C(Inter-Integrated Circuit)总线是一种用于串行通信的接口技术。

主要特点:

简化的硬件连接:WiPy I2C总线采用两线制连接方式,包括数据线(SDA)和时钟线(SCL)。相对于其他串行通信总线,如SPI总线,它的硬件连接更简洁,只需两根线即可实现通信。
多设备支持:WiPy I2C总线支持多个设备的连接,每个设备都有唯一的地址。通过设备地址和片选机制,可以实现与多个设备的通信,灵活性较高。
低功耗:WiPy I2C总线在传输过程中采用了主从模式,主设备发起通信并控制传输的时序。在从设备不工作时,可以将其设置为低功耗模式,以节省能源。
软件可编程:WiPy I2C总线可以通过软件进行配置和控制,包括设备地址、传输速率、时钟频率等参数的设置。这种软件可编程性使得WiPy I2C总线适应各种不同的应用需求。

应用场景:

传感器与微控制器通信:WiPy I2C总线广泛应用于传感器和微控制器之间的通信。例如,与温度传感器、湿度传感器、加速度计等传感器进行数据交互,实现环境监测和物体定位等功能。
扩展模块连接:WiPy I2C总线可用于连接各种扩展模块,如显示屏模块、扩展存储模块等。通过I2C总线,可以实现与这些模块之间的数据交换和控制操作。
多设备控制:WiPy I2C总线支持多个设备的连接,因此适用于需要同时控制多个设备的应用场景。例如,智能家居系统中的控制器可以通过I2C总线与多个传感器、执行器等设备进行通信和控制。
实时时钟(RTC)模块:WiPy I2C总线常用于连接实时时钟模块,以提供精确的时间信息。这对于需要时间戳记录或时间同步的应用非常重要。

注意事项:

硬件兼容性:在使用WiPy I2C总线时,需要确保外部设备与WiPy之间的硬件兼容性。检查设备的电压和信号电平等参数,以确保它们能够正确连接和通信。
设备地址冲突:WiPy I2C总线连接多个设备时,需要注意设备地址的唯一性。确保每个设备具有不同的地址,以避免地址冲突导致通信错误。
电源和地线连接:在连接WiPy和外部设备时,需要正确连接电源和地线。确保电源供应稳定可靠,并保持地线的连接良好,以避免电源噪声和信号干扰。

综上所述,MicroPython的WiPy I2C总线是一种用于串行通信的接口技术。它具有简化的硬件连接、多设备支持、低功耗和软件可编程等特点。WiPy I2C总线在传感器与微控制器通信、扩展模块连接、多设备控制等应用场景中发挥重要作用。在使用WiPy I2C总线时,需要注意硬件兼容性、设备地址冲突和电源地线连接等方面的事项,以确保通信的可靠性和稳定性。

在这里插入图片描述
案例1:使用I2C总线读取SMBus传感器数据

import machine  
import smbus  
  
# 设置I2C总线参数  
I2C = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=400000)  
  
# 初始化SMBus传感器  
sensor = smbus.SMBus(I2C)  
  
# 读取传感器数据  
sensor_address = 0x50  # 传感器地址,根据实际传感器设置。  
register_address = 0x00  # 传感器寄存器地址,根据实际传感器设置。  
data = sensor.read_byte_data(sensor_address, register_address)  
  
# 打印传感器数据  
print("传感器数据:", data)

案例2:使用I2C总线控制LED灯

import machine  
import utime  
  
# 设置I2C总线参数  
I2C = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=400000)  
  
# 初始化LED灯  
led = machine.Pin(5, machine.Pin.OUT)  
  
# 循环控制LED灯闪烁  
while True:  
    led.toggle()  
    utime.sleep(1)

案例3:使用I2C总线控制树莓派光感器

import machine  
import time  
import sensor  # 导入树莓派光感器库  
  
# 设置I2C总线参数  
I2C = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=400000)  
  
# 初始化光感器  
sens = sensor.TCS34725()  # 假设使用TCS34725光感器芯片  
sens.setup()  # 初始化光感器芯片  
sens.set_gain(3)  # 设置增益,这里设置为3倍。  
sens.set_integration_time(14)  # 设置积分时间,这里设置为14ms。  
sens.enable(True)  # 启用光感器。  
  
# 循环读取光感器数据  
while True:  
    data = sens.read()  # 读取光感器数据。  
    print("光感器数据:", data)  # 打印光感器数据。  
    time.sleep(1)  # 等待1秒。

案例4:使用MicroPython读取I2C数据

from machine import I2C, Pin
import time

i2c = I2C(scl=Pin(5), sda=Pin(4))

while True:
    # 读取I2C数据
    data = i2c.readfrom(0x3f)
    print("Received data: {0}".format(data))
    time.sleep(1)  # 延时1秒

案例5:使用MicroPython发送I2C数据

from machine import I2C, Pin
import time

i2c = I2C(scl=Pin(5), sda=Pin(4))

while True:
    # 发送字符串数据
    i2c.writeto(0x3f, "Hello, world!")
    time.sleep(1)  # 延时1秒

案例6:使用MicroPython控制LED灯的亮度

from machine import Pin, PWM
import time

# 初始化引脚12为PWM输出模式
led = PWM(Pin(12), duty=50)

while True:
    # 设置占空比为75%
    led.duty(75)
    time.sleep(1)  # 延时1秒
    # 设置占空比为25%
    led.duty(25)
    time.sleep(1)  # 延时1秒

案例7:使用I2C总线连接一个LCD显示屏的参考代码案例:

# 导入必要的模块
from machine import I2C, Pin
from lcd160cr import LCD160CR # 从 https://github.com/micropython/micropython/tree/master/drivers/display 下载

# 初始化I2C总线和LCD对象
i2c = I2C(0, mode=I2C.MASTER, baudrate=1000000, polarity=0, phase=0)
lcd = LCD160CR('X') # LCD160CR显示屏连接到X端口

# 清除屏幕
lcd.erase()
lcd.show()

# 显示一些文本
lcd.set_font(1, 0) # 设置字体为1号,颜色为黑色
lcd.set_pos(0, 0) # 设置光标位置为左上角
lcd.write('Hello from WiPy') # 写入文本
lcd.show()

# 显示一些图形
lcd.rect(10, 30, 140, 100, lcd.rgb(255, 0, 0), lcd.rgb(0, 255, 0)) # 画一个红色边框绿色填充的矩形
lcd.circle(80, 80, 40, lcd.rgb(0, 0, 255), lcd.rgb(255, 255, 255)) # 画一个蓝色边框白色填充的圆形
lcd.line(40, 40, 120, 120, lcd.rgb(255, 255, 0)) # 画一条黄色的直线
lcd.show()

:

案例8:使用I2C总线连接一个MPU6050陀螺仪加速度传感器的参考代码案例:

# 导入必要的模块
from machine import I2C, Pin
from mpu6050 import MPU6050 # 从 https://github.com/adamjezek98/MPU6050-ESP8266-MicroPython 下载
import network
import time
import ubinascii
from umqtt.simple import MQTTClient

# 初始化I2C总线和MPU6050对象
i2c = I2C(0, mode=I2C.MASTER, baudrate=1000000, polarity=0, phase=0)
mpu = MPU6050(i2c)

# 连接到WLAN网络
wlan = network.WLAN(mode=network.WLAN.STA)
wlan.connect('your_ssid', auth=(network.WLAN.WPA2, 'your_password'))
while not wlan.isconnected():
    time.sleep_ms(50)

# 创建一个MQTT客户端对象,并连接到MQTT服务器
client_id = ubinascii.hexlify(machine.unique_id())
client = MQTTClient(client_id, 'your_mqtt_server')
client.connect()

# 定义姿态数据主题和间隔时间(秒)
topic_accel = b'wipy/acceleration'
topic_gyro = b'wipy/gyroscope'
interval = 1

# 循环读取并发送姿态数据
while True:
    try:
        # 读取加速度和角速度数据,返回值是三轴的元组(单位分别是g和度/秒)
        accel = mpu.get_accel_data()
        gyro = mpu.get_gyro_data()
        print('Acceleration: {} g'.format(accel))
        print('Gyroscope: {} deg/s'.format(gyro))

        # 将姿态数据转换为字节串,并发送到MQTT服务器
        client.publish(topic_accel, str(accel))
        client.publish(topic_gyro, str(gyro))

        # 等待一段时间
        time.sleep(interval)

    except Exception as e:
        # 如果发生异常,打印异常信息,并重试
        print(e)
        time.sleep(1)

案例9:使用I2C总线连接一个EEPROM芯片的参考代码案例:

# 导入必要的模块
from machine import I2C, Pin
import time

# 初始化I2C总线和EEPROM对象
i2c = I2C(0, mode=I2C.MASTER, baudrate=1000000, polarity=0, phase=0)
eeprom = 0x50 # EEPROM的I2C地址

# 定义一个辅助函数,用于将16位的地址转换为两个8位的字节
def addr_to_bytes(addr):
    return bytes([addr >> 8, addr & 0xff])

# 写入一些数据到EEPROM的指定地址(假设为0x0000)
data = b'Hello from WiPy'
i2c.writeto_mem(eeprom, 0x0000, data)
time.sleep_ms(10) # 等待写入完成

# 从EEPROM的指定地址读取相同长度的数据
data = i2c.readfrom_mem(eeprom, 0x0000, len(data))
print(data) # 打印读取到的数据

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/133412431
今日推荐