【DigiKey好物畅享】Arduino UNO Q 获取Linux时间并显示于LED点阵

非常感谢Digikey,收到UNO Q感叹如此精致,比树莓派5还小一圈。

插上电就迫不及待装上Arduino App Lab跑一个点灯程序。

也就是Blink LED例程。

通过这个例程学习到,UNO Q双核(MPU+MCU)架构带来的功能性。

**MPU:**主控Qualcomm Dragonwing QRB2210(四核 ARM Cortex-A53,主频 2.0 GHz,64 位),运行Linux系统,编程基于python语言。通常运行高阶应用,如AI应用。

**MCU:**主控STM32U585(单核Arm Cortex-M33,主频160 MHz,32位),运行Zephyr OS,编程基于Arduino语言。通常运行实时控制,如电机控制。

而沟通MPU和MCU的则是Bridge,也就是像“桥”一样连接MPU和MCU

具体到Blink LED例程

MPU程序如下:

主要功能是每秒钟将led_state取反,并将led_state通过Bridge.call传送给MCU。

from arduino.app_utils import *
import time

led_state = False

def loop():
    global led_state
    time.sleep(1)
    led_state = not led_state
    Bridge.call("set_led_state", led_state)

App.run(user_loop=loop)

MCU端程序如下:

主要功能是配置LED外设,从MPU获取led_state的状态(通过Bridge.provide),并将其赋值给LED

#include "Arduino_RouterBridge.h"

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);

    Bridge.begin();
    Bridge.provide("set_led_state", set_led_state);
}

void loop() {
}

void set_led_state(bool state) {
    // LOW state means LED is ON
    digitalWrite(LED_BUILTIN, state ? LOW : HIGH);
}

最终就实现了每秒钟闪烁LED的效果,虽然搞得有点复杂了,毕竟MCU就能轻松实现这一功能,但通过这个简单得例子明白了MPU与MCU是如何协同运行的。

经过后续的摸索,我发现MPU和MCU既可以协同运行(通过App Lab同步编程),也可以单独运行。

具体而言:

单独运行MPU程序(基于python),可以使用App Lab的python部分,删除sketch目录下的sketch.ino文件即可。

单独运行MCU程序(基于Arduino),可以使用Arduino IDE。

接下来回到本文的主题:Arduino UNO Q 获取Linux时间并显示于MCU LED点阵。

上面的Blink_LED只实现了ON OFF状态信息的传递,信息量太少,而且仅仅点灯不够过瘾,没有利用上LED点阵。

因此本文的重点是 MPU将文本字符串(string)通过Bridge传递给MCU,并将文本字符串显示在LED点阵。

这里主要借鉴了Air quality on LED matrix这一例程,然而也遇到新的问题。

最大的问题是:App Lab下Sketch 的 Arduino_LED_Matrix.h 不支持英文及数字显示函数。
经过很长时间的折腾,通过App Lab单独进行MPU linux 编程 + Arduino IDE MCU编程的方式,实现了上述功能。

App Lab单独进行MPU linux 编程 :

from arduino.app_utils import *
import datetime
import time


def get_time():
    # 获取当前日期和时间
    now = datetime.datetime.now()
    # 将日期和时间转换为字符串
    datetime_str = now.strftime("%Y-%m-%d %H:%M:%S")
    print(datetime_str)
    time.sleep(1)
    return datetime_str



Bridge.provide("get_time", get_time)

App.run()

Arduino IDE MCU编程:

(不知道为什么上传程序总是失败:403 error,只好贴个图片了)

分别对MPU、MCU端各自编程并运行后,

最终运行效果如下: