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:
- Carica lo schizzo Arduino nella scheda Arduino.
- Collegare l'Arduino al Raspberry Pi tramite il cablaggio SPI.
- Esegui lo script Python su Raspberry Pi:
python3 spi_master.py
- 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!