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:
- Upload de Arduino -schets naar het Arduino -bord.
- Sluit de Arduino aan op de Raspberry Pi via de SPI -bedrading.
- Voer het Python -script uit op de Raspberry Pi:
python3 spi_master.py
- 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!