- ¿Qué es SPI?
- Funcionamiento de SPI
- Pines SPI en Arduino UNO
- Usando SPI en Arduino
- Componentes necesarios para la comunicación Arduino SPI
- Diagrama del circuito de comunicación Arduino SPI
- Cómo programar Arduino para comunicación SPI:
- Explicación de la programación maestra de Arduino SPI
- Explicación de la programación del esclavo Arduino SPI
- ¿Cómo funciona SPI en Arduino? - ¡Probemos!
Un microcontrolador utiliza muchos protocolos diferentes para comunicarse con varios sensores y módulos. Existen muchos tipos diferentes de protocolos de comunicación para la comunicación inalámbrica y por cable, y la técnica de comunicación más utilizada es la comunicación en serie. La comunicación en serie es el proceso de enviar datos de uno en uno, secuencialmente, a través de un canal o bus de comunicación. Hay muchos tipos de comunicación en serie como comunicación UART, CAN, USB, I2C y SPI.
En este tutorial, aprendemos sobre el protocolo SPI y cómo usarlo en Arduino. Usaremos el protocolo SPI para la comunicación entre dos Arduinos. Aquí un Arduino actuará como Maestro y otro actuará como Esclavo, dos LED y botones pulsadores estarán conectados a ambos Arduino. Para demostrar la comunicación SPI, controlaremos el LED del lado maestro mediante el botón pulsador en el lado esclavo y viceversa utilizando el protocolo de comunicación en serie SPI.
¿Qué es SPI?
SPI (Serial Peripheral Interface) es un protocolo de comunicación en serie. La interfaz SPI fue encontrada por Motorola en 1970. SPI tiene una conexión full-duplex, lo que significa que los datos se envían y reciben simultáneamente. Es decir, un maestro puede enviar datos a un esclavo y un esclavo puede enviar datos al maestro simultáneamente. SPI es una comunicación en serie sincrónica, lo que significa que el reloj es necesario para fines de comunicación.
La comunicación SPI se explica previamente en otros microcontroladores:
- Comunicación SPI con el microcontrolador PIC PIC16F877A
- Interfaz de pantalla táctil TFT LCD de 3,5 pulgadas con Raspberry Pi
- Programación del microcontrolador AVR con pines SPI
- Interfaz del LCD gráfico Nokia 5110 con Arduino
Funcionamiento de SPI
Un SPI tiene una comunicación maestro / esclavo utilizando cuatro líneas. Un SPI puede tener solo un maestro y puede tener varios esclavos. Un maestro suele ser un microcontrolador y los esclavos pueden ser un microcontrolador, sensores, ADC, DAC, LCD, etc.
A continuación se muestra la representación del diagrama de bloques de SPI Master con Single Slave.
SPI tiene las siguientes cuatro líneas MISO, MOSI, SS y CLK
- MISO (Master in Slave Out): la línea esclava para enviar datos al maestro.
- MOSI (Master Out Slave In): la línea Master para enviar datos a los periféricos.
- SCK (reloj en serie): los pulsos de reloj que sincronizan la transmisión de datos generada por el maestro.
- SS (Selección de esclavo): el maestro puede usar este pin para habilitar y deshabilitar dispositivos específicos.
Maestro SPI con múltiples esclavos
Para iniciar la comunicación entre el maestro y el esclavo, debemos configurar el pin de selección de esclavo (SS) del dispositivo requerido en BAJO, para que pueda comunicarse con el maestro. Cuando está alto, ignora al maestro. Esto le permite tener varios dispositivos SPI que comparten las mismas líneas maestras MISO, MOSI y CLK. Como puede ver en la imagen de arriba, hay cuatro esclavos en los que SCLK, MISO, MOSI están conectados en común al maestro y el SS de cada esclavo se conecta por separado a los pines SS individuales (SS1, SS2, SS3) del maestro. Al establecer el pin SS requerido en BAJO, un maestro puede comunicarse con ese esclavo.
Pines SPI en Arduino UNO
La siguiente imagen muestra los pines SPI presentes en Arduino UNO (en cuadro rojo).
Línea SPI |
Pin en Arduino |
MOSI |
11 o ICSP-4 |
MISO |
12 o ICSP-1 |
SCK |
13 o ICSP-3 |
SS |
10 |
Usando SPI en Arduino
Antes de comenzar a programar para la comunicación SPI entre dos Arduinos. Necesitamos aprender sobre la biblioteca Arduino SPI utilizada en Arduino IDE.
La biblioteca
1. SPI.begin ()
USO: Para inicializar el bus SPI configurando SCK, MOSI y SS en las salidas, bajando SCK y MOSI y SS alto.
2. SPI.setClockDivider (divisor)
USO: Para configurar el divisor de reloj SPI en relación con el reloj del sistema. Los divisores disponibles son 2, 4, 8, 16, 32, 64 o 128.
Divisores:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (controlador)
USO: Esta función se llama cuando un dispositivo esclavo recibe datos del maestro.
4. SPI.transfer (val)
USO: Esta función se utiliza para enviar y recibir datos simultáneamente entre maestro y esclavo.
Así que ahora comencemos con la demostración práctica del protocolo SPI en Arduino. En este tutorial usaremos dos arduino uno como maestro y otro como esclavo. Ambos Arduino están conectados con un LED y un botón pulsador por separado. El LED maestro se puede controlar utilizando el botón pulsador de Arduino esclavo y el LED de Arduino esclavo se puede controlar mediante el botón pulsador de Arduino maestro utilizando el protocolo de comunicación SPI presente en arduino.
Componentes necesarios para la comunicación Arduino SPI
- Arduino UNO (2)
- LED (2)
- Botón pulsador (2)
- Resistencia 10k (2)
- Resistencia 2.2k (2)
- Tablero de circuitos
- Conexión de cables
Diagrama del circuito de comunicación Arduino SPI
El siguiente diagrama de circuito muestra cómo usar SPI en Arduino UNO, pero puede seguir el mismo procedimiento para la comunicación Arduino Mega SPI o la comunicación Arduino nano SPI. Casi todo seguirá igual a excepción del número de pin. Tienes que verificar el pinout de Arduino nano o mega para encontrar los pines Arduino nano SPI y los pines Arduino Mega, una vez que lo hayas hecho todo lo demás será igual.
He construido el circuito que se muestra arriba sobre una placa de prueba, puede ver la configuración del circuito que usé para probar a continuación.
Cómo programar Arduino para comunicación SPI:
Este tutorial tiene dos programas, uno para Arduino maestro y otro para Arduino esclavo. Los programas completos para ambos lados se dan al final de este proyecto.
Explicación de la programación maestra de Arduino SPI
1. En primer lugar, debemos incluir la biblioteca SPI para utilizar las funciones de comunicación SPI.
#incluir
2. En configuración nula ()
- Comenzamos la comunicación en serie a una velocidad de 115200 baudios.
Serial.begin (115200);
- Conecte el LED al pin 7 y presione el botón al pin 2 y configure esos pines SALIDA e ENTRADA respectivamente.
pinMode (botón ip, ENTRADA); pinMode (LED, SALIDA);
- A continuación, comenzamos la comunicación SPI.
SPI.begin ();
- A continuación, configuramos el Clockdivider para la comunicación SPI. Aquí hemos configurado el divisor 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Luego establezca el pin SS en ALTO ya que no iniciamos ninguna transferencia al arduino esclavo.
escritura digital (SS, ALTA);
3. En bucle vacío ():
- Leemos el estado del pin del botón conectado al pin2 (Master Arduino) para enviar esos valores al Arduino esclavo.
buttonvalue = digitalRead (ipbutton);
- Establecer lógica para establecer el valor x (para enviar al esclavo) dependiendo de la entrada del pin 2
if (buttonvalue == HIGH) { x = 1; } más { x = 0; }
- Antes de enviar el valor, necesitamos BAJAR el valor de selección del esclavo para comenzar la transferencia al esclavo desde el maestro.
escritura digital (SS, BAJA);
- Aquí viene el paso importante, en la siguiente declaración enviamos el valor del botón pulsador almacenado en la variable Mastersend al arduino esclavo y también recibimos el valor del esclavo que se almacenará en la variable Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Después de eso, dependiendo del valor de recepción de Maste , encenderemos o apagaremos el LED de Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Establece el pin 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, BAJO); // Establece el pin 7 BAJO Serial.println ("LED maestro APAGADO"); }
Nota: Usamos serial.println () para ver el resultado en Serial Motor of Arduino IDE. Mira el video al final.
Explicación de la programación del esclavo Arduino SPI
1. En primer lugar, debemos incluir la biblioteca SPI para utilizar las funciones de comunicación SPI.
#incluir
2. En configuración nula ()
- Comenzamos la comunicación en serie a una velocidad de 115200 baudios.
Serial.begin (115200);
- Conecte el LED al pin 7 y presione el botón al pin2 y configure esos pines SALIDA e ENTRADA respectivamente.
pinMode (botón ip, ENTRADA); pinMode (LED, SALIDA);
- El paso importante aquí son las siguientes declaraciones
pinMode (MISO, SALIDA);
La declaración anterior establece MISO como SALIDA (tiene que enviar datos a Master IN). Entonces, los datos se envían a través de MISO de Slave Arduino.
- Ahora encienda SPI en modo esclavo usando el registro de control SPI
SPCR - = _BV (SPE);
- Luego encienda la interrupción para la comunicación SPI. Si se reciben datos del maestro, se llama a la rutina de interrupción y el valor recibido se toma de SPDR (registro de datos SPI)
SPI.attachInterrupt ();
- El valor del maestro se toma de SPDR y se almacena en la variable esclava recibida . Esto tiene lugar en la siguiente función de rutina de interrupción.
ISR (SPI_STC_vect) { Slavereceived = SPDR; recibido = verdadero; }
3. A continuación, en el bucle vacío () configuramos el LED arduino esclavo para que se encienda o apague según el valor recibido por el esclavo.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Establece el pin 7 como LED ALTO ENCENDIDO Serial.println ("LED esclavo ENCENDIDO"); } else { digitalWrite (LEDpin, LOW); // Establece el pin 7 como LED BAJO APAGADO Serial.println ("LED esclavo APAGADO"); }
- A continuación leemos el estado del botón Slave Arduino Push y almacenamos el valor en Slavesend para enviar el valor al Master Arduino dando valor al registro SPDR.
buttonvalue = digitalRead (alfiler de botón); if (buttonvalue == HIGH) {x = 1; } más {x = 0; } Slavesend = x; SPDR = esclavo;
Nota: Usamos serial.println () para ver el resultado en Serial Motor of Arduino IDE. Mira el video al final.
¿Cómo funciona SPI en Arduino? - ¡Probemos!
A continuación se muestra la imagen de la configuración final para la comunicación SPI entre dos placas Arduino.
Cuando se presiona el botón en el lado maestro, el LED blanco en el lado esclavo se enciende.
Y cuando se presiona el botón en el lado esclavo, el LED rojo en el lado maestro se enciende.
Puede ver el video a continuación para ver la demostración de la comunicación Arduino SPI. Si tiene alguna pregunta, déjela en la sección de comentarios y use nuestros foros.