Saltar al contenido principal

Multiplexación de pines (Arduino)

Seeed Studio XIAO RP2350 tiene interfaces muy completas. Hay 19 E/S digitales que se pueden usar como pines PWM y 3 entradas analógicas que se pueden usar como pines ADC. Es compatible con cuatro interfaces de comunicación serie como UART, I2C y SPI. Este wiki será útil para aprender sobre estas interfaces e implementarlas en tus próximos proyectos.

Descripción general del hardware

Parte frontal

Parte trasera

Preparación

Actualmente, hay algunos problemas con el uso de los pines del XIAO RP2350 debido a problemas de compatibilidad. Hemos solucionado este problema y la biblioteca oficial de Raspberry Pi ha sido fusionada. La versión actual es la 4.2.0 y la actualización se completará en la próxima versión, 4.2.1.

Mientras tanto, reemplaza este archivo yendo a Arduino15/packages/rp2040/hardware/rp2040/4.2.0/variants/seeed_xiao_rp2350(Tu dirección de biblioteca de Arduino) y haz clic aquí para descargar el archivo. Una vez hecho esto, ¡podrás disfrutar de tu trabajo!

Digital

Preparación de hardware

Seeed Studio XIAO RP2350Base de expansión Seeed Studio para XIAO con Grove OLEDGrove - LED

Instala el XIAO RP2350 en la placa de expansión y conecta el Grove LED a la interfaz A0/D0 de la placa de expansión mediante un cable Grove. Finalmente, conecta el 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.

//define which pin you use
int LED_BUILTIN = D0;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}

Efecto

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 RP2350 admiten salida PWM. Por lo tanto, puedes usar cualquier pin para generar PWM y ajustar el brillo de las luces, controlar servos y otras funciones.

Preparación de hardware

Seeed Studio XIAO RP2350Base de expansión Seeed Studio para XIAO con Grove OLEDGrove - LED

Instala el XIAO RP2350 en la placa de expansión y conecta el Grove LED a la interfaz A0/D0 de la placa de expansión mediante un cable Grove. Finalmente, conecta el XIAO al 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);
}
}

Efecto

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 RP2350Base de expansión Seeed Studio para XIAO con Grove OLEDGrove - Sensor de ruido

Implementación de software

int loudness;

void setup()
{
Serial.begin(9600);// initialize Serial
}

void loop()
{
loudness = analogRead(A0);// read analog data from A0 pin
Serial.println(loudness);
delay(200);
}

Efecto

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 el atajo de teclado Ctrl+Shift+M.

Uso general

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);
}

Efecto

Si todo va bien, después de cargar el programa, deberías ver el siguiente efecto.

Uso de Serial1

De acuerdo con los diagramas de pines de XIAO RP2350 anteriores para parámetros específicos, podemos observar que hay pines TX y RX (D6, D7). El uso también es muy similar, pero necesitamos usar una herramienta de monitorización de puerto serie para monitorizar los pines D6 y D7 para obtener datos. Así que a continuación, usaremos los pines D6 y D7 para usar serial1.

tip

Normalmente, usamos Serial para comunicarnos entre el dispositivo y tu ordenador para que podamos saber qué está pasando en tu programa.

Basado en eso, quieres usar este dispositivo para comunicarse con otro dispositivo. En este caso, usaremos Serial1.


void setup() {
Serial1.begin(115200);
}

void loop() {
if(Serial1.available() > 0)
{
char incominByte = Serial1.read();
Serial1.print("I received : ");
Serial1.println(incominByte);
}
delay(1000);
}

Efecto

Si todo va bien, después de cargar el programa, deberías ver el siguiente efecto.

I2C

XIAO RP2350 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 RP2350Seeed Studio Expansion Base for XIAO with Grove OLEDGrove - DHT20 Temperature and Humidity Sensor

El sensor DHT20 usa el protocolo I2C, por lo que podemos usar el puerto I2C en la XIAO Expansion Board para obtener los datos del sensor.

Implementación de software

Este ejemplo presenta cómo obtener los datos del sensor DHT20 a través de la Seeed Studio Expansion Base para XIAO RP2350.

Paso 1. Instala la Seeed Studio XIAO RP2350 en la placa de expansión y luego conecta el cable Type-C.

Paso 2. Instala la librería Grove Temperature And Humidity Sensor.

Paso 3. Añade la librería a Arduino.

Paso 4. Abre la demo DHTtester desde la librería que acabas de descargar.

Como usamos DHT20, necesitamos descomentar el código de DHT20 como en el siguiente código.

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "Grove_Temperature_And_Humidity_Sensor.h"

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
// #define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//#define DHTTYPE DHT10 // DHT 10
#define DHTTYPE DHT20 // DHT 20

/*Notice: The DHT10 and DHT20 is different from other DHT* sensor ,it uses i2c interface rather than one wire*/
/*So it doesn't require a pin.*/
// #define DHTPIN 2 // what pin we're connected to(DHT10 and DHT20 don't need define it)
// DHT dht(DHTPIN, DHTTYPE); // DHT11 DHT21 DHT22
DHT dht(DHTTYPE); // DHT10 DHT20 don't need to define Pin

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor


#if defined(ARDUINO_ARCH_AVR)
#define debug Serial

#elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM)
#define debug SerialUSB
#else
#define debug Serial
#endif

void setup() {

debug.begin(115200);
debug.println("DHTxx test!");
Wire.begin();

/*if using WIO link,must pull up the power pin.*/
// pinMode(PIN_GROVE_POWER, OUTPUT);
// digitalWrite(PIN_GROVE_POWER, 1);

dht.begin();
}

void loop() {
float temp_hum_val[2] = {0};
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)


if (!dht.readTempAndHumidity(temp_hum_val)) {
debug.print("Humidity: ");
debug.print(temp_hum_val[0]);
debug.print(" %\t");
debug.print("Temperature: ");
debug.print(temp_hum_val[1]);
debug.println(" *C");
} else {
debug.println("Failed to get temprature and humidity value.");
}

delay(1500);
}

Efecto

Si todo va bien, después de cargar el programa, deberías ver el siguiente efecto.

SPI

El chip XIAO RP2350 integra múltiples periféricos, incluido una interfaz SPI que se puede utilizar para conectar dispositivos SPI externos como memorias flash, pantallas, sensores y más. El XIAO RP2350 también admite un modo de transferencia SPI de alta velocidad, que puede alcanzar una velocidad máxima de transferencia SPI de 80 MHz, satisfaciendo las necesidades de transferencia de datos de la mayoría de los dispositivos SPI.

Preparación de hardware

Seeed Studio XIAO RP2350Grove - OLED Display 1.12 (SH1107) V3.0 - SPI/IIC

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 la siguiente tabla para el cableado.

XIAO RP2350OLED Display
D8SCL
D10SI
D5RES
D4D/C
D7CS
VCC(VBUS)5V
GNDGND

Implementación de software

A continuación, tomaremos el siguiente programa como ejemplo para introducir cómo utilizar la interfaz SPI para controlar la pantalla OLED.

Instala la biblioteca u8g2.


#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

U8G2_SH1107_128X128_1_4W_HW_SPI u8g2(U8G2_R3, /* cs=*/ D7, /* dc=*/ D4, /* reset=*/ D5);

void setup(void) {
u8g2.begin();
}

void loop(void) {
u8g2.firstPage();

do {
u8g2.setFont(u8g2_font_luBIS08_tf);
u8g2.drawStr(0,24,"Hello Seeed!");
} while ( u8g2.nextPage() );
}

En la función setup(), la clase U8G2_SH1107_128X128_1_4W_HW_SPI se instancia con los argumentos de constructor apropiados que especifican los pines utilizados para chip select (cs), datos/comando (dc) y reset. Luego, se llama a la función u8g2.begin() para inicializar la pantalla.

En la función loop(), la pantalla se actualiza con nuevo contenido utilizando las funciones u8g2.firstPage(), u8g2.setFont() y u8g2.drawStr(). La función u8g2.firstPage() configura el búfer de la pantalla para escritura, mientras que u8g2.nextPage() muestra el contenido actualizado. El bucle do-while garantiza que el contenido se muestre continuamente hasta que el programa se detenga.

En general, este código demuestra cómo utilizar la biblioteca U8g2 para controlar una pantalla OLED y mostrar texto en ella.

Finalizar

Has aprendido las funciones básicas de los pines del XIAO RP2350. Ahora, ¡diviértete con él~!

Soporte técnico y debate sobre el producto

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

Loading Comments...