Cómo usar la comunicación SPI con Arduino y Raspberry Pi

La interfaz periférica en serie (SPI) es un protocolo de comunicación en serie sincrónica ampliamente utilizado para la comunicación de corta distancia, principalmente en sistemas integrados. La combinación de la versatilidad del Arduino con el poder computacional de la Raspberry Pi a través de SPI puede abrir una gran cantidad de posibilidades del proyecto. En esta publicación de blog, exploraremos cómo configurar y usar la comunicación SPI entre un Arduino y una Raspberry Pi.

Comprender SPI

SPI es un protocolo de comunicación Full-Duplex que funciona en modo maestro-esclavo. Utiliza cuatro líneas principales:

  • Mosi (maestro fuera de esclavo): Transfiere datos del maestro al esclavo.
  • MISO (maestro en esclavo): Transfiere datos de esclavo a maestro.
  • SCLK (reloj en serie): Sincroniza la transmisión de datos generada por el maestro.
  • SS/CS (Slave Select/Chip Select): Selecciona el dispositivo esclavo.

SPI es favorecido por su simplicidad y velocidad, lo que lo hace ideal para aplicaciones que requieren un intercambio de datos rápido entre dispositivos.

¿Por qué usar SPI con Arduino y Raspberry Pi?

La combinación de un Arduino con una Raspberry Pi aprovecha las fortalezas de ambas plataformas. El Arduino se destaca en el control de hardware de bajo nivel en tiempo real, mientras que el Raspberry Pi ofrece capacidades de procesamiento de alto nivel, conectividad de red y un entorno de sistema operativo rico. El uso de SPI permite que estos dos dispositivos se comuniquen de manera eficiente, permitiendo proyectos complejos como sistemas de automatización de hogares, robótica y aplicaciones de registro de datos.

Configuración del hardware

Para establecer la comunicación SPI entre un Arduino y una Raspberry Pi, necesitará los siguientes componentes:

  • Arduino Uno (o cualquier tablero de Arduino compatible)
  • Raspberry Pi (cualquier modelo con pines GPIO)
  • Cables de jersey
  • Paneles (opcional)

Cableado el Arduino y Raspberry Pi para SPI

El cableado cuidadoso es crucial para garantizar una comunicación adecuada. Aquí le mostramos cómo conectar el Arduino y la Raspberry PI usando SPI:

Raspberry pi gpio pin Alfiler de arduino Descripción
GPIO10 (MOSI) Pin 11 (Mosi) Dominar esclavo en
GPIO9 (MISO) Pin 12 (miso) Maestro en esclavo
GPIO11 (SCLK) Pin 13 (SCLK) Reloj de serie
GPIO8 (CE0) Pin 10 (SS) SELECCIÓN DE LA SLAVE
Gnd Gnd Terreno común
3.3V 5V Fuente de alimentación (uso de nivel de uso si es necesario)

Nota: El Raspberry Pi funciona a niveles lógicas de 3.3V, mientras que Arduino Uno usa 5V. Se recomienda utilizar un convertidor de nivel lógico para evitar daños potenciales en la Raspberry Pi.

Configuración del arduino

El Arduino actuará como el dispositivo SPI Slave. A continuación se muestra una muestra del boceto Arduino para configurarlo:


// Arduino as SPI Slave

#include 

volatile byte receivedData = 0;

void setup() {
  // Initialize serial communication for debugging
  Serial.begin(9600);

  // Set MISO as output
  pinMode(MISO, OUTPUT);

  // Enable SPI in Slave Mode
  SPCR |= _BV(SPE);
  SPI.attachInterrupt();
}

ISR(SPI_STC_vect) {
  receivedData = SPDR;
}

void loop() {
  if (receivedData) {
    Serial.print("Received: ");
    Serial.println(receivedData);
    receivedData = 0;
  }
}

Explicación:

  • Spi.attachinterrupt (); habilita la interrupción SPI, lo que permite que el Arduino maneje los datos entrantes.
  • En la rutina de servicio de interrupción ISR(SPI_STC_vect), los datos recibidos se almacenan para su procesamiento.
  • El loop() Comprobaciones de funciones para datos recibidos e imprime al monitor en serie.

Configuración de Raspberry Pi

La Raspberry Pi actuará como el dispositivo SPI Master. Usaremos Python con el spidev Biblioteca para manejar la comunicación SPI. Primero, asegúrese de que SPI esté habilitado:

  • Abra la herramienta de configuración de Raspberry Pi:
    sudo raspi-config
  • Navegar por Opciones de interfaz > SPI > Permitir
  • Reinicie la Raspberry Pi si se le solicita.

Instalar el spidev Biblioteca si aún no está instalado:

sudo apt-get install python3-spidev

Aquí hay una muestra de script de Python para Raspberry Pi:

# Raspberry Pi as SPI Master

import spidev
import time

# Open SPI bus 0, device (CS) 0
spi = spidev.SpiDev()
spi.open(0, 0)

# Set SPI speed and mode
spi.max_speed_hz = 50000
spi.mode = 0

def send_data(data):
    """Send a single byte to the SPI slave"""
    response = spi.xfer2([data])
    return response

try:
    while True:
        data = 42  # Example data byte
        print(f"Sending: {data}")
        resp = send_data(data)
        print(f"Received: {resp[0]}")
        time.sleep(1)

except KeyboardInterrupt:
    spi.close()

Explicación:

  • spi.open (0, 0) Abre el bus SPI 0, dispositivo 0 (CE0).
  • Spi.xfer2 ([datos]) envía el byte de datos y recibe simultáneamente datos del esclavo.
  • El script envía un byte (por ejemplo, 42) cada segundo e imprime la respuesta del Arduino.

Probar la comunicación

Después de configurar tanto el Arduino como la Raspberry PI:

  1. Sube el boceto Arduino a la Junta Arduino.
  2. Conecte el Arduino a la Raspberry Pi a través del cableado SPI.
  3. Ejecute el script de Python en la Raspberry Pi:
    python3 spi_master.py
  4. Abra el monitor de serie Arduino para ver los datos recibidos:
    Tools > Serial Monitor

Debería ver que el Arduino recibe los datos enviados por Raspberry Pi y mostrándolos en el monitor en serie. Del mismo modo, el Raspberry Pi mostrará los datos que envía y la respuesta que recibe.

Consejos de resolución de problemas

  • Verifique el cableado: Asegúrese de que todas las conexiones entre Arduino y Raspberry Pi estén seguras y asignadas correctamente.
  • Niveles de voltaje: Use un convertidor de nivel lógico para que coincida con los 3.3V de la Raspberry Pi con el 5V del Arduino.
  • Habilitar SPI: Verifique que SPI esté habilitado en la Raspberry Pi usando raspi-config.
  • Permisos: Asegúrese de que su usuario tenga los permisos necesarios para acceder a dispositivos SPI. Es posible que deba ejecutar su guión de Python con sudo.
  • Tasa de baudios: Asegúrese de que el monitor en serie y el boceto Arduino estén utilizando la misma velocidad de baudios.
  • Configuración de SPI: Asegúrese de que tanto el maestro como el esclavo estén configurados con el mismo modo SPI y velocidad.

Conclusión

El uso de la comunicación SPI entre un Arduino y una Raspberry Pi le permite aprovechar las fortalezas de ambas plataformas de manera efectiva. Ya sea que esté construyendo un sistema robótico complejo, desarrollar una red de sensores o experimentar con el registro de datos, comprender SPI es invaluable. Siguiendo los pasos descritos en esta guía, puede configurar una comunicación SPI confiable y embarcarse en emocionantes proyectos integrados que aprovechan el poder de Arduino y Raspberry Pi.

¡Feliz tinking!

Escribir un comentario

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.