Hoe SPI -communicatie te gebruiken met Arduino en Raspberry Pi

Seriële perifere interface (SPI) is een synchroon serieel communicatieprotocol dat veel wordt gebruikt voor communicatie met korte afstand, voornamelijk in ingebedde systemen. Het combineren van de veelzijdigheid van de Arduino met de rekenkracht van de Raspberry Pi via SPI kan een overvloed aan projectmogelijkheden openen. In deze blogpost zullen we onderzoeken hoe we SPI -communicatie kunnen instellen en gebruiken tussen een Arduino en een Raspberry Pi.

SPI begrijpen

SPI is een full-duplex communicatieprotocol dat in de master-slave-modus werkt. Het gebruikt vier hoofdlijnen:

  • MOSI (Master Out Slave In): Verbiedt gegevens van master naar slaaf.
  • Miso (meester in slaaf Out): Overdracht van gegevens van slaaf naar master.
  • SCLK (seriële klok): Synchroniseert gegevensoverdracht gegenereerd door de master.
  • SS/CS (Slave Select/Chip Select): Selecteert het slavenapparaat.

SPI heeft de voorkeur vanwege zijn eenvoud en snelheid, waardoor het ideaal is voor toepassingen die een snelle gegevensuitwisseling tussen apparaten vereisen.

Waarom SPI gebruiken met Arduino en Raspberry Pi?

Het combineren van een Arduino met een Raspberry Pi maakt gebruik van de sterke punten van beide platforms. De Arduino blinkt uit in realtime hardwarebesturing op laag niveau, terwijl de Raspberry Pi verwerkingsmogelijkheden op hoog niveau, netwerkconnectiviteit en een rijke besturingssysteemomgeving biedt. Door SPI te gebruiken, kunnen deze twee apparaten efficiënt communiceren, waardoor complexe projecten zoals thuisautomatiseringssystemen, robotica en gegevensloggingstoepassingen mogelijk worden.

De hardware instellen

Om SPI -communicatie tussen een Arduino en een Raspberry Pi vast te stellen, heb je de volgende componenten nodig:

  • Arduino Uno (of een compatibele Arduino Board)
  • Raspberry Pi (elk model met GPIO -pinnen)
  • Jumper draden
  • Breadboard (optioneel)

Bedrading van de Arduino en Raspberry Pi voor SPI

Zorgvuldige bedrading is cruciaal om een ​​goede communicatie te garanderen. Hier leest u hoe u de Arduino en Raspberry Pi verbindt met SPI:

Frambozen pi gpio pin Arduino Pin Beschrijving
GPIO10 (MOSI) Pin 11 (Mosi) Beheersen slaaf in
Gpio9 (miso) Pin 12 (miso) Meester in slaaf
GPIO11 (SCLK) Pin 13 (SCLK) Seriële klok
GPIO8 (CE0) Pin 10 (SS) Slaven selecteren
GND GND Gemeenschappelijke grond
3.3V 5V Voedingsvoorziening (gebruik niveaubissing indien nodig)

Opmerking: De Raspberry Pi werkt op 3,3V -logische niveaus, terwijl Arduino UNO 5V gebruikt. Het wordt aanbevolen om een ​​logische niveauomvormer te gebruiken om mogelijke schade aan de Raspberry Pi te voorkomen.

De Arduino configureren

De Arduino zal optreden als het SPI -slavenapparaat. Hieronder is een voorbeeld Arduino -schets om het in te stellen:


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

Uitleg:

  • Spi.AttachInterrupt (); Schakelt de SPI -interrupt in, waardoor de Arduino inkomende gegevens kan verwerken.
  • In de routine voor interrupt -services ISR(SPI_STC_vect), de ontvangen gegevens worden opgeslagen voor verwerking.
  • De loop() Functie controleert op ontvangen gegevens en drukt deze af naar de seriële monitor.

De Raspberry Pi configureren

De Raspberry Pi zal fungeren als het SPI -masterapparaat. We zullen Python gebruiken met de spidev bibliotheek om SPI -communicatie af te handelen. Zorg er eerst voor dat SPI is ingeschakeld:

  • Open de Raspberry Pi -configuratie -tool:
    sudo raspi-config
  • Navigeren naar Interface -opties > Spi > Inschakelen
  • Start de Raspberry Pi opnieuw op indien gevraagd.

Installeer de spidev bibliotheek als het nog niet is geïnstalleerd:

sudo apt-get install python3-spidev

Hier is een voorbeeldpython -script voor de 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()

Uitleg:

  • spi.open (0, 0) Opent SPI Bus 0, apparaat 0 (CE0).
  • spi.xfer2 ([data]) Verzendt de gegevens byte en ontvangt tegelijkertijd gegevens van de slaaf.
  • Het script verzendt elke seconde een byte (bijvoorbeeld 42) en drukt de reactie af van de Arduino.

De communicatie testen

Na het opzetten van zowel de Arduino als Raspberry Pi:

  1. Upload de Arduino -schets naar het Arduino -bord.
  2. Sluit de Arduino aan op de Raspberry Pi via de SPI -bedrading.
  3. Voer het Python -script uit op de Raspberry Pi:
    python3 spi_master.py
  4. Open de Arduino Serial Monitor om de ontvangen gegevens te bekijken:
    Tools > Serial Monitor

U zou zien dat de Arduino de gegevens ontvangt die door de Raspberry Pi worden verzonden en deze in de seriële monitor weergeven. Evenzo wordt de Raspberry Pi de gegevens weergegeven die deze verzendt en de reactie die het ontvangt.

Tips voor het oplossen van problemen

  • Controleer de bedrading: Zorg ervoor dat alle verbindingen tussen de Arduino en Raspberry Pi veilig zijn en correct in kaart worden gebracht.
  • Spanningsniveaus: Gebruik een logische niveauomvormer die overeenkomt met de 3.3V van de Raspberry Pi met de 5V van de Arduino.
  • Schakel SPI in: Controleer of SPI is ingeschakeld op de Raspberry Pi met behulp van raspi-config.
  • Machtigingen: Zorg ervoor dat uw gebruiker de nodige machtigingen heeft om toegang te krijgen tot SPI -apparaten. Misschien moet u uw Python -script uitvoeren sudo.
  • Baud -tarief: Zorg ervoor dat de seriële monitor en de Arduino -schets dezelfde baudrate gebruiken.
  • SPI -instellingen: Zorg ervoor dat zowel de master als de slaaf zijn geconfigureerd met dezelfde SPI -modus en snelheid.

Conclusie

Door SPI -communicatie tussen een Arduino en een Raspberry Pi te gebruiken, kunt u de sterke punten van beide platforms effectief benutten. Of u nu een complex robotica -systeem bouwt, een sensornetwerk ontwikkelt of experimenteert met gegevenslogging, het begrijpen van SPI is van onschatbare waarde. Door de stappen in deze gids te volgen, kunt u betrouwbare SPI -communicatie instellen en aan spannende ingebedde projecten beginnen die gebruikmaken van de kracht van zowel Arduino als Raspberry Pi.

Blij knutselen!

Laat een reactie achter

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.