Hur man använder SPI -kommunikation med Arduino och Raspberry Pi

Seriellt perifert gränssnitt (SPI) är ett synkron seriekommunikationsprotokoll som används allmänt för kortdistanskommunikation, främst i inbäddade system. Att kombinera mångsidigheten hos Arduino med beräkningskraften hos Raspberry Pi genom SPI kan öppna upp en mängd projektmöjligheter. I det här blogginlägget undersöker vi hur man ställer in och använder SPI -kommunikation mellan en Arduino och en Raspberry Pi.

Förstå Spi

SPI är ett kommunikationsprotokoll med full duplex som fungerar i master-slavläge. Den använder fyra huvudlinjer:

  • Mosi (Master Out Slave i): Överför data från mästare till slav.
  • Miso (Master in Slave Out): Överför data från slav till mästare.
  • SCLK (serieklocka): Synkroniserar dataöverföring som genereras av befälhavaren.
  • SS/CS (Slave Select/Chip Select): Väljer slavenheten.

SPI gynnas för sin enkelhet och hastighet, vilket gör den idealisk för applikationer som kräver snabb datautbyte mellan enheter.

Varför använda SPI med Arduino och Raspberry Pi?

Att kombinera en Arduino med en Raspberry Pi utnyttjar styrkorna hos båda plattformarna. Arduino utmärker sig i realtid, hårdvarukontroll på låg nivå, medan Raspberry PI erbjuder bearbetningsfunktioner på hög nivå, nätverksanslutning och en rik operativsystemmiljö. Genom att använda SPI gör det möjligt för dessa två enheter att kommunicera effektivt, vilket möjliggör komplexa projekt som Home Automation Systems, Robotics och Data Logging Applications.

Ställa in hårdvaran

För att upprätta SPI -kommunikation mellan en Arduino och en Raspberry Pi behöver du följande komponenter:

  • Arduino Uno (eller någon kompatibel Arduino -styrelse)
  • Raspberry Pi (vilken modell som helst med GPIO -stift)
  • Bulttrådar
  • Breadboard (valfritt)

Kopplar Arduino och Raspberry Pi för SPI

Försiktiga ledningar är avgörande för att säkerställa korrekt kommunikation. Så här ansluter du Arduino och Raspberry Pi med SPI:

Hallon pi gpio stift Arduinosnål Beskrivning
GPIO10 (MOSI) Stift 11 (MOSI) Behärska slaven i
GPIO9 (MISO) Stift 12 (MISO) Mästare i slaven ut
GPIO11 (SCLK) Stift 13 (SCLK) Serieklocka
GPIO8 (CE0) Stift 10 (SS) Slavval
Gard Gard Gemensam
3.3V 5V Strömförsörjning (användningsnivåförskjutning vid behov)

Notera: Raspberry PI fungerar på 3,3V logiknivåer, medan Arduino UNO använder 5V. Det rekommenderas att använda en logiknivåomvandlare för att förhindra potentiella skador på Raspberry Pi.

Konfigurera Arduino

Arduino kommer att fungera som SPI -slavenheten. Nedan följer ett prov Arduino -skiss för att ställa in den:


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

Förklaring:

  • Spi.AttachInterrupt (); gör det möjligt för SPI -avbrottet, vilket gör att Arduino kan hantera inkommande data.
  • I avbrottstjänstrutinen ISR(SPI_STC_vect), de mottagna uppgifterna lagras för behandling.
  • De loop() Funktionskontroller för mottagna data och skriver ut den till seriell monitor.

Konfigurera Raspberry Pi

Raspberry Pi kommer att fungera som SPI Master -enheten. Vi använder python med spidev Bibliotek för att hantera SPI -kommunikation. Först, se till att SPI är aktiverat:

  • Öppna Raspberry PI -konfigurationsverktyget:
    sudo raspi-config
  • Navigera till Gränssnittsalternativ > Spi > Möjliggöra
  • Starta om Raspberry Pi om den uppmanas.

Installera spidev bibliotek om det inte redan är installerat:

sudo apt-get install python3-spidev

Här är ett prov Python -skript för 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()

Förklaring:

  • spi.open (0, 0) Öppnar SPI -buss 0, enhet 0 (CE0).
  • spi.xfer2 ([data]) Skickar databyten och tar samtidigt data från slaven.
  • Skriptet skickar en byte (t.ex. 42) varje sekund och skriver ut svaret från Arduino.

Testa kommunikationen

Efter att ha ställt in både Arduino och Raspberry Pi:

  1. Ladda upp Arduino -skissen till Arduino -styrelsen.
  2. Anslut Arduino till Raspberry Pi via SPI -ledningar.
  3. Kör Python -skriptet på Raspberry Pi:
    python3 spi_master.py
  4. Öppna Arduino Serial Monitor för att se de mottagna uppgifterna:
    Tools > Serial Monitor

Du bör se Arduino ta emot de uppgifter som skickas av Raspberry Pi och visa dem i seriemonitorn. På liknande sätt kommer Raspberry Pi att visa de data som den skickar och svaret den får.

Felsökningstips

  • Kontrollera ledningar: Se till att alla anslutningar mellan Arduino och Raspberry Pi är säkra och korrekt mappade.
  • Spänningsnivåer: Använd en logiknivåomvandlare för att matcha 3,3V av Raspberry Pi med 5V av Arduino.
  • Aktivera SPI: Kontrollera att SPI är aktiverat på Raspberry Pi med raspi-config.
  • Behörigheter: Se till att din användare har nödvändiga behörigheter för att komma åt SPI -enheter. Du kanske måste köra ditt Python -skript med sudo.
  • Baudhastighet: Se till att seriell monitor och Arduino -skissen använder samma baudhastighet.
  • SPI -inställningar: Se till att både mästaren och slaven är konfigurerade med samma SPI -läge och hastighet.

Slutsats

Genom att använda SPI -kommunikation mellan en Arduino och en Raspberry PI kan du utnyttja styrkorna hos båda plattformarna effektivt. Oavsett om du bygger ett komplext robotiksystem, att utveckla ett sensornätverk eller experimentera med datavoggning är det ovärderligt att förstå SPI. Genom att följa stegen som beskrivs i den här guiden kan du ställa in pålitlig SPI -kommunikation och gå in på spännande inbäddade projekt som utnyttjar kraften hos både Arduino och Raspberry Pi.

Glad tippning!

Lämna en kommentar

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.