Skip to main content

Seeed Studio XIAO SAMD21 Comenzar con Nanase

Este es un documento escrito por @nanase_coder. (Traducido por Seeed del documento original en japonés: コインサイズ Arduino互換機 Seeed Studio XIAO SAMD21 を使ってみた). ¡Gracias Nanase por compartir esto con nosotros!

Documentación

Hay dos documentaciones sobre el uso de Seeeduino XIAO que se enfocan en diferentes áreas, consulta la tabla a continuación para más detalles:

Documentación de SeeedDocumentación de Nanase
Diagrama de pinesInterfaz
Comenzar con Seeed Studio XIAO SAMD21Seeed Studio XIAO SAMD21 con tarjeta MicroSD (SPI)
Uso de GPIO en Seeed Studio XIAO SAMD21Seeed Studio XIAO SAMD21 con GPS (UART)
Recursos de Seeed Studio XIAO SAMD21IOBUS de ciclo único

Características

  • CPU ARM Cortex M0 + (SAMD21G18) 48MHz
  • 256 KB de Flash, 32 KB de SRAM
  • USB Tipo-C
  • SPI, I2C, UART, DMA disponibles
  • Tamaño de moneda (21mm x 17.8mm)
  • Nivel lógico: 3.3V

No hay componentes en la parte posterior de la placa y todos los pines tienen agujeros estriados, lo que facilita la soldadura a otra placa.

Lista de piezas

  • 1 x Seeeduino XIAO
  • 2 x encabezados de 7 pines
  • 4 x pegatinas

pir

Agujeros castellados:

pir

Especificaciones

Especificación
CPUCPU ARM Cortex-M0+ (SAMD21G18) funcionando a hasta 48MHz (multiplicado desde 32.768 kHz)
Almacenamiento256KB de Flash, 32KB de SRAM
PINS de I/O14 pines GPIO, 11 pines analógicos, 11 pines digitales, 1 pin de salida DAC
Función de pinesSPI, I2C, UART, PWM, interrupción externa, SWD (Power Pad)
Nivel lógico3.3V
LEDs:1 LED de usuario, 1 LED de alimentación, dos LEDs para descarga por puerto serial
AlimentaciónInterfaz USB Tipo-C, pads de alimentación en la parte posterior
Tamaño21x17.8x3.5mm

Como puedes ver, es un Arduino de tipo SAMD y es similar a la serie Arduino MKR, por lo que técnicamente cualquier biblioteca escrita para ellos puede ser utilizada en Seeed Studio XIAO SAMD21. Por otro lado, como es diferente al Arduino tipo ATmega, como el Arduino Uno, la biblioteca que depende de algún registro específico de ATmega no puede ser utilizada.

El GPIO de 14 pines se refiere a los 11 pines del lado, el pin de reinicio y el SWD (SWDIO, SWCLK) en la parte posterior.

El UART en la función de pines es diferente del serial a través de USB y puede ser operado por Serial1.

Restablecer tu placa

Consulta aquí para aprender cómo agregar Seeed Studio XIAO SAMD21 a tu Arduino IDE.

pir

Seeed Studio XIAO SAMD21 no tiene un botón de reinicio. En su lugar, tiene un pad de reinicio.
Conecta brevemente este pad de reinicio y aplica GND para reiniciar tu placa.

Modo de arranque

pir

A veces, el programa puede fallar o no ser posible cargar el sketch. Puedes reiniciar la placa dos veces y entrar en el modo Bootloader. En este modo, los LEDs parpadean lentamente, y el Seeed Studio XIAO SAMD21 es reconocido como un dispositivo de almacenamiento USB. El puerto serial se separa del modo normal y siempre está en modo de escritura de sketch, sin ejecutar el programa anterior en la placa.

Para volver del modo bootloader al modo normal, sube un sketch o reinicia la placa rápidamente dos veces de nuevo.

Si entras en el modo bootloader y el Seeed Studio XIAO SAMD21 no es reconocido como un dispositivo USB por el PC, el LED parpadeará rápidamente.

LCD

Al igual que el Arduino original, selecciona Basics > Blink desde el sketch de ejemplo y súbelo.

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

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

A diferencia del Arduino original, se enciende en LOW y se apaga en HIGH.

Dos LEDs incorporados que parpadean

El sitio web oficial describe otros dos LEDs incorporados como "dos LEDs para la descarga por puerto serial". Sin embargo, al revisar el esquema, no hay un pin físico conectado a estos LEDs RX y TX.

Si miras USBCore.cpp, puedes ver que se encienden mediante digitalWrite cada vez que ocurre una transmisión / recepción serial USB, lo que significa que los dos LEDs son programables.

uint32_t USBDeviceClass::recv(uint32_t ep, void *_data, uint32_t len)
{
if (!_usbConfiguration)
return -1;

#ifdef PIN_LED_RXL
if (rxLEDPulse == 0)
digitalWrite(PIN_LED_RXL, LOW);

rxLEDPulse = TX_RX_LED_PULSE_MS;
#endif

Los números de pin específicos se encuentran en variant.h / variant.cpp al igual que en los Arduino SAMD, y en el caso de Seeeduino XIAO, se asignan a los pines 11 y 12 de la siguiente manera.

#define PIN_LED_13  (13u)
#define PIN_LED PIN_LED_13
#define LED_BUILTIN PIN_LED

#define PIN_LED_RXL (12u)
#define PIN_LED_TXL (11u)
#define PIN_LED2 PIN_LED_RXL
#define PIN_LED3 PIN_LED_TXL

A continuación se muestra un sketch para hacer parpadear tres LEDs. Los LEDs para RX y TX son de color azul.

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
pinMode(PIN_LED3, OUTPUT);
}

void loop() {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(PIN_LED2, HIGH);
digitalWrite(PIN_LED3, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(PIN_LED2, LOW);
digitalWrite(PIN_LED3, LOW);
delay(1000);
}

pir

Interfaz

Serial sobre USB CDC

A diferencia de los Arduinos de tipo ATmega, el estado actual de la comunicación serial del Seeed Studio XIAO SAMD21 es USB CDC. En otras palabras, puede realizar comunicaciones más rápidas que la comunicación serial normal.

Por lo tanto, especificar la velocidad en baudios con Serial.begin (velocidad) no tiene sentido, pero fuera de eso, se puede usar como una comunicación serial normal.

Medición de velocidad

pir

Usé este sketch para medir la velocidad de transferencia desde el Seeed Studio XIAO SAMD21 hacia la PC, y la tasa de transferencia desde la PC hacia el Seeed Studio XIAO SAMD21 debería ser la misma.

El eje horizontal es el tamaño del búfer (enviado todo de una vez usando Serial.write (buf, len)). Si envías 1 byte a la vez, solo obtendrás 0.11 Mbps (14.53 KB/s), pero si envías 64 bytes, será significativamente más rápido, alcanzando los 6.30 Mbps (805.86 KB/s). Se puede inferir que el tamaño del búfer interno es de 64 bytes.

Como se mencionó anteriormente, el LED parpadea durante la comunicación serial, pero casi no hubo disminución de velocidad debido a esto.

SPI (Tarjeta microSD)

El Seeed Studio XIAO SAMD21 tiene un nivel lógico de 3.3V. En otras palabras, la tarjeta microSD puede ser manejada a través de SPI sin un convertidor de nivel. Algunas funciones de SPI son diferentes de las de los Arduinos tipo ATmega, por favor consulta aquí para más información.

Aquí leeremos la tarjeta microSD usando el kit de ranura para microSD DIP de Akizuki Denshi.

Usamos el código de ejemplo de Arduino, pero el parámetro de SD.begin (cs_pin) se especifica como SS. Según variant.h, SS = 4, que es el mismo que los pines D4 / A4 / SDA. Por supuesto, puedes especificar otros pines.

pir

pir

#include <SPI.h>
#include <SD.h>

File myFile;

void setup() {
Serial.begin(9600);
while (!Serial) ;

Serial.print("Inicializando la tarjeta SD... ");

if (!SD.begin(SS)) { // <-------------------------------- SS = Pin D4/A4/SDA
Serial.println("¡La inicialización falló!");
while (1) ;
}
Serial.println("Inicialización completada.");

myFile = SD.open("test.txt", FILE_WRITE);

if (myFile) {
Serial.print("Escribiendo en test.txt...");
myFile.println("probando 1, 2, 3.");

myFile.close();
Serial.println("Hecho.");
}
else
Serial.println("Error al abrir test.txt");

myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");

while (myFile.available())
Serial.write(myFile.read());

myFile.close();
}
else
Serial.println("Error al abrir test.txt");
}

void loop() { }

Resultado:

Inicializando la tarjeta SD... Inicialización completa.
Escribiendo en test.txt... Hecho.
test.txt:
probando 1, 2, 3.

I2C

También está disponible I2C. Los dispositivos de 3.3V pueden conectarse directamente sin un convertidor de nivel.

En esta ocasión, usamos el BME280 para medir la temperatura, la humedad y la presión atmosférica. El BME280 funciona a 3.3V, por lo que se puede conectar sin un convertidor de nivel. Consulta aquí para obtener instrucciones detalladas sobre la conexión entre Arduino y el BME280.

pir

pir

#include <Wire.h>
#include "SparkFunBME280.h"

BME280 sensor;

void setup() {
Serial.begin(9600);
Wire.begin();
sensor.beginI2C(); // Wire を用いて I2C 接続開始
}

void loop() {
Serial.print("Temp: ");
Serial.print(sensor.readTempC(), 2);

Serial.print(" °C, Humidity: ");
Serial.print(sensor.readFloatHumidity(), 2);

Serial.print(" %, Pressure: ");
Serial.print(sensor.readFloatPressure() / 100.0, 1);
Serial.println(" hPa");

delay(5000);
}

Resultado:

Temp: 22.05 °C, Humidity: 44.99 %, Pressure: 1009.0 hPa
Temp: 22.05 °C, Humidity: 44.72 %, Pressure: 1008.9 hPa
Temp: 22.06 °C, Humidity: 44.81 %, Pressure: 1008.9 hPa

UART

Como se mencionó anteriormente, los pines físicos UART son diferentes a los del USB CDC. Se utiliza Serial1 para la comunicación serial utilizando los pines TX y RX.

En esta ocasión, conectamos el Seeed Studio XIAO SAMD21 al kit receptor GPS y obtenemos información NMEA desde la PC. Es un trabajo muy sencillo cuando se usa el Xiao, que funciona simplemente como un puente entre el kit GPS y el serial de la PC.

pir

pir

void setup() {
Serial.begin(9600);
Serial1.begin(9600);
}

void loop() {
if (Serial.available()) {
char c = (char)Serial.read();
Serial1.write(c);
}

if (Serial1.available()) {
char c = (char)Serial1.read();
Serial.write(c);
}
}

En esta ocasión, usamos GPSFox para explorar la información NMEA. Las coordenadas se pueden medir fácilmente.

pir

Otros

DMA

Como una de las características del Arduino tipo SAMD, puedes usar DMA en Xiao. Consulta aquí para más información sobre DMA.

Single Cycle IOBUS

El Cortex M0+ tiene una función llamada Single Cycle IOBUS que puede operar la salida GPIO en un ciclo de reloj. Escribir a un registro específico puede invertir la lógica, deshabilitar el pin o cambiar la corriente de conducción del pin.

DigitalWrite

Puedes usar digitalWrite para crear un pulso, que es un método que funciona con cualquier placa Arduino, simplemente repitiendo la sobrecarga.

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

#define P \
digitalWrite(PIN_A7, HIGH); \
digitalWrite(PIN_A7, LOW);

#define W P P P P P P P P P P P P P P P P
void loop() { W W W W W W W W W W W W W W W W }

Uso de Registros

También puedes crear un pulso operando directamente el registro sin utilizar digitalWrite.

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

#define P \
digitalPinToPort(PIN_A7)->OUTSET.reg = digitalPinToBitMask(PIN_A7); \
digitalPinToPort(PIN_A7)->OUTCLR.reg = digitalPinToBitMask(PIN_A7);

#define W P P P P P P P P P P P P P P P P
void loop() { W W W W W W W W W W W W W W W W }

Usar Single Cycle IOBUS

Usamos IOBUS.h introducido aquí.

#include "IOBUS.h"

#define digitalPinToIOPin(P) ((g_APinDescription[P].ulPort << 5) + g_APinDescription[P].ulPin)
#define PIN_NUM digitalPinToIOPin(PIN_A7)

void setup() {
IOBUS::pinMode(PIN_NUM, OUTPUT, true);
}

#define P IOBUS::toggleOutput(PIN_NUM);

#define W P P P P P P P P P P P P P P P P
void loop() { W W W W W W W W W W W W W W W W }
DigitalWriteRegistrosIobus de un solo ciclo
Forma de onda

pir

pir

pir

frecuencia333 kHz6 MHz24 MHz
Número de ciclos de reloj necesarios para crear un pulso14482

La lógica ciertamente puede invertirse en un ciclo (48 MHz).

Soporte Técnico y Discusión de Productos

¡Gracias por elegir nuestros productos! Estamos aquí para ofrecerte diferentes tipos de soporte y asegurar 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...