已经快成路边的Arduino官方去年底出的最新的UNO系列,但这次又是个高通SoC+STM32的缝合怪。先说前提:这玩意并不被社区看好,海外社区玩的人也不多,国内更是基本没有玩的。虽然大概率是赤石,不过冲着这个外观,我决定率先品鉴。

这是来自官方文档的示意图(下面很多图也是),比较清晰。简单来讲,这是一个高通SoC的SBC系统和STM32的嵌入式系统二合一的开发板,全功能Type-C(含有USB3.0和DP视频输出)、内存、EMMC、WiFi/BT、背面的高密度连接器都连接到了高通SoC上;而正面的I/O口基本上都是STM32的,还有一个单色的8×13 LED阵列和IIC插座也连接在其上,具体如下图:

作为SBC,它的接口基本只有一个全功能Type-C,以及正面的JCTL调试接口+两个LED,其余一些接口可以从高密度连接器接入底板后引出,但目前底板很少,且国内买不到。这意味着作为SBC它需要连接外挂的全功能Type-C HUB适用,或者直接连接带HUB的显示器,插上就是一个性能有些烂的Linux小电脑。另外这个Type-C也支持OTG,可以直接连接到其他电脑上。其实就很像一个手机,对于这个高通SoC倒是意料之中。
如果只是将其当作一个SBC的话,那在2026年基本全无性价比:性能羸弱,四核A53 2.0GHz仅仅是树莓派Zero2的水平,100块以内的大量SBC都比它的CPU强。跑桌面的话2+16款会比较紧张,自带软件占用不低,4+32款倒是还凑合。接口也极为寒酸的只有一个全功能Type-C,不过如果你有带Hub的显示器那其实还挺方便的。其支持USB 3.0和DP视频输出,但整个板子的分辨率最高只能1920×1080。实际的桌面体验很一般,用起来卡卡的,估计只有倒霉蛋学生会实际用自带桌面做开发:这功能的设计目的大概就是像树莓派一样放在学生教室里,让学生直接用它自己操作自己,省一个电脑钱,至于什么4k就别想了。
要说其作为SBC的唯一优势,就是功耗比较低。这个高通SoC(QRB2210)使用了11nm LPP (Low Power Plus)制程,对比性能类似的树莓派3/Zero2的BCM2837则为古老的40nm。整板在空载时功耗0.5w,不接显示器时CPU满载 + led matrix部分点亮是功耗也只有1.5~2w。
而对于STM32系统,正面Arduino风格的I/O排插都是它的,3.3v电平,绝大多数有5v耐受。也可以通过Arduino ide上只用STM32部分,但此时SoC部分并没法关闭,会白白耗电,而且也不会有人话400多块钱就当个STM32用吧。
官方真正主推的是这个新的Arduino APP Lab中的高通SoC上的linux程序 + STM32的裸机程序的协同任务,这个新的APP Lab是全平台桌面应用,可以在Arduino UNO Q上直接运行,也可以在别的电脑上远程连接。有个自带的bridge api方便高通SoC和STM32进行通信,不过目前底层走的只是串口(LPUART1,TX、RX、RTS、CTS),默认波特率为115200,速度很挫,似乎可以改高来提速。另外还有一组SPI在电路上是相连的,但目前的bridge api功能并没有实际用上。
整个编程模型大概如下,一个App是一个目录,其中包含普通Arduino嵌入式程序,用于STM32,但增加了bridge API,其是一个RPC模块,可以调用Linux侧的函数,或者暴露函数给Linux测进行调用。而Linux测目前为python,也包含bridge API,同时Arduino APP Lab还提供了一些常用功能在python包中来方便开发,例如WebUI,天气API之类的。
官方给的一个入门小例子就是获取天气并将图标显示在板载的led matrix上显示,主要代码如下:
Linux测:
# SPDX-FileCopyrightText: Copyright (C) Arduino s.r.l. and/or its affiliated companies
#
# SPDX-License-Identifier: MPL-2.0
from arduino.app_bricks.weather_forecast import WeatherForecast
from arduino.app_utils import *
forecaster = WeatherForecast()
def get_weather_forecast(city: str) -> str:
forecast = forecaster.get_forecast_by_city(city)
print(f"Weather forecast for {city}: {forecast.description}")
return forecast.category
Bridge.provide("get_weather_forecast", get_weather_forecast)
App.run()
Arduino侧:
// SPDX-FileCopyrightText: Copyright (C) Arduino s.r.l. and/or its affiliated companies
//
// SPDX-License-Identifier: MPL-2.0
#include <Arduino_LED_Matrix.h>
#include <Arduino_RouterBridge.h>
#include "weather_frames.h"
String city = "Beijing";
Arduino_LED_Matrix matrix;
void setup() {
matrix.begin();
matrix.clear();
Bridge.begin();
}
void loop() {
String weather_forecast;
bool ok = Bridge.call("get_weather_forecast", city).result(weather_forecast);
if (ok) {
if (weather_forecast == "sunny") {
matrix.loadSequence(sunny);
playRepeat(1000);
} else if (weather_forecast == "cloudy") {
matrix.loadSequence(cloudy);
playRepeat(1000);
} else if (weather_forecast == "rainy") {
matrix.loadSequence(rainy);
playRepeat(2000);
} else if (weather_forecast == "snowy") {
matrix.loadSequence(snowy);
playRepeat(1000);
} else if (weather_forecast == "foggy") {
matrix.loadSequence(foggy);
playRepeat(500);
}
}
}
void playRepeat(int repeat_count) {
for (int i = 0; i < repeat_count; i++) {
matrix.playSequence();
}
}
其中的bridge API用起来还挺方便的,不需要自己处理MCU和Linux通讯的各种协议和解析细节。不过有一说一,如果这只是这么一个应用,单独一个树莓派或者单独一个ESP32都能干,树莓派也有GPIO,只是难以实时控制(Linux是非实时系统),不过实际上在用纯软件驱动个LCD12864是很轻松的;至于ESP32则是没有太多的性能、资源和多媒体能力,但连个在线API还是不在话下;而真正需要Arduino UNO Q这种Linux+MCU混合设计的是一个十分狭窄的领域,例如高性能+高实时的智能机器人?而其余的恐怕90%的应用仅需要一个单一的树莓派或ESP32就足够了。
此外还有一个槽点:这玩意由于是SBC,需要安全关机,不然文件系统可能会坏。但如果你用sudo poweroff命令,它在关机后会立即再次启动。正确的方式是使用sudo halt命令,这个命令的含义是进linux系统安全关闭,但不会向硬件发送关闭电源的命令。因此它关机完成后也不会有任何指示灯的变化,你只能等几十秒觉得差不多了后再拔掉电源。

发表回复