Arduino UNO Q 是一块看起来和经典 UNO R3 几乎一样、内核却完全换代的新板子。它保持了 UNO 的扩展板排列思路,但主控从 ATmega328P 换成了瑞萨 RA4M1(Arm Cortex-M4 架构),性能和存储空间都明显提升。对正在学 Arduino 的新人来说,它比 R3 更适合作为第一块板;对老玩家来说,它是把旧项目迁移到更强主控的一个低成本方案。
不过“最强 Arduino 板”这个说法需要限定范围。如果只看 UNO 形态、引脚兼容性和入门生态,UNO Q 是目前 UNO 家族里比较激进的一款;但如果要比无线连接、双核算力和复杂物联网应用,Nano ESP32 那类板子仍然是另一个赛道。这篇文章会从规格、定位、环境安装、第一个程序、舵机控制、红外遥控、SPI 屏幕、智能小车、程序模块化、命令行批量编译到常见排错,完整走一遍 UNO Q 的上手流程。下面直接进入正题。
1. UNO Q 核心能力速览
先给一张速览表,方便你判断这块板适不适合自己。
| 项目 | 说明 |
|---|---|
| 板卡型号 | Arduino UNO Q |
| 主控芯片 | 瑞萨 RA4M1,Arm Cortex-M4 内核(以官方规格页为准) |
| 运行频率 | 官方标称最高 48MHz 级别(以官方规格页为准) |
| 闪存 / SRAM | 相比 ATmega328P 有明显提升,常见公布值为 256KB Flash / 32KB SRAM,具体以官方规格页为准 |
| 供电 | USB-C 供电,也保留 VIN/5V 引脚供电路径 |
| 逻辑电平 | 不要默认按 R3 的 5V 逻辑处理,数字 IO 电平需以官方原理图和实际测试为准 |
| USB 接口 | USB-C |
| 引脚布局 | 兼容经典 UNO R3 引脚排布 |
| 开发方式 | Arduino IDE 2.x、Arduino Cloud Editor、Arduino CLI |
| 板级包 | 第一次使用需要在开发板管理器里安装对应板卡支持包 |
| 无线能力 | 无板载 WiFi/蓝牙 |
| 适合场景 | 教学入门、传感器采集、舵机控制、智能小车、桌面自动化原型、5V 传感器模块移植 |
从编译和运行角度说,UNO Q 最明显的改变是“不用再抠抠搜搜省 Flash”。ATmega328P 时代,程序稍微复杂一点就会看到磁盘占用告警;UNO Q 上跑 IRremote、TFT 屏幕库、多传感器驱动这类典型教学项目,存储压力会小很多。
2. 从 UNO R3 迁移到 UNO Q:变化与兼容性
很多人的第一个问题是:把 R3 的代码拿过来,能不能直接烧到 UNO Q 上?
先看代码层面。只要是标准 Arduino API 写的程序,比如pinMode、digitalWrite、millis、delay、Serial、Servo、SPI、Wire,迁移成本通常不高。因为这些 API 是 Arduino 生态的公共接口,板级包会帮你做底层映射。需要注意的是一些直接操作寄存器的老代码。R3 的 ATmega328P 寄存器和 RA4M1 寄存器完全不同,凡是写DDRB、PORTB、TCCR1A这类底层寄存器的程序,都要重写。
再看扩展板兼容性。UNO Q 的引脚排布延续了 UNO 的传统位置,所以大部分以 UNO 为目标的扩展板在物理上能插上去。但“能插”不等于“电平和供电完全一致”。R3 是 5V 逻辑,而 UNO Q 的逻辑电平不能直接照搬。如果接的是老式 5V 传感器模块,建议先查模块的输入高电平阈值,必要时加逻辑电平转换器。比如 5V 的超声波模块、5V 的舵机信号线、5V 的 LCD 模块,都要检查信号电压是否在 UNO Q 可接受范围内。这个问题是最容易踩的坑,也是从 R3 升级过来最容易忽略的点。
电源也要分开看。通过 USB-C 给板子供电时,板载 5V 和 3.3V 路径由板卡稳压电路决定。外接舵机、电机这类大电流设备时,不要直接从开发板的 5V 引脚抽大电流,最好单独准备电源,并把 GND 和开发板共地。
3. UNO Q、UNO R3、Nano ESP32 怎么选
选型问题,直接对比。
| 对比项 | UNO Q | UNO R3 | Nano ESP32 |
|---|---|---|---|
| 主控 | Arm Cortex-M4 内核 | ATmega328P | ESP32-S3(双核) |
| 运行频率 | 高于 R3,以官方规格页为准 | 16MHz | 常见 240MHz 级别 |
| Flash/RAM | 明显高于 R3 | 较低 | 高于 UNO Q |
| WiFi/蓝牙 | 无 | 无 | 有 |
| 引脚布局 | UNO 布局 | UNO 布局 | Nano 布局 |
| 典型用途 | 基础教学、传感器、舵机、小车 | 老项目维护、5V 生态 | 无线联网、复杂 IoT、AIoT 原型 |
| 上手难度 | 低 | 低 | 中 |
| 对新手友好度 | 高 | 高,但资源紧张 | 需要先理解无线和双核概念 |
结论是:如果你要的是“继续用 UNO 的机械尺寸、扩展板引脚和教学路径,但希望性能不卡”,选 UNO Q。如果你手头已经有一堆 5V 的 R3 生态模块,而且不想做电平检查,那么至少在迁移第一版时,可以在 UNO Q 上先跑通核心逻辑,再把 5V 外设单独处理。如果你要做联网、摄像头、MQTT、云端控制,Nano ESP32 会是更合理的方案。
严格说,UNO Q 并不是用来替代所有 Arduino 板卡的“全家桶”,而是补上 UNO 家族在性能和存储上的短板。从教学角度讲,它足够流畅;从进阶角度讲,它还能再挂一个 ESP32 当协处理器,让 WiFi 功能外置。
4. 环境准备:安装 IDE、板级包与命令行工具
4.1 安装 Arduino IDE 2.x
UNO Q 需要较新的 Arduino IDE 2.x 版本。去 Arduino 官方软件下载页,按操作系统下载安装包。安装完成后打开 IDE,先不着急插板,先确认 IDE 能正常启动。
如果机器上有老版本 IDE 1.8.x,建议保留也行,但 UNO Q 的板级包支持情况以 IDE 2.x 和官方发布信息为准。对于新项目,直接使用 IDE 2.x 就好。
4.2 在开发板管理器里安装 UNO Q 支持包
把 UNO Q 用 USB-C 线连接到电脑。注意线材不能是“只充电不传数据”的线,否则端口识别不出来。
打开 IDE 2.x,在左侧找到“开发板管理器”图标,或者通过菜单“工具 -> 开发板 -> 开发板管理器”打开,在搜索框里输入UNO Q或Uno Q。搜索结果中会出现 Arduino 官方发布的板卡支持包,点击“安装”等待完成。这个过程会下载工具链,第一次安装耗时取决于网络情况,看到进度条走完即可。
安装完成后,在“工具 -> 开发板”菜单里选择对应的 UNO Q 型号,再用“工具 -> 端口”选择新出现的 COM 口或 USB 串口设备。Windows 下如果看不到端口,先检查 USB 线是否数据线,再检查驱动是否被识别。
4.3 安装 Arduino CLI,为批量编译做准备
如果只是玩一块板,IDE 够用了。但如果以后要批量给小车、教室里的多块板子统一烧录程序,Arduino CLI 更方便。Arduino CLI 是官方命令行工具,支持编译、上传、板卡管理。安装后可以先初始化配置:
arduino-cli config init arduino-cli core update-index然后搜索板卡:
arduino-cli board listall | grep -i uno这条命令会列出所有包含 Uno 的板卡,找到 UNO Q 对应的 FQBN。FQBN 的格式类似vendor:architecture:board,实际名称需要以你本地 listall 输出为准。后续批量编译、批量上传都依赖 FQBN,建议先把这一步跑通。
5. 上手实验:从点亮 LED 到舵机控制
5.1 第一个程序:板载 LED 闪烁
拿到 UNO Q 之后,第一个实验还是经典的 Blink。新建一个 Arduino 工程,先测试板子能不能编译、能不能上传、板载 LED 能不能工作。
#define LED_PIN LED_BUILTIN void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); delay(500); }上传后,如果板载 LED 以 500ms 间隔闪烁,说明工具链、板级包、端口、驱动全部正常。这一步是整个使用过程的“最小验证”,以后遇到任何环境问题,都先回到 Blink 这个最小程序来判断是硬件问题还是环境问题。
5.2 用 Servo 库控制舵机
舵机控制是 Arduino 入门最常见的外设之一。接线时注意 UNO Q 的逻辑电平问题,舵机信号线不要直接接到 5V 引脚,建议按实际舵机规格和电平要求处理;舵机电源单独供电,并把 GND 和开发板共地。
#include <Servo.h> Servo myservo; const int servoPin = 9; void setup() { myservo.attach(servoPin); } void loop() { myservo.write(0); delay(2000); myservo.write(90); delay(2000); myservo.write(180); delay(2000); }如果舵机一直没有反应,先检查电源供电能力,再检查信号线是否接在支持 PWM 输出的引脚上。UNO Q 的 PWM 引脚分布和 R3 并不是完全一样的,具体引脚能力要以板卡原理图和官方引脚说明为准。舵机抖动通常不是代码问题,而是供电不稳。给舵机单独接外部 5V 电源时,一定要把外部电源负极和开发板 GND 连在一起。
5.3 为什么建议优先用 millis 而不是 delay
在写多个传感器读取时,delay会阻塞整个程序。比如舵机转完 90 度,又想同时检测按键,用delay(2000)会导致按键检测停顿。更通用的做法是用millis()做非阻塞定时。
下面示例让 LED 每 1000ms 翻转一次,同时循环里还能执行其它任务:
unsigned long previousMillis = 0; const unsigned long interval = 1000; int ledState = LOW; void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(LED_BUILTIN, ledState); } // 这里可以继续做其它非阻塞任务,例如读取传感器 }这种写法在 UNO Q 和 R3 上都能运行,但对 UNO Q 来说意义更大。因为 UNO Q 的性能更强,很多人会同时接多个传感器、屏幕和执行器,阻塞式编程很快就会变成代码混乱的源头。最好从第一个项目开始就养成非阻塞定时的习惯。
6. 进阶实验:NEC 红外遥控、SPI 屏幕与智能小车
6.1 NEC 格式红外遥控解码
热词里频繁出现 NEC 红外,很多小车或桌面项目都会用到红外遥控。IRremote 是常用的红外库,使用前先确认你用的库版本是否支持 RA4M1 系列主控。如果编译报错提示“不支持该开发板”,可以先升级到库的最新版本,再检查库作者是否在支持列表里加入了 UNO Q。
以下是一个基于 IRremote 库的典型解码程序:
#include <IRremote.h> const int IR_RECEIVE_PIN = 11; void setup() { Serial.begin(9600); IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); } void loop() { if (IrReceiver.decode()) { IrReceiver.printIRResultShort(&Serial); IrReceiver.resume(); } }打开串口监视器,把红外遥控器对准接收头,按下按键,串口会输出对应的 NEC 协议地址和指令值。这一步成功后,就可以把按键值映射到小车的前进、后退、左转、右转等动作上。这里要提醒一句:使用红外遥控时,不要用未经授权的设备去破解别人的门禁、车位锁或家电控制信号,只能在自己拥有的设备或者测试环境里做技术验证。
IRremote 库在 RAM 紧张的板子上会占用很多资源,但在 UNO Q 上一般不用太担心。如果确实需要进一步压缩空间,可以删掉串口打印、关闭 LED 反馈、不编译不需要的协议部分。
6.2 ST7789 SPI 屏幕显示
Arduino 项目里经常用到 SPI 接口的小屏幕,比如 ST7789。接线时尽量使用硬件 SPI 引脚,这样显示刷新速度更快。下面示例连接方式为 CS 接 10、DC 接 9、RST 接 8,SDA 接 MOSI、SCK 接 SCK,实际引脚以你的屏幕模块和 UNO Q 引脚定义为准。
#include <Adafruit_GFX.h> #include <Adafruit_ST7789.h> #include <SPI.h> #define TFT_CS 10 #define TFT_DC 9 #define TFT_RST 8 Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); void setup() { tft.init(240, 240); tft.fillScreen(ST77XX_BLACK); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(2); tft.setCursor(0, 0); tft.println("Hello UNO Q"); } void loop() { }刷新屏幕和绘制图形需要占用一定的 RAM,尤其是使用 Adafruit GFX 库时,图形缓冲区会占用不少空间。UNO Q 的内存比 R3 宽裕,这在这种场景下优势明显。如果屏幕花屏,先检查 SPI 接线是否稳定,再检查供电是否足够,最后确认库版本和分辨率参数是否正确。
6.3 定时器使用的通用思路
Arduino 里“定时器”这个概念有两种。一种是用millis()做软件定时,简单通用;另一种是硬件定时器,通过芯片内部定时器外设精确触发中断。UNO Q 的硬件定时器架构和 ATmega328P 不一样,所以如果你在 R3 上写过Timer1.initialize()那类代码,迁移到 UNO Q 时需要重新确认库是否支持新主控。
对大部分应用,建议先用millis()解决。只有当需要微秒级、周期非常稳定的 PWM 或中断触发时,才去碰硬件定时器。而且拿到 UNO Q 后,不要凭旧经验直接操作寄存器,先看官方核心库和示例代码,再决定使用哪种定时器方案。
6.4 智能小车最小系统
把上一堆模块组合起来,就能搭出一个智能小车最小系统。典型的控制链路是:
- 主控统一读取红外遥控、超声波传感器或按键指令。
- 根据指令计算左右轮目标速度和方向。
- 通过电机驱动模块控制两个直流电机。
- 用 OLED 或 ST7789 显示当前模式、测距结果和电池电压。
在选择电机驱动模块时,要特别关注驱动板逻辑电平阈值。很多老式 L298N 模块设计时默认输入是 5V 逻辑,UNO Q 的信号电平能不能稳定触发,需要看驱动板资料。如果逻辑电平不匹配,加一个电平转换模块比硬接更稳。
小车项目很容易出现“代码没问题但车不动”的情况。最常见的不是程序逻辑,而是:电机电源没接好、GND 没共地、PWM 引脚接错、驱动板逻辑电源没接。排查顺序建议先跑一个最简单的“两轮同时转”测试,确定驱动板和电机正常,再接入传感器和遥控逻辑。
7. 程序模块化:怎么区分和拆分工程文件
热词里有一个很有价值的问题:“进行 Arduino 程序设计的时候,应该怎么区分程序的模块呢?”这其实是很多 Arduino 项目从几十行膨胀到几千行之后的必然需求。
7.1 单文件痛点
新手习惯把所有代码写在一个.ino文件里。当项目包含舵机、红外遥控、屏幕、超声波、电机驱动时,.ino文件会迅速膨胀到几百上千行。到后期,改动一个电机函数要滚很长的页面,而且变量名容易冲突,调试效率非常低。
Arduino IDE 的工程目录本身支持多文件。一个工程是一个文件夹,里面可以放主文件main.ino、多个.h头文件和多个.cpp源文件。IDE 在编译时会自动把同目录下的.cpp文件加入编译,不需要手动维护 Makefile。这就是最简单的模块化方式。
7.2 按设备或职责拆分
推荐按“硬件设备”拆分。比如小车项目可以拆成:
main.ino:主循环,负责调度。MyCar.h/MyCar.cpp:电机驱动封装。SensorManager.h/SensorManager.cpp:超声波等传感器读取。RemoteControl.h/RemoteControl.cpp:红外遥控解码和指令映射。DisplayManager.h/DisplayManager.cpp:屏幕显示刷新。
每个模块只对一种硬件负责,模块之间通过明确的接口通信。
下面是一个简单的头文件示例:
#ifndef MY_CAR_H #define MY_CAR_H #include <Arduino.h> class MyCar { public: MyCar(int leftPin, int rightPin); void begin(); void forward(int speed); void stop(); private: int _leftPin; int _rightPin; }; #endif对应的源文件:
#include "MyCar.h" MyCar::MyCar(int leftPin, int rightPin) { _leftPin = leftPin; _rightPin = rightPin; } void MyCar::begin() { pinMode(_leftPin, OUTPUT); pinMode(_rightPin, OUTPUT); } void MyCar::forward(int speed) { analogWrite(_leftPin, speed); analogWrite(_rightPin, speed); } void MyCar::stop() { digitalWrite(_leftPin, LOW); digitalWrite(_rightPin, LOW); }这种设计把电机相关的硬件细节完全封装在MyCar类里。主循环不需要知道左轮接在哪个引脚,只需要调用car.forward(150)或者car.stop()。以后换驱动板、换引脚,只改MyCar文件,主逻辑不用动。
7.3 模块间通信:全局状态机
模块拆分后,主.ino文件的作用就变成“状态机调度”。比如:
- 红外遥控模块返回一个按键值。
- 主程序根据按键值切换模式:模式 1 手动遥控,模式 2 自动避障。
- 自动避障模式下,传感器模块把测距结果给主程序。
- 主程序决定是否调用
car.stop()。
不建议每个模块直接操作其它模块的内部变量,更稳妥的做法是让每个模块暴露简单的函数接口,由主文件把它们串起来。这样程序逻辑清楚,也方便后续加新功能。
8. Arduino CLI 批量编译与批量烧录
如果已经有 Arduino CLI,可以先通过arduino-cli board listall确认 UNO Q 的 FQBN。然后就可以写脚本批量编译多个工程。下面是一段通用 bash 脚本示例:
#!/bin/bash # 批量编译 sketches 目录下所有工程 # 注意:FQBN 需要先用 arduino-cli board listall 确认实际名称 FQBN="arduino:renesas:unoq" for sketch in ./sketches/*/; do echo "Compiling $sketch" arduino-cli compile --fqbn "$FQBN" "$sketch" done编译通过后,如果有多块 UNO Q,可以写循环按端口批量上传:
#!/bin/bash # 批量上传示例,port 列表需要按实际设备修改 FQBN="arduino:renesas:unoq" for port in /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2; do echo "Uploading to $port" arduino-cli upload -p "$port" --fqbn "$FQBN" ./sketches/smart_car done在 Windows 下端口名可能是COM3、COM4,需要相应修改。批量烧录前一定要确认每个端口对应哪块板子,避免程序烧到错误设备上。另外,教室或实验室批量维护时,建议先把所有板子刷入一个带版本号和自检功能的程序,方便快速识别异常板卡。
9. 资源占用、性能观察与降载技巧
9.1 看编译输出判断资源占用
每次编译完成后,IDE 或 CLI 会输出程序存储空间和全局变量占用。比如:
Sketch uses 12345 bytes (4%) of program storage space. Global variables use 678 bytes (1%) of dynamic memory.百分比是相对于板卡总 Flash 和 RAM 而言的。UNO Q 的基数和 R3 不同,所以同样的程序在 R3 上可能占 60% Flash,在 UNO Q 上只占不到 10%。如果看到全局变量占用超过 80%,说明程序里可能有大量不该常驻内存的数组或字符串。
9.2 减少 Flash 和 RAM 占用的实用方法
- 串口调试输出只在开发阶段保留,正式版删掉或加开关。
- 字符串常量放进 Flash,用
F("text")宏包裹。 - 尽量不用
String做频繁拼接,改用char数组和snprintf。 - 大型
const数组用PROGMEM存储。 - 不要一次性把所有传感器库都 include 进来,按模块裁剪。
- 使用 IRremote 这类库时,只编译需要的协议。
在 R3 上,这些技巧是“必须”;在 UNO Q 上,这些技巧是“优化”。同样的心态可以保留,但不需要像以前那样每字节都省。
9.3 I/O 电流、供电与稳定性
UNO Q 的性能提升并不代表它可以输出大电流。驱动舵机、电机、电磁锁之类设备时,必须外接电源。开发板的 3.3V 输出引脚适合给传感器模块和逻辑电路供电,不适合给电机供电。如果多个设备同时工作导致系统频繁重启,基本可以判断是电源问题,而不是代码问题。
观察性能时,除了看编译资源占用,还可以在代码里用millis()或micros()测量关键函数的执行时间,通过串口输出数据。这样能判断到底是传感器慢、屏幕刷新慢,还是控制逻辑本身耗时。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 电脑识别不到 UNO Q | USB 线只支持充电、驱动未安装、端口被占用 | 换一根数据线,检查设备管理器端口 | 换线、重装驱动、重启 IDE |
| 开发板管理器搜索不到 UNO Q | IDE 版本过旧、板级包索引未更新 | 检查 IDE 版本,更新索引 | 使用最新 IDE 2.x 或 Arduino Cloud Editor |
| 上传失败 | 端口被串口监视器占用、板卡未进入上传模式 | 关闭串口监视器后重试 | 先关闭监视器再上传 |
| 程序编译报错,提示板卡不支持 | 开发板选择错误、板级包未装 | 确认“工具 -> 开发板”选择正确 | 安装 UNO Q 板级包并重新选择 |
| 舵机不转或乱抖 | 供电不足、信号线接错、PWM 引脚不支持 | 检查电源和信号线 | 外接 5V 电源并共地 |
| 5V 传感器读数异常 | 逻辑电平不匹配 | 查看传感器逻辑阈值 | 加逻辑电平转换器 |
| IRremote 编译失败 | 库版本过旧,未支持 RA4M1 | 查看库文档和更新日志 | 更新 IRremote 到最新版本 |
| 屏幕花屏或白屏 | SPI 接线不稳定、供电不足、参数错误 | 检查接线和模块供电 | 缩短杜邦线,检查背光供电 |
| 程序能编译但板子无反应 | 电源供电功率不足、启动阶段卡死 | 观察板载电源指示灯 | 检查供电电流,改用独立电源 |
| 批量烧录时某块板失败 | 端口号不对、板卡未复位 | 查看 CLI 上传日志 | 确认端口映射后重试 |
遇到问题最忌讳的是直接从网上复制一堆不确定的配置。建议始终回到最小实验:先 Blink 确认环境没问题,再逐个接入外设。这样可以快速定位是环境、硬件还是代码的问题。
11. 最佳实践与使用建议
第一次接触 UNO Q,建议先保持“最小可运行”原则。不要一开始就搭完整小车,而是分阶段验证:
- 先跑通 Blink。
- 再测试串口输出。
- 然后单独测试舵机。
- 再测试屏幕。
- 最后才组合成完整项目。
工程文件管理方面,建议每个项目用独立文件夹,内部结构统一划分:
smart_car/ smart_car.ino MyCar.h MyCar.cpp SensorManager.h SensorManager.cpp RemoteControl.h RemoteControl.cpp README.md模型文件、文档、接线图放在docs/目录,调试记录放在logs/目录。这样做的好处是,过几周再打开项目时,还能快速理解接线和代码结构。
如果项目要发布到 GitHub,记得在 README 里写清楚硬件引脚定义,否则别人拿到代码根本不知道线接在哪。另外,涉及远程控制、传感器数据采集时,要特别注意隐私和授权问题。使用摄像头或麦克风模块进行图像、声音采集时,不要未经许可对他人进行人脸识别、声音采样或位置追踪,测试数据只在自己可控设备上处理,不要随意上传到公有云。
12. 总结与下一步
UNO Q 最值得尝试的点,是它用低学习成本换来了明显提升的性能。对新手,它比 UNO R3 更适合作为第一块学习板;对老手,它能把以前“跑不动”的实验重新跑起来,比如大屏 UI、复杂传感器融合、多舵机控制。
拿到板子后,第一件要做的事就是安装板级包、烧录 Blink,然后接一个舵机测试 PWM。最容易踩的坑是逻辑电平和老驱动库兼容性,一定要先确认引脚定义和电平要求。
下一步的扩展方向,可以考虑给 UNO Q 外挂一个 ESP32 协处理器,用串口通信实现本地计算和无线连接分工;或者关注官方是否提供 micro-ROS 支持,逐步往机器人操作系统方向过渡。如果只是做日常桌面小项目,UNO Q 目前已经足够稳定,建议直接动手开始第一个实验,把基础流程跑通后,再逐步加模块。