- ما هو SPI؟
- عمل SPI
- دبابيس SPI في Arduino UNO
- باستخدام SPI في Arduino
- المكونات المطلوبة لاتصال Arduino SPI
- مخطط دائرة اتصالات Arduino SPI
- كيفية برمجة Arduino لاتصالات SPI:
- شرح برمجة ماجستير Arduino SPI
- شرح برمجة الرقيق في Arduino SPI
- كيف يعمل SPI على Arduino؟ - دعونا نختبرها!
يستخدم Microcontroller العديد من البروتوكولات المختلفة للتواصل مع أجهزة الاستشعار والوحدات النمطية المختلفة. هناك العديد من أنواع بروتوكولات الاتصال المختلفة للاتصالات السلكية واللاسلكية ، وأكثر تقنيات الاتصال شيوعًا هي الاتصال التسلسلي. الاتصال التسلسلي هو عملية إرسال البيانات بتة واحدة في كل مرة ، بالتتابع ، عبر قناة اتصال أو ناقل. هناك العديد من أنواع الاتصالات التسلسلية مثل اتصالات UART و CAN و USB و I2C و SPI.
في هذا البرنامج التعليمي ، نتعرف على بروتوكول SPI وكيفية استخدامه في Arduino. سوف نستخدم بروتوكول SPI للتواصل بين اثنين من Arduinos. هنا سيعمل أحد Arduino باعتباره Master والآخر سيكون بمثابة Slave ، وسيتم توصيل اثنين من مصابيح LED وأزرار الضغط بكل من Arduino. لإثبات اتصال SPI ، سوف نتحكم في مؤشر LED للجانب الرئيسي عن طريق زر الضغط في الجانب التابع والعكس صحيح باستخدام بروتوكول الاتصال التسلسلي SPI.
ما هو SPI؟
SPI (Serial Peripheral Interface) هو بروتوكول اتصال تسلسلي. تم العثور على واجهة SPI بواسطة Motorola في عام 1970. يحتوي SPI على اتصال مزدوج الاتجاه ، مما يعني أن البيانات يتم إرسالها واستلامها في وقت واحد. يمكن للسيد إرسال البيانات إلى العبد ويمكن أن يرسل العبد البيانات إلى السيد في وقت واحد. SPI هو اتصال تسلسلي متزامن يعني أن الساعة مطلوبة لأغراض الاتصال.
تم شرح اتصال SPI مسبقًا في ميكروكنترولر أخرى:
- اتصال SPI مع PIC Microcontroller PIC16F877A
- واجهة 3.5 بوصة تعمل باللمس TFT LCD مع Raspberry Pi
- برمجة متحكم AVR مع دبابيس SPI
- ربط Nokia 5110 الرسومية بشاشة LCD مع Arduino
عمل SPI
يحتوي SPI على اتصال رئيسي / تابع باستخدام أربعة أسطر. يمكن أن يكون لـ SPI سيد واحد فقط ويمكن أن يكون له عدة عبيد. عادة ما يكون السيد متحكمًا ويمكن أن يكون العبيد متحكمًا دقيقًا ، وأجهزة استشعار ، و ADC ، و DAC ، و LCD ، إلخ.
يوجد أدناه تمثيل مخطط الكتلة لـ SPI Master مع Single Slave.
يتبع SPI أربعة أسطر MISO و MOSI و SS و CLK
- MISO (Master in Slave Out) - الخط التابع لإرسال البيانات إلى السيد.
- MOSI (Master Out Slave In) - الخط الرئيسي لإرسال البيانات إلى الأجهزة الطرفية.
- SCK (الساعة التسلسلية) - نبضات الساعة التي تزامن نقل البيانات التي يولدها السيد.
- SS (تحديد الرقيق) - يمكن للماجستير استخدام هذا الدبوس لتمكين وتعطيل أجهزة معينة.
SPI Master مع عبيد متعددين
لبدء الاتصال بين السيد والعبد ، نحتاج إلى ضبط دبوس Slave Select (SS) للجهاز المطلوب على LOW ، حتى يتمكن من التواصل مع السيد. عندما تكون عالية ، فإنها تتجاهل السيد. يتيح لك ذلك الحصول على أجهزة SPI متعددة تشترك في نفس خطوط MISO و MOSI و CLK الرئيسية. كما ترون في الصورة أعلاه ، هناك أربعة عبيد حيث يتم توصيل SCLK و MISO و MOSI بشكل شائع بالسيد ويتم توصيل SS لكل عبد بشكل منفصل بدبابيس SS الفردية (SS1 ، SS2 ، SS3) للسيد. من خلال تعيين SS pin LOW المطلوب ، يمكن للسيد التواصل مع هذا العبد.
دبابيس SPI في Arduino UNO
توضح الصورة أدناه دبابيس SPI الموجودة في Arduino UNO (في المربع الأحمر).
خط SPI |
دبوس في اردوينو |
MOSI |
11 أو ICSP-4 |
ميسو |
12 أو ICSP-1 |
SCK |
13 أو ICSP-3 |
SS |
10 |
باستخدام SPI في Arduino
قبل البدء في البرمجة لاتصال SPI بين اثنين من Arduinos. نحتاج إلى التعرف على مكتبة Arduino SPI المستخدمة في Arduino IDE.
المكتبة
1. SPI.begin ()
الاستخدام: لتهيئة ناقل SPI عن طريق ضبط SCK و MOSI و SS على المخرجات ، وسحب SCK و MOSI منخفضًا ، و SS مرتفعًا.
2. SPI.setClockDivider (مقسم)
الاستخدام: لضبط مقسم ساعة SPI بالنسبة إلى ساعة النظام. الفواصل المتاحة هي 2 أو 4 أو 8 أو 16 أو 32 أو 64 أو 128.
فواصل:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (معالج)
الاستخدام: يتم استدعاء هذه الوظيفة عندما يتلقى جهاز تابع بيانات من السيد.
4. SPI.transfer (val)
الاستخدام: تُستخدم هذه الوظيفة لإرسال البيانات واستلامها في وقت واحد بين السيد والعبد.
لنبدأ الآن بالشرح العملي لبروتوكول SPI في Arduino. في هذا البرنامج التعليمي سوف نستخدم اثنين من اردوينو للسيد والآخر كعبيد. يتم توصيل كل من Arduino بمصباح LED وزر ضغط بشكل منفصل. يمكن التحكم في مؤشر LED الرئيسي باستخدام زر ضغط Arduino التابع ويمكن التحكم في مؤشر LED الخاص بـ Arduino عن طريق زر ضغط Arduino الرئيسي باستخدام بروتوكول اتصال SPI الموجود في اردوينو.
المكونات المطلوبة لاتصال Arduino SPI
- اردوينو UNO (2)
- ال اي دي (2)
- زر ضغط (2)
- مقاوم 10 كيلو (2)
- مقاوم 2.2 كيلو (2)
- اللوح
- توصيل الأسلاك
مخطط دائرة اتصالات Arduino SPI
يوضح الرسم البياني أدناه كيفية استخدام SPI على Arduino UNO ، ولكن يمكنك اتباع نفس الإجراء لاتصالات Arduino Mega SPI أو اتصالات Arduino nano SPI. سيبقى كل شيء تقريبًا كما هو باستثناء الرقم السري. يجب عليك التحقق من pinout الخاص بـ Arduino nano أو mega للعثور على دبابيس Arduino nano SPI ودبابيس Arduino Mega ، بمجرد القيام بذلك ، سيكون كل شيء آخر هو نفسه.
لقد قمت ببناء الدائرة الموضحة أعلاه فوق لوحة توصيل ، يمكنك رؤية إعداد الدائرة الذي استخدمته للاختبار أدناه.
كيفية برمجة Arduino لاتصالات SPI:
يحتوي هذا البرنامج التعليمي على برنامجين أحدهما لبرنامج Master Arduino والآخر لبرنامج Slave Arduino. يتم تقديم برامج كاملة لكلا الجانبين في نهاية هذا المشروع.
شرح برمجة ماجستير Arduino SPI
1. بادئ ذي بدء ، نحتاج إلى تضمين مكتبة SPI لاستخدام وظائف اتصال SPI.
#تضمن
2. في الإعداد الباطل ()
- نبدأ الاتصال التسلسلي بسعر الباود 115200.
Serial.begin (115200) ؛
- قم بتوصيل LED بالدبوس 7 وزر الضغط على السن 2 وقم بتعيين تلك المسامير OUTPUT و INPUT على التوالي.
pinMode (ipbutton ، INPUT) ؛ pinMode (LED ، الإخراج) ؛
- بعد ذلك نبدأ الاتصال SPI
SPI.begin () ،
- بعد ذلك ، قمنا بتعيين Clockdivider للاتصال SPI. هنا قمنا بتعيين الفاصل 8.
SPI.setClockDivider (SPI_CLOCK_DIV8) ،
- ثم قم بتعيين SS pin HIGH لأننا لم نبدأ أي نقل إلى slave arduino.
الكتابة الرقمية (SS ، عالية) ؛
3. في الحلقة الفارغة ():
- قرأنا حالة دبوس زر الضغط المتصل بـ pin2 (Master Arduino) لإرسال هذه القيمة إلى العبد Arduino.
buttonvalue = digitalRead (ipbutton) ؛
- ضبط المنطق لإعداد قيمة x (ليتم إرسالها إلى التابع) اعتمادًا على الإدخال من الدبوس 2
إذا (buttonvalue == HIGH) { x = 1 ؛ } آخر { x = 0 ؛ }
- قبل إرسال القيمة ، نحتاج إلى خفض قيمة تحديد العبد لبدء النقل إلى التابع من السيد.
الكتابة الرقمية (SS ، منخفضة) ؛
- هنا تأتي الخطوة المهمة ، في البيان التالي ، نرسل قيمة زر الضغط المخزنة في متغير Mastersend إلى التابع arduino ونتلقى أيضًا قيمة من slave التي سيتم تخزينها في متغير Mastereceive .
Mastereceive = SPI.transfer (Mastersend) ؛
- بعد ذلك اعتمادًا على قيمة Mastereceive ، سنقوم بتشغيل أو إيقاف تشغيل Master Arduino LED.
إذا (Mastereceive == 1) { digitalWrite (LED ، HIGH) ؛ // يعين pin 7 HIGH Serial.println ("Master LED ON") ؛ } else { digitalWrite (LED، LOW)؛ // يعين pin 7 LOW Serial.println ("Master LED OFF") ؛ }
ملاحظة: نستخدم serial.println () لعرض النتيجة في Serial Motor من Arduino IDE. تحقق من الفيديو في النهاية.
شرح برمجة الرقيق في Arduino SPI
1. بادئ ذي بدء ، نحتاج إلى تضمين مكتبة SPI لاستخدام وظائف اتصال SPI.
#تضمن
2. في الإعداد الباطل ()
- نبدأ الاتصال التسلسلي بسعر الباود 115200.
Serial.begin (115200) ؛
- قم بتوصيل LED بالدبوس 7 وزر الضغط على pin2 وقم بتعيين تلك المسامير OUTPUT و INPUT على التوالي.
pinMode (ipbutton ، INPUT) ؛ pinMode (LED ، الإخراج) ؛
- الخطوة المهمة هنا هي البيانات التالية
pinMode (MISO ، الإخراج) ؛
تحدد العبارة أعلاه MISO على أنها OUTPUT (يجب إرسال البيانات إلى Master IN). لذلك يتم إرسال البيانات عبر MISO من Slave Arduino.
- الآن قم بتشغيل SPI في وضع Slave باستخدام SPI Control Register
SPCR - = _BV (SPE) ؛
- ثم قم بتشغيل المقاطعة لاتصال SPI. في حالة تلقي بيانات من الجهاز الرئيسي ، يتم استدعاء روتين المقاطعة ويتم أخذ القيمة المستلمة من SPDR (سجل بيانات SPI)
SPI.attachInterrupt () ،
- القيمة من master مأخوذة من SPDR وتخزينها في متغير Slavereceived . يحدث هذا في أعقاب وظيفة المقاطعة الروتينية.
ISR (SPI_STC_vect) { Slavereceived = SPDR ؛ تلقى = صحيح ؛ }
3. بعد ذلك في الحلقة الفارغة () قمنا بضبط Slave arduino LED ليتم تشغيله أو إيقاف تشغيله وفقًا لقيمة Slaver Received.
إذا (Slavereceived == 1) { digitalWrite (LEDpin، HIGH) ؛ // يعين الدبوس 7 كـ HIGH LED ON Serial.println ("Slave LED ON") ؛ } else { digitalWrite (LEDpin، LOW)؛ // يعين الدبوس 7 على أنه LOW LED OFF Serial.println ("Slave LED OFF") ؛ }
- بعد ذلك ، قرأنا حالة زر Slave Arduino Push وقمنا بتخزين القيمة في Slavesend لإرسال القيمة إلى Master Arduino من خلال إعطاء قيمة إلى سجل SPDR.
buttonvalue = digitalRead (buttonpin) ؛ إذا (buttonvalue == HIGH) {x = 1 ؛ } آخر {x = 0 ؛ } Slavesend = x ؛ SPDR = Slavesend ؛
ملاحظة: نستخدم serial.println () لعرض النتيجة في Serial Motor من Arduino IDE. تحقق من الفيديو في النهاية.
كيف يعمل SPI على Arduino؟ - دعونا نختبرها!
فيما يلي صورة الإعداد النهائي لاتصال SPI بين لوحين من Arduino.
عند الضغط على زر الضغط على الجانب الرئيسي ، يضيء مؤشر LED الأبيض في الجانب التابع.
وعند الضغط على زر الضغط في الجانب التابع ، يتم تشغيل مؤشر LED الأحمر في الجانب الرئيسي.
يمكنك مشاهدة الفيديو أدناه لمشاهدة العرض التوضيحي لاتصالات Arduino SPI. إذا كان لديك أي أسئلة ، فيرجى تركها في قسم التعليقات ، استخدم منتدياتنا.