使用MicroPython在Raspberry Pi上通过双核编程的多线程控制LED

描述

在本教程中,我们将使用 MicroPython在 Raspberry Pi Pico 上通过双核编程的多线程控制两个 LED 。

到目前为止,我们已经了解了如何连接OLED、LCD、伺服、超声波传感器,并且我们已经实现了I2C、ADC、与 Raspberry Pi Pico 的蓝牙通信。RP2040微控制器pico 板具有双核。如果您不熟悉多线程执行,那么请考虑一下您的计算机系统。它可以同时执行多个程序,这些程序可以由一个操作系统使用多线程来运行。但是我们在 Raspberry Pi Pico 上没有任何操作系统来控制 CPU 周期,它只能支持每个内核一个线程,在这种情况下是两个。

Raspberry Pi Pico 上双核编程所需的组件

您需要确保拥有以下组件来演示 Pico 板上的双核编程。

树莓派 Pico

LED x2

电阻器 x2(330 欧姆)

面包板

连接电线

使用 Raspberry Pi Pico 板的伺服电机电路图

伺服电机的电路图就是这么简单。我已经分别使用两个 330 欧姆电阻与 GPIO15 和 GPIO16 连接了两个 LED。LED 的接地引脚已连接到 Pico 板的接地引脚。

led

使用双核编程在 Raspberry Pi Pico 上进行多线程

您需要克隆我们的Raspberry Pi Pico 教程GitHub 存储库。然后打开“ T9_DualCore_Program_PIco”文件夹。在此文件夹中,您可以找到“代码”文件夹。在Thonny编辑器中打开“main.py” python 文件。现在,让我们讨论一下main.py文件。

 

从机器进口销
导入 utime
导入_thread

 

首先,我们需要从上面提到的 machine.py 库中导入Pin () 类。在我们之前的教程中,我们已经多次使用机器库,希望您现在熟悉机器库。然后我们需要导入“ utime”库来使用pico的内部时钟。我们正在使用“_thread”库来使用 raspberry pi pico 社区制作的线程函数。

 

led1 = Pin(16, machine.Pin.OUT)
led2 = Pin(15, machine.Pin.OUT)
sLock = _thread.allocate_lock()

 

在上面的代码中,我使用“Pin(16, machine.Pin.OUT)”和“Pin(15, machine.Pin.OUT)”函数将 GPIO15 和 GPIO16 的两个 LED 初始化为 OUPUT 。“ _thread.allocate_lock() ”函数可用于为两个线程提供信号量锁。如果想详细了解这个函数,可以参考“_thread”库的文档。

 

定义核心任务():
    而真:
        sLock.acquire()
        print("进入第二个线程")
        utime.sleep(1)
        led2.high()
        print("Led 2 开启")
        utime.sleep(2)
        led2.low()
        print("Led 2 关闭")
        utime.sleep(1)
        print("从第二个线程退出")
        utime.sleep(1)
        sLock.release()
_thread.start_new_thread(CoreTask, ())

 

我们将在单线程的另一个内核中使用“ CoreTask() ”函数。在函数内的 while 循环中,我们使用信号量锁来保持线程,直到它完成。然后我将 led2 调高 1 秒钟,然后在 Thonny 的输出端打印指令。然后我在线程完成时释放信号量锁。“ _thread.start_new_thread(CoreTask, ()) ”函数将启动线程。该函数将目标函数名作为第一个参数。在我的例子中,它是“ CoreTask ”,它在第二个参数中接受参数。就我而言,我没有任何要传递的论点。

 

而真:
    # 我们获取信号量锁
    sLock.acquire()
    print("进入主线程")
    led1.toggle()
    utime.sleep(0.15)
    print("Led 1 开始切换。")
    print("退出主线程")
    utime.sleep(1)
    # 我们释放信号量锁
    sLock.release()

 

在上面的 while 循环中,我们类似地使用了另一个信号量锁,以便主线程继续运行直到它完成。它将切换 led1,然后释放信号量锁。现在,在 Thonny IDE中,打开 “main.py” 文件。首先, 通过按键盘上的 “ctrl+shift+s”键将“main.py”文件保存在 Pico 板上 。在保存文件之前,请确保您的 Pico 板已连接到您的笔记本电脑。保存代码后,会出现一个弹出窗口,如下图所示。您必须首先 选择 Raspberry Pi Pico,然后 将文件命名为“main.py”并保存。 此过程使您能够在 Pico 打开时运行程序。

led

当您在 Pico 板上上传并运行代码时,您会看到连接到 GPIO16 的 led1 以 1.15 秒的延迟切换。但是连接到 GPIO15 的 led2 会延迟 2 秒闪烁。您可以参考下面的视频了解更多详情。

代码

主文件

 

进口机
导入 utime
导入_thread
led1 = machine.Pin(16, machine.Pin.OUT)
led2 = machine.Pin(15, machine.Pin.OUT)
sLock = _thread.allocate_lock()
定义核心任务():
    而真:
        sLock.acquire()
        print("进入第二个线程")
        utime.sleep(1)
        led2.high()
        print("Led 2 开启")
        utime.sleep(2)
        led2.low()
        print("Led 2 关闭")
        utime.sleep(1)
        print("从第二个线程退出")
        utime.sleep(1)
        sLock.release()
_thread.start_new_thread(CoreTask, ())
而真:
    # 我们获取信号量锁
    sLock.acquire()
    print("进入主线程")
    led1.toggle()
    utime.sleep(0.15)
    print("Led 1 开始切换。")
    utime.sleep(1)
    print("退出主线程")
    utime.sleep(1)
    # 我们释放信号量锁
    sLock.release()

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分