أردوينو وحفنة أسلاك فقط

2013-11-13

حصلت على لوح أردوينو ليوناردو من موقع اشتري (مع أني انصح المبتدئين بشراء uno) وقبل أن أحصل على أي مكونات أخرى ولا حتى أضواء ولا مفاتيح كهربائية. سأكتب ما يمكنك أن تقوم به بلوح أردوينو وحفنة من الأسلاك فقط.

لوح أردوينو ليوناردو

من أين نحضر الأسلاك المناسبة؟ يمكنك استعمال أسلك خط الهاتف وذلك من خلال تعرية طرفيه ثم سحب السلكين الموجودين بداخله. من الخيارات الجيدة الأخرى أسلاك cat-5 المستخدم في خط الإيثرنت حيث يمكننا أن نستخرج منه 5 أسلاك. ما يميز هذه الأسلاك أنها تحتوي سلك نحاسي واحد صلب يمكن حشره في فتحات أردوينو وألواح التجارب. كذلك يمكن تشكيل هذه الأسلاك وتجديلها.

قم بتقطيع الأسلاك بأطول قصيرة مثلا 4 سم و 8 سم و 10 سم و 15 سم. بعد تقطيع الأسلاك قم بتعرية حوالي نصف سنتيمتر من طرفي كل سلك قبل تشكيل السلك. خذ السلك الطويل وجدله حول مغزل صوف أو قلم رفيع مما يعطيك مرونة أكبر في الطول.

شغل بيئة تطوير أردوينو ثم حدد نوع اللوحة من قائمة tools ثم boards. كذلك حدد المنفذ التسلسلي المستخدم في التحدث مع اللوحة من قائمة Serial port. نظام لينكس ذكي سيعرض لك المنافذ التي تحتوي ألواح أردوينو في حالتي لم يكن هناك سوى خيار واحد وهو ttyACM0 لكن في ويندوز سيكون عليك التخمين بين COM1 إلى COM13 حظا طيبا.

افتح برنامج Blink من قائمة File ثم Examples ثم Basics ثم Blink ارفع البرنامج على لوح أردوينو ولاحظ ما يلي:

  • هناك ثنائيات مضيئة LED صغيرة مطبوعة على اللوحة عددها 4
  • ضوء الطاقة ويعني أن اللوح يعمل
  • ضوء RX و TX والتي تضيء عند إرسال واستقبال بيانات من وإلى الحاسوب سواء لرفع البرنامج أو التواصل التسلسلي ضمن البرنامج (سنعمله لاحقا)
  • ضوء مكتوب عليه L يومض ويطفئ برمجيات بسبب برنامج Blink وذلك لأنه موصول بالمنفذ PIN13 والذي يقوم برنامجنا بتقليبه دوريا
  • الضغط على زر RESET يعيد تشغيل المتحكم الدقيق
  • يمكنك تشغيل لوح أردوينو من خلال وصله مع اي شاحن USB عوضا عن الحاسوب.

قلنا أن زر RESET يعيد تشغيل المتحكم الدقيق وبالتالي برنامجك لكن في حالة ليوناردو يؤدي إلى فقدان التواصل مع USB أيضا مما يشوش بيئة التطوير وقد تحتاج الخروج والدخول إليها أو إعادة اختيار المنفذ التسليلي ولهذا أنصح المبتدئي بلوح أونو Uno وليس ليوناردو.

كود برنامج Blink هو

/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */ // Pin 13 has an LED connected on most Arduino boards. // give it a name: #define led 13 // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }

قمت بتعديل السطر رقم 10 لأستعمل define preprocessor عوضا عن حجز رقم في الذاكرة. حيث أن define led 13 تعني في كل مكان ترى فيه التعبير led ضع مكانه رقم 13 قبل تصنيف البرنامج compile

بيئة اردوينو تستخدم نسخة مصغرة ومبسطة من لغة سي وتقوم بتصنيفها عبر مصنف avr-gcc من غنو.

يتألف الكود من دالتين: دالة إعداد setup يتم تنفيذها عند تشغيل المتحكم الدقيق والثانية دالة الحلقة loop ويظل البرنامج يدور فيها ويعيد تنفيذها مرة بعد مرة.

في الدالة الإعداد setup قمنا بتحديد طور المنفذ رقم 13 ليكون للمخرجات وذلك لنتمكن من إرسال نبضات إلى هذا المنفذ. ويقابل هذا الطور طور الإدخال INPUT وطور الإدخال المرفوع INPUT_PULLUP سنأتي عليها لاحقا.

في دالة الحلقة loop قمنا بتقليب وضع ذلك المنفذ بين عالي HIGH (يعني +5.0 فولت) ومنخفض LOW (يعني صفر فولت) عبر دالة digitalWrite مع الانتظار 1000 ميلي-ثانية (أي ثانية واحدة) عبر دالة delay بعد كل حالة لنتمكن من مشاهدتها (لأن لوح أردوينو يعمل بتردد 16 مليون دورة في الثانية فلو تم تقليب وضعية الضوء كذا مليون مرة في الثانية لن نلحظ شيء)

لنلهو قليلا بهذا البرنامج مثلا فلنجعله يتقلب مرتين بسرعة ثم ينتظر ثانية بتعديل الكود كما يلي:

// the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(100); // wait for a second digitalWrite(led, LOW); // turn the LED on (HIGH is the voltage level) delay(100); // wait for a second digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(100); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }

المشروع التالي هو التنقل بين طورين: تقليب الضوء مرة واحدة أو مرتين. لكن من أين سنأتي بشيء يحفز الانتقال من هذا الطور وليس معي إلا حفنة أسلاك. طيب لنجرب استخدام أحد المنافذ مثلا المنفذ رقم 3 ونعده لاستقبال المدخلات INPUT ونغذيه بفولتية عالية عندما نريد بوصله بالمنفذ v+5. ولنتجاهل قليلا أنني أحتاج لمقاومة صغيرة عند وصله حتى لا تحدث دارة قصر short circuit المشكلة الأكبر أن عدم توصيل المنفذ بأي شيء يجعل المنفذ يستقبل ضوضاء من البيئة المحيطة في حين أنني أريده أن يكون صفر عندما يكون غير موصول وتوصل مرة GND ومرة V+5 أمر غير عملي.

لننتقل لمشروع قياس الضوضاء والتحدث مع الحاسوب ثم نعود لمشروع تقليب الأطوار. اكتب المشروع التالي وصل بعض الأسلاك في المنفذ الرقمي رقم 3 و رقم 8 والمنفذ التناظري رقم A0 و A1 واتركها في الهواء

#define PINi 3 #define PINj 8 #define PINa A0 #define PINb A1 int i=0,j=0,a,b; void setup() { pinMode(PINi, INPUT); pinMode(PINj, INPUT); Serial.begin(9600); } void loop() { i=digitalRead(PINi); j=digitalRead(PINj); a=analogRead(PINa); b=analogRead(PINb); if (i==HIGH) Serial.println("PINi is HIGH"); else Serial.println("PINi is LOW"); if (j==HIGH) Serial.println("PINj is HIGH"); else Serial.println("PINj is LOW"); Serial.print("Analog Value a: "); Serial.println(a); Serial.print("Analog Value b: "); Serial.println(b); delay(1000); // wait for a second }

بعد رفع البرنامج على اللوح افتح المرقاب التسلسلي Serial Monitor وهو شاشة للتواصل مع اللوح وذلك بالضغط على الزر المبين في الشكل

المرقاب التسلسلي

ونلاحظ ما يلي:

  • لاحظ إمكانية استقبال مخرجات من أردوينو في جهاز الحاسوب ويكون ذلك عبر استهلالها Serial.begin بسرعة معينة وهي في مثالنا 9600 واستخدام نفس السرعة في شاشة المراقب
  • تظهر قيم عشوائية على المنافذ الرقمية بين HIGH و LOW وذلك لأن ممانعة impedence المنفذ منخفضة في طور الإدخال وهو غير موصول بالإرض ولا بحساس.
  • المنافذ التناظرية تعيد قيمة من 10 منازل رقمية أي من 0 إلى 1023 بالنظام العشري ولأنها غير موصولة بحساس ولا بالأرض ولها ممانعة قليلة تجدها تعطي أرقام عشوائية
  • صل سلك بين GND والمنفذ الرقمي 3 واترك 8 غير موصول ولاحظ أنه أصبح ثابت على LOW ولم يعد عشوائي
  • صل سلك بين GND والمنفذ التناظري A0 ولاحظ أنه أصبح صفر أو قريب من الصفر
  • صل سلك بين V+5 والمنفذ التناظري A1 ولاحظ أنه أصبح 1023 أو قريب منه
  • صل سلك بين V3.3 والمنفذ التناظري A1 ولاحظ أنه أصبح 675 أو قريب منه
  • تجنب لمس الأطراف المعدنية أو تلامس الأطراف العارية للأسلك يمكنك أن تجرب كل خطوة سابقة وحدها
  • يوجد أكثر من منفذ عليه علامة GND يمكنك استخدام أيها تشاء

لنعد الآن إلى مشروع تقليب الأطوار. تحتوي المتحكمات الدقيقة المستخدمة في أردوينو مقاومات رفع داخلية pullup resistors يمكن وصلها برمجيا على أي من المنافذ الرقمية باستعمال طور INPUT_PULLUP وهي تجعل المنفذ يعطي القيمة 1 ما لم تقم بوصله بالأرض GND. يمكنني الآن الاستغناء عن المقاومة والإلتزام بهدف هذه المقالة وهو استخدام أردوينو وحفنة أسلاك حصريا.

جرب البرنامج التالي ولاحظ ما بعده

#define led 13; #define i 3; #define j 8; int mode = 1; // the setup routine runs once when you press reset: void setup() { Serial.begin(9600); pinMode(i, INPUT_PULLUP); pinMode(j, INPUT_PULLUP); pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { if (mode==1) { Serial.println("mode 1"); digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(900); } else { Serial.println("mode 2"); digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100); digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(700); } if (digitalRead(i)==LOW) mode=1; if (digitalRead(j)==LOW) mode=2; }
  • صل سلك بين GND ومنفذ 3 مما يؤدي إلى خفظ فولتيته المرفوعة تلقائيا مما يطابق الشرط ويغير قيمة متغير الطور mode إلى 1 فنرى الضوء يومض مرة واحدة بشكل متكرر
  • فك السلك السابق وصله بين GND ومنفذ رقم 8 مما يؤدي إلى خفظ فولتيته مما يطابق الشرط ويغير قيمة متغير الطور mode إلى 2 فنرى الضوء يومض مرتين متتاليتين بشكل متكرر
  • طالما كان السلك في أحد الأطوار فإننا نرى نافذة المرقاب التسلسلي تفيض بعبارة mode 1 أو mode 2 وليس فقط عند الانتقال بين الطورين.

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

#define led 13 #define mode1_int 0 #define mode2_int 1 volatile int mode = 1; char in; // the setup routine runs once when you press reset: void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(led, OUTPUT); attachInterrupt(mode1_int, mode1, FALLING); attachInterrupt(mode2_int, mode2, FALLING); } void mode1() { mode=1; Serial.println("switching to mode 1"); } void mode2() { mode=2; Serial.println("switching to mode 2"); } // the loop routine runs over and over again forever: void loop() { if (mode==1) { digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(1000); } else { digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100); digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(700); } if (Serial.available()) { in=(char)Serial.read(); if (in>='0' && in<='\9') { mode=(in=='1')?1:2; Serial.println("switching"); } Serial.println("got serial"); } }

لاحظ معي ما يلي

  • جرب أن تصل المنفذ INT0 وهو المنفذ الرقمي 2 أو 3 حسب اللوح الموجود عندك (انظر مرجع أردوينو عن AttachInterrupt)
  • جرب أن تصل المنفذ INT1 وهو المنفذ الرقمي 3 أو 2 حسب اللوح الموجود عندك
  • لاحظ أن عبارة switching لاتظهر على المرقاب إلا عند التغير من طور إلى الآخر لأننا سجلنا لمقاطعة تعمل عند هبوط الفولتية FALLING (بعد أن كانت مرتفعة) وليس عندما تكون الفولتية منخفضة LOW
  • لاحظ أن المتغيرات المستخدم داخل دوال معالجة المقاطعة يجب أن تعرف بالمحدد الإضافي volatile
  • داخل نافذة المرقاب اكتب 1 أو 2 ثم انقر على send أو اضغط ENTER وستلاحظ تغير الطور أيضا وبهذا وضحنا كيفية استقبال أوامر من الحاسوب من خلال فحص Serial.available ثم استخراج المحرف باستدعاء Serial.read

يمكنك أن تذهب أبعد من هذا حيث يمكنك أن تتخاط تسلسليا من لوح أردوينو من خارج بيئة أردوينو تماما كما تتخاطب عبر المنافذ التسلسلية في العديد من لغات البرمجة مثل بايثون انظر مثلا مخاطبة أردوينو من خلال بايثون

3


محمد عنيني
محمد عنينيمنذ 3 سنوات

رائع!! جزاك الله خيرا على الموضوع القيم، لكل مبتدأ، سيكون موضوعك كفيلا بفهم طريقة عمل وتواصل الأردوينو، باستخدام أردوينو وحفنة أسلاك فقط!

بالمناسبة، معلومة دالة define preprocessor جديدة علي، سأستخدمها أكثر في مشاريعي القادمة، شكرا :)

0

hanood_ja
hanood_jaمنذ 3 سنوات

السلام عليكم ..انا بحاجه لمساعده من ناحية كيف اخلي الاردوينو يقدر يقرأ ويكتب على داتا بيز؟؟؟نصحوني بالبايثون؟؟؟ بس مو عارف كيف ؟؟او حتى شو الرابط بينهم؟؟ ممكن تفيدوني

0

Test User