使用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
完善资料,
赚取积分