Skip to main content

适用于 Seeed Studio XIAO nRF54L15 的 Arduino

本文基于 XIAO nRF54L15 Sense 与 Arduino 平台进行开发。

致谢

特别感谢开发者 lolren 为 nRF54L15 芯片提供 Arduino 适配支持。这使得 XIAO nRF54L15 能够在 Arduino 生态中进行开发与实际应用。同时也感谢他在相关开源生态建设中持续付出的努力与贡献。


入门指南

硬件准备

在开始之前,请准备 XIAO nRF54L15 或 XIAO nRF54L15 Sense 硬件中的任意一款。

Seeed Studio XIAO nRF54L15Seeed Studio XIAO nRF54L15 Sense

软件

tip

如果这是你第一次使用 Arduino,我们强烈建议你参考Arduino 入门指南

  • 步骤 1. 根据你的操作系统下载并安装稳定版本的 Arduino IDE。


  • 步骤 2. 添加开发板管理器 URL

    打开 File → Preferences


在 Additional Boards Manager URLs 字段中添加用于支持 XIAO nRF54L15 的 URL。

https://raw.githubusercontent.com/lolren/nrf54-arduino-core/main/package_nrf54l15clean_index.json

  • 步骤 3. 选择 XIAO nRF54L15 / Sense 和串口

  • 步骤 4. 上传程序
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(500);
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
}

结果:

数字接口

数字引脚是 MCU 用于读写高/低电平逻辑的接口,可以获取外部数据并控制外设。本节通过实现 LED 的开关控制和 PWM 呼吸灯效果来说明数字引脚的功能。

硬件准备

你需要准备 XIAO nRF54L15 Sense 和 Grove 器件。

Seeed Studio XIAO nRF54L15 SenseSeeed Studio Grove Base for XIAOGrove – Chainable RGB LED

软件

在 lolren 的仓库中,XIAO nRF54L15 的 D0 到 D10 引脚被重新定义为 PIN_D0 到 PIN_D10。

void setup() {
pinMode(PIN_D0, OUTPUT);
}

void loop() {
digitalWrite(PIN_D0, LOW);
delay(500);
digitalWrite(PIN_D0, HIGH);
delay(500);

for (int i = 0; i <= 255; i++) {
analogWrite(PIN_D0, i); // The duty cycle increases gradually.
delay(5);
}

for (int i = 255; i >= 0; i--) {
analogWrite(PIN_D0, i); // The duty cycle decreases gradually.
delay(5);
}
}

结果

将 Grove – Chainable RGB LED 连接到 Seeed Studio Grove Base for XIAO 的 0 号引脚。Grove – Chainable RGB LED 将呈现闪烁和渐亮渐暗的呼吸效果。


UART

UART 是一种异步半双工通信协议,常用于设备调试、日志输出和数据传输。XIAO nRF54L15 提供了一组 UART 引脚。本节通过串口数据打印来演示 UART 的使用方法。

硬件准备

你需要准备 XIAO nRF54L15 和 CH340 器件。

Seeed Studio XIAO nRF54L15 SenseCH340G USB to Serial (TTL) Module&Adapter

软件

在 XIAO nRF54L15 上,D6 和 D7 分别对应 TX 和 RX 引脚。在 lolren 的引脚重定义文件中,D6 和 D7 被定义为 PIN_SERIAL1_RXPIN_SERIAL1_TX。可用的串口为 Serial1Serial2

tip

如果你不熟悉 XIAO nRF54L15 的引脚分布,请点击 XIAO nRF54L15 Pin List 查看。

caution

不要将 PIN_SERIAL1_RXPIN_SERIAL1_TX 用于 Serial(USB 串口)。 这会干扰默认的下载和调试通道,并可能导致程序烧录失败(SWD/CDC 故障)。

#define RX_PIN PIN_SERIAL1_RX
#define TX_PIN PIN_SERIAL1_TX
#define BAUD 115200

void setup() {
// Set RX and TX pins
Serial1.setPins(RX_PIN, TX_PIN);

// Initialize baud rate and communication configuration
Serial1.begin(BAUD, SERIAL_8N1);
}

void loop() {
Serial1.print("Hello XIAO nRF54L15!\n");
delay(1000);
}

结果

tip

接线

XIAO nRF54L15CH340G USB 转串口 (TTL) 模块与适配器
RXTX
TXRX
GNDGND
VBUS5V

打开任意串口监视工具,将波特率设置为 115200,即可观察输出数据。


模拟量

模拟引脚用于通过 ADC 读取连续的电压信号。它们可以连接到各种传感器,例如电位器、光敏电阻、用于温度检测的热敏电阻、模拟灰度传感器和红外传感器。本节通过读取电位器旋钮的调节值来演示模拟引脚的功能。

硬件准备

你需要准备 XIAO nRF54L15 Sense 和 Grove 设备。

Seeed Studio XIAO nRF54L15 SenseGrove-旋转角度传感器Seeed Studio Grove Base for XIAO

软件

在 XIAO nRF54L15 上有四组模拟引脚,即 A0 到 A3。在 lolren 提供的引脚重定义中,这些引脚被定义为 PIN_A0 到 PIN_A3。

tip

如果你不熟悉 XIAO nRF54L15 的引脚分布,请点击 XIAO nRF54L15 Pin List 查看。

const int analogPin = PIN_A0;

void setup() {
Serial.begin(115200);
analogReadResolution(12);
}

void loop() {
int analogValue = analogRead(analogPin);

// Assume reference voltage is 3.3V
int voltage_mv = analogValue * 3300 / 4095;

Serial.printf("ADC value = %d\n", analogValue);
Serial.printf("Voltage = %d mV\n", voltage_mv);

delay(1000);
}

结果

将 Grove-旋转角度传感器连接到 Seeed Studio Grove Base for XIAO。


旋转旋钮,Arduino 串口监视器会打印 ADC 读数值和换算后的模拟电压。


I2C

I2C 是一种同步串行通信协议,它通过 SCL 时钟线和 SDA 数据线实现主从设备之间的多设备通信。XIAO nRF54L15 / Sense 提供了两组 I2C 接口。本节通过控制 Expansion Board Base for XIAO 上的 OLED 显示屏来演示 I2C 的功能。

硬件准备

你需要准备 XIAO nRF54L15 Sense 和带有 I2C 接口的设备。

Seeed Studio XIAO nRF54L15 SenseSeeed Studio Expansion Board Base for XIAO

软件

在 XIAO nRF54L15 上,D4 和 D5 分别作为 SCL 和 SDA 引脚。 在 lolren 框架中,引脚 D4 被重定义为 PIN_WIRE_SCL,引脚 D5 被重定义为 PIN_WIRE_SDA

tip

如果你不熟悉 XIAO nRF54L15 的引脚分布,请点击 XIAO nRF54L15 Pin List 查看。

#include <U8x8lib.h>
#include <Wire.h>

#define SCL PIN_WIRE_SCL
#define SDA PIN_WIRE_SDA

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // OLEDs without Reset of the Display

void setup(void) {
u8x8.begin();
u8x8.setFlipMode(0);
}

void loop(void) {
u8x8.setFont(u8x8_font_chroma48medium8_r);

u8x8.setCursor(2, 10);
u8x8.print("Hello World!");
u8x8.setCursor(1, 28);
u8x8.print("XIAO nRF54L15!");
}

结果

上传程序后,Expansion Board Base for XIAO 上会显示 “Hello World!” 和 “XIAO nRF54L15!” 这两行文字。


SPI

SPI 是一种同步串行、全双工通信协议。它通常使用四根线——SCK 时钟、MOSI、MISO 和 CS——在主从设备之间实现高速数据传输。与 I2C 相比,SPI 具有更高的传输速率、更低的延迟以及更简单直观的通信方式。但它需要更多的引脚,每个从设备通常占用一条独立的片选线。它常用于连接 Flash 存储器、SD 卡、LCD/OLED 显示屏、ADC/DAC 模块和高速传感器等高速外设。本节通过连接一块电子纸显示屏来演示 SPI 的用法。

硬件准备

你需要准备一块 XIAO nRF54L15 和一款支持 SPI 通信的设备。

Seeed Studio XIAO nRF54L15 SenseePaper Driver Board for Seeed Studio XIAO2.9" Monochrome eInk

软件

  • 安装 GxEPD2 库

根据 Lolren 的引脚重定义文件,修改并宏定义 SPI 引脚。

#include <Arduino.h>
#include <SPI.h>
#include <GxEPD2_BW.h>
#include <Fonts/FreeMonoBold9pt7b.h>
#include <Fonts/FreeMonoBold12pt7b.h>

// -------- Pin Definitions (from pins_arduino.h) --------
// PIN_D0=RST, PIN_D1=CS, PIN_D3=DC, PIN_D5=BUSY
// SPI: SCK=PIN_D8, MISO=PIN_D9, MOSI=PIN_D10 (macros are already defined)
#define EPD_RST PIN_D0 // 0
#define EPD_CS PIN_D1 // 1
#define EPD_DC PIN_D3 // 3
#define EPD_BUSY PIN_D2 // 5

// -------- 029BN-T94-D2 Driver --------
GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(
GxEPD2_290_T94_V2(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY)
);

const char* LINE1 = "Hello XIAO nRF54L15";

void setup() {
Serial.begin(115200);
delay(2000);
Serial.println("=== EPaper Start ===");

// Close serial port to avoid TX(D1) interfering with CS(D1)
delay(100);
Serial.end();

// Directly specify using macros, fully consistent with pins_arduino.h
SPI.setPins(PIN_SPI_SCK, PIN_SPI_MISO, PIN_SPI_MOSI, -1);
SPI.begin();

// Pass 0 to disable GxEPD2 internal serial debug output
display.init(0);
display.setRotation(1); // Landscape 296×128
display.setTextColor(GxEPD_BLACK);
display.setFullWindow();

display.firstPage();
do {
display.fillScreen(GxEPD_WHITE);

// ---- LINE1: Large font, upper half ----
display.setFont(&FreeMonoBold12pt7b);
int16_t tbx, tby;
uint16_t tbw, tbh;
display.getTextBounds(LINE1, 0, 0, &tbx, &tby, &tbw, &tbh);
uint16_t x1 = (display.width() - tbw) / 2 - tbx;
uint16_t y1 = display.height() / 2 - 4;
display.setCursor(x1, y1);
display.print(LINE1);

} while (display.nextPage());

display.hibernate();

// Reopen serial port for confirmation after screen refresh
Serial.begin(115200);
delay(100);
Serial.println("=== Done ===");
}

void loop() {
delay(1000000);
}

结果

上传程序后,Hello XIAO nRF54L15 将显示在电子纸屏幕上。

常见问题

  • Q1:上传程序时,提示没有 py 的路径。

  • A:C:\Users\yourname\AppData\Local\Arduino15\packages\nrf54l15clean\hardware\nrf54l15clean\0.6.27\platform.txt。

    • tools.python3.cmd.windows=py 修改为 tools.python3.cmd.windows=python
    • tools.python3.args.windows=-3 修改为 tools.python3.args.windows=

技术支持与产品讨论

感谢您选择我们的产品!我们将为您提供多种支持,以确保您在使用我们产品的过程中尽可能顺利。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...