Multiplexación de pines con Seeed Studio XIAO MG24

El XIAO MG24 cuenta con hasta 22 pines regulares, 18 pines analógicos, 18 pines digitales, 2 SPI, 2 UART, 2 I2C y es compatible con todo PWM. Ofrece una gran variedad de pines disponibles para nuestro uso. En este wiki, te enseñaré cómo manejar estos pines, ¡permitiéndonos utilizarlos de forma eficaz 😀!
Descripción general del hardware
- XIAO MG24
- XIAO MG24 Sense
Digital
Preparación de hardware
| Seeed Studio XIAO MG24 Sense | Seeed Studio Expansion Base for XIAO with Grove OLED | Grove - Relay |
|---|---|---|
![]() | ![]() | ![]() |
Instala XIAO MG24(Sense) en la placa de expansión y conecta el relé a la interfaz A0/D0 de la placa de expansión mediante un cable Grove. Por último, conecta XIAO al ordenador mediante un cable USB-C.
Implementación de software
En este ejemplo, implementaremos el control del estado de encendido/apagado de un relé utilizando un botón conectado a la placa de expansión XIAO. Cuando se pulsa el botón, el relé se enciende y, cuando se suelta el botón, el relé se apaga.
const int buttonPin = D1; // the number of the pushbutton pin
int buttonState = 0; // variable for reading the pushbutton status
const int relayPin = D0;
void setup() {
// initialize the Relay pin as an output:
pinMode(relayPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn Relay on:
digitalWrite(relayPin, HIGH);
} else {
// turn Relay off:
digitalWrite(relayPin, LOW);
}
}
Gráfico de resultados
Si todo va bien, después de cargar el programa deberías ver el siguiente efecto.

Digital como PWM
Todos los pines GPIO en XIAO MG24(Sense) admiten salida PWM. Por lo tanto, puedes utilizar cualquier pin para generar PWM y ajustar el brillo de las luces, controlar servos y otras funciones.
Preparación de hardware
| Seeed Studio XIAO MG24 Sense | Seeed Studio Expansion Base for XIAO with Grove OLED | Grove - Variable Color LED |
|---|---|---|
![]() | ![]() | ![]() |
Instala XIAO MG24(Sense) en la placa de expansión, luego conecta el Variable Color LED a la interfaz A0/D0 de la placa de expansión utilizando un cable Grove. Por último, conecta XIAO a tu ordenador mediante un cable USB-C.
Implementación de software
En este ejemplo, mostraremos cómo utilizar la salida PWM para controlar el brillo de una luz.
int LED_pin = D0; // LED connected to digital pin 10
void setup() {
// declaring LED pin as output
pinMode(LED_pin, OUTPUT);
}
void loop() {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 3) {
// sets the value (range from 0 to 255):
analogWrite(LED_pin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
// fade out from max to min in increments of 5 points:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 3) {
// sets the value (range from 0 to 255):
analogWrite(LED_pin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}
Gráfico de resultados
Si el programa se ejecuta correctamente, verás el siguiente efecto de funcionamiento.

Analógico
La placa de desarrollo XIAO MG24(Sense) tiene un ADC de 12 bits para la lectura de alta resolución de valores de sensores analógicos, lo que nos ayuda a leer valores más precisos.
A continuación, elegiremos dos sensores para reflejar las características del ADC.
Preparación de hardware
| Seeed Studio XIAO MG24 Sense | Grove-Variable Color LED | Grove-Rotary Angle Sensor | Seeed Studio Grove Base for XIAO |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
Implementación de software
- analogRead sin DMA
- analogRead con DMA
const int analogInPin = D1; // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to
int sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)
void setup() {
Serial.begin(115200);
}
void loop() {
sensorValue = analogRead(analogInPin);
outputValue = map(sensorValue, 0, 4095, 0, 255);
analogWrite(analogOutPin, outputValue);
Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
delay(100);
}
#define ANALOG_VALUE_MIN 0 // Define the minimum analog value
#define ANALOG_VALUE_MAX 4095 // Define the maximum analog value for 12-bit ADC
#define NUM_SAMPLES 128 // Define the number of samples to collect each time
const int analogInPin = D1; // Analog input pin that the potentiometer is attached to
const int analogOutPin = LED_BUILTIN; // Analog output pin that the LED is attached to
// Buffers for storing samples
uint32_t analog_buffer[NUM_SAMPLES]; // Global buffer to store sampled values
uint32_t analog_buffer_local[NUM_SAMPLES]; // Local buffer to store sampled values for calculations
volatile bool data_ready_flag = false; // Data ready flag indicating new sample data is available
void analog_samples_ready_cb(); // Callback function called when samples are ready
void calculate_and_display_analog_level(); // Function to calculate and display the analog level
float getAverage(uint32_t *buffer, uint32_t buf_size); // Function to compute the average of the given buffer
void setup() {
Serial.begin(115200);
pinMode(analogOutPin, OUTPUT);
// Start DMA sampling, storing samples in analog_buffer, with callback on completion
analogReadDMA(analogInPin, analog_buffer, NUM_SAMPLES, analog_samples_ready_cb);
Serial.println("Sampling started...");
}
void loop() {
// If data is ready, process it
if (data_ready_flag) {
data_ready_flag = false;
calculate_and_display_analog_level();
}
}
void analog_samples_ready_cb() {
// Copy data to the local buffer in order to prevent it from overwriting
memcpy(analog_buffer_local, analog_buffer, NUM_SAMPLES * sizeof(uint32_t));
data_ready_flag = true;
}
void calculate_and_display_analog_level() {
// Rolling average for smoothing the analog level
static uint32_t rolling_average = 0u;
// Stop sampling in order to prevent overwriting the current data
ADC.scan_stop();
// Get the average of the sampled values
uint32_t analog_level = (uint32_t)getAverage(analog_buffer_local, NUM_SAMPLES);
// Adjust the analog level
analog_level = constrain(analog_level, ANALOG_VALUE_MIN, ANALOG_VALUE_MAX);
// Calculate the rolling average
rolling_average = (analog_level + rolling_average) / 2;
// Map the current average level to brightness
int brightness = map(rolling_average, ANALOG_VALUE_MIN, ANALOG_VALUE_MAX, 0, 255);
if (LED_BUILTIN_ACTIVE == LOW) {
analogWrite(analogOutPin, 255 - brightness);
} else {
analogWrite(analogOutPin, brightness);
}
// Print the average analog level and brightness output
Serial.print("sensor = ");
Serial.print(rolling_average);
Serial.print("\t output = ");
Serial.println(brightness);
// Restart sampling
analogReadDMA(analogInPin, analog_buffer, NUM_SAMPLES, analog_samples_ready_cb);
}
// Gets the average value of the provided samples
float getAverage(uint32_t *buffer, uint32_t buf_size) {
if (!buffer) {
return 0.0f;
}
float sum = 0.0f;
for (uint32_t i = 0u; i < buf_size; i++) {
sum += buffer[i];
}
return sum / buf_size;
}
Cabe señalar que si deseas usar DMA para leer señales analógicas, la versión de tu biblioteca debe ser superior a 2.2.0. Actualmente, la nueva versión no ha sido aprobada y necesitas instalarla manualmente.
Gráfico de resultados
Si todo va bien, después de cargar el programa deberías ver el siguiente efecto.

UART
Al trabajar con Arduino IDE, la comunicación Serial es una parte esencial de muchos proyectos. Para usar Serial en Arduino IDE, debes comenzar abriendo la ventana del Monitor Serial. Esto se puede hacer haciendo clic en el icono Serial Monitor en la barra de herramientas o presionando la combinación de teclas Ctrl+Shift+M.
Uso general de Serial
Algunas de las funciones Serial más utilizadas incluyen:
Serial.begin()-- que inicializa la comunicación a una velocidad en baudios especificada;Serial.print()-- que envía datos al puerto Serial en un formato legible;Serial.write()-- que envía datos binarios al puerto Serial;Serial.available()-- que comprueba si hay datos disponibles para ser leídos desde el puerto Serial;Serial.read()-- que lee un solo byte de datos desde el puerto Serial;Serial.flush()-- que espera a que se complete la transmisión de los datos seriales salientes.
Al usar estas funciones Serial, puedes enviar y recibir datos entre la placa Arduino y tu ordenador, lo que abre muchas posibilidades para crear proyectos interactivos.
Aquí hay un programa de ejemplo:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
void loop() {
// send data to the serial port
Serial.println("Hello World!");
// read data from the serial port
if (Serial.available() > 0) {
// read the incoming byte:
char incomingByte = Serial.read();
// print the incoming byte to the serial monitor:
Serial.print("I received: ");
Serial.println(incomingByte);
}
// wait for a second before repeating the loop
delay(1000);
}
Uso de Serial1
De acuerdo con los diagramas de pines anteriores de XIAO MG24(Sense) para parámetros específicos, podemos observar que hay un pin TX y un pin RX. Esto es diferente de la comunicación serial, pero el uso también es muy similar, excepto que es necesario añadir algunos parámetros. Así que a continuación utilizaremos los pines sacados por el chip para la comunicación serial.
#define BAUD 115200
void setup() {
Serial1.begin(BAUD);
}
void loop() {
if(Serial1.available() > 0)
{
char incominByte = Serial1.read();
Serial1.print("I received : ");
Serial1.println(incominByte);
}
delay(1000);
}
I2C
XIAO MG24(Sense) tiene una interfaz I2C que se puede usar para la transmisión y el análisis de datos de muchos sensores, así como para usar algunas pantallas OLED.
Preparación de hardware
| Seeed Studio XIAO MG24 Sense | Base de expansión Seeed Studio para XIAO con Grove OLED |
|---|---|
![]() | ![]() |
La pantalla OLED en la placa de expansión XIAO utiliza el protocolo I2C y está conectada a la interfaz I2C de la XIAO a través del circuito I2C de la placa. Por lo tanto, podemos conectar directamente la XIAO a la placa de expansión y programarla para mostrar contenido en la pantalla.
Implementación de software
Este ejemplo presenta cómo usar la pantalla OLED en la Base de expansión Seeed Studio para XIAO MG24(Sense).
Paso 1. Instala la Seeed Studio XIAO MG24(Sense) en la placa de expansión y luego conecta el cable Type-C.
Paso 2. Instala la biblioteca u8g2.
Paso 3. Copia el código y pégalo en el IDE de Arduino y luego súbelo.
- Descarga el archivo zip de abajo
📄 [ZIP] smiley_face Header
- Crea un archivo de cabecera llamado "smiley_face. h" y copia el contenido del archivo zip descargado en el archivo de cabecera que creaste

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include "smiley_face.h"
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
int xx = 20;
int yy = 10;
void setup() {
u8g2.begin();
}
void loop() {
smeil_display();
delay(500);
}
void smeil_display() {
const unsigned char* smileImages[] = {
semil1, semil2, semil3, semil4, semil5,
semil6, semil7, semil8, semil9, semil10,
semil11, semil12, semil13, semil14, semil15,
semil16, semil17, semil18, semil19, semil20,
semil21, semil22, semil23, semil24, semil25,
semil26, semil27
};
int delays[] = {
40, 50, 40, 40, 40,
40, 40, 50, 40, 40,
40, 40, 40, 50, 40,
40, 50, 40, 40, 50,
40, 50, 40, 40, 50,
50, 50, 40, 50
};
for (int i = 0; i < sizeof(smileImages) / sizeof(smileImages[0]); i++) {
u8g2.firstPage();
do {
u8g2.drawXBMP(xx, yy, 48, 48, smileImages[i]);
} while (u8g2.nextPage());
delay(delays[i]);
}
}
Gráfico de resultado

SPI
El chip XIAO MG24(Sense) integra múltiples periféricos, incluyendo una interfaz SPI que se puede utilizar para conectar dispositivos SPI externos como memorias flash, pantallas, sensores y más.
Descripción general de la biblioteca de Arduino
Basándonos en el programa de ejemplo de Arduino proporcionado por Waveshare, hemos escrito una biblioteca de Arduino para su uso con toda la serie XIAO, y puedes ir directamente al Github de esta biblioteca mediante el botón de abajo.
Preparación de hardware
| Seeed Studio XIAO MG24 Sense | Pantalla SPI LCD de 1,69 pulgadas |
|---|---|
![]() | ![]() |
Conexión de pines
Después de preparar el hardware como se mencionó anteriormente, utiliza cables de puente para conectar la interfaz SPI del XIAO y el OLED. Consulta el siguiente diagrama para el método de cableado.

Instalación
Dado que has descargado la biblioteca zip, abre tu IDE de Arduino, haz clic en Sketch > Include Library > Add .ZIP Library. Elige el archivo zip que acabas de descargar, y si la biblioteca se instala correctamente, verás Library added to your libraries en la ventana de notificación. Lo que significa que la biblioteca se ha instalado correctamente.

Implementación de software
Después de descargar e instalar la biblioteca correctamente, puedes encontrar dos programas de ejemplo llamados helloworld.ino y bgcolor.ino en la carpeta de ejemplos. El bgcolor.ino es un ejemplo para mostrar el color de fondo, establecemos el rojo como predeterminado. Y el helloworld.ino es un ejemplo para mostrar la animación sobre el logotipo de nuestra empresa, y este ejemplo contiene el efecto que tiene el ejemplo bgcolor.
#include <st7789v2.h>
#include "SPI.h"
#include "seeed.h"
st7789v2 Display;
void setup() {
// put your setup code here, to run once:
Display.SetRotate(270);
Display.Init();
Display.SetBacklight(100);
Display.Clear(WHITE);
}
void loop() {
// put your main code here, to run repeatedly:
// Display.SetPixel(100, 100, RED);
// Display.DrawPoint(50, 50, YELLOW, DOT_PIXEL_8X8, DOT_FILL_AROUND);
Display.DrawImage(gImage_seeed, 20, 90, 240, 47);
Display.DrawLine(15, 65, 65, 65, MAGENTA, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
Display.DrawLine(15, 70, 80, 70, MAGENTA, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
Display.DrawRectangle(15, 80, 265, 150, GRAY, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 10, 25, BLUE, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 10, 20, BLACK, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 10, 15, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 10, 10, GREEN, DOT_PIXEL_2X2, DRAW_FILL_FULL);
Display.DrawCircle(270, 10, 25, BLUE, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 10, 20, BLACK, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 10, 15, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 10, 10, GREEN, DOT_PIXEL_2X2, DRAW_FILL_FULL);
Display.DrawCircle(10, 230, 25, BLUE, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 230, 20, BLACK, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 230, 15, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(10, 230, 10, GREEN, DOT_PIXEL_2X2, DRAW_FILL_FULL);
Display.DrawCircle(270, 230, 25, BLUE, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 230, 20, BLACK, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 230, 15, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
Display.DrawCircle(270, 230, 10, GREEN, DOT_PIXEL_2X2, DRAW_FILL_FULL);
Display.DrawLine(200, 160, 265, 160, GRAYBLUE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
Display.DrawLine(215, 165, 265, 165, GRAYBLUE, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
Display.DrawString_EN(20, 180, "By: Jason", &Font20, WHITE, BLACK);
// Display.DrawNum(100, 220, 123456, &Font24, RED, BRED);
Display.DrawFloatNum(100, 210, 1.00, 2, &Font16, WHITE, BLACK);
}
Encontrarás el logotipo de Seeed Studio impreso dinámicamente en la pantalla.

Finalizar
Has aprendido las funciones básicas de los pines del XIAO MG24 (Sense). Ahora, exploremos más a fondo los sensores integrados.

Soporte técnico y debate sobre el producto
Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte para 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.










