כיצד להשתמש בתקשורת SPI עם Arduino ו- Raspberry Pi

ממשק היקפי סדרתי (SPI) הוא פרוטוקול תקשורת סדרתי סינכרוני הנמצא בשימוש נרחב לתקשורת למרחקים קצרים, בעיקר במערכות משובצות. שילוב הרבגוניות של הארדואינו עם כוח החישוב של ה- Raspberry Pi דרך SPI יכול לפתוח שפע של אפשרויות פרויקט. בפוסט בבלוג זה, נחקור כיצד להגדיר ולהשתמש בתקשורת SPI בין ארדואינו לפטל PI.

הבנת SPI

SPI הוא פרוטוקול תקשורת מלאה של דופלקס הפועל במצב עבד אדון. הוא משתמש בארבע קווים עיקריים:

  • MOSI (Master Out Slave In): מעביר נתונים מהמאסטר לעבד.
  • מיסו (אדון בעבד החוצה): מעביר נתונים מעבד לשלוט.
  • SCLK (שעון סדרתי): מסנכרן העברת נתונים שנוצר על ידי המאסטר.
  • SS/CS (Select Select/ChIP Select): בוחר את מכשיר העבדים.

SPI מועדף על הפשטות והמהירות שלו, מה שהופך אותו לאידיאלי ליישומים הדורשים החלפת נתונים מהירה בין מכשירים.

מדוע להשתמש ב- SPI עם Arduino ו- Raspberry Pi?

שילוב ארדואינו עם פטל PI ממנף את חוזקות שתי הפלטפורמות. הארדואינו מצטיין בבקרת חומרה ברמה אמת, ואילו ה- Raspberry PI מציע יכולות עיבוד ברמה גבוהה, קישוריות רשת וסביבת מערכת הפעלה עשירה. השימוש ב- SPI מאפשר לשני מכשירים אלה לתקשר ביעילות, מה שמאפשר פרויקטים מורכבים כמו מערכות אוטומציה ביתיות, רובוטיקה ויישומי רישום נתונים.

הגדרת החומרה

כדי לבסס תקשורת SPI בין ארדואינו ל- Raspberry Pi, תזדקק לרכיבים הבאים:

  • Arduino uno (או כל לוח ארדואינו תואם)
  • Raspberry Pi (כל דגם עם סיכות GPIO)
  • חוטי מגשר
  • לחם (אופציונלי)

חיווט הארדואינו והפטל PI עבור SPI

חיווט זהיר הוא קריטי בכדי להבטיח תקשורת נאותה. הנה כיצד לחבר את ה- Arduino ו- Raspberry Pi באמצעות SPI:

סיכת פטל pi gpio סיכת ארדואינו תֵאוּר
GPIO10 (MOSI) סיכה 11 (מוסי) לשלוט בעבד
Gpio9 (miso) סיכה 12 (מיסו) אדון בעבד החוצה
GPIO11 (SCLK) סיכה 13 (SCLK) שעון סדרתי
GPIO8 (CE0) סיכה 10 (SS) Sleabe Select
GND GND קרקע משותפת
3.3V 5V אספקת חשמל (השתמש בהעברת רמה במידת הצורך)

פֶּתֶק: ה- Raspberry Pi פועל ברמות לוגיקה של 3.3 וולט, ואילו Arduino UNO משתמש ב- 5V. מומלץ להשתמש בממיר ברמת ההיגיון כדי למנוע נזק פוטנציאלי ל- Raspberry Pi.

קביעת תצורה של Arduino

הארדואינו ישמש כמכשיר העבדים SPI. להלן סקיצה של Arduino לדוגמא להגדרתו:


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

הֶסבֵּר:

  • Spi.attachinterrupt (); מאפשר להפריע ל- SPI, ומאפשר לארדואינו לטפל בנתונים נכנסים.
  • בשגרת שירות ההפרעה ISR(SPI_STC_vect), הנתונים שהתקבלו מאוחסנים לעיבוד.
  • THE loop() פונקציות בודקות נתונים שהתקבלו ומדפיס אותם לצג הסידורי.

קביעת תצורה של ה- Raspberry Pi

ה- Raspberry Pi ישמש כמכשיר Master SPI. נשתמש בפייתון עם spidev ספרייה לטיפול בתקשורת SPI. ראשית, וודא ש- SPI מופעל:

  • פתח את כלי התצורה של Raspberry Pi:
    sudo raspi-config
  • נווט אל אפשרויות ממשק > SPI > לְאַפשֵׁר
  • אתחל מחדש את ה- Raspberry Pi אם יתבקש.

התקן את spidev ספרייה אם היא כבר לא מותקנת:

sudo apt-get install python3-spidev

להלן תסריט Python לדוגמא עבור 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()

הֶסבֵּר:

  • spi.open (0, 0) פותח את SPI אוטובוס 0, מכשיר 0 (CE0).
  • spi.xfer2 ([נתונים]) שולח את בייט הנתונים ומקבל בו זמנית נתונים מהעבד.
  • התסריט שולח בייט (למשל, 42) כל שנייה ומדפיס את התגובה מהארדואינו.

בדיקת התקשורת

לאחר הקמת גם את ארדואינו וגם פטל PI:

  1. העלה את הסקיצה של ארדואינו ללוח ארדואינו.
  2. חבר את הארדואינו ל- Raspberry Pi דרך חיווט SPI.
  3. הפעל את תסריט הפיתון ב- Raspberry Pi:
    python3 spi_master.py
  4. פתח את המסך הסידורי של Arduino כדי להציג את הנתונים שהתקבלו:
    Tools > Serial Monitor

אתה אמור לראות את Arduino מקבל את הנתונים שנשלחו על ידי ה- Raspberry Pi ומציג אותם במוניטור הסידורי. באופן דומה, ה- Raspberry Pi יציג את הנתונים שהם שולחים ואת התגובה שהיא מקבלת.

טיפים לפתרון בעיות

  • בדוק את החיווט: ודא שכל החיבורים בין Arduino ו- Raspberry Pi מאובטחים וממוסים נכון.
  • רמות מתח: השתמש בממיר ברמת ההיגיון כדי להתאים ל -3.3 וולט של ה- Raspberry Pi עם ה- 5V של הארדואינו.
  • אפשר SPI: ודא ש- SPI מופעל ב- Raspberry Pi באמצעות raspi-config.
  • הרשאות: ודא שלמשתמש שלך יש את ההרשאות הדרושות לגישה למכשירי SPI. יתכן שתצטרך להריץ את תסריט הפיתון שלך sudo.
  • שיעור באוד: וודא שהמוניטור הסדרתי והסקיצה של Arduino משתמשים באותו קצב Baud.
  • הגדרות SPI: ודא שגם הראשי וגם העבד מוגדרים עם אותו מצב SPI ומהירות.

מַסְקָנָה

שימוש בתקשורת SPI בין Arduino ל- Raspberry Pi מאפשר לך לרתום את חוזקותיהן של שתי הפלטפורמות בצורה יעילה. בין אם אתה בונה מערכת רובוטיקה מורכבת, פיתוח רשת חיישנים או מתנסים בכריתת נתונים, הבנת SPI היא לא יסולא בפז. על ידי ביצוע הצעדים המפורטים במדריך זה, תוכלו להגדיר תקשורת SPI אמינה ולצאת לפרויקטים משובצים מרגשים הממנפים את כוחם של ארדואינו וגם של Raspberry Pi.

מתעסק שמח!

השאירו תגובה

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.