Jak korzystać z komunikacji SPI z Arduino i Raspberry Pi

Serial Peripheral Interface (SPI) jest synchronicznym protokołem komunikacji szeregowej szeroko stosowanej do komunikacji na krótkich odległości, głównie w systemach osadzonych. Połączenie wszechstronności Arduino z mocą obliczeniową Raspberry PI poprzez SPI może otworzyć mnóstwo możliwości projektu. W tym poście na blogu zbadamy, jak skonfigurować i korzystać z komunikacji SPI między Arduino a Raspberry Pi.

Zrozumienie SPI

SPI to protokół komunikacji pełnego dupleksu, który działa w trybie master-niewolnicy. Używa czterech głównych linii:

  • MOSI (Master Out Slave in): Przenosi dane z głównego do niewolnika.
  • Miso (mistrz w niewolniku): Przenosi dane z niewolnika na master.
  • SCLK (zegar szeregowy): Synchronizuje transmisję danych generowaną przez Master.
  • SS/CS (Slave Select/Chip Select): Wybiera urządzenie niewolników.

SPI jest preferowany ze względu na swoją prostotę i szybkość, co czyni go idealnym do aplikacji wymagających szybkiej wymiany danych między urządzeniami.

Po co używać SPI z Arduino i Raspberry Pi?

Łączenie Arduino z malinowym PI wykorzystuje mocne strony obu platform. Arduino wyróżnia się kontrolą sprzętu na niskim poziomie w czasie rzeczywistym, podczas gdy Raspberry Pi oferuje możliwości przetwarzania na wysokim poziomie, łączność sieciową i bogate środowisko systemu operacyjnego. Korzystanie z SPI pozwala tym dwóm urządzeniom skutecznie komunikować się, umożliwiając złożone projekty, takie jak systemy automatyzacji domowej, robotyka i aplikacje do rejestrowania danych.

Konfigurowanie sprzętu

Aby ustanowić komunikację SPI między Arduino a Raspberry Pi, potrzebujesz następujących elementów:

  • Arduino UNO (lub dowolna kompatybilna płyta Arduino)
  • Raspberry Pi (dowolny model z szpilkami GPIO)
  • Przewody zworki
  • Breadboard (opcjonalnie)

Okablowanie Arduino i Raspberry Pi dla SPI

Ostrożne okablowanie ma kluczowe znaczenie dla zapewnienia prawidłowej komunikacji. Oto jak podłączyć Arduino i Raspberry Pi za pomocą SPI:

Raspberry Pi GPIO PIN Arduino Opis
GPIO10 (MOSI) PIN 11 (MOSI) Opanuj niewolnik
GPIO9 (MISO) PIN 12 (MISO) Mistrz w niewolniku
GPIO11 (SCLK) Pin 13 (SCLK) Zegar szeregowy
GPIO8 (CE0) Pin 10 (ss) Wybierz niewolnika
GND GND Wspólna płaszczyzna
3,3 V. 5v Zasilacz (w razie potrzeby przesunięcie poziomu użycia)

Notatka: Raspberry Pi działa na poziomie logiki 3,3 V, podczas gdy Arduino Uno używa 5V. Zaleca się użycie konwertera poziomu logicznego, aby zapobiec potencjalnym uszkodzeniu Raspberry Pi.

Konfigurowanie Arduino

Arduino będzie działać jako urządzenie SLAVE SPI. Poniżej znajduje się przykładowy szkic Arduino, aby go skonfigurować:


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

Wyjaśnienie:

  • SPI.ATATCHINTERRUT (); Umożliwia przerwanie SPI, umożliwiając Arduino obsługa danych przychodzących.
  • W rutynie usługi przerwania ISR(SPI_STC_vect), Otrzymane dane są przechowywane do przetwarzania.
  • . loop() Kontrola funkcji pod kątem otrzymanych danych i drukuje je do monitora szeregowego.

Konfigurowanie Raspberry Pi

Raspberry Pi będzie działać jako urządzenie Master SPI. Użyjemy Pythona z spidev Biblioteka do obsługi komunikacji SPI. Po pierwsze, upewnij się, że SPI jest włączone:

  • Otwórz narzędzie konfiguracyjne Raspberry Pi:
    sudo raspi-config
  • Przejść do Opcje interfejsu > SPI > Włączać
  • Uruchom ponownie Raspberry Pi, jeśli zostanie wyświetlony.

Zainstaluj spidev Biblioteka, jeśli nie jest jeszcze zainstalowana:

sudo apt-get install python3-spidev

Oto przykładowy skrypt Python dla 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()

Wyjaśnienie:

  • spi.open (0, 0) Otwiera Bus SPI 0, urządzenie 0 (CE0).
  • SPI.XFER2 ([dane]) Wysyła bajt danych i jednocześnie odbiera dane od niewolnika.
  • Skrypt wysyła bajt (np. 42) co sekundę i drukuje odpowiedź z Arduino.

Testowanie komunikacji

Po skonfigurowaniu zarówno Arduino i Raspberry Pi:

  1. Prześlij szkic Arduino na planszę Arduino.
  2. Podłącz Arduino do Raspberry Pi za pomocą okablowania SPI.
  3. Uruchom skrypt Python na Raspberry Pi:
    python3 spi_master.py
  4. Otwórz monitor szeregowy Arduino, aby wyświetlić odebrane dane:
    Tools > Serial Monitor

Powinieneś zobaczyć, jak Arduino otrzymują dane wysyłane przez Raspberry Pi i wyświetlające je w monitorze szeregowym. Podobnie Raspberry Pi wyświetli wysyłane dane i otrzymaną odpowiedź.

Wskazówki dotyczące rozwiązywania problemów

  • Sprawdź okablowanie: Upewnij się, że wszystkie połączenia między Arduino i Raspberry Pi są bezpieczne i poprawnie zmapowane.
  • Poziomy napięcia: Użyj konwertera poziomu logicznego, aby dopasować 3,3 V Raspberry Pi do 5 V Arduino.
  • Włącz SPI: Sprawdź, czy SPI jest włączone na Raspberry Pi za pomocą raspi-config.
  • Uprawnienia: Upewnij się, że użytkownik ma niezbędne uprawnienia do dostępu do urządzeń SPI. Być może będziesz musiał uruchomić skrypt Python z sudo.
  • Stawka BAUD: Upewnij się, że monitor szeregowy i szkic Arduino stosują tę samą szybkość transmisji.
  • Ustawienia SPI: Upewnij się, że zarówno główny, jak i niewolnik są skonfigurowane z tym samym trybem SPI i prędkości.

Wniosek

Korzystanie z komunikacji SPI między Arduino a Raspberry Pi pozwala skutecznie wykorzystać mocne strony obu platform. Niezależnie od tego, czy budujesz złożony system robotyki, opracowujesz sieć czujników, czy eksperymentujesz z rejestrowaniem danych, zrozumienie SPI jest nieocenione. Postępując zgodnie z krokami przedstawionymi w tym przewodniku, możesz skonfigurować niezawodną komunikację SPI i rozpocząć ekscytujące wbudowane projekty, które wykorzystują moc zarówno Arduino, jak i Raspberry Pi.

Szczęśliwy majsterkowanie!

Zostaw komentarz

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.