- نظرة عامة حول STM32F103C8 I2C
- دبابيس I2C في STM32F103C8
- دبابيس I2C في Arduino
- المكونات مطلوبة
- مخطط الدائرة والتوصيلات
- برمجة I2C في STM32
- شرح البرمجة ماجستير STM32
- شرح برمجة الرقيق اردوينو
في دروسنا السابقة ، تعلمنا عن اتصال SPI و I2C بين لوحتين من Arduino. في هذا البرنامج التعليمي ، سنستبدل لوحة Arduino بلوحة Blue Pill وهي STM32F103C8 وسنتواصل مع لوحة Arduino باستخدام ناقل I2C.
يحتوي STM32 على ميزات أكثر من لوحة Arduino. لذلك سيكون من الرائع التعرف على الاتصال بين STM32 و Arduino باستخدام ناقل SPI & I2C. في هذا البرنامج التعليمي ، سنستخدم ناقل I2C للاتصال بين Arduino و STM32F103C8 ، وسنتعرف على ناقل SPI في البرنامج التعليمي التالي. لمعرفة المزيد عن لوحة STM32 ، تحقق من مشاريع STM32 الأخرى.
نظرة عامة حول STM32F103C8 I2C
بمقارنة I2C (الدوائر المتكاملة) في STM32F103C8 Blue Pill board مع Arduino Uno ، سنرى أن Arduino به متحكم ATMEGA328 ، وأن STM32F103C8 به ARM Cortex- M3. يحتوي STM32 على ناقلتي I2C بينما يحتوي Arduino Uno على ناقل I2C واحد فقط و STM32 أسرع من Arduino.
لمعرفة المزيد حول اتصالات I2C ، راجع مقالاتنا السابقة
- كيفية استخدام I2C في Arduino: الاتصال بين لوحتي Arduino
- اتصال I2C مع متحكم PIC PIC16F877
- واجهات 16X2 LCD مع ESP32 باستخدام I2C
- اتصال I2C مع MSP430 Launchpad
- واجهات شاشات الكريستال السائل مع NodeMCU دون استخدام I2C
- كيفية التعامل مع الاتصالات المتعددة (I2C SPI UART) في برنامج واحد من اردوينو
دبابيس I2C في STM32F103C8
SDA: PB7 أو PB9 ، PB11.
SCL: PB6 أو PB8 ، PB10.
دبابيس I2C في Arduino
SDA: دبوس A4
SCL: دبوس A5
المكونات مطلوبة
- STM32F103C8
- اردوينو اونو
- LED (عدد 2)
- زر ضغط (2-N)
- المقاومات (4-Nos)
- اللوح
- توصيل الأسلاك
مخطط الدائرة والتوصيلات
يوضح الجدول التالي الاتصال بين STM32 Blue Pill و Arduino Uno لاستخدام ناقل I2C. لا يتطلب سوى سلكين.
STM32F103C8 |
اردوينو |
دبوس الوصف |
ب 7 |
A4 |
SDA |
ب 6 |
A5 |
SCL |
GND |
GND |
أرض |
مهم
- لا تنس توصيل Arduino GND و STM32F103C8 GND معًا.
- ثم قم بتوصيل مقاوم سحب لأسفل يبلغ 10 كيلو بدبابيس زر الضغط لكل من اللوحين بشكل منفصل.
في هذا البرنامج التعليمي STM32 I2C سنقوم بتكوين STM32F103C8 كـ Master و Arduino كـ Slave. كلا اللوحتين متصلتان بمصباح LED وزر ضغط منفصل.
لإثبات اتصال I2C في STM32 ، نتحكم في STM32 LED الرئيسي باستخدام قيمة زر ضغط Arduino التابع والتحكم في Arduino LED التابع باستخدام قيمة زر الضغط STM32F103C8 الرئيسية. يتم إرسال هذه القيم عبر ناقل اتصال I2C.
برمجة I2C في STM32
البرمجة تشبه كود اردوينو. نفس الشيء
يحتوي هذا البرنامج التعليمي على برنامجين أحدهما لـ Master STM32 والآخر لـ Slave Arduino. يتم تقديم برامج كاملة لكلا الجانبين في نهاية هذا المشروع مع فيديو توضيحي.
شرح البرمجة ماجستير STM32
في Master STM32 ، دعونا نرى ما يحدث:
1. أولاً وقبل كل شيء نحتاج إلى تضمين مكتبة Wire ومكتبة softwire لاستخدام وظائف اتصال I2C في STM32F103C8.
#تضمن
2. في الإعداد الباطل ()
- نبدأ الاتصال التسلسلي بسعر الباود 9600.
Serial.begin (9600) ؛
- بعد ذلك نبدأ اتصال I2C عند الطرف (B6 ، B7)
Wire.begin () ؛
3. In Void loop ()
- أولاً نحصل على البيانات من Slave Arduino لذلك نستخدم requestFrom () مع العنوان الفرعي 8 ونطلب بايت واحد.
طلب الأسلاك من (8،1) ؛
تتم قراءة القيمة المستلمة باستخدام Wire.read ()
البايت أ = Wire.read () ؛
- اعتمادًا على القيمة المستلمة من التابع ، يتم تشغيل Master LED أو إيقاف تشغيله باستخدام الكتابة الرقمية في الطرف PA1 ، كما يتم استخدام الطباعة التسلسلية لطباعة القيمة في الشاشة التسلسلية
if (a == 1) { digitalWrite (LED، HIGH) ؛ Serial.println ("Master LED ON") ؛ } else { digitalWrite (LED، LOW)؛ Serial.println ("Master LED OFF") ؛ }
- بعد ذلك ، نحتاج إلى قراءة حالة الدبوس PA0 وهو زر الضغط الرئيسي STM32.
int pinvalue = digitalRead (دبوس الزر) ؛
- بعد ذلك ، أرسل قيمة الدبوس وفقًا للمنطق ، لذلك نستخدم شرط if ثم نبدأ الإرسال باستخدام slave arduino مع 8 كعنوان ثم نكتب القيمة وفقًا لقيمة إدخال زر الضغط.
إذا (قيمة pinvalue == عالية) { x = 1 ؛ } آخر { x = 0 ؛ } Wire.beginTransmission (8) ؛ Wire.write (x) ؛ Wire.endTransmission () ؛
شرح برمجة الرقيق اردوينو
1. أولاً وقبل كل شيء نحتاج إلى تضمين مكتبة Wire لاستخدام وظائف اتصالات I2C.
#تضمن
2. في الإعداد الباطل ()
- نبدأ الاتصال التسلسلي بسعر الباود 9600.
Serial.begin (9600) ؛
- بعد ذلك ، ابدأ اتصال I2C على رقم التعريف الشخصي (A4 ، A5) بعنوان تابع كـ 8. من المهم هنا تحديد عنوان التابع.
Wire.begin (8) ؛
بعد ذلك ، نحتاج إلى استدعاء دالة Wire.onReceive عندما يتلقى Slave قيمة من master واستدعاء دالة Wire.onRequest عندما يطلب Master قيمة من Slave.
Wire.onReceive (استقبال الحدث) ؛ Wire.onRequest (requestEvent) ؛
3. بعد ذلك لدينا وظيفتان واحدة لحدث الطلب والأخرى لحدث الاستلام
لطلب الحدث
عندما يطلب Master STM32 قيمة من التابع ، سيتم تنفيذ هذه الوظيفة. تأخذ هذه الوظيفة قيمة الإدخال من زر الضغط Slave Arduino وترسل بايت (1 أو 0) إلى Master STM32 وفقًا لقيمة زر الضغط باستخدام Wire.write ().
requestEvent () باطل { قيمة int = digitalRead (buttonpin) ؛ إذا كانت (القيمة == عالية) { س = 1 ؛ } آخر { x = 0 ؛ } Wire.write (x) ؛ }
لتلقي الحدث
عندما يرسل Master البيانات إلى التابع بعنوان تابع (8) ، سيتم تنفيذ هذه الوظيفة. تقرأ هذه الوظيفة القيمة المستلمة من الرئيسي وتخزينها في متغير من نوع البايت ثم تستخدم منطق if لتشغيل أو إيقاف تشغيل مؤشر LED التابع وفقًا للقيمة المستلمة. إذا كانت القيمة المستلمة هي 1 ، فسيتم تشغيل LED و 0 ينطفئ.
Void ReceiveEvent (int howMany) { byte a = Wire.read ()؛ if (a == 1) { digitalWrite (LED، HIGH) ؛ Serial.println ("Slave LED ON") ؛ } else { digitalWrite (LED، LOW)؛ Serial.println ("Slave LED OFF") ؛ } تأخير (500)؛ }
انتاج |
1. عندما نضغط على زر الضغط في Master STM32 ، يضيء المصباح المتصل بـ Slave Ardiono (أبيض).
2. الآن عندما نضغط على زر الضغط على الجانب التابع ، يتحول مؤشر LED المتصل بـ Master إلى وضع التشغيل (أحمر) وعندما يتم تحرير الزر ينطفئ LED.
3. عند الضغط على زري الانضغاط في نفس الوقت ، يتوهج مصباحا LED في نفس الوقت ، ويظلان قيد التشغيل حتى يتم الضغط على الأزرار
هذه هي الطريقة التي يحدث بها اتصال I2C في STM32. يمكنك الآن ربط أي مستشعر I2C بلوحة STM32.
يتم تقديم الترميز الكامل لـ Master STM32 و Slave Arduino أدناه مع فيديو توضيحي