Seri periferik arayüz (SPI), öncelikle gömülü sistemlerde, kısa mesafeli iletişim için yaygın olarak kullanılan senkron bir seri iletişim protokolüdür. Arduino'nun çok yönlülüğünü SPI aracılığıyla Ahududu Pi'nin hesaplama gücüyle birleştirmek, çok sayıda proje olanakları açabilir. Bu blog yazısında, bir Arduino ve bir Raspberry Pi arasında SPI iletişiminin nasıl kurulacağını ve kullanılacağını keşfedeceğiz.
SPI'yı Anlamak
SPI, ana-köle modunda çalışan tam çift yönlü bir iletişim protokolüdür. Dört ana satır kullanır:
- Mosi (köle dışarı ustalaşın): Verileri ustadan köle aktarır.
- Miso (köle dışarıda usta): Verileri köleden ustaya aktarır.
- SCLK (seri saat): Master tarafından oluşturulan veri iletimini senkronize eder.
- SS/CS (Slave Select/Chip Select): Köle cihazını seçer.
SPI, sadeliği ve hızı ile tercih edilir, bu da cihazlar arasında hızlı veri alışverişi gerektiren uygulamalar için idealdir.
Neden Arduino ve Raspberry Pi ile SPI kullanıyorsunuz?
Bir Arduino'yu bir Raspberry Pi ile birleştirmek her iki platformun güçlü yönlerinden yararlanır. Arduino gerçek zamanlı, düşük seviyeli donanım kontrolünde mükemmelleşirken, Raspberry Pi yüksek seviyeli işleme özellikleri, ağ bağlantısı ve zengin bir işletim sistemi ortamı sunar. SPI kullanmak, bu iki cihazın verimli iletişim kurmasına izin vererek ev otomasyon sistemleri, robotik ve veri günlüğü uygulamaları gibi karmaşık projeleri mümkün kılar.
Donanımı Ayarlama
Bir Arduino ve bir Raspberry Pi arasında SPI iletişimi oluşturmak için aşağıdaki bileşenlere ihtiyacınız olacak:
- Arduino Uno (veya herhangi bir uyumlu Arduino Kurulu)
- Raspberry Pi (GPIO pimleri olan herhangi bir model)
- Jumper telleri
- Breadboard (isteğe bağlı)
SPI için Arduino ve Raspberry Pi'nin kablolanması
Uygun iletişimi sağlamak için dikkatli kablolama çok önemlidir. SPI kullanarak Arduino ve Raspberry Pi'yi nasıl bağlayacağınız aşağıda açıklanmıştır:
Raspberry Pi GPIO PIN | Arduino pimi | Tanım |
---|---|---|
GPIO10 (MOSI) | Pim 11 (Mosi) | Köle ustalaşmak |
GPIO9 (MISO) | Pim 12 (miso) | Köle dışarıda usta |
GPIO11 (SCLK) | Pim 13 (SCLK) | Seri saat |
GPIO8 (CE0) | Pim 10 (SS) | Köle seç |
Gnd | Gnd | Ortak |
3.3v | 5V | Güç kaynağı (Gerekirse Seviye Değişimi Kullanın) |
Not: Raspberry Pi 3.3V mantık seviyelerinde çalışırken, Arduino Uno 5V kullanıyor. Ahududu Pi'ye potansiyel hasarı önlemek için bir mantık seviyesi dönüştürücü kullanılması önerilir.
Arduino'yu yapılandırma
Arduino SPI köle cihazı olarak hareket edecek. Aşağıda ayarlamak için bir örnek arduino taslağı var:
// 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;
}
}
Açıklama:
- Spi.attachInTRIPT (); Arduino'nun gelen verileri işlemesine izin vererek SPI kesintisini etkinleştirir.
- Kesme hizmet rutininde
ISR(SPI_STC_vect)
, alınan veriler işleme için saklanır. - .
loop()
İşlev alınan verileri kontrol eder ve seri monitöre yazdırır.
Raspberry Pi'yi yapılandırma
Raspberry Pi, SPI ana cihazı olarak hareket edecek. Python'u spidev
SPI iletişimini işlemek için kütüphane. İlk olarak, SPI'nın etkin olduğundan emin olun:
- Raspberry Pi yapılandırma aracını açın:
sudo raspi-config
- Gezmek Arayüz seçenekleri > SPI > Olanak vermek
- İstenirse Raspberry Pi'yi yeniden başlatın.
Kurun spidev
Kütüphane zaten yüklenmemişse:
sudo apt-get install python3-spidev
İşte Raspberry Pi için örnek bir Python betiği:
# 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()
Açıklama:
- spi.open (0, 0) SPI Bus 0, Cihaz 0 (CE0) açar.
- spi.xfer2 ([veri]) Veri baytını gönderir ve aynı anda köleden veri alır.
- Komut dosyası her saniyede bir bayt (örn., 42) gönderir ve yanıtını Arduino'dan yazdırır.
İletişimi test etmek
Hem Arduino hem de Raspberry Pi'yi kurduktan sonra:
- Arduino eskizini Arduino kartına yükleyin.
- SPI kabloları aracılığıyla Arduino'yu Raspberry Pi'ye bağlayın.
- Raspberry Pi'de Python betiğini çalıştırın:
python3 spi_master.py
- Alınan verileri görüntülemek için Arduino seri monitörünü açın:
Tools > Serial Monitor
Raspberry Pi tarafından gönderilen verileri alıp seri monitörde görüntüleyen Arduino'nun görmelisiniz. Benzer şekilde, Raspberry Pi gönderdiği verileri ve aldığı yanıtı görüntüleyecektir.
Sorun Giderme İpuçları
- Kabloları kontrol edin: Arduino ve Raspberry Pi arasındaki tüm bağlantıların güvenli ve doğru bir şekilde eşlendiğinden emin olun.
- Voltaj seviyeleri: Raspberry Pi'nin 3.3V'si Arduino'nun 5V'si ile eşleşmesi için bir mantık seviyesi dönüştürücü kullanın.
-
SPI Etkinleştir: SPI'nin Raspberry Pi'de etkinleştirildiğini doğrulayın
raspi-config
. -
İzinler: Kullanıcınızın SPI cihazlarına erişmek için gerekli izinlere sahip olduğundan emin olun. Python betiğinizi ile çalıştırmanız gerekebilir
sudo
. - BAUD ORAN: Seri monitör ve Arduino eskizinin aynı baud hızını kullandığından emin olun.
- SPI ayarları: Hem master hem de köleyin aynı SPI modu ve hız ile yapılandırıldığından emin olun.
Çözüm
Bir Arduino ve Raspberry Pi arasındaki SPI iletişimi kullanmak, her iki platformun güçlü yönlerini etkili bir şekilde kullanmanıza olanak tanır. İster karmaşık bir robot sistemi oluşturun, ister bir sensör ağı geliştiriyor olun, ister veri günlüğünü denemek, SPI'yi anlamak paha biçilmezdir. Bu kılavuzda belirtilen adımları izleyerek, güvenilir SPI iletişimi kurabilir ve hem Arduino hem de Raspberry Pi'nin gücünden yararlanan heyecan verici gömülü projelere başlayabilirsiniz.Mutlu Tinkering!