فئات: دوائر متحكم
مرات المشاهدة: 41940
تعليقات على المقال: 5

طرق لقراءة وإدارة منافذ الإدخال / الإخراج من Arduino

 

للتفاعل مع العالم الخارجي ، تحتاج إلى تكوين مخرجات متحكم لتلقي إشارة أو نقلها. نتيجة لذلك ، سيعمل كل دبوس في وضع الإدخال والإخراج. هناك طريقتان للقيام بذلك على لوحة Arduino المفضلة لديك ، بالضبط كيف ستتعلم من هذه المقالة.

طرق لقراءة وإدارة منافذ الإدخال / الإخراج من Arduino

الطريقة الأولى - اللغة القياسية لـ Arduino IDE

الجميع يعرف ذلك اردوينو مبرمجة في C ++ مع بعض التكيف والتبسيط للمبتدئين. ويسمى الأسلاك. في البداية ، يتم تعريف جميع منافذ اردوينو على أنها مدخلات ، وليس هناك حاجة لتحديد ذلك في الكود.

تتم كتابة المنافذ عادة في وظيفة التهيئة المتغيرة:

إعداد باطل ()
{
// الرمز
}

للقيام بذلك ، استخدم الأمر pinMode ، به بناء جملة بسيط إلى حد ما ، أوضح أولاً رقم المنفذ ، ثم دوره ، مفصولة بفواصل.

pinMode (nomer_porta ، naznachenie)

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

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

pinMode (13 ، INPUT) ؛

الإخراج - الإخراج ، اعتمادًا على الأمر الموضح في الكود ، يأخذ المنفذ قيمة واحدة أو صفر. يصبح الإخراج نوعًا من مصدر الطاقة المتحكم به وينتج أقصى تيار (في حالتنا ، 20 مللي أمبير و 40 مللي أمبير في الذروة) للحمل المتصل به. لتعيين منفذ كإخراج إلى Arduino ، يلزمك إدخال:

pinMode (13 ، الإخراج) ؛

INPUT_PULLUP - يعمل المنفذ كمدخل ، ولكن ما يسمى يتصل به. 20 كيلو متر المقاوم متابعة.

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

pinMode (13 ، INPUT_PULLUP) ؛

مدخلات سحب المتابعة

يتم استلام البيانات من المنافذ ويتم إرسالها إليهم بواسطة الأوامر:

  • digitalWrite (رقم التعريف الشخصي ، القيمة) - يحول دبوس الإخراج إلى منطقية 1 أو 0 ، على التوالي ، يظهر جهد 5V أو يختفي عند الإخراج ، على سبيل المثال digitalWrite (13 ، HIGH) - يوفر 5 فولت (وحدة منطقية) إلى 13 دبابيس ، و digitalWrite (13 ، منخفض ) - يترجم 13 دبابيس إلى حالة من الصفر المنطقي (0 فولت) ؛

  • digitalRead (pin) - يقرأ القيمة من المدخلات ، على سبيل المثال digitalRead (10) ، يقرأ الإشارة من 10 دبابيس ؛

  • analogRead (pin) - يقرأ إشارة تمثيلية من منفذ تمثيلي ، تحصل على قيمة في النطاق من 0 إلى 1023 (ضمن ADC 10 بت) ، مثال هو analogRead (3).


الطريقة الثانية - إدارة المنافذ من خلال سجلات Atmega وتسريع التعليمات البرمجية

هذا التحكم بسيط بالطبع ، ولكن في هذه الحالة هناك عيبان - استهلاك أكبر للذاكرة وضعف الأداء عند العمل مع المنافذ. ولكن تذكر ما هو Arduino ، بغض النظر عن لوحة الخيار (uno ، micro ، nano)؟ بادئ ذي بدء ، هذا متحكم AVR الأسرة ATMEGA، استخدمت مؤخرا MK atmega328.

في Arduino IDE ، يمكنك برمجة لغة C AVR الأصلية لهذه العائلة ، كما لو كنت تعمل مع متحكم منفصل. لكن أول الأشياء أولا. لإدارة منافذ Arduino بهذه الطريقة ، عليك أولاً التفكير بعناية في الرسم التوضيحي التالي.

Atmega168 متحكم الموانئ

ربما سيقوم شخص ما بفحص المنافذ في هذا النموذج بشكل أكثر وضوحًا (نفس الشيء في الشكل ، ولكن في تصميم مختلف):

منافذ متحكم Atmega328

هنا ترى مراسلات استنتاجات اردوينو وأسماء موانئ أتميغا. لذلك ، لدينا 3 منافذ:

  • PORTB.

  • PORTC.

  • PORTD.

بناءً على الصور المعروضة ، قمت بتجميع جدول المراسلات بين موانئ Arduino و Atmega ، سيكون مفيدًا لك في المستقبل.

جدول التوافق من الموانئ اردوينو و Atmega

يحتوي Atmega على ثلاث سجلات من 8 بت تتحكم في حالة المنافذ ، على سبيل المثال ، سيتعرف المنفذ B على الغرض من ذلك من خلال رسم القياس باستخدام أدوات الأسلاك القياسية الموضحة في بداية هذه المقالة:

  • PORTB - إدارة حالة الإخراج. إذا كان الدبوس في وضع "الإخراج" ، فإن 1 و 0 يحددان وجود نفس الإشارات في الخرج. إذا كان الدبوس في وضع "الإدخال" ، فإن 1 يربط المقاوم بالسحب (مثل INPUT_PULLUP الذي تمت مناقشته أعلاه) ، إذا كانت 0 هي حالة مقاومة عالية (تناظرية INPUT) ؛

  • PINB هو سجل القراءة. وفقًا لذلك ، يحتوي على معلومات حول الحالة الحالية لدبابيس المنفذ (الوحدة المنطقية أو الصفر).

  • DDRB - سجل اتجاه الميناء. مع ذلك ، تشير إلى متحكم ما إذا كان المنفذ هو إدخال أو إخراج ، مع "1" إخراج و "0" إدخال.

بدلاً من الحرف "B" ، يمكن أن يكون هناك أي شيء آخر وفقًا لأسماء المنافذ ، على سبيل المثال ، تعمل أوامر PORTD أو PORTC الأخرى بشكل مشابه.

نحن نغمض مؤشر LED ، واستبدل وظيفة digitalWrite () القياسية. أولاً ، دعنا نتذكر كيف يبدو المثال الأصلي من مكتبة Arduino IDE.

اردوينو الصمام رمز وامض

هذا هو رمز "وميض" المشهور ، والذي يظهر يومض المصباح المدمج في اللوحة.

إدارة دبوس

التعليقات شرح الرمز. منطق هذا العمل هو على النحو التالي.

يضع الأمر PORTB B00100000 PB5 في حالة وحدة منطقية ، انظر ، وتلك الصور والجدول الموجود أدناه وترى أن PB5 يتوافق مع 13 دبوسًا من Arduina.

يشير الحرف "B" أمام الأرقام إلى أننا نكتب القيم في شكل ثنائي. ينتقل الترقيم بالثنائي من اليمين إلى اليسار ، أي هنا الوحدة في الجزء السادس من الحافة اليمنى للبت ، والتي تخبر متحكم حول التفاعل مع حالة بت السادس من سجل المنفذ B (PB5). يوضح الجدول أدناه بنية المنفذ D ، وهو مشابه ويتم تقديمه كمثال.

ميناء D هيكل

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

حاسبة ويندوز

أدخل الرقم المطلوب:

وضع حاسبة مبرمج

وانقر على HEX:

ترجمة الأرقام على آلة حاسبة

في هذه الحالة ، ننقل كل هذا إلى Arduino IDE ، ولكن بدلاً من البادئة "B" ، ستكون "0x".

نقل الرقم في اردوينو IDE

ولكن مع هذا الإدخال هناك مشكلة. إذا كان لديك أي شيء متصل بدبابيس أخرى ، فقم بإدخال أمر مثل B00010000 - ستقوم بإعادة تعيين جميع المسامير باستثناء 13 (PB5). يمكنك إدخال البيانات لكل دبوس على حدة. سيبدو مثل هذا:

إدخال البيانات في كل دبوس

قد يبدو هذا السجل غير مفهوم ، دعنا نتعرف عليه.

تحليل سجل

هذه عملية إضافة منطقية ، | = تعني إضافة شيء إلى محتويات المنفذ.

عملية إضافة منطقية

هذا يعني أنك تحتاج إلى إضافة كلمة مكونة من 8 بتات في السجل مع وحدة مبدلة بمقدار 5 بتات - نتيجة لذلك ، إذا تبين أن 11000010 هي 110،110،010. ظلت حالة المسامير متحكم دون تغيير.

ولكن مع الإضافة المنطقية ، تنشأ مشكلة - لا يمكنك تحويل الوحدة إلى صفر ، للأسباب التالية:

0+0=1

1+0=1

0+1=1

الضرب المنطقي والانعكاس سيساعدنا:

الضرب المنطقي والانعكاس

& = يعني ضرب محتويات المنفذ برقم محدد.

 

ضرب محتويات المنفذ برقم

وهذا هو الرقم الذي نتضاعف به. تشير علامة "~" إلى انعكاس. في حالتنا ، الوحدة المقلوبة هي صفر. بمعنى ، نقوم بضرب محتويات المنفذ بمقدار صفر ، ونحوله إلى 5 بتات. على سبيل المثال ، كان 10110001 ، أصبح 10100001. بقيت البتات المتبقية دون تغيير.

اضرب محتويات المنفذ بمعدل صفر تحول بمقدار 5 بتات

يمكن القيام بنفس الشيء باستخدام العملية العكسية (^):

قراءة من المنافذ ، يتم تنفيذ analog لـ digitalRead () باستخدام سجل PIN ، ويبدو أنه في الممارسة العملية كما يلي:

قراءة من الموانئ

نحن هنا نتحقق مما إذا كان التعبير الوارد بين قوسين يساوي الحالة الحقيقية للمنافذ ، أي وبالمثل إذا كتبنا إذا (digitalRead (12) == 1).


استنتاج

لماذا توجد مثل هذه الصعوبات في إدارة المنفذ إذا كان يمكنك استخدام وظائف ملائمة قياسية؟ كل شيء عن السرعة وحجم الرمز. عند استخدام الطريقة الثانية ، التي تمت مناقشتها في المقالة ، يتم تقليل حجم الرمز إلى حد كبير ، وتزداد السرعة بعدة أوامر من حيث الحجم. تم تنفيذ digitalWrite القياسي () في 1800 μs ، وتسجيله مباشرة إلى المنفذ في 0.2 μs ، و digitalRead () في 1900 μs ، وأصبح أيضًا 0.2 μs. تم العثور على طريقة التحكم هذه في المساحات المفتوحة للشبكة وغالبًا ما توجد في التعليمات البرمجية. مشاريع مكتملة.

انظر أيضا في bgv.electricianexp.com:

  • ربط وبرمجة اردوينو للمبتدئين
  • كيفية توصيل التشفير التدريجي لاردوينو
  • ميكروكنترولر الموافقة المسبقة عن علم للمبتدئين
  • متحكم عن بعد: IR Remote، Arduino، ESP8266، 433 ...
  • قياس درجة الحرارة والرطوبة على اردوينو - مجموعة مختارة من الطرق

  •  
     
    التعليقات:

    # 1 كتب: Kipovets | [سيت]

     
     

    "ولكن مع إضافة منطقية ، تنشأ مشكلة - لا يمكنك تحويل الوحدة إلى صفر ، لأنه:

    0 + 0 = 1 "(ج)

    رقابة صغيرة: 0 + 0 = 0.

     
    التعليقات:

    # 2 كتب: chugou | [سيت]

     
     

    Kipovets ، ربما أراد أن يقول:

    1 + 1 = 1

     
    التعليقات:

    # 3 كتب: | [سيت]

     
     

    Kipovets,
    الخطأ المطبعي عاديا! ترى كم هو جيد أن المتخصصين يجلسون على بوابتنا! عليك أن تجعل المحتوى المناسب فقط!

     
    التعليقات:

    # 4 كتب: Serg | [سيت]

     
     

    في الجزء الأخير ، تقول PORTB | = 1 << 5 ... إذا (digitalRead (12) == 1). لكن 5 دبوس من الميناء B ، فمن 13 دبوس من اردوينو. أم أنا مخطئ؟!

     
    التعليقات:

    # 5 كتب: ف على بعد ساعة واحد | [سيت]

     
     

    إذا كان (PINB == B00010000) {} غير صحيحيشبه إذا كتبنا إذا (digitalRead (12) == 1)
    التناظرية إلى حد ما
    (digitalRead (12) == 1) &&(digitalRead (13) == 1) &&(digitalRead (14) == 1) &&(digitalRead (15) == 1) &&(digitalRead (11) == 1) ... وهكذا 8 دبابيس منفذ

    هنا تحتاج إما هذا:
    إذا (
    ! (~ PORTB & (1 << PB4))) {} //عائدات0 أو 1
    إما مثل هذا:
    إذا (PORTB & (1 << PB4)) {} // تقوم بإرجاع الوحدة المتحولة = 16 ، DEC
    إما مثل هذا:
    إذا (
    bit_is_set (PORTB ، 4)) {}/ ترجع الوحدة المغيرة = 16 ، DEC