دعونا نلقي نظرة على الاتصالات الأكثر ملاءمة المضمنة فعليًا في وحدات تحكم Arduino. مكتبة سلكية لـ Arduino للعمل مع ناقل I2C

21.07.2019

وصف مكتبة الأسلاك

تتيح لك هذه المكتبة التفاعل مع أجهزة I2C / TWI. في لوحات Arduino ذات تخطيط R3 (pinout 1.0)، يوجد SDA (خط البيانات) وSCL (خط الساعة) على أطراف قريبة من طرف AREF. يحتوي Arduino Due على واجهتين I2C/TWI: SDA1 وSCL1 تقعان بالقرب من طرف AREF، وتوجد خطوط إضافية على الأطراف 20 و21.

يوضح الجدول أدناه مكان تواجد أطراف TWI على لوحات Arduino المختلفة.

منذ Arduino 1.0، ترث هذه المكتبة وظائف Stream، مما يجعلها متوافقة مع مكتبات القراءة/الكتابة الأخرى. ولهذا السبب، تم استبدال send() وreceive() بـ read() و write() .

ملحوظة

هناك إصدارات 7 و8 بت من عناوين I2C. 7 بتات تحدد الجهاز، والبت الثامن يحدد ما إذا كان الجهاز قيد الكتابة أو القراءة. تستخدم مكتبة Wire عناوين 7 بت. إذا كان لديك ورقة بيانات أو رمز مثال يستخدم عنوانًا مكونًا من 8 بتات، فستحتاج إلى قلب البت الأقل أهمية (أي تحويل القيمة بت واحد إلى اليمين)، مما يؤدي إلى عنوان من 0 إلى 127. ومع ذلك، فإن العناوين من 0 إلى لم يتم استخدام 7، لأنها محجوزة، وبالتالي فإن العنوان الأول الذي يمكن استخدامه هو 8. لاحظ أن مقاومات السحب مطلوبة عند توصيل منافذ SDA/SCL. انظر الأمثلة لمزيد من التفاصيل. تحتوي لوحة MEGA 2560 على مقاومات سحب على الأطراف 20 و 21.

وصف الأساليب

سلك. ابدأ ()

وصف

تهيئة مكتبة Wire والاتصال بحافلة I2C كرئيس (رئيسي) أو تابع. عادة يجب أن يتم استدعاؤه مرة واحدة فقط.

بناء الجملة

Wire.begin (العنوان)

خيارات

العنوان: عنوان 7 بت للجهاز التابع (اختياري)؛ إذا لم يتم تحديد ذلك، يتم توصيل اللوحة بالحافلة كرئيسية.

قيمة الإرجاع

مثال

للحصول على أمثلة للتابع، راجع الأمثلة الخاصة بالطرق onReceive() وonRequest(). للحصول على أمثلة للجهاز الرئيسي، راجع الأمثلة الخاصة بالطرق الأخرى. .

Wire.requestFrom()

وصف

يستخدمه السيد لطلب البايتات من العبد. يمكن الحصول على هذه البايتات باستخدام الطرق المتاحة () والقراءة ().

إذا كانت هذه الوسيطة صحيحة، فسيرسل requestFrom() رسالة STOP بعد الطلب، مما يؤدي إلى تحرير ناقل I2C.

إذا كانت هذه الوسيطة خاطئة، فسيرسل requestFrom() رسالة إعادة التشغيل بعد الطلب. لم يتم تحرير الناقل، مما يمنع جهازًا رئيسيًا آخر من التنقل بين الرسائل. يسمح هذا لسيد واحد بإرسال طلبات متعددة أثناء التحكم في الناقل.

بناء الجملة

Wire.requestFrom(العنوان، الكمية)

Wire.requestFrom(العنوان، الكمية، التوقف)

خيارات

  • العنوان: عنوان 7 بت للجهاز الذي يتم طلب البايتات منه؛
  • الكمية: عدد البايتات المطلوبة؛
  • توقف: منطقي. صحيح يرسل رسالة STOP بعد الطلب. يرسل الخطأ رسالة إعادة التشغيل بعد الطلب، مما يبقي الاتصال نشطًا.
قيمة الإرجاع

البايت: عدد البايتات التي تم إرجاعها من العبد.

مثال

Wire.beginTransmission()

وصف

يبدأ الإرسال إلى جهاز I2C التابع بالعنوان المحدد. بعد ذلك، يتم وضع تسلسل البايتات المراد إرسالها في قائمة الانتظار باستخدام وظيفة write()، ويتم إرسالها باستخدام استدعاء endTransmission().

بناء الجملة

Wire.beginTransmission (العنوان)

خيارات

العنوان: عنوان 7 بت للجهاز الذي يجب نقل البيانات إليه.

قيمة الإرجاع

مثال

سلك.endTransmission()

وصف

يكمل الإرسال إلى العبد الذي بدأ بواسطة طريقة beginTransmission() وينقل البايتات التي كانت في قائمة الانتظار بواسطة طريقة write().

للتوافق مع بعض أجهزة I2C، منذ Arduino 1.0.1، يقبل requestFrom() وسيطة نوع البيانات المنطقية التي تغير سلوكه.

إذا كانت هذه الوسيطة صحيحة، فسيرسل requestFrom() رسالة STOP بعد الإرسال، مما يحرر ناقل I2C.

إذا كانت هذه الوسيطة خاطئة، فسيرسل requestFrom() رسالة إعادة التشغيل بعد الإرسال. لم يتم تحرير الناقل، مما يمنع جهازًا رئيسيًا آخر من التنقل بين الرسائل. يسمح هذا لقائد واحد بإرسال عمليات إرسال متعددة أثناء مراقبة الحافلة.

بشكل افتراضي، هذه الحجة صحيحة.

بناء الجملة

سلك.endTransmission()

Wire.endTransmission (توقف)

خيارات

توقف: منطقي. صحيح يرسل رسالة STOP بعد الإرسال. يرسل الخطأ رسالة إعادة التشغيل بعد الإرسال، مما يبقي الاتصال نشطًا.

قيمة الإرجاع

البايت الذي يشير إلى حالة النقل:

  • 0: النجاح؛
  • 1: البيانات طويلة جدًا بحيث لا يمكن ملء المخزن المؤقت للإرسال؛
  • 2: تم استلام NACK عند إرسال العنوان؛
  • 3: تم استلام NACK عند إرسال البيانات؛
  • 4: أخطاء أخرى.
مثال

راجع المثال الخاص بطريقة الكتابة ().

سلك.كتابة ()

وصف

يكتب البيانات من العبد استجابةً لطلب من السيد، أو يضع البايتات في قائمة الانتظار للإرسال من السيد إلى العبد (بين استدعاءات beginTransmission() وendTransmission()).

بناء الجملة

كتابة السلك (القيمة)

سلك.كتابة (سلسلة)

Wire.write (البيانات، الطول)

خيارات

  • القيمة: القيمة المراد نقلها، بايت واحد.
  • سلسلة: سلسلة ليتم إرسالها، سلسلة من البايتات.
  • البيانات: مجموعة من البيانات لنقلها، بايت.
  • الطول: عدد البايتات المراد نقلها.
قيمة الإرجاع

البايت: تُرجع الدالة write()‎ عدد البايتات المكتوبة، على الرغم من أن قراءة هذا الرقم ليست ضرورية.

مثال #يتضمن بايت فال = 0؛ إعداد باطلة () (Wire.begin ()؛ // الاتصال بحافلة i2c) حلقة باطلة () (Wire.beginTransmission (44)؛ // النقل إلى الجهاز رقم 44 (0x2c) // تم تحديد عنوان الجهاز في السلك الوصف الفني. write(val); // إرسال قيمة البايت Wire.endTransmission(); // إيقاف الإرسال val++; val = 0 // البدء من البداية ) تأخير (500)؛

سلك متاح ()

وصف

إرجاع عدد البايتات المتاحة لاستردادها باستخدام read() . يجب استدعاء هذه الطريقة على الجهاز الرئيسي بعد استدعاء requestFrom()، أو على التابع داخل معالج onReceive().

بناء الجملة

سلك متاح ()

خيارات

قيمة الإرجاع

عدد البايتات المتاحة للقراءة.

مثال

راجع المثال الخاص بطريقة القراءة ().

سلك.قراءة ()

وصف

يقرأ البايت الذي تم نقله من العبد إلى السيد بعد استدعاء requestFrom()، أو الذي تم نقله من السيد إلى العبد.

بناء الجملة

خيارات

قيمة الإرجاع

البايت: البايتة التالية المستلمة.

مثال #يتضمن بايت فال = 0؛ إعداد باطلة () (Wire.begin ()؛ // الاتصال بحافلة i2c (العنوان الرئيسي اختياري) Serial.begin (9600)؛ // تكوين المنفذ التسلسلي للإخراج) حلقة باطلة () (Wire.requestFrom (2 ، 6)؛ // طلب 6 بايت من العبد رقم 2 while(Wire.available()) // يمكن للعبد إرسال أقل من المطلوب ( char c = Wire.read(); // قبول البايت كحرف تسلسلي () ج)؛ // طباعة الرمز ) تأخير (500)؛

Wire.setClock()

وصف

يغير تردد الساعة لاتصالات ناقل I2C. ليس لدى العبيد I2C حد أدنى لتردد ساعة التشغيل، ولكن يتم استخدام 100 كيلو هرتز عادةً.

بناء الجملة

Wire.setClock(تردد الساعة)

خيارات

تردد الساعة: قيمة التردد (بالهرتز) لإشارة الساعة. القيم المقبولة هي 100000 (الوضع القياسي) و400000 (الوضع السريع). تدعم بعض المعالجات أيضًا 10000 (وضع السرعة المنخفضة)، و1000000 (وضع السرعة الزائدة) و3400000 (وضع السرعة العالية). للتأكد من دعم الوضع المطلوب، راجع الوثائق الفنية الخاصة بالمعالج المحدد لديك.

قيمة الإرجاع

سلك.onReceive()

وصف

يسجل وظيفة سيتم استدعاؤها عندما يتلقى العبد إرسالاً من السيد.

بناء الجملة

Wire.onReceive (معالج)

خيارات

المعالج: وظيفة يجب استدعاؤها عندما يتلقى الجهاز التابع البيانات؛ يجب أن تأخذ معلمة واحدة int (عدد البايتات المقروءة من السيد) ولا تُرجع شيئًا، أي:

باطلة myHandler (كثافة العمليات numBytes)

قيمة الإرجاع

مثال

#يشمل إعداد الفراغ () (Wire.begin (8)؛ // الاتصال بحافلة i2c بالعنوان رقم 8 Wire.onReceive (receiveEvent)؛ // تسجيل معالج الأحداث Serial.begin (9600)؛ // تكوين المنفذ التسلسلي لـ الإخراج ) حلقة باطلة () (تأخير (100)؛) // دالة سيتم تنفيذها عندما يتم استلام البيانات من السيد // يتم تسجيل هذه الوظيفة كمعالج للحدث، راجع الإعداد () void ReceEvent(int howMany) ( بينما (1< Wire.available()) // пройтись по всем до последнего { char c = Wire.read(); // принять байт как символ Serial.print(c); // напечатать символ } int x = Wire.read(); // принять байт как целое число Serial.println(x); // напечатать число }

Wire.onRequest()

وصف

يسجل دالة سيتم استدعاؤها عندما يطلب السيد البيانات من العبد.

بناء الجملة

Wire.onRequest(معالج)

خيارات

المعالج: الدالة التي سيتم استدعاؤها، ولا تأخذ أي معلمات ولا تُرجع شيئًا، أي:

باطلة myHandler ()

قيمة الإرجاع

مثال

رمز لوحة Arduino التي تعمل كعبد:

#يشمل إعداد باطل () ( Wire.begin (8)؛ // الاتصال بحافلة i2c بالعنوان رقم 8 Wire.onRequest (requestEvent)؛ // تسجيل معالج الأحداث ) حلقة باطلة () (تأخير (100)؛) // الدالة، والتي سيتم تنفيذها عندما يطلب السيد البيانات // تم تسجيل هذه الدالة كمعالج للحدث، راجع setup() void requestEvent() ( Wire.write("hello "); // الرد برسالة )

مع تقديرات من 10 أوم إلى 1 ميجا أوم)؛

  • 2 مقاومات 4.7 كيلو أوم (من نفس المجموعة) ؛
  • توصيل الأسلاك (على سبيل المثال، هنا مجموعة جيدة)؛
  • الكمبيوتر مع اردوينو IDE.
  • 1 وصفواجهة I2C

    يستخدم Serial IIC (يُسمى أيضًا I2C - الدوائر المتكاملة) خطي اتصال ثنائي الاتجاه يُطلق عليهما ناقل البيانات التسلسلي لنقل البيانات. SDA (البيانات التسلسلية)وحافلة الساعة SCL (الساعة التسلسلية). يوجد أيضًا خطان للطاقة. يتم سحب حافلات SDA وSCL إلى ناقل الطاقة من خلال المقاومات.

    هناك واحد على الأقل على الانترنت الجهاز الرئيسي، الذي يبدأ نقل البيانات ويولد إشارات التزامن. الشبكة لديها أيضا أجهزة الرقيقالتي تنقل البيانات بناء على طلب القائد. يحتوي كل جهاز تابع على عنوان فريد يستخدمه السيد للوصول إليه. يشار إلى عنوان الجهاز في ورقة البيانات. يمكن توصيل ما يصل إلى 127 جهازًا، بما في ذلك العديد من الأجهزة الرئيسية، بحافلة I2C واحدة. يمكن توصيل الأجهزة بالحافلة أثناء التشغيل، أي. وهو يدعم التوصيل الساخن.

    دعونا نلقي نظرة على مخطط توقيت التبادل عبر بروتوكول I2C. هناك عدة خيارات مختلفة، دعونا نلقي نظرة على واحدة من أكثر الخيارات شيوعا. دعونا نستخدم محللًا منطقيًا متصلاً بحافلات SCL وSDA.

    السيد يبدأ التبادل. للقيام بذلك، يبدأ في توليد نبضات الساعة ويرسلها على طول خط SCL في حزمة مكونة من 9 قطع. في الوقت نفسه، يتم تعيينه على خط بيانات SDA عنوان الجهاز، والتي من الضروري من خلالها إنشاء اتصال يتم تسجيله بواسطة أول 7 نبضات على مدار الساعة (وبالتالي القيود المفروضة على نطاق العنوان: 2 7 = 128 ناقص عنوان صفر). الجزء التالي من الرسالة هو رمز العملية(القراءة أو الكتابة) وقليل آخر - بت الاعتراف(ACK) أن الجهاز التابع قد قبل الطلب. إذا لم يصل بت التأكيد، ينتهي التبادل. أو يستمر السيد في إرسال الطلبات المتكررة.

    وهذا موضح في الشكل أدناه، على سبيل المثال، لنفصل الجهاز التابع عن الناقل. يمكن ملاحظة أن السيد يحاول إنشاء اتصال مع الجهاز بعنوان 0x27، لكنه لا يتلقى تأكيدًا (NAK). ينتهي التبادل.


    الآن قم بتوصيل الجهاز التابع بحافلة I2C وكرر العملية. لقد تغير الوضع. تلقت الحزمة الأولى التي تحمل العنوان إقرارًا (ACK) من التابع. واستمر التبادل. يتم أيضًا نقل المعلومات في حزم مكونة من 9 بتات، ولكن الآن هناك 8 بتات مشغولة بياناتو 1 بت - بت الاعترافيتلقى العبد كل بايت من البيانات. إذا انقطع الاتصال في أي لحظة ولم تصل بتة الإقرار، فسيتوقف السيد عن الإرسال.

    2 تنفيذ I2Cفي اردوينو

    يستخدم Arduino منفذين للعمل عبر واجهة I2C. على سبيل المثال، في Arduino UNO وArduino Nano، يتوافق المنفذ التناظري A4 مع SDA، ويتوافق المنفذ التناظري A5 مع SCL.


    بالنسبة لنماذج اللوحات الأخرى، تكون مراسلات الدبوس كما يلي:

    3 مكتبة "سلك"للعمل مع IIC

    لتسهيل تبادل البيانات مع الأجهزة عبر ناقل I2C، تم إنشاء مكتبة قياسية لاردوينو الأسلاك. لديها الوظائف التالية:

    وظيفةغاية
    ابدأ (العنوان) تهيئة المكتبة والاتصال بحافلة I2C؛ إذا لم يتم تحديد العنوان، فإن الجهاز المتصل يعتبر هو الجهاز الرئيسي؛ يتم استخدام معالجة 7 بت؛
    طلب من() يستخدمه السيد لطلب عدد معين من البايتات من العبد؛
    بدء الإرسال (العنوان) بدء نقل البيانات إلى الجهاز التابع على عنوان محدد؛
    نهاية الإرسال () إيقاف نقل البيانات إلى العبد؛
    يكتب() تسجيل البيانات من العبد استجابة للطلب؛
    متاح() إرجاع عدد بايتات المعلومات المتاحة لتلقيها من العبد؛
    يقرأ() قراءة البايت المنقولة من العبد إلى السيد أو من السيد إلى العبد؛
    onReceive() يشير إلى وظيفة يجب استدعاؤها عندما يتلقى العبد إرسالاً من السيد؛
    تحت الطلب() يشير إلى وظيفة يجب استدعاؤها عندما يتلقى السيد إرسالاً من العبد.

    4 توصيل جهاز I2Cإلى اردوينو

    دعونا نرى كيفية العمل مع ناقل I2C باستخدام Arduino.

    أولا، دعونا نجمع الدائرة، كما في الشكل. سوف نتحكم في سطوع مؤشر LED باستخدام مقياس جهد رقمي ذو 64 موضعًا AD5171 (انظر الوصف الفني)، وهو متصل بحافلة I2C. العنوان الذي سنصل إليه إلى مقياس الجهد هو 0x2c (44 بالنظام العشري).


    5 إدارة الجهازعبر حافلة IIC

    دعونا نلقي نظرة على الرسوم البيانية لتبادل المعلومات باستخدام مقياس الجهد الرقمي AD5171، الموضح في الوصف الفني:


    نحن مهتمون بمخطط كتابة البيانات في السجل RDAC. يستخدم هذا السجل للتحكم في مقاومة مقياس الجهد.

    لنفتح رسمًا تخطيطيًا من أمثلة مكتبة "Wire": عينات الملفات - مقياس الجهد الرقمي للسلك. لنقم بتحميله في ذاكرة Arduino.

    #يشمل // توصيل بايت مكتبة "السلك" val = 0; // القيمة المراد نقلها إلى مقياس الجهد الإعداد باطل() ( Wire.begin(); // الاتصال بحافلة I2C كرئيس } حلقة فارغة() ( Wire.beginTransmission(44); // ابدأ التبادل مع جهاز بعنوان I2C "44" (0x2C) Wire.write(byte(0x00)); // أرسل تعليمات الكتابة إلى سجل RDAC Wire.write(val); // اضبط موضع مقياس الجهد ذو 64 موضعًا Wire.endTransmission(); // نقل I2C كاملًا val++; // زيادة val بمقدار 1 إذا (val == 63) ( // عندما يصل مقياس الجهد إلى الحد الأقصى val = 0؛ // إعادة تعيين val ) تأخير (500)؛ }

    بعد التشغيل، ترى كيف يزيد سطوع LED بشكل دوري ثم ينطفئ. في هذه الحالة، نقوم بالتحكم في مقياس الجهد باستخدام الاردوينو عبر ناقل I2C.

    قررت إنشاء لوحة تشغيل نصية (HMI) وتوصيلها عبر ناقل I2C "مربع" إلى Arduino. للقيام بذلك، قمت بتطوير لوحة مفاتيح ذات 5 أزرار تعتمد على شريحة PCF8574P.

    PCF8574P عبارة عن موسع منفذ، حزمة DIP، يعمل على ناقل I2C. لقد اشتريت مجموعة من اثنتين من هذه الدوائر الدقيقة مقابل 0.94 دولارًا أمريكيًا مع الشحن المجاني من الصين، لذا تبلغ تكلفة القطعة الواحدة 0.47 دولارًا أمريكيًا. يعد الشراء مربحًا، نظرًا لأن هذه الدوائر الدقيقة نفسها في المتاجر المحلية تكلف أكثر من دولارين للقطعة الواحدة.

    ستكون شاشة HMI عبارة عن شاشة 1602 قياسية، وتعمل أيضًا عبر ناقل مربع من خلال لوحة FC-113.

    لقد أرسلوا PCF8574P، وأعطوني رقم تتبع وبعد أسبوعين تلقيتهم بالفعل عبر البريد.


    نخرجه من الأنبوب البلاستيكي، ويبدو أن كل شيء على ما يرام.


    ومع ذلك، في الجزء السفلي من علبة واحدة من الدوائر الدقيقة هناك آثار للتأثيرات الحرارية الغامضة.


    طبيعة هذه الأضرار ليست واضحة بالنسبة لي، ولكن من الواضح أنها لا يمكن أن تظهر أثناء الشحن.

    فكرت في هذا اللغز لفترة طويلة حتى خطر ببالي.
    كل ما في الأمر هو أن Luke Skywalker تسلل إلى مستودع البائع، وتقلص فجأة إلى حجم مجهري. هناك لاحظ أحد موسعات الميناء، فخلط بينه وبين مشاية إمبراطوري وبدأ في اختراقه باستخدام السيف الضوئي. ثم جاء المنتقي ورأى هذه الصورة وقال: "توقف يا لوك سكاي ووكر! هذه ليست مشاية إمبراطورية، إنها دائرة كهربائية صغيرة PCF8574P، والتي دفعنا ثمنها بالفعل من زابوروجي."

    من الجيد أن كلتا الدائرتين الصغيرتين كانتا تعملان عند الاختبار.

    لنبدأ في إنشاء لوحة المفاتيح نفسها وفقًا لهذا المخطط.


    في Layout 6.0 قمت برسم لوحة أحادية الجانب.


    يمكنك تنزيل الملف مع اللوحة.

    تم حفر اللوحة باستخدام بيروكسيد الهيدروجين وحمض الستريك.

    هناك العديد من الوصفات لنقش الألواح بالبيروكسيد على الإنترنت.
    لقد قمت بإعداد المحلول التالي: 100 مل من بيروكسيد الهيدروجين 3%، 50 جرام من حامض الستريك، 3 ملاعق صغيرة من الملح. تسخين جرة من البيروكسيد في وعاء من الماء.

    نقوم بغمر اللوح في المحلول مع وضع النموذج لأسفل، على النحو الموصى به عند الحفر باستخدام البيروكسيد.

    بسشش! في البداية تكون العملية سريعة.


    ملاحظة... ثم يهدأ بشكل ملحوظ. اقلبها وانظر إلى الرسم.


    جمال.


    اللوحة النهائية تبدو هكذا.




    يتم توصيل دبابيس عنوان الدائرة الدقيقة بـ GND، وبالتالي فإن عنوان اللوحة الموجود على الناقل سيكون 0x20.

    نحن نكتب برنامج لاردوينو.

    #يشمل
    #يشمل

    #تعريف الصمام 13
    #تعريف ADDR_KBRD 0x20
    #تعريف ADDR_LCD 0x27

    سلسلة سلسلة؛
    بايت dio_in؛
    منطقي ب؛
    مفتاح منطقي؛

    LiquidCrystal_I2C شاشات الكريستال السائل (ADDR_LCD،16،2)؛ // اضبط العرض

    الإعداد باطل()
    {
    pinMode(13, OUTPUT);
    شاشات الكريستال السائل.init();
    LCD.backlight();// قم بتشغيل الإضاءة الخلفية للشاشة
    Wire.begin();

    Wire.beginTransmission(ADDR_KBRD);
    Wire.write(B11111111);
    Wire.endTransmission();
    Serial.begin(9600);
    }
    حلقة فارغة()
    {
    Wire.requestFrom(ADDR_KBRD,1);
    بينما (! Wire.available())؛
    بايت dio_in = Wire.read(); // اقرأ حالة منافذ PCF8574P
    قناع البايت = 1؛
    ل(int i=0; i<5;i++)
    {
    مفتاح[i]=!(dio_in & قناع);
    قناع=قناع<<1;
    }

    Str=String(dio_in, BIN); //
    Serial.println(str);

    ب=!ب;
    الكتابة الرقمية (led، ب)؛

    //
    شاشات الكريستال السائل.setCursor(0, 0);
    شاشات الكريستال السائل.طباعة (سلسلة (مفتاح)+" "+
    سلسلة (مفتاح)+" "+
    سلسلة (مفتاح)+" "+
    سلسلة (مفتاح)+" "+
    سلسلة (مفتاح)+" "
    );
    تأخير (100)؛
    }


    نقوم بتحميل البرنامج في Arduino ونقوم بتوصيله بلوحة المفاتيح والشاشة التي تم إنشاؤها.

    قم بتشغيله، إنه يعمل!


    لن يعمل جهاز HMI الخاص بي مع Arduino فحسب، بل مع PLC متوافق مع Arduino. إذا كان هناك إلهام واهتمام من القراء، فسوف أكتب عنه يومًا ما.

    إيجابيات PCF8574P:
    1. الحد الأدنى من الربط.
    2. سهل الاستخدام.

    سلبيات PCF8574P:
    لم أجده على الدائرة المصغرة نفسها، على الرغم من أنني أنصحك بالشراء من بائع آخر.

    بهذا نختتم مراجعة الدائرة الدقيقة PCF8574P.
    ولكن كمراقب من ذوي الخبرة بالفعل، مقدماًسأجيب على الأسئلة التي ستطرح بالتأكيد:

    لماذا في حزمة DIP؟ SOIC أفضل.
    مع تساوي جميع الأمور الأخرى، أفضل DIP، فهو أسهل بالنسبة لي.

    يتم تثبيت عناصر DIP والإخراج فقط بواسطة أجهزة التصفيح؛ ويستخدم جميع المتخصصين SOIC وSMD. لذلك أقوم بلحام SMD حصريًا وبشكل عام أنا رائع.
    لقد أحسنت.

    لماذا لا تشتري فقط وحدة جاهزة على Aliexpress مع شاشة 1602 ولوحة مفاتيح ذات 5 أزرار؟ كما أنه يعمل عبر I2C.
    سعره يبدأ من 11 دولار.
    أنفقت:
    عرض 1602 - 1.3 دولار
    لوحة FC-113 – 0.55 دولار
    رقاقة PCF8574P – 0.47 دولار
    الأزرار والقبعات - 0.7 دولار
    الكواشف لنقش اللوحة - 0.3 دولار
    Textolite والمقاومات والأشياء الصغيرة الأخرى - مجانًا من المخزونات القديمة.
    المجموع: 3.32 دولار
    لكن الشيء الرئيسي هو أنني قمت بتثبيت أزرار ذات دافع مربع على لوحتي لوضع قبعات ملونة جميلة عليها.

    واو، شريحة PCF8574P واحدة فقط تكلف تقريبًا نفس تكلفة لوحة FC-113 بأكملها!
    نعم…

    لقد فعلت كل شيء خاطئ. لقد رسموه بشكل غير صحيح، وحفروه بشكل غير صحيح في الحل الخطأ، ووضعوا الأزرار الخطأ. لو كنت أنت، كنت سأفعل كل شيء بشكل صحيح.
    لقد أحسنت.

    لماذا الزر الخامس بعيد عن الباقي؟
    هذا مقصود، فهي مختلفة وظيفيا. هؤلاء الأربعة هم اليسار، اليمين، الإلغاء، الدخول، والخامس سيكون SETUP.

    كنت أتوقع قصة أكثر إثارة عن لوك سكاي ووكر، لقد خدعتني!
    أنا انتهيت.

    يدعم Arduino العديد من واجهات نقل البيانات، إحداها هي I2C، والتي تحظى بشعبية كبيرة اليوم. ذات مرة، تم اختراع بروتوكول الاتصال هذا من قبل شركة Philips وتم تسجيله تحت اسم براءة الاختراع "I2C"، ويمكنك أيضًا العثور عليه تحت أسماء TWI، 2 line Interface، ولكنها جميعها تعمل على نفس المبدأ.

    بيت القصيد من ناقل I2C هو أنه يمكنك تعليق عدد كبير (128) من الأجهزة المختلفة على سلكين، من أجهزة استشعار درجة الحرارة إلى وحدات التحكم الدقيقة.

    ولكن في الوقت نفسه، فإن سرعة I2C أقل شأنا من UART وSPI، وذلك بسبب المبادئ الأساسية للتشغيل، لأن يرتبط الخطان دائمًا بالمقاومات (Vcc)، مما يعني أننا لا نحصل على نبضات مستطيلة على الرسم البياني، بل نبضات شبه منحرفة، على عكس ما ورد أعلاه.

    SDA - المسؤول عن نقل المعلومات (بداية الإرسال والعنوان والبيانات)
    SCL - توقيت الحافلة

    في I2C، يمكن أن تكون الأجهزة من نوعين: رئيسي و تابع

    الآن دعونا نلقي نظرة على المبادئ الأساسية للبرمجة باستخدام مكتبة Wire.h القياسية:

    Wire.begin(uint8_t عنوان) - يستخدم لتهيئة الجهاز، في الوضع التابع تحتاج إلى إدخال العنوان، في الوضع الرئيسي Wire.begin() . بدلاً من Wire، يمكنك استخدام أي كلمة أخرى.

    Wire.requestFrom(uint8_t Address, uint8_tquity) – طلب لتلقي عدد معين من البايتات من جهاز معين (عنوان 7 بت). إرجاع عدد البايتات المقروءة.

    Wire.beginTransmission(عنوان uint8_t) - بداية الإرسال

    Wire.endTransmission() - نهاية الإرسال، إرجاع رقم الخطأ أو النجاح (0)

    Wire.write(uint8_t data) - يمكن أن يأخذ قيمة بايت واحد (قيمة)، عدة بايت (سلسلة)، صفيف بطول معين (بيانات، طول). يقع بين: beginTransmission وendTransmission. لعرض عدد وحدات البايت المكتوبة.

    Wire.available() – يُرجع عدد البايتات المتاحة للمعالجة. تم استدعاؤه من قبل السيد بعد requestFrom.

    Wire.read() – يقرأ بايت من الجهاز التابع. يتم كتابته بعد requestFrom.

    إن ربط المكتبات بـ Arduino IDE ليس بالأمر الصعب، لأنه يأتي مرفقًا بمحرر قياسي.

    هناك عدد قليل من الوظائف، لكنني أعتقد أن هذه الأساسيات كافية تماما للبدء، بالإضافة إلى ذلك، يمكنك العثور على مكتبة لأي جهاز طرفي تقريبا.

    على سبيل المثال، فكر في توصيل وتشغيل مقياس التسارع والجيروسكوب Gy-521.

    نقوم بالاتصال وفقًا للمخطط (مقاومات السحب مدمجة في الوحدة):

    يمكن للوحدة أن تعمل على كل من 3.3 فولت و 5.

    #يشمل // قم بتوصيل المكتبة للعمل مع واجهة i2c const int MPU_addr = 0x68; // عنوان I2C GY-521 int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ; // متغيرات لكتابة القيم void setup() ( Wire.begin(); // تهيئة ناقل i2c Wire.beginTransmission(MPU_addr); // بدء النقل Wire.write(0x6B); // اكتب سجلات معينة للتهيئة وحدة السلك. write(0); // أرسل صفرًا لتنبيه الوحدة من وضع السكون Wire.endTransmission(true) Serial.begin(9600); ); // ابدأ بهذا السجل Wire.endTransmission(false); Wire.requestFrom(MPU_addr, 14, true);<< 8 | Wire.read(); // 0x3B AcY = Wire.read() << 8 | Wire.read(); // 0x3D AcZ = Wire.read() << 8 | Wire.read(); // 0x3F Tmp = Wire.read() << 8 | Wire.read(); // 0x41 GyX = Wire.read() << 8 | Wire.read(); // 0x43 GyY = Wire.read() << 8 | Wire.read(); // 0x45 GyZ = Wire.read() << 8 | Wire.read(); // 0x47 Serial.print("AcX = "); Serial.print(AcX); // выводим данные в Serial Serial.print(" | AcY = "); Serial.print(AcY); Serial.print(" | AcZ = "); Serial.print(AcZ); Serial.print(" | Tmp = "); Serial.print(Tmp / 340.00 + 36.53); // выводим температуры по формуле Serial.print(" | GyX = "); Serial.print(GyX); Serial.print(" | GyY = "); Serial.print(GyY); Serial.print(" | GyZ = "); Serial.println(GyZ); delay(333); }

    سوف تحتاج

    • - اردوينو؛
    • - مقياس الجهد الرقمي AD5171؛
    • - الصمام الثنائي الباعث للضوء.
    • - مقاومة 220 أوم؛
    • - 2 مقاومات عند 4.7 كيلو أوم؛
    • - توصيل الأسلاك.

    تعليمات

    يستخدم Serial IIC (يُسمى أيضًا I2C - الدوائر المتكاملة) خطي اتصال ثنائي الاتجاه يُطلق عليهما ناقل البيانات التسلسلي لنقل البيانات. S.D.A.(البيانات التسلسلية) وحافلة الساعة SCL(الساعة التسلسلية). يوجد أيضًا خطان للطاقة. يتم سحب حافلات SDA وSCL إلى ناقل الطاقة من خلال المقاومات.
    يوجد جهاز رئيسي واحد على الأقل على الشبكة ( يتقن)، الذي يبدأ نقل البيانات ويولد إشارات التزامن. تحتوي الشبكة أيضًا على أجهزة تابعة ( عبد)، والتي تنقل البيانات بناء على طلب القائد. يحتوي كل جهاز تابع على عنوان فريد يستخدمه السيد للوصول إليه. يشار إلى عنوان الجهاز في ورقة البيانات. يمكن توصيل ما يصل إلى 127 جهازًا، بما في ذلك العديد من الأجهزة الرئيسية، بحافلة I2C واحدة. يمكن توصيل الأجهزة بالحافلة أثناء التشغيل، أي. وهو يدعم التوصيل الساخن.

    يستخدم Arduino منفذين للعمل عبر واجهة I2C. على سبيل المثال، في Arduino UNO وArduino Nano، يتوافق المنفذ التناظري A4 مع SDA، ويتوافق المنفذ التناظري A5 مع SCL.
    لنماذج اللوحة الأخرى:
    اردوينو برو وبرو ميني- A4 (SDA)، A5 (SCL)
    اردوينو ميجا- 20 (SDA)، 21 (SCL)
    اردوينو ليوناردو- 2 (SDA)، 3 (SCL)
    اردوينو بسبب- 20 (SDA)، 21 (SCL)، SDA1، SCL1

    لتسهيل تبادل البيانات مع الأجهزة عبر ناقل I2C، تمت كتابة مكتبة "Wire" قياسية لـ Arduino. لديها الوظائف التالية:
    ابدأ (العنوان)- تهيئة المكتبة والاتصال بحافلة I2C؛ إذا لم يتم تحديد العنوان، فإن الجهاز المتصل يعتبر هو الجهاز الرئيسي؛ يتم استخدام معالجة 7 بت؛
    طلب من()- يستخدمه السيد لطلب عدد معين من البايتات من العبد؛
    بدء الإرسال (العنوان)- بدء نقل البيانات إلى الجهاز التابع على عنوان محدد؛
    نهاية الإرسال ()- إنهاء نقل البيانات إلى العبد؛
    يكتب()- تسجيل البيانات من العبد ردا على الطلب؛
    متاح()- إرجاع عدد بايتات المعلومات المتاحة للاستلام من العبد؛
    يقرأ()- قراءة البايت المنقولة من العبد إلى السيد أو من السيد إلى العبد؛
    onReceive()- يشير إلى وظيفة يجب استدعاؤها عندما يتلقى العبد إرسالاً من السيد؛
    تحت الطلب()- يشير إلى وظيفة يجب استدعاؤها عندما يتلقى السيد إرسالاً من العبد.

    دعونا نرى كيفية العمل مع ناقل I2C باستخدام Arduino.
    أولا، دعونا نجمع الدائرة، كما في الشكل. سوف نتحكم في سطوع مؤشر LED باستخدام مقياس الجهد الرقمي ذو 64 موضعًا AD5171، المتصل بحافلة I2C. العنوان الذي سنصل إليه إلى مقياس الجهد هو 0x2c (44 بالنظام العشري).