Pular para o conteúdo principal

Seeed Studio XIAO nRF54LM20A Sense com Arduino

Esta seção orienta você pela preparação de hardware e software necessária para o desenvolvimento com Arduino. Seguindo as etapas abaixo, você configurará seu ambiente de desenvolvimento, ajustará a IDE Arduino e preparará sua placa XIAO para programação. Quando a configuração estiver concluída, você poderá compilar, enviar e testar rapidamente os sketches de exemplo fornecidos.

Introdução

Preparação de hardware

Você precisa preparar o seguinte:

Seeed Studio XIAO nRF54LM20A Sense

Software

O XIAO nRF54LM20A oferece suporte ao desenvolvimento com a IDE Arduino. Antes de começar, instale e configure a IDE Arduino.

dica

Se esta é a sua primeira vez usando Arduino, recomendamos fortemente que consulte Introdução ao Arduino.

  • Passo 1. Baixe e instale a versão estável da IDE Arduino de acordo com o seu sistema operacional.


  • Passo 2. Inicie o aplicativo Arduino.

  • Passo 3. Abra Arduino IDE > Settings, encontre Additional Boards Manager URLs e adicione a seguinte URL:

https://raw.githubusercontent.com/lolren/nrf54-arduino-core/main/package_nrf54l15clean_index.json
  • Passo 4. Vá em Tools > Board > Boards Manager, procure por nRF54L15 Boards e instale.
  • Passo 5. Após conectar a placa, selecione a seguinte placa na IDE Arduino:

Tools > Board > nRF54L15 Boards > XIAO nRF54LM20A

Enviar programa

O exemplo a seguir usa um programa simples de piscar LED.

Passo 1. Selecione o código de exemplo Blink para teste.

Passo 2. Clique em Upload para compilar e enviar o sketch.


Demonstração do efeito:

Depois de enviar o programa e pressionar o botão de reset, o indicador L piscará em intervalos de 1 segundo.

Digital

Pinos digitais são comumente usados para controlar sensores e atuadores externos alternando entre níveis lógicos alto e baixo. Esta seção usa um Grove Button e um Grove Buzzer com o Grove Base for XIAO para demonstrar a entrada e saída digital básicas no XIAO nRF54LM20A.

Preparação de hardware

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

Preparação de software

De acordo com o pinout do XIAO nRF54LM20A, D0 / P1.00 pode ser usado para o Grove Button e D1 / P1.31 pode ser usado para o Grove Buzzer.

dica

Crie um novo sketch Arduino e envie o código a seguir.

#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

Depois de enviar o sketch, pressione o botão. O buzzer irá apitar e o Serial Monitor exibirá o status do botão e do buzzer.

dica

Defina a taxa de baud do Serial Monitor para 115200.

PWM

PWM gera uma forma de onda digital temporizada em uma frequência fixa e altera o ciclo de trabalho para aproximar um sinal de controle analógico. É comumente usado para controle de ângulo de servo, ajuste de brilho de LED, controle de velocidade de motor e outras aplicações que precisam de controle de saída suave.

Preparação de hardware

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

Preparação de software

De acordo com o pinout do XIAO nRF54LM20A, D0 / P1.00 pode ser usado como pino de controle PWM para o Grove Servo.

dica

Crie um novo sketch Arduino para implementar o controle de servo por PWM e configurar parâmetros como o período do 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

Após o upload do sketch, o servo gira de 0° a 180° a cerca de 33 graus por segundo e depois gira de volta para 0°.

Enquanto isso, o ângulo atual do servo será impresso via porta serial USB.

Analógico

A entrada analógica é baseada em um conversor analógico-digital (ADC), que converte uma tensão contínua de um sensor externo em um valor digital. O valor bruto do ADC pode então ser mapeado para medições práticas, como umidade do solo, tensão da bateria ou temperatura.

Preparação de hardware

Seeed Studio XIAO nRF54LM20A SenseSeeed Studio Grove Base for XIAO Grove - Capacitive Soil Moisture Sensor

Preparação de software

De acordo com o pinout do XIAO nRF54LM20A, A0 / P1.00 pode ser usado como um pino de entrada analógica.

dica

Crie um novo sketch Arduino, leia o valor analógico de A0 / P1.00 e imprima o valor bruto do ADC pela serial USB a 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

Após gravar o programa, insira o Grove-Capacitive Soil Moisture Sensor em plantas de vaso domésticas.


Abra o assistente de porta serial no seu computador e observe os valores de saída.


dica

Tabela de leitura de referência de tensão

StatusTensão de saída do sensorValor bruto de ADC esperado
No ar (seco)~2.0–2.4V~3400–4095
Em solo úmido~1.3–1.8V~2200–3000
Totalmente imerso em água~0.8–1.2V~1365–2048
cuidado

Devido a diferenças individuais nos componentes, medições de módulos diferentes no mesmo ambiente podem variar.

UART

O receptor/transmissor assíncrono universal (UART) é um protocolo serial assíncrono padrão. Ele não requer um clock compartilhado; ambos os dispositivos se comunicam usando a mesma taxa de baud configurada. Com TX e RX conectados de forma cruzada e GND compartilhado, o UART fornece um link full-duplex simples para logs de console, depuração de módulos e comunicação ponto a ponto de baixa largura de banda.

Preparação de hardware

Seeed Studio XIAO nRF54LM20A SenseUSB to TTL Converter

Preparação de software

De acordo com o pinout do XIAO nRF54LM20A, D6 / P1.08 e D7 / P1.09 podem ser usados como pinos TX e RX para comunicação UART externa.

dica

Crie um novo sketch Arduino. O exemplo envia uma mensagem de inicialização através do UART externo, ecoa os caracteres recebidos e imprime periodicamente uma mensagem de heartbeat.

Sketch 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. Faça a fiação de acordo com a ordem da tabela
XIAO nRF54LM20ACH340
VBUS5V
GNDGND
P1.08 - TXRX
P1.09 - RXTX
  1. Abra o software de monitoramento de porta serial no seu computador. A UART externa imprimirá as informações dos pinos configurados na inicialização. Por padrão, a string [Heartbeat #number] UART running... será impressa periodicamente. Se você digitar caracteres na ferramenta serial externa e pressionar Enter, a placa irá ecoar a linha recebida.

I2C

I2C é um protocolo de comunicação síncrono e half-duplex que utiliza duas linhas: SDA para dados e SCL para clock. Vários dispositivos podem compartilhar o mesmo barramento por meio de endereçamento, tornando o I2C uma escolha comum para sensores, IMUs, módulos de temperatura e umidade e pequenos displays OLED.

Preparação de hardware

Seeed Studio XIAO nRF54LM20A SensePlaca de expansão base Seeed Studio para XIAO

Preparação de software

De acordo com o pinout do XIAO nRF54LM20A, D4 / P1.03 e D5 / P1.07 podem ser configurados como pinos I2C SDA e SCL.

dica
  1. Instale as seguintes bibliotecas em Arduino IDE > Tools > Manage Libraries...:
  • Adafruit SSD1306
  • Adafruit GFX Library
  • Adafruit BusIO
  1. Crie um novo sketch Arduino para inicializar o OLED e exibir texto.
Sketch Arduino
#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

Após a execução do programa, o texto Hello XIAO nRF54LM20A será exibido no OLED, e o status de inicialização será impresso pela porta serial USB.

SPI

SPI é um protocolo de comunicação síncrono, full-duplex e de alta velocidade. Ele utiliza uma linha SCLK dedicada para temporização, linhas MOSI e MISO para dados e uma linha CS/SS para selecionar o dispositivo alvo. Como o SPI pode fornecer alta taxa de transferência com hardware simples, ele é amplamente utilizado para armazenamento flash, cartões SD, displays de alta taxa de atualização e sensores de alta velocidade.

Preparação de hardware

Seeed Studio XIAO nRF54LM20A SenseRound Display para Seeed Studio XIAO

Preparação de software

dica
  1. Instale as seguintes bibliotecas em Arduino IDE > Tools > Manage Libraries...:
  • Adafruit GC9A01A
  • Adafruit GFX Library
  • Adafruit BusIO
  1. Crie um novo sketch Arduino e escreva a lógica de preenchimento de tela com cor sólida.
Sketch Arduino
#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

Após enviar o sketch, o programa atualiza a tela na sequência vermelho, laranja, amarelo, verde, ciano, azul e magenta, e então exibe padrões listrados coloridos.

A saída do Serial Monitor é mostrada abaixo:

Agradecimentos especiais

Agradecimentos especiais a lolren por contribuir com a adaptação do Arduino para o XIAO nRF54LM20A. O código e o README são claros e úteis. Se você quiser saber mais sobre o uso do XIAO nRF54LM20A com Arduino, consulte os links do GitHub abaixo.

Suporte técnico e discussão sobre o produto

Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...