Come usare la comunicazione SPI con Arduino e Raspberry Pi

L'interfaccia periferica seriale (SPI) è un protocollo di comunicazione seriale sincrono ampiamente utilizzato per la comunicazione a breve distanza, principalmente in sistemi incorporati. Combinando la versatilità dell'Arduino con la potenza computazionale di Raspberry Pi attraverso SPI può aprire una pletora di possibilità di progetto. In questo post sul blog, esploreremo come impostare e utilizzare la comunicazione SPI tra un Arduino e un Raspberry Pi.

Comprensione SPI

SPI è un protocollo di comunicazione full duplex che opera in modalità master-slave. Utilizza quattro linee principali:

  • MOSI (Master Out Slave In): Trasferisce i dati dal master allo slave.
  • Miso (Master in Slave Out): Trasferisce i dati da slave a padrone.
  • SCLK (orologio seriale): Sincronizza la trasmissione di dati generata dal master.
  • SS/CS (Slave Select/Chip Select): Seleziona il dispositivo slave.

SPI è favorito per la sua semplicità e velocità, rendendolo ideale per le applicazioni che richiedono uno scambio di dati rapidi tra i dispositivi.

Perché usare SPI con Arduino e Raspberry Pi?

La combinazione di un Arduino con un Raspberry Pi sfrutta i punti di forza di entrambe le piattaforme. L'Arduino eccelle nel controllo hardware di basso livello in tempo reale, mentre Raspberry Pi offre capacità di elaborazione di alto livello, connettività di rete e un ricco ambiente del sistema operativo. L'uso di SPI consente a questi due dispositivi di comunicare in modo efficiente, consentendo progetti complessi come sistemi di automazione domestica, robotica e applicazioni di registrazione dei dati.

Impostazione dell'hardware

Per stabilire la comunicazione SPI tra un Arduino e un Raspberry Pi, avrai bisogno dei seguenti componenti:

  • Arduino Uno (o qualsiasi scheda Arduino compatibile)
  • Raspberry Pi (qualsiasi modello con pin GPIO)
  • Fili jumper
  • Breadboard (opzionale)

Cablaggio dell'Arduino e Raspberry Pi per SPI

Cablaggio attento è fondamentale per garantire una comunicazione adeguata. Ecco come collegare l'Arduino e il Raspberry Pi usando SPI:

Pin gpiio di lampone Arduino Pin Descrizione
GPIO10 (MOSS) PIN 11 (MOSS) Padroneggiare lo schiavo
GPIO9 (miso) Pin 12 (miso) Master in Slave Out
GPIO11 (SCLK) PIN 13 (SCLK) Orologio seriale
GPIO8 (CE0) Pin 10 (SS) Slave Seleziona
GND GND Terreno comune
3.3v 5v Alimentazione (Usa il cambio di livello se necessario)

Nota: Raspberry Pi opera a livelli logici a 3,3 V, mentre Arduino Uno utilizza 5V. Si consiglia di utilizzare un convertitore a livello logico per prevenire potenziali danni al Raspberry Pi.

Configurazione dell'Arduino

L'Arduino fungerà da dispositivo SPI Slave. Di seguito è riportato uno schizzo Arduino campione per 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;
  }
}

Spiegazione:

  • SPI.ATTACHIRTRURT (); Abilita l'interrupt SPI, consentendo all'Arduino di gestire i dati in arrivo.
  • Nella routine di servizio di interruzione ISR(SPI_STC_vect), i dati ricevuti vengono archiviati per l'elaborazione.
  • IL loop() Controlla la funzione per i dati ricevuti e li stampa sul monitor seriale.

Configurazione di Raspberry Pi

Raspberry Pi fungerà da dispositivo Master SPI. Useremo Python con il spidev Biblioteca per gestire la comunicazione SPI. Innanzitutto, assicurarsi che SPI sia abilitato:

  • Apri lo strumento di configurazione Raspberry Pi:
    sudo raspi-config
  • Navigare a Opzioni di interfaccia > Sp > Abilitare
  • Riavvia il Raspberry Pi se richiesto.

Installa il spidev Biblioteca se non è già installata:

sudo apt-get install python3-spidev

Ecco uno script di Python di esempio per 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()

Spiegazione:

  • sp.open (0, 0) Apre il bus SPI 0, dispositivo 0 (CE0).
  • SPI.XFER2 ([Data]) Invia il byte di dati e riceve contemporaneamente i dati dallo slave.
  • Lo script invia un byte (ad es. 42) ogni secondo e stampa la risposta da Arduino.

Testare la comunicazione

Dopo aver impostato sia Arduino che Raspberry Pi:

  1. Carica lo schizzo Arduino nella scheda Arduino.
  2. Collegare l'Arduino al Raspberry Pi tramite il cablaggio SPI.
  3. Esegui lo script Python su Raspberry Pi:
    python3 spi_master.py
  4. Apri il monitor seriale Arduino per visualizzare i dati ricevuti:
    Tools > Serial Monitor

Dovresti vedere Arduino ricevere i dati inviati da Raspberry Pi e visualizzarli nel monitor seriale. Allo stesso modo, Raspberry Pi visualizzerà i dati inviati e la risposta che riceve.

Risoluzione dei problemi

  • Controlla il cablaggio: Assicurarsi che tutte le connessioni tra Arduino e Raspberry Pi siano sicuri e mappati correttamente.
  • Livelli di tensione: Utilizzare un convertitore a livello logico per abbinare il 3.3V di Raspberry Pi con il 5V dell'Arduino.
  • Abilita SPI: Verificare che SPI sia abilitato su Raspberry Pi utilizzando raspi-config.
  • Autorizzazioni: Assicurati che l'utente abbia le autorizzazioni necessarie per accedere ai dispositivi SPI. Potrebbe essere necessario eseguire il tuo script Python sudo.
  • Tasso di baud: Assicurarsi che il monitor seriale e lo schizzo Arduino utilizzino lo stesso tasso di baud.
  • Impostazioni SPI: Assicurarsi che sia il master che lo slave siano configurati con la stessa modalità SPI e velocità.

Conclusione

L'uso della comunicazione SPI tra un Arduino e un Raspberry Pi consente di sfruttare efficacemente i punti di forza di entrambe le piattaforme. Che tu stia costruendo un sistema di robotica complesso, sviluppando una rete di sensori o sperimentando la registrazione dei dati, la comprensione della SPI è preziosa. Seguendo i passaggi delineati in questa guida, è possibile impostare una comunicazione SPI affidabile e imbarcarsi su entusiasmanti progetti incorporati che sfruttano il potere di Arduino e Raspberry Pi.

Felice armeggiare!

Lascia un commento

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.