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 Seeed | Documentación de Nanase |
---|---|
Diagrama de pines | Interfaz |
Comenzar con Seeed Studio XIAO SAMD21 | Seeed Studio XIAO SAMD21 con tarjeta MicroSD (SPI) |
Uso de GPIO en Seeed Studio XIAO SAMD21 | Seeed Studio XIAO SAMD21 con GPS (UART) |
Recursos de Seeed Studio XIAO SAMD21 | IOBUS 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
Agujeros castellados:
Especificaciones
Especificación | |
---|---|
CPU | CPU ARM Cortex-M0+ (SAMD21G18) funcionando a hasta 48MHz (multiplicado desde 32.768 kHz) |
Almacenamiento | 256KB de Flash, 32KB de SRAM |
PINS de I/O | 14 pines GPIO, 11 pines analógicos, 11 pines digitales, 1 pin de salida DAC |
Función de pines | SPI, I2C, UART, PWM, interrupción externa, SWD (Power Pad) |
Nivel lógico | 3.3V |
LEDs: | 1 LED de usuario, 1 LED de alimentación, dos LEDs para descarga por puerto serial |
Alimentación | Interfaz USB Tipo-C, pads de alimentación en la parte posterior |
Tamaño | 21x17.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.
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
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);
}
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
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.
#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.
#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.
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.
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 }
DigitalWrite | Registros | Iobus de un solo ciclo | |
---|---|---|---|
Forma de onda | |||
frecuencia | 333 kHz | 6 MHz | 24 MHz |
Número de ciclos de reloj necesarios para crear un pulso | 144 | 8 | 2 |
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.