Sarjaperifeerinen rajapinta (SPI) on synkroninen sarjaviestintäprotokolla, jota käytetään laajasti lyhyen matkan viestinnässä, pääasiassa sulautetuissa järjestelmissä. Yhdistämällä Arduinon monipuolisuus Raspberry Pi: n laskennalliseen voimaan SPI: n kautta voi avata joukon projektimahdollisuuksia. Tässä blogiviestissä tutkimme, kuinka SPI -viestintä Arduinon ja Raspberry Pi: n välillä voidaan asentaa ja käyttää.
SPI: n ymmärtäminen
SPI on koko duplex-viestintäprotokolla, joka toimii master-orjatilassa. Se käyttää neljä päälinjaa:
- Mosi (Master Out Slave in): Siirtää tietoja päälliköstä orjalle.
- MISO (Mestari Slave Out): Siirtää tietoja orjasta mestariin.
- SCLK (sarjakello): Synkronoi päällikön luoman tiedonsiirron.
- SS/CS (Slave Select/Chip Select): Valitsee orjalaitteen.
SPI on suosittu sen yksinkertaisuudesta ja nopeudesta, joten se on ihanteellinen sovelluksille, jotka vaativat nopean tiedonvaihtoa laitteiden välillä.
Miksi käyttää SPI: tä Arduinon ja Raspberry Pi: n kanssa?
Arduinon yhdistäminen Raspberry PI: n kanssa hyödyntää molempien alustojen vahvuuksia. Arduino on erinomainen reaaliaikaisessa, matalan tason laitteistohallinnassa, kun taas Raspberry PI tarjoaa korkean tason käsittelyominaisuuksia, verkkoyhteyksiä ja rikkaan käyttöjärjestelmäympäristön. SPI: n käyttö antaa näiden kahden laitteen kommunikoida tehokkaasti, mahdollistaen monimutkaiset projektit, kuten kodin automaatiojärjestelmät, robotiikka ja tiedon kirjaussovellukset.
Laitteiden asettaminen
SPI -viestinnän luomiseksi Arduinon ja Raspberry PI: n välillä tarvitset seuraavat komponentit:
- Arduino UNO (tai mikä tahansa yhteensopiva Arduino Board)
- Raspberry Pi (mikä tahansa malli, jolla on GPIO -nastat)
- Hyppyjohdot
- Leipälevy (valinnainen)
Arduino ja Raspberry Pi SPI: lle
Huolellinen johdotus on ratkaisevan tärkeää asianmukaisen viestinnän varmistamiseksi. Näin yhdistää Arduino ja Raspberry Pi SPI: n avulla:
Raspberry Pi GPIO -tappi | Arduino -nasta | Kuvaus |
---|---|---|
GPIO10 (MOSI) | Tappi 11 (mosi) | Hallita orja |
GPIO9 (MISO) | Tappi 12 (MISO) | Mestarina |
GPIO11 (SCLK) | Tappi 13 (SCLK) | Sarjakello |
GPIO8 (CE0) | Tappi 10 (SS) | Slave Select |
Hölynpöly | Hölynpöly | Yhteinen kanta |
3,3 V | 5V | Virtalähde (käytä tarvittaessa tasonsiirtoa) |
Huomaa: Raspberry PI toimii 3,3 V: n logiikkatasoilla, kun taas Arduino UNO käyttää 5 V. On suositeltavaa käyttää logiikkatason muunninta, jotta vadelma PI: n mahdolliset vauriot estävät.
Arduinon määrittäminen
Arduino toimii SPI -orjana. Alla on näyte Arduino -luonnos sen asettamiseksi:
// 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;
}
}
Selitys:
- Spi.attachInterrupt (); Mahdollistaa SPI -keskeytyksen, jolloin Arduino pystyy käsittelemään saapuvia tietoja.
- Keskeytyspalvelun rutiinissa
ISR(SPI_STC_vect)
, Vastaanotetut tiedot tallennetaan käsittelyyn. - Se
loop()
Toiminto tarkistaa vastaanotetut tiedot ja tulostaa sen sarjamonitorille.
Raspberry Pi -sovelluksen määrittäminen
Raspberry Pi toimii SPI -päälaitteena. Käytämme pythonia spidev
Kirjasto käsittelee SPI -viestintää. Varmista ensin, että SPI on käytössä:
- Avaa Raspberry Pi -määritystyökalu:
sudo raspi-config
- Siirtyä jhk Käyttöliittymävaihtoehdot > SPI > Ottaa käyttöön
- Käynnistä Raspberry Pi uudelleen, jos sitä pyydetään.
Asenna spidev
Kirjasto, jos sitä ei ole vielä asennettu:
sudo apt-get install python3-spidev
Tässä on näyte Python -käsikirjoitus 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()
Selitys:
- Spi.Open (0, 0) Avaa SPI -väylä 0, laite 0 (CE0).
- Spi.xfer2 ([data]) lähettää datatavut ja vastaanottaa samanaikaisesti tietoja orjalta.
- Käsikirjoitus lähettää tavun (esim. 42) joka sekunti ja tulostaa vastauksen Arduinosta.
Viestintä
Kun olet asettanut sekä Arduino että Raspberry Pi:
- Lataa Arduino -luonnos Arduino -levylle.
- Kytke Arduino Raspberry Pi: hen SPI -johdotuksen kautta.
- Suorita python -käsikirjoitus Raspberry Pi:
python3 spi_master.py
- Avaa Arduino -sarjamonitori katsomaan vastaanotettuja tietoja:
Tools > Serial Monitor
Sinun pitäisi nähdä Arduinon vastaanottava Raspberry PI: n lähettämät tiedot ja näyttää sen sarjamonitorissa. Samoin Raspberry Pi näyttää lähettämänsä tiedot ja sen vastaanottaman vastauksen.
Vianetsintävinkit
- Tarkista johdotus: Varmista, että kaikki Arduinon ja Raspberry Pi: n väliset yhteydet ovat turvallisia ja kartoitettuja oikein.
- Jännitetasot: Käytä logiikkatason muunninta vastaamaan Raspberry Pi: n 3,3 V: n Arduinon 5 V: n kanssa.
-
Ota SPI käyttöön: Varmista, että SPI on käytössä Raspberry Pi: ssä
raspi-config
. -
Käyttöoikeudet: Varmista, että käyttäjälläsi on tarvittavat käyttöoikeudet käyttää SPI -laitteita. Saatat joutua suorittamaan python -komentosarjan kanssa
sudo
. - Baud -arvo: Varmista, että sarjamonitori ja Arduino -luonnos käyttävät samaa baudia.
- SPI -asetukset: Varmista, että sekä isäntä että orja on määritetty samalla SPI -tilalla ja nopeudella.
Johtopäätös
SPI -viestintä Arduinon ja Raspberry PI: n välillä antaa sinun hyödyntää molempien alustojen voimakkuutta tehokkaasti. Rakennatko monimutkaista robottijärjestelmää, anturiverkon kehittäminen tai tiedon kirjaamisen kokeileminen, SPI: n ymmärtäminen on korvaamatonta. Seuraamalla tässä oppaassa hahmoteltuja vaiheita voit asettaa luotettavan SPI -viestinnän ja aloittaa jännittäviä sulautettuja projekteja, jotka hyödyntävät sekä Arduinon että Raspberry Pi: n voimaa.Hyvää tinking!