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:
- Prześlij szkic Arduino na planszę Arduino.
- Podłącz Arduino do Raspberry Pi za pomocą okablowania SPI.
- Uruchom skrypt Python na Raspberry Pi:
python3 spi_master.py
- 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!