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...