Cum se folosește comunicarea SPI cu Arduino și Raspberry Pi

Interfața periferică serială (SPI) este un protocol de comunicare serială sincronă utilizat pe scară largă pentru comunicarea la distanță scurtă, în principal în sistemele încorporate. Combinarea versatilității Arduino cu puterea de calcul a Raspberry PI prin SPI poate deschide o multitudine de posibilități de proiect. În această postare pe blog, vom explora cum să configurați și să folosim comunicarea SPI între un Arduino și un Raspberry Pi.

Înțelegerea SPI

SPI este un protocol de comunicare complet duplex care funcționează în modul master-sclave. Utilizează patru linii principale:

  • MOSI (Master Out Slave In): Transferează date de la master la sclav.
  • Miso (stăpân în sclav afară): Transferează date de la sclav la master.
  • SCLK (ceas în serie): Sincronizează transmisia de date generată de master.
  • SS/CS (SLAVE SELECT/CHIP SELECT): Selectează dispozitivul sclav.

SPI este favorizat pentru simplitatea și viteza sa, ceea ce îl face ideal pentru aplicațiile care necesită schimb de date rapide între dispozitive.

De ce să folosiți SPI cu Arduino și Raspberry Pi?

Combinarea unui Arduino cu un Raspberry Pi folosește punctele forte ale ambelor platforme. Arduino excelează la un control hardware în timp real, la nivel scăzut, în timp ce Raspberry Pi oferă capacități de procesare la nivel înalt, conectivitate la rețea și un mediu bogat de sistem de operare. Utilizarea SPI permite acestor două dispozitive să comunice eficient, permițând proiecte complexe precum sisteme de automatizare la domiciliu, robotică și aplicații de înregistrare a datelor.

Configurarea hardware -ului

Pentru a stabili comunicarea SPI între un Arduino și un Raspberry PI, veți avea nevoie de următoarele componente:

  • Arduino Uno (sau orice tablă Arduino compatibilă)
  • Raspberry Pi (orice model cu pini GPIO)
  • Fire de jumper
  • Panoul de pâine (opțional)

Cablarea Arduino și Raspberry Pi pentru SPI

Cablarea atentă este crucială pentru a asigura o comunicare adecvată. Iată cum să conectați Arduino și Raspberry Pi folosind SPI:

Pin de zmeură PI GPIO Pinul Arduino Descriere
GPIO10 (MOSI) Pinul 11 ​​(MOSI) Stăpânește sclavul în
GPIO9 (miso) Pinul 12 (miso) Stăpâni în sclav afară
GPIO11 (SCLK) Pinul 13 (SCLK) Ceas în serie
GPIO8 (CE0) Pinul 10 (SS) Select sclav
GND GND Teren comun
3.3V 5V Sursa de alimentare (schimbarea nivelului de utilizare, dacă este necesar)

Nota: Raspberry Pi funcționează la niveluri logice de 3,3 V, în timp ce Arduino Uno folosește 5V. Se recomandă utilizarea unui convertor de nivel logic pentru a preveni deteriorarea potențială a zmeurii PI.

Configurarea Arduino

Arduino va acționa ca dispozitiv SPI Slave. Mai jos este o eșantion de schiță Arduino pentru a o configura:


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

Explicaţie:

  • SPI.attachInterrupt (); Permite întreruperea SPI, permițând lui Arduino să se ocupe de datele primite.
  • În rutina serviciului de întrerupere ISR(SPI_STC_vect), datele primite sunt stocate pentru procesare.
  • loop() Funcția verifică datele primite și le tipărește la monitorul în serie.

Configurarea Raspberry Pi

Raspberry Pi va acționa ca dispozitiv SPI Master. Vom folosi python cu spidev Biblioteca pentru a gestiona comunicarea SPI. În primul rând, asigurați -vă că SPI este activat:

  • Deschideți instrumentul de configurare Raspberry PI:
    sudo raspi-config
  • Navigați la Opțiuni de interfață > SPI > Permite
  • Reporniți Raspberry Pi dacă vi se solicită.

Instalați spidev biblioteca dacă nu este deja instalată:

sudo apt-get install python3-spidev

Iată un eșantion de script Python pentru 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()

Explicaţie:

  • SPI.Open (0, 0) Deschide SPI Bus 0, dispozitiv 0 (CE0).
  • SPI.xfer2 ([date]) Trimite octetul de date și primește simultan date de la sclav.
  • Scriptul trimite un octet (de exemplu, 42) în fiecare secundă și tipărește răspunsul de la Arduino.

Testarea comunicării

După configurarea atât Arduino, cât și Raspberry PI:

  1. Încărcați schița Arduino pe tabloul Arduino.
  2. Conectați Arduino la Raspberry Pi prin intermediul cablului SPI.
  3. Rulați scriptul Python pe Raspberry Pi:
    python3 spi_master.py
  4. Deschideți Monitorul Serial Arduino pentru a vizualiza datele primite:
    Tools > Serial Monitor

Ar trebui să vedeți Arduino primind datele trimise de Raspberry Pi și afișându -l în monitorul serial. În mod similar, Raspberry Pi va afișa datele pe care le trimite și răspunsul pe care îl primește.

Sfaturi de depanare

  • Verificați cablarea: Asigurați -vă că toate conexiunile dintre Arduino și Raspberry Pi sunt sigure și mapate corect.
  • Niveluri de tensiune: Utilizați un convertor de nivel logic pentru a se potrivi cu 3.3V -ul Raspberry Pi cu 5V -ul Arduino.
  • Activați SPI: Verificați dacă SPI este activat pe Raspberry Pi folosind raspi-config.
  • Permisiuni: Asigurați -vă că utilizatorul dvs. are permisiunile necesare pentru a accesa dispozitivele SPI. S -ar putea să fie nevoie să rulați scriptul Python cu sudo.
  • Rata de transfer: Asigurați -vă că monitorul în serie și schița Arduino folosesc aceeași rată de transfer.
  • Setări SPI: Asigurați -vă că atât maestrul cât și sclavul sunt configurate cu același mod SPI și viteză.

Concluzie

Utilizarea comunicării SPI între un Arduino și un Raspberry PI vă permite să valorificați în mod eficient punctele forte ale ambelor platforme. Indiferent dacă construiți un sistem de robotică complex, dezvoltați o rețea de senzori sau experimentați cu exploatarea de date, înțelegerea SPI este de neprețuit. Urmărind pașii prezentate în acest ghid, puteți configura o comunicare SPI fiabilă și puteți porni în proiecte încorporate interesante care utilizează puterea atât a lui Arduino, cât și a Raspberry Pi.

Tinkering fericit!

Lasă un comentariu

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.