كيفية استخدام اتصال SPI مع Arduino و Raspberry Pi

الواجهة المحيطية التسلسلية (SPI) عبارة عن بروتوكول اتصال متسلسل متزامن يستخدم على نطاق واسع للتواصل على مسافة قصيرة ، في المقام الأول في الأنظمة المضمنة. يمكن أن يؤدي الجمع بين براعة Arduino مع الطاقة الحسابية لـ Raspberry Pi من خلال SPI إلى فتح عدد كبير من إمكانيات المشروع. في منشور المدونة هذا ، سنستكشف كيفية إعداد واستخدام اتصال SPI بين Arduino و Raspberry Pi.

فهم SPI

SPI هو بروتوكول اتصالات كامل الاكتتاب يعمل في وضع Master-Slave. يستخدم أربعة خطوط رئيسية:

  • Mosi (Master Out Slave in): ينقل البيانات من السيد إلى العبد.
  • ميسو (سيد في العبد): ينقل البيانات من العبد إلى الماجستير.
  • SCLK (الساعة التسلسلية): مزامنة نقل البيانات التي تم إنشاؤها بواسطة السيد.
  • SS/CS (Slave Select/Chip Select): يختار جهاز الرقيق.

يتم تفضيل SPI لبساطتها وسرعتها ، مما يجعلها مثالية للتطبيقات التي تتطلب تبادل البيانات السريع بين الأجهزة.

لماذا تستخدم SPI مع Arduino و Raspberry Pi؟

الجمع بين Arduino مع Raspberry Pi يعزز نقاط قوة كلا المنصتين. يتفوق Arduino في الوقت الفعلي للتحكم في الأجهزة منخفضة المستوى ، بينما يوفر Raspberry PI إمكانات معالجة عالية المستوى ، واتصال الشبكة ، وبيئة نظام التشغيل الغنية. يتيح استخدام SPI هذين الجهازين التواصل بكفاءة ، وتمكين مشاريع معقدة مثل أنظمة أتمتة المنزل والروبوتات وتطبيقات تسجيل البيانات.

إعداد الأجهزة

لإنشاء اتصال SPI بين Arduino و Raspberry Pi ، ستحتاج إلى المكونات التالية:

  • Arduino Uno (أو أي لوحة Arduino متوافقة)
  • Raspberry PI (أي نموذج مع دبابيس GPIO)
  • الأسلاك الطائر
  • لوح (اختياري)

توصيل Arduino و Raspberry Pi لـ SPI

الأسلاك الدقيقة أمر بالغ الأهمية لضمان التواصل المناسب. إليك كيفية توصيل Arduino و Raspberry Pi باستخدام SPI:

التوت PI GPIO دبوس دبوس أردوينو وصف
GPIO10 (MOSI) PIN 11 (MOSI) إتقان العبد في
GPIO9 (ميسو) دبوس 12 (ميسو) سيد في الخارج
GPIO11 (SCLK) PIN 13 (SCLK) الساعة التسلسلية
GPIO8 (CE0) دبوس 10 (SS) العبيد اختيار
GND GND أرضية مشتركة
3.3V 5V مزود الطاقة (استخدام مستوى تحول إذا لزم الأمر)

ملحوظة: يعمل Raspberry Pi بمستويات منطقية 3.3V ، بينما يستخدم Arduino UNO 5V. يوصى باستخدام محول مستوى المنطق لمنع الأضرار المحتملة لـ Raspberry Pi.

تكوين Arduino

سوف Arduino بمثابة جهاز SPI Slave. فيما يلي عينة رسم 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 ، مما يسمح لـ Arduino بالتعامل مع البيانات الواردة.
  • في روتين خدمة المقاطعة ISR(SPI_STC_vect)، يتم تخزين البيانات المستلمة للمعالجة.
  • ال loop() تعمل الدالة على البيانات المستلمة وتطبعها على الشاشة التسلسلية.

تكوين Raspberry Pi

سيعمل Raspberry Pi كجهاز SPI الرئيسي. سنستخدم Python مع 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 Bus 0 ، الجهاز 0 (CE0).
  • spi.xfer2 ([بيانات]) يرسل بايت البيانات ويتلقى في وقت واحد بيانات من العبد.
  • يرسل البرنامج النصي بايت (على سبيل المثال ، 42) كل ثانية ويطبع الاستجابة من Arduino.

اختبار الاتصال

بعد إعداد كل من Arduino و Raspberry Pi:

  1. قم بتحميل رسم Arduino إلى لوحة Arduino.
  2. قم بتوصيل Arduino إلى Raspberry Pi عبر الأسلاك SPI.
  3. قم بتشغيل نص Python على Raspberry Pi:
    python3 spi_master.py
  4. افتح شاشة Arduino التسلسلية لعرض البيانات المستلمة:
    Tools > Serial Monitor

يجب أن ترى Arduino يتلقى البيانات المرسلة بواسطة Raspberry Pi وعرضها في الشاشة التسلسلية. وبالمثل ، ستعرض Raspberry Pi البيانات التي يرسلها والاستجابة التي يتلقاها.

نصائح استكشاف الأخطاء وإصلاحها

  • تحقق من الأسلاك: تأكد من أن جميع الاتصالات بين Arduino و Raspberry Pi آمنة ومُرسم بشكل صحيح.
  • مستويات الجهد: استخدم محول مستوى المنطق لمطابقة 3.3V من Raspberry Pi مع 5V من Arduino.
  • تمكين SPI: تحقق من تمكين SPI على Raspberry Pi باستخدام raspi-config.
  • أذونات: تأكد من أن المستخدم الخاص بك لديه الأذونات اللازمة للوصول إلى أجهزة SPI. قد تحتاج إلى تشغيل نص Python الخاص بك sudo.
  • معدل باود: تأكد من أن الشاشة التسلسلية ورسم Arduino تستخدم نفس معدل الباود.
  • إعدادات SPI: تأكد من تكوين كل من Master و Slave بنفس وضع SPI والسرعة.

خاتمة

يتيح لك استخدام اتصال SPI بين Arduino و Raspberry Pi تسخير نقاط القوة في كلا النظامين بشكل فعال. سواء كنت تقوم ببناء نظام روبوتات معقد ، أو تطوير شبكة استشعار ، أو تجربة تسجيل البيانات ، فإن فهم SPI لا يقدر بثمن. باتباع الخطوات الموضحة في هذا الدليل ، يمكنك إعداد اتصالات SPI موثوقة والشروع في المشاريع المدمجة المثيرة التي تستفيد من قوة كل من Arduino و 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.