Saltar al contenido principal

Seeed Studio XIAO nRF54LM20A Sense con Arduino

Esta sección te guía a través de la preparación de hardware y software necesaria para el desarrollo con Arduino. Siguiendo los pasos a continuación, configurarás tu entorno de desarrollo, ajustarás el IDE de Arduino y prepararás tu placa XIAO para la programación. Una vez completada la configuración, podrás compilar, cargar y probar rápidamente los ejemplos de sketches proporcionados.

Introducción

Preparación de hardware

Necesitas preparar lo siguiente:

Seeed Studio XIAO nRF54LM20A Sense

Software

La XIAO nRF54LM20A es compatible con el desarrollo mediante el IDE de Arduino. Antes de comenzar, instala y configura el IDE de Arduino.

tip

Si es la primera vez que usas Arduino, te recomendamos encarecidamente que consultes Getting Started with Arduino.

  • Paso 1. Descarga e instala la versión estable del IDE de Arduino según tu sistema operativo.


  • Paso 2. Inicia la aplicación de Arduino.

  • Paso 3. Abre Arduino IDE > Settings, busca Additional Boards Manager URLs y añade la siguiente URL:

https://raw.githubusercontent.com/lolren/nrf54-arduino-core/main/package_nrf54l15clean_index.json
  • Paso 4. Ve a Tools > Board > Boards Manager, busca nRF54L15 Boards e instálalo.
  • Paso 5. Después de conectar la placa, selecciona la siguiente placa en el IDE de Arduino:

Tools > Board > nRF54L15 Boards > XIAO nRF54LM20A

Cargar programa

El siguiente ejemplo utiliza un sencillo programa de parpadeo.

Paso 1. Selecciona el código de ejemplo Blink para realizar la prueba.

Paso 2. Haz clic en Upload para compilar y cargar el sketch.


Demostración del efecto:

Después de cargar el programa y pulsar el botón de reinicio, el indicador L parpadeará a intervalos de 1 segundo.

Digital

Los pines digitales se utilizan comúnmente para controlar sensores y actuadores externos cambiando entre niveles lógicos alto y bajo. Esta sección utiliza un Grove Button y un Grove Buzzer con la Grove Base for XIAO para demostrar la entrada y salida digital básica en la XIAO nRF54LM20A.

Preparación de hardware

Seeed Studio XIAO nRF54LM20A SenseSeeed Studio Grove Base for XIAO Grove - Piezo BuzzerGrove - Button

Preparación de software

Según el pinout de la XIAO nRF54LM20A, D0 / P1.00 se puede usar para el Grove Button y D1 / P1.31 se puede usar para el Grove Buzzer.

tip

Crea un nuevo sketch de Arduino y carga el siguiente código.

#define BUTTON_PIN 0
#define BUZZER_PIN 1

int last_val = LOW;

void setup() {
Serial.begin(115200);
while (!Serial) {
delay(10);
}

Serial.println("=== Grove Button + Buzzer (Digital Mode) ===");

pinMode(BUTTON_PIN, INPUT);

pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);

Serial.println("Button: D0 (input)");
Serial.println("Buzzer: D1 (output)");
Serial.println("Press the button to turn on the buzzer...");
}

void loop() {
int val = digitalRead(BUTTON_PIN);

digitalWrite(BUZZER_PIN, val);

if (val != last_val) {
Serial.print("Button ");
Serial.print(val ? "PRESSED " : "released");
Serial.print(" -> Buzzer ");
Serial.println(val ? "ON" : "OFF");

last_val = val;
}

delay(10);
}

Resultado

Después de cargar el sketch, pulsa el botón. El zumbador emitirá un pitido y el Monitor Serie mostrará el estado del botón y del zumbador.

tip

Configura la velocidad en baudios del Monitor Serie a 115200.

PWM

PWM genera una forma de onda digital temporizada a una frecuencia fija y cambia el ciclo de trabajo para aproximar una señal de control analógica. Se utiliza comúnmente para el control de ángulo de servos, ajuste de brillo de LED, control de velocidad de motores y otras aplicaciones que necesitan un control de salida suave.

Preparación de hardware

Seeed Studio XIAO nRF54LM20A SenseSeeed Studio Grove Base for XIAO Grove - Servo

Preparación de software

Según el pinout del XIAO nRF54LM20A, D0 / P1.00 se puede utilizar como pin de control PWM para el Grove Servo.

tip

Crea un nuevo sketch de Arduino para implementar el control del servo por PWM y configurar parámetros como el período PWM.

#include <Arduino.h>

#define SERVO_PIN PIN_D0

#define SERVO_FREQ_HZ 50
#define SERVO_PERIOD_US 20000
#define SERVO_MIN_US 500
#define SERVO_MAX_US 2500

#define STEP_FWD_MS 30
#define STEP_RET_MS 30

#define PWM_RESOLUTION 16
#define PWM_MAX_VALUE 65535UL

static void set_angle(int degrees)
{
if (degrees < 0) degrees = 0;
if (degrees > 180) degrees = 180;

uint32_t pulse_us = SERVO_MIN_US +
(uint32_t)((uint64_t)degrees *
(SERVO_MAX_US - SERVO_MIN_US) / 180UL);

uint32_t duty = (uint32_t)((uint64_t)pulse_us *
PWM_MAX_VALUE / SERVO_PERIOD_US);

analogWrite(SERVO_PIN, duty);
}

void setup()
{
Serial.begin(115200);
delay(1000);

Serial.println("=== boot ===");
Serial.println("Servo control started on P1.0 / PIN_D0");

pinMode(SERVO_PIN, OUTPUT);

analogWriteResolution(PWM_RESOLUTION);
analogWritePinFrequency(SERVO_PIN, SERVO_FREQ_HZ);

set_angle(0);
delay(500);
}

void loop()
{
for (int a = 0; a <= 180; a++) {
set_angle(a);

Serial.print("Angle: ");
Serial.print(a);
Serial.println(" deg");

delay(STEP_FWD_MS);
}

for (int a = 180; a >= 0; a--) {
set_angle(a);

Serial.print("Angle: ");
Serial.print(a);
Serial.println(" deg");

delay(STEP_RET_MS);
}
}

Resultado

Después de cargar el sketch, el servo gira de 0° a 180° a unos 33 grados por segundo y luego vuelve a girar a 0°.

Mientras tanto, el ángulo actual del servo se imprimirá a través del puerto serie USB.

Analógico

La entrada analógica se basa en un convertidor analógico-digital (ADC), que convierte un voltaje continuo de un sensor externo en un valor digital. El valor ADC bruto puede luego asignarse a mediciones prácticas como humedad del suelo, voltaje de la batería o temperatura.

Preparación de hardware

Seeed Studio XIAO nRF54LM20A SenseSeeed Studio Grove Base para XIAO Grove - Sensor Capacitivo de Humedad del Suelo

Preparación de software

Según el pinout del XIAO nRF54LM20A, A0 / P1.00 se puede utilizar como pin de entrada analógica.

tip

Crea un nuevo sketch de Arduino, lee el valor analógico desde A0 / P1.00 e imprime el valor ADC bruto a través de USB serie cada 500 ms.

#include <Arduino.h>

#define ADC_PIN A0

void setup()
{
Serial.begin(115200);
delay(1000);

Serial.println("ADC demo - XIAO nRF54LM20A Arduino");
Serial.println("Reading analog input on P1.00 / AIN0 / A0");

analogReadResolution(12);
}

void loop()
{
int raw = analogRead(ADC_PIN);

Serial.print("ADC raw: ");
Serial.println(raw);

delay(500);
}

Resultado

Después de flashear el programa, inserta el Grove-Capacitive Soil Moisture Sensor en plantas en maceta domésticas.


Abre el asistente de puerto serie en tu ordenador y observa los valores de salida.


tip

Tabla de lectura de referencia de voltaje

EstadoVoltaje de salida del sensorValor ADC bruto esperado
En el aire (seco)~2.0–2.4V~3400–4095
En suelo húmedo~1.3–1.8V~2200–3000
Totalmente sumergido en agua~0.8–1.2V~1365–2048
precaución

Debido a las diferencias individuales de los componentes, las mediciones de diferentes módulos en el mismo entorno pueden variar.

UART

El receptor/transmisor asíncrono universal (UART) es un protocolo serie asíncrono estándar. No requiere un reloj compartido; ambos dispositivos se comunican utilizando la misma velocidad en baudios configurada. Con TX y RX conectados en cruz y GND compartida, UART proporciona un enlace full-dúplex sencillo para registros de consola, depuración de módulos y comunicación punto a punto de bajo ancho de banda.

Preparación de hardware

Seeed Studio XIAO nRF54LM20A SenseConvertidor USB a TTL

Preparación de software

Según el pinout del XIAO nRF54LM20A, D6 / P1.08 y D7 / P1.09 se pueden utilizar como pines TX y RX para comunicación UART externa.

tip

Crea un nuevo sketch de Arduino. El ejemplo envía un mensaje de inicio a través del UART externo, hace eco de los caracteres recibidos e imprime periódicamente un mensaje de latido.

Sketch de Arduino
#include <Arduino.h>

#define RX_BUF_SIZE 128
#define TX_BUF_SIZE 256
#define HEARTBEAT_INTERVAL_MS 5000

static char rx_buf[RX_BUF_SIZE];
static size_t rx_buf_pos = 0;
static char tx_buf[TX_BUF_SIZE];

static uint32_t heartbeat_count = 0;
static unsigned long last_heartbeat = 0;

static void uart_send_string(const char *str)
{
Serial1.print(str);
}

static void handle_complete_line()
{
rx_buf[rx_buf_pos] = '\0';

if (rx_buf_pos > 0) {
Serial.print("Received: ");
Serial.println(rx_buf);

uart_send_string("\r\nYou sent: ");
uart_send_string(rx_buf);
}

uart_send_string("\r\n");
rx_buf_pos = 0;
memset(rx_buf, 0, sizeof(rx_buf));
}

static void process_rx_byte(char c)
{
static bool last_was_cr = false;

if (c == '\r' || c == '\n') {
if (c == '\n' && last_was_cr) {
last_was_cr = false;
return;
}

uart_send_string("\r\n");
handle_complete_line();
last_was_cr = (c == '\r');
return;
}

last_was_cr = false;

Serial1.write(c);

if (rx_buf_pos < RX_BUF_SIZE - 1) {
rx_buf[rx_buf_pos++] = c;
return;
}

uart_send_string("\r\n[Warning] Input too long, buffer cleared.\r\n");
rx_buf_pos = 0;
memset(rx_buf, 0, sizeof(rx_buf));
}

void setup()
{
Serial.begin(115200);
delay(1000);

Serial.println("========================================");
Serial.println(" UART demo for XIAO nRF54LM20A");
Serial.println("========================================");

Serial1.begin(115200);

uart_send_string("\r\n");
uart_send_string("========================================\r\n");
uart_send_string(" UART demo for XIAO nRF54LM20A\r\n");
uart_send_string("========================================\r\n");
uart_send_string("\r\n");
uart_send_string("Pin Configuration:\r\n");
uart_send_string(" TX: P1.08 / D6\r\n");
uart_send_string(" RX: P1.09 / D7\r\n");
uart_send_string(" Baud Rate: 115200\r\n");
uart_send_string("\r\n");
uart_send_string("Type something and press Enter to see it echoed.\r\n");
uart_send_string("\r\n");

Serial.println("UART demo started. Waiting for data...");
Serial.println("Connect USB-TTL RX to D6/TX, TX to D7/RX, and GND to GND.");

last_heartbeat = millis();
}

void loop()
{
while (Serial1.available() > 0) {
char c = (char)Serial1.read();
process_rx_byte(c);
}

unsigned long now = millis();
if (now - last_heartbeat >= HEARTBEAT_INTERVAL_MS) {
last_heartbeat = now;
heartbeat_count++;

snprintf(tx_buf, sizeof(tx_buf),
"\r\n[Heartbeat #%lu] UART running...\r\n",
(unsigned long)heartbeat_count);

uart_send_string(tx_buf);

Serial.print("Heartbeat #");
Serial.print(heartbeat_count);
Serial.println(" sent");
}

delay(10);
}

Resultado

  1. Cablea según el orden de la tabla
XIAO nRF54LM20ACH340
VBUS5V
GNDGND
P1.08 - TXRX
P1.09 - RXTX
  1. Abre el software de monitorización de puerto serie en tu ordenador. El UART externo imprimirá la información de los pines configurados al inicio. De forma predeterminada, la cadena [Heartbeat #number] UART running... se imprimirá periódicamente. Si escribes caracteres en la herramienta de serie externa y pulsas Enter, la placa hará eco de la línea recibida.

I2C

I2C es un protocolo de comunicación síncrono y half-dúplex que utiliza dos líneas: SDA para datos y SCL para reloj. Varios dispositivos pueden compartir el mismo bus mediante direccionamiento, lo que hace que I2C sea una opción común para sensores, IMU, módulos de temperatura y humedad, y pequeñas pantallas OLED.

Preparación de hardware

Seeed Studio XIAO nRF54LM20A SensePlaca base de expansión Seeed Studio para XIAO

Preparación de software

Según el pinout del XIAO nRF54LM20A, D4 / P1.03 y D5 / P1.07 se pueden configurar como pines SDA y SCL de I2C.

tip
  1. Instala las siguientes bibliotecas desde Arduino IDE > Tools > Manage Libraries...:
  • Adafruit SSD1306
  • Adafruit GFX Library
  • Adafruit BusIO
  1. Crea un nuevo sketch de Arduino para inicializar el OLED y mostrar texto.
Arduino sketch
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_W 128
#define OLED_H 64
#define OLED_ADDR 0x3C
#define OLED_RESET -1

#define OLED_SDA PIN_D4
#define OLED_SCL PIN_D5

Adafruit_SSD1306 display(OLED_W, OLED_H, &Wire, OLED_RESET);

void setup() {
Serial.begin(115200);
delay(1000);

Serial.println("SSD1306 OLED test with pull-ups");

Wire.setPins(OLED_SDA, OLED_SCL);
Wire.begin();
Wire.setClock(100000);

pinMode(OLED_SDA, INPUT_PULLUP);
pinMode(OLED_SCL, INPUT_PULLUP);
delay(20);

Serial.print("SDA idle = ");
Serial.println(digitalRead(OLED_SDA));
Serial.print("SCL idle = ");
Serial.println(digitalRead(OLED_SCL));

if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR, true, false)) {
Serial.println("SSD1306 init failed");
while (1) {
delay(1000);
}
}

Serial.println("SSD1306 init OK");

display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);

display.setCursor(28, 20);
display.println("Hello XIAO");

display.setCursor(24, 36);
display.println("nRF54LM20A");

display.display();
}

void loop() {
}

Resultado

Después de que el programa se ejecute, el texto Hello XIAO nRF54LM20A se mostrará en el OLED y el estado de inicialización se imprimirá a través del puerto serie USB.

SPI

SPI es un protocolo de comunicación síncrono, full-dúplex y de alta velocidad. Utiliza una línea SCLK dedicada para la temporización, líneas MOSI y MISO para los datos, y una línea CS/SS para seleccionar el dispositivo objetivo. Debido a que SPI puede proporcionar un alto rendimiento con hardware sencillo, se utiliza ampliamente para almacenamiento flash, tarjetas SD, pantallas de alta frecuencia de actualización y sensores de alta velocidad.

Preparación de hardware

Seeed Studio XIAO nRF54LM20A SensePantalla redonda para Seeed Studio XIAO

Preparación de software

tip
  1. Instala las siguientes bibliotecas desde Arduino IDE > Tools > Manage Libraries...:
  • Adafruit GC9A01A
  • Adafruit GFX Library
  • Adafruit BusIO
  1. Crea un nuevo sketch de Arduino y escribe la lógica de relleno de pantalla de color sólido.
Arduino sketch
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GC9A01A.h>

#define TFT_CS PIN_D1
#define TFT_DC PIN_D3
#define TFT_MOSI PIN_D10
#define TFT_SCLK PIN_D8
#define TFT_RST -1
#define TFT_BL PIN_D6

#define LCD_W 240
#define LCD_H 240

#define COLOR_BLACK 0x0000U
#define COLOR_WHITE 0xFFFFU
#define COLOR_RED 0xF800U
#define COLOR_GREEN 0x07E0U
#define COLOR_BLUE 0x001FU
#define COLOR_YELLOW 0xFFE0U
#define COLOR_CYAN 0x07FFU
#define COLOR_MAGENTA 0xF81FU
#define COLOR_ORANGE 0xFD20U

Adafruit_GC9A01A tft(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

static void fill_screen(uint16_t color)
{
tft.fillScreen(color);
}

static void demo_solid_colors()
{
static const uint16_t colors[] = {
COLOR_RED, COLOR_ORANGE, COLOR_YELLOW,
COLOR_GREEN, COLOR_CYAN, COLOR_BLUE, COLOR_MAGENTA,
};

static const char *names[] = {
"RED", "ORANGE", "YELLOW", "GREEN", "CYAN", "BLUE", "MAGENTA",
};

for (int i = 0; i < 7; i++) {
Serial.print("Solid: ");
Serial.println(names[i]);

fill_screen(colors[i]);
delay(600);
}
}

static void demo_color_bars()
{
static const uint16_t bar_colors[] = {
COLOR_RED, COLOR_ORANGE, COLOR_YELLOW,
COLOR_GREEN, COLOR_BLUE, COLOR_MAGENTA,
};

const int BAR_W = LCD_W / 6;

for (int i = 0; i < 6; i++) {
tft.fillRect(i * BAR_W, 0, BAR_W, LCD_H, bar_colors[i]);
}

Serial.println("Color bars");
delay(2000);
}

void setup()
{
Serial.begin(115200);
delay(1000);

Serial.println("GC9A01 demo - XIAO nRF54LM20A Arduino");

pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH);

tft.begin();
tft.setRotation(0);
tft.fillScreen(COLOR_BLACK);

Serial.println("Display ready, starting demo loop");
}

void loop()
{
demo_solid_colors();
demo_color_bars();
}

Resultado

Después de subir el sketch, el programa refresca la pantalla en la secuencia de rojo, naranja, amarillo, verde, cian, azul y magenta, y luego muestra patrones de franjas de colores.

La salida del Serial Monitor se muestra a continuación:

Agradecimientos especiales

Agradecimientos especiales a lolren por contribuir con la adaptación de Arduino para XIAO nRF54LM20A. El código y el README son claros y útiles. Si deseas obtener más información sobre el uso de XIAO nRF54LM20A con Arduino, consulta los enlaces de GitHub que aparecen a continuación.

Soporte técnico y debate sobre el producto

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.

Loading Comments...