【雕爷学编程】MicroPython手册之 WiPy SPI总线

在这里插入图片描述
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 SPI(串行外设接口)总线是一种用于串行通信的接口技术。

主要特点:

高速传输:WiPy SPI总线具有高速传输的特点,能够实现快速的数据传输速率。它采用全双工通信方式,在时钟的驱动下,同时进行数据的发送和接收,大大提高了数据传输效率。
多设备支持:WiPy SPI总线通常支持多个设备的连接,每个设备都有一个片选信号(Chip Select),通过选择特定的片选信号,可以与目标设备进行通信。这种多设备支持使得WiPy在连接多个外部设备时非常灵活。
硬件传输:WiPy SPI总线通过硬件实现数据传输,能够提供更高的性能和可靠性。它利用硬件的特殊功能电路来处理数据传输,减轻了CPU的负担,提高了系统的稳定性。
灵活配置:WiPy SPI总线通常具有灵活的配置选项,可以根据具体需求设置传输参数,如时钟频率、数据位数、传输模式等。这样可以根据不同的外设要求进行调整,以达到最佳的传输效果。

应用场景:

与外部存储器通信:WiPy SPI总线可用于与外部存储器(如闪存、EEPROM等)进行通信。通过SPI接口,可以读取和写入存储器中的数据,实现数据的存储和读取功能。
与传感器通信:WiPy SPI总线可用于与各种外部传感器进行通信,如温度传感器、加速度计、压力传感器等。通过SPI接口,可以获取传感器的数据并进行实时处理和分析。
与显示器通信:WiPy SPI总线可用于与显示器(如液晶显示器、OLED显示屏等)进行通信。通过SPI接口,可以发送显示数据和控制命令,实现图形和文本的显示。
与无线模块通信:WiPy SPI总线可用于与无线模块(如Wi-Fi模块、LoRa模块等)进行通信。通过SPI接口,可以发送和接收无线数据,实现无线通信和远程控制。

注意事项:

硬件兼容性:在使用WiPy SPI总线时,需要确保外部设备与WiPy之间的硬件兼容性。检查设备的电压和信号电平等参数,以确保它们能够正确连接和通信。
传输参数配置:在使用WiPy SPI总线进行通信时,需要根据外设的要求适当配置传输参数,如时钟频率、数据位数、传输模式等。确保这些参数与外设匹配,以确保数据传输的正确性和稳定性。
片选信号控制:在连接多个设备时,需要正确设置和控制每个设备的片选信号。在通信时,选择目标设备的片选信号,以确保只与目标设备进行通信,避免数据干扰和冲突。
电源和地线连接:在连接WiPy和外部设备时,需要正确连接电源和地线。确保电源供应稳定可靠,并保持地线的连接良好,以避免电源噪声和信号干扰。

综上所述,MicroPython的WiPy SPI总线是一种用于串行通信的接口技术。它具有高速传输、多设备支持、硬件传输和灵活配置等特点。WiPy SPI总线在与外部存储器、传感器、显示器和无线模块等设备通信方面具有广泛的应用场景。在使用WiPy SPI总线时,需要注意硬件兼容性、传输参数配置、片选信号控制和电源地线连接等事项,以确保通信的正确性和稳定性。

在这里插入图片描述

以下是几个MicroPython的WiPy SPI总线的实际运用程序参考代码案例:

案例2:与外部存储器进行数据读写:

from machine import SPI

# 初始化SPI对象
spi = SPI(0, mode=SPI.MASTER, baudrate=1000000, polarity=0, phase=0)

# 外部存储器写入数据
data_to_write = b"Hello SPI!"
cs_pin.value(0)  # 选择存储器
spi.write(data_to_write)
cs_pin.value(1)  # 取消选择存储器

# 外部存储器读取数据
cs_pin.value(0)  # 选择存储器
data_received = spi.read(10)  # 读取10字节数据
cs_pin.value(1)  # 取消选择存储器
print("接收到的数据:", data_received)

上述代码中,通过使用MicroPython的SPI模块,初始化SPI对象,并设置为主设备模式。然后通过选择存储器的片选信号,使用write()方法向外部存储器写入数据。接下来,再次选择存储器的片选信号,使用read()方法从外部存储器读取数据,然后取消选择存储器。

案例2:与传感器进行数据交互:

from machine import SPI

# 初始化SPI对象
spi = SPI(1, mode=SPI.MASTER, baudrate=1000000, polarity=1, phase=0)

# 读取传感器数据
cs_pin.value(0)  # 选择传感器
command = bytes([0x01, 0x80])  # 发送读取命令
spi.write(command)
data_received = spi.read(4)  # 读取4字节数据
cs_pin.value(1)  # 取消选择传感器
print("接收到的数据:", data_received)

上述代码中,通过使用MicroPython的SPI模块,初始化SPI对象,并设置为主设备模式。然后通过选择传感器的片选信号,使用write()方法向传感器发送读取命令。接下来,再次选择传感器的片选信号,使用read()方法从传感器读取数据,然后取消选择传感器。

案例3:与显示器进行数据交互:

from machine import SPI

# 初始化SPI对象
spi = SPI(2, mode=SPI.MASTER, baudrate=1000000, polarity=0, phase=1)

# 向显示器发送数据
cs_pin.value(0)  # 选择显示器
command = bytes([0x80, 0x01])  # 发送控制命令
spi.write(command)
data_to_send = b"Hello Display!"
spi.write(data_to_send)
cs_pin.value(1)  # 取消选择显示器

上述代码中,通过使用MicroPython的SPI模块,初始化SPI对象,并设置为主设备模式。然后通过选择显示器的片选信号,使用write()方法向显示器发送控制命令和显示数据,然后取消选择显示器。以上代码仅为示例,实际应用中需要根据具体的通信需求和硬件配置进行适当的修改和调整。同时,确保正确配置SPI对象、设置传输模式、片选信号的控制和数据的读写。另外,根据具体情况,可能还需要配置时钟频率、数据位数等参数。

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

from machine import Pin, SPI
import time

spi = SPI(1, baudrate=4000000)

while True:
    # 读取SPI数据
    data = spi.readbytes(2)
    print("Received data: {0}".format(data))
    time.sleep(1)  # 延时1秒

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

from machine import Pin, SPI
import time

spi = SPI(1, baudrate=4000000)

while True:
    # 发送字符串数据
    spi.writebytes("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:使用SPI总线控制一个LED矩阵显示器的参考代码案例:

# 导入必要的模块
from machine import SPI, Pin
from max7219 import Matrix8x8 # 从 https://github.com/mcauser/micropython-max7219 下载

# 初始化SPI总线和LED矩阵对象
spi = SPI(0, mode=SPI.MASTER, baudrate=1000000, polarity=0, phase=0)
display = Matrix8x8(spi, Pin('P10'), 4) # 4个8x8的LED矩阵组成一个32x8的显示器

# 清除显示器
display.fill(0)
display.show()

# 显示一些文本
display.text('Hello',0,0,1)
display.show()
time.sleep(2)

# 滚动显示文本
for i in range(32):
    display.scroll(-1,0)
    display.show()
    time.sleep(0.1)

# 显示一些图形
display.fill(0)
display.pixel(15,4,1) # 画一个点
display.hline(0,7,32,1) # 画一条水平线
display.vline(31,0,8,1) # 画一条垂直线
display.rect(5,1,22,6,1) # 画一个矩形
display.show()
time.sleep(2)

# 滚动显示图形
for i in range(32):
    display.scroll(-1,0)
    display.show()
    time.sleep(0.1)

:

案例8:使用SPI总线读取一个温湿度传感器的数据,并将其发送到一个MQTT服务器的参考代码案例:

# 导入必要的模块
from machine import SPI, Pin
from dht22 import DHT22 # 从 https://github.com/danjperron/MicroPythonDHT22SPI 下载
import network
import time
import ubinascii
from umqtt.simple import MQTTClient

# 初始化SPI总线和DHT22传感器对象
spi = SPI(0, mode=SPI.MASTER, baudrate=1000000, polarity=0, phase=0)
dht = DHT22(spi, Pin('P10'))

# 连接到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_temp = b'wipy/temperature'
topic_humi = b'wipy/humidity'
interval = 10

# 循环读取并发送温湿度数据
while True:
    try:
        # 读取温湿度数据,返回值是摄氏度和百分比
        temp, humi = dht.read()
        print('Temperature: {} C'.format(temp))
        print('Humidity: {} %'.format(humi))

        # 将温湿度数据转换为字节串,并发送到MQTT服务器
        client.publish(topic_temp, str(temp))
        client.publish(topic_humi, str(humi))

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

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

案例9:使用SPI总线连接一个SD卡模块,实现文件的读写操作的参考代码案例:

# 导入必要的模块
from machine import SPI, Pin
import os
import sdcard # 从 https://github.com/micropython/micropython/tree/master/drivers/sdcard 下载

# 初始化SPI总线和SD卡对象
spi = SPI(0, mode=SPI.MASTER, baudrate=1000000, polarity=0, phase=0)
sd = sdcard.SDCard(spi, Pin('P10')) # SD卡的CS引脚连接到P10

# 挂载SD卡到文件系统
os.mount(sd, '/sd')

# 切换到SD卡目录
os.chdir('/sd')

# 创建一个新文件,并写入一些内容
f = open('test.txt', 'w')
f.write('Hello from WiPy')
f.close()

# 读取文件的内容,并打印出来
f = open('test.txt', 'r')
print(f.read())
f.close()

# 删除文件
os.remove('test.txt')

# 卸载SD卡
os.umount('/sd')

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

在这里插入图片描述

猜你喜欢

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