Pular para o conteúdo principal

Primeiros Passos com Seeed Studio XIAO SAMD21 por Nanase

Este é um documento escrito por @nanase_coder. (Traduzido pela Seeed a partir do documento original em japonês: コインサイズ Arduino互換機 Seeed Studio XIAO SAMD21 を使ってみた). Obrigado, Nanase, por compartilhar isso conosco!

Documentações

Existem duas documentações sobre o uso do Seeeduino XIAO que se concentram em áreas diferentes; consulte a tabela abaixo como referência:

Documentação da SeeedDocumentação da Nanase
Diagrama de pinagemInterface
Seeed Studio XIAO SAMD21 Primeiros PassosSeeed Studio XIAO SAMD21 com Cartão MicroSD (SPI)
Uso de GPIO do Seeed Studio XIAO SAMD21Seeed Studio XIAO SAMD21 com GPS (UART)
Recursos do Seeed Studio XIAO SAMD21IOBUS de Ciclo Único

Recursos

  • CPU ARM Cortex M0 + (SAMD21G18) 48MHz
  • 256 KB de Flash, 32 KB de SRAM
  • USB Type-C
  • SPI, I2C, UART, DMA disponíveis
  • tamanho de moeda (21mm x 17.8mm)
  • Nível lógico: 3,3V

Não há componentes no lado de trás da placa, e todos os pinos possuem furos metalizados em meia-lua (castellated), o que torna fácil soldá-la em outra placa.

Lista de peças

  • 1 x Seeeduino XIAO
  • 2 x header de 7 pinos
  • 4 x pastilhas adesivas

pir

Furos metalizados em meia-lua (castellated holes):

pir

Especificação

Especificação
CPUCPU ARM Cortex-M0+ (SAMD21G18) rodando a até 48MHz (multiplicado a partir de 32.768 kHz)
Armazenamento256KB Flash, 32KB SRAM
Pinos de I/O14 pinos GPIO, 11 pinos analógicos, 11 pinos digitais, 1 pino de saída DAC
Função dos pinosSPI, I2C, UART, PWM, interrupção externa, SWD (Power Pad)
Nível lógico3,3V
LEDs:1 LED de usuário, 1 LED de alimentação, dois LEDs para download pela porta serial
AlimentaçãoInterface USB Type-C, pads de alimentação na parte de trás
Tamanho21x17.8x3.5mm

Como você pode ver, é um Arduino do tipo SAMD e é semelhante à série Arduino MKR, portanto, tecnicamente, qualquer biblioteca escrita para eles pode ser usada no Seeed Studio XIAO SAMD21. Por outro lado, como é diferente do Arduino do tipo ATmega, como o Arduino Uno, a biblioteca que depende de algum registrador específico do ATmega não pode ser usada.

Os 14 pinos GPIO referem-se aos 11 pinos laterais, ao pino de reset e ao SWD (SWDIO, SWCLK) na parte de trás.

O UART na função de pino é diferente da serial via USB e pode ser operado por Serial1.

Redefinir sua Placa

Confira aqui e aprenda como adicionar o Seeed Studio XIAO SAMD21 ao seu Arduino IDE.

pir

O Seeed Studio XIAO SAMD21 não possui um botão de reset. Em vez disso, há um pad de reset. Faça uma conexão rápida entre esse pad de reset e o GND para redefinir sua placa.

Modo Bootloader

pir

Às vezes o programa pode travar ou não ser possível fazer o upload do sketch. Você pode redefinir a placa duas vezes e entrar no modo Bootloader. Nesse modo, os LEDs piscam lentamente e o Seeed Studio XIAO SAMD21 é reconhecido como um dispositivo de memória USB. A porta serial é separada do modo normal e fica sempre em modo de gravação de sketch, sem executar o programa anterior na placa.

Para voltar do modo bootloader para o modo normal, faça o upload de um sketch ou redefina novamente rapidamente duas vezes.

Se você entrar no modo bootloader quando o Seeed Studio XIAO SAMD21 não for reconhecido como um dispositivo USB pelo PC, o LED piscará rapidamente.

LCD

Assim como no Arduino original, selecione Basics > Blink a partir do sketch de exemplo e faça o upload.

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

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

Ao contrário do Arduino original, ele é ligado em LOW e desligado em HIGH.

Dois LEDs internos piscáveis

O site oficial descreve dois outros LEDs internos como two LEDs for serial port downloading. No entanto, observando o esquemático, não há pino físico conectado a esses LEDs RX e TX.

Se você olhar USBCore.cpp aqui, poderá ver que eles são ligados por digitalWrite toda vez que ocorre transmissão/recepção pela serial USB, o que significa que os dois LEDs são programáveis.

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

Os números específicos dos pinos são definidos em variant.h / variant.cpp, como no Arduino SAMD, e, no caso do Seeeduino XIAO, eles são atribuídos a 11 e 12, conforme abaixo.

#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

Abaixo está um sketch que pisca três LEDs. Os LEDs de RX e TX são azuis.

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

Interface

Serial via USB CDC

Ao contrário do Arduino do tipo ATmega, o estado real da comunicação serial do Seeed Studio XIAO SAMD21 é USB CDC. Em outras palavras, ele pode operar mais rápido do que a comunicação serial normal.

Portanto, especificar o baud rate com Serial.begin (speed) não faz sentido, mas, exceto por isso, ele pode ser usado como uma serial normal.

Medindo a Velocidade

pir

Usei este sketch para medir a velocidade de transferência do Seeed Studio XIAO SAMD21 para o PC, e a taxa de transferência do PC para o Seeed Studio XIAO SAMD21 deve ser a mesma.

O eixo horizontal é o tamanho do buffer (envio de uma vez usando Serial.write (buf, len)). Se você enviar 1 byte de cada vez, obterá apenas 0,11 Mbps (14,53 KB/s), mas se enviar 64 bytes, será significativamente mais rápido, a 6,30 Mbps (805,86 KB/s). Pode-se inferir que o tamanho do buffer interno é de 64 bytes.

Como mencionado acima, o LED pisca na comunicação serial, mas quase não houve redução de velocidade devido a isso.

SPI (Cartão MicroSD)

O Seeed Studio XIAO SAMD21 tem nível lógico de 3,3V. Em outras palavras, o cartão microSD pode ser manuseado via SPI sem um conversor de nível. Algumas funções de SPI são diferentes das do Arduino do tipo ATmega; consulte aqui para mais informações.

Aqui vamos ler o cartão microSD usando o kit DIP de slot para cartão micro SD da Akizuki Denshi.

Aqui usamos o código de exemplo do Arduino, mas o parâmetro de SD.begin (cs_pin) é especificado como SS. De acordo com variant.h, SS = 4, que é o mesmo que os pinos D4 / A4 / SDA. Claro, você pode especificar outros pinos.

pir

pir

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

File myFile;

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

Serial.print("Initializing SD card... ");

if (!SD.begin(SS)) { // <-------------------------------- SS = D4/A4/SDA pin
Serial.println("initialization failed!");
while (1) ;
}
Serial.println("initialization done.");

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

if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");

myFile.close();
Serial.println("done.");
}
else
Serial.println("error opening 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 opening test.txt");
}

void loop() { }

Resultado:

Initializing SD card...initialization done.
Writing to test.txt...done.
test.txt:
testing 1, 2, 3.

I2C

I2C também está disponível. Dispositivos de 3,3 V podem ser conectados diretamente sem um conversor de nível.

Desta vez, usamos o BME280 para medir temperatura, umidade e pressão atmosférica. O BME280 opera em 3,3 V, portanto pode ser conectado sem um conversor de nível. Verifique aqui para obter instruções detalhadas da conexão entre Arduino e 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

Conforme mencionado anteriormente, os pinos físicos de UART são diferentes daqueles no USB CDC. Serial1 é usado para comunicação serial utilizando os pinos TX e RX.

Desta vez, conectamos o Seeed Studio XIAO SAMD21 ao kit receptor de GPS e obtemos informações NMEA a partir do PC. É um trabalho muito simples ao usar o Xiao, que é apenas uma ponte entre o kit de GPS e a serial do 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);
}
}

Desta vez usamos o GPSFox para visualizar as informações NMEA. As coordenadas podem ser medidas facilmente.

pir

Outros

DMA

Como um dos recursos do Arduino do tipo SAMD, você pode usar DMA no Xiao. Verifique aqui para mais informações sobre DMA.

Single Cycle IOBUS

O Cortex M0+ possui uma função chamada Single Cycle IOBUS que pode operar a saída GPIO em um ciclo de clock. Escrever em um registro específico pode inverter a lógica, desabilitar o pino ou alterar a corrente de acionamento do pino.

DigitalWrite

Você pode usar digitalWrite para criar um pulso, que é um método que funciona com qualquer placa Arduino - apenas repetindo a 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 }

Usar Registradores

Você também pode criar um pulso operando diretamente o registrador sem usar 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 apresentado aqui.

#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 }
DigitalWriteRegistradoresSingle Cycle IOBUS
Waveform

pir

pir

pir

frequência333 kHz6 MHz24 MHz
Número de ciclos de clock necessários para criar um pulso14482

A lógica pode certamente ser invertida em um ciclo (48 MHz).

Suporte Técnico & Discussão de Produto

Obrigado por escolher nossos produtos! Estamos aqui para oferecer diferentes formas 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...