You are on page 1of 184

‫د‪.‬م‪ .

‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫األردوينو من البداية وحتى االحتراف‬


‫(مستوى المتوسط)‬

‫د‪.‬م‪ .‬حسام الوفائي‬

‫‪1‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫مقدمة‬
‫يتناول كتاب األردوينو من البداية وحتى االحتراف – مستوى المتوسط – ما يلي‪:‬‬

‫حساس األلوان ‪TCS230‬‬ ‫حساس المسافة ‪HC-SR04‬‬ ‫حساس الحرارة والرطوبة ‪DHT‬‬

‫حساس اللهب‬ ‫حساس معدل التدفق ‪YF-S201‬‬ ‫حساس الحركة ‪HC-SR501‬‬

‫وحدة إشارة القلب ‪AD8232‬‬ ‫حساس أول أكسيدالكربون ‪MQ-7‬‬ ‫وحدة تجنب العوائق‬
‫‪MQ7‬‬

‫‪2‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫وحدة تعريف الهوية ‪MFRC522‬‬ ‫حساس معدل النبضات ونسبة األكسجين‬ ‫وحدة الزمن الحقيقي ‪DS1307‬‬
‫‪RFID‬‬ ‫‪RTC‬‬

‫وحدة اتصال البلوتوث ‪HC-05‬‬ ‫وحدة االتصال الخلوية ‪SIM800‬‬ ‫وحدة تحديد الموقع ‪NEO-6M‬‬

‫شاشة اللمس الملونة ‪2.4” TFT‬‬ ‫وحدة اتصال إثرنت ‪ENC28J60‬‬ ‫وحدة اتصال واي‪-‬فاي ‪ESP-01‬‬
‫‪LCD‬‬

‫تصميم برامج على الهواتف الخلوية‬

‫‪3‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫لالستفادة من المستوى المتوسط البد من االنتهاء من دراسة مستوى المبتدئ‬

‫إلبداء المالحظات والمساعدة يرجى التواصل على البريد االلكتروني‪:‬‬

‫‪hussam.wafai@hotmail.com‬‬
‫مالحظة هامة‪ :‬يسمح باالستفادة العلمية من الكتاب والنسخ منه مع اإلشارة إلى المصدر‪ ،‬ويمنع‬

‫استخدامه تجاريا‪.‬‬

‫حمص‪-‬سوريا ‪2121/11/22‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬
‫(عضو هيئة تدريسية في جامعة البعث – كلية الهندسة الميكانيكية والكهربائية – قسم الهندسة االلكترونية واالتصاالت)‬

‫‪4‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الفهرس‬

‫‪-1‬حساس الحرارة والرطوبة ‪6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DHT‬‬


‫‪-2‬حساس المسافة ‪12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HC-SR04‬‬
‫‪-3‬حساس األلوان ‪16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TCS230‬‬
‫‪-4‬حساس الحركة ‪24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HC-SR501‬‬
‫‪-5‬حساس معدل تدفق الماء ‪31 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . YF-S201‬‬
‫‪ -6‬حساس اللهب ‪33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬
‫‪-2‬حساس تجنب العوائق ‪36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .‬‬
‫‪-8‬حساس غاز أول أكسيد الكربون ‪38 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MQ7‬‬
‫‪-9‬وحدة قياس إشارة القلب الكهربائية ‪42 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AD8232‬‬
‫‪-11‬وحدة الزمن الحقيقي ‪54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DS1307 RTC‬‬
‫‪-11‬حساس معدل نبضات القلب ونسبة األكسجين ‪64 . . . . . . . . . . . . . . . . . . . . . . MAX30100‬‬
‫‪-12‬وحدة تعريف الهوية ‪21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MFRC522 RFID‬‬
‫‪-13‬وحدة تحديد الموقع العالمي ‪81 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GPS NEO-6M‬‬
‫‪-14‬وحدة اتصال بالشبكة الخلوية ‪92 . . . . . . . . . . . . . . . . . . . . . . . . SIM800L GSM / GPRS‬‬
‫‪-15‬وحدة اتصال البلوتوث ‪115 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HC-05‬‬
‫‪-16‬وحدة اتصال واي فاي ‪123 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ESP-01‬‬
‫‪-12‬وحدة اتصال شبكة محلية ‪149 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ENC28J60‬‬
‫‪-18‬شاشة اللمس الملونة ‪154 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4” TFT LCD‬‬
‫‪-19‬تصميم برامج على الهواتف المحمولة للتحكم باألردوينو باستخدام ‪162 . . . . . . . . RemoteXY‬‬

‫‪5‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫ربط الحساسات مع لوحة األردوينو‬


‫‪-1‬حساس الحرارة والرطوبة ‪DHT‬‬
‫‪-1-1‬مقدمة‬
‫يستخدم حساس ‪ DHT‬كعنصر لقياس درجة الحرارة والرطوبة حيث يولد إشارة رقمية للقيمة الفعلية‬
‫لهما‪ .‬يمكن وصله بسهولة مع المتحكمات الصغرية واألردوينو والراسبري باي‪ .‬يتألف ‪ DHT‬من العناصر‬
‫التالية‪:‬‬
‫‪ -1‬حساس رطوبة عن طريق السعة ‪.capacitor humidity sensor‬‬
‫‪-2‬حساس حرارة على شكل مقاومة حرارية ‪.thermistor‬‬
‫‪ -3‬شريحة ‪ chip‬تنجز عملية التحويل التشابهية الرقمية‪ ،‬وتولد إشارة رقمية معبرة عن درجة الحرارة‬
‫والرطوبة‪.‬‬
‫يوجد نموذجان لحساس ‪ DHT‬هما ‪ DHT11‬و‪ DHT22‬كما هو موضح في الشكل (‪ .)1‬لهما نفس‬
‫األرجل ولكن يختلفان عن بعضهما ببعض الخواص كما هو موضح في الجدول(‪.)1‬‬

‫الشكل (‪ :)1‬حساس الحرارة والرطوبة ‪ DHT11‬و ‪.DHT22‬‬

‫الجدول (‪ :)1‬مقارنة ما بين ‪ DHT11‬و ‪.DHT22‬‬


‫‪DHT22‬‬ ‫‪DHT11‬‬ ‫الخاصية‬
‫تكلفة منخفضة‬ ‫تكلفة منخفضة جدا‬ ‫التكلفة‬
‫)‪3-5 (V‬‬ ‫)‪3-5 (V‬‬ ‫جهد العمل‬
‫‪2.5 mA‬‬ ‫‪2.5 mA‬‬ ‫التيار المستهلك األعظمي أثناء التبديل‬
‫المجال‪0-100%:‬‬ ‫المجال‪20-80% :‬‬ ‫مجال القراءة والدقة للرطوبة‬
‫الدقة ‪2-5%‬‬ ‫الدقة ‪5%‬‬
‫المجال‪-40°C to +125°C:‬‬ ‫المجال‪0°C to 50°C:‬‬ ‫مجال القراءة والدقة لدرجة الحرارة‬
‫دقة ‪.±0.5°C‬‬ ‫دقة ‪±2°C‬‬
‫يجب أن ال يزيد عن ‪0.5 Hz‬‬ ‫يجب أن ال يزيد عن ‪1 Hz‬‬ ‫معدل أخذ العينات‬
‫(قراءة واحدة كل ثانيتين)‪.‬‬ ‫(قراءة واحدة كل ثانية)‪.‬‬
‫‪15.1mm x 25mm x‬‬ ‫‪15.5mm x 12mm x‬‬ ‫الحجم‬
‫‪7.7mm‬‬ ‫‪5.5mm‬‬
‫‪4 pins‬‬ ‫‪4 pins‬‬ ‫األرجل‬

‫‪6‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫من الواضح أن ‪ DHT22‬أكثر دقة من ‪ DHT11‬مع مجال قياس أكبر‪.‬‬
‫للحساسين ‪ DHT11‬و ‪ DHT22‬أربع أرجل كما هو موضح في الشكل (‪:)2‬‬
‫‪ :VCC‬رجل التغذية ‪.(3-5)V‬‬
‫‪ :Data‬رجل البيانات‪ .‬يتم وصلها إلى متحكم صغري‪ .‬تتطلب إضافة مقاومة سحب ‪ pull-up‬قيمتها‬
‫‪ 10KΩ‬أو ‪ 5KΩ‬ما بين هذه الرجل وجهد التغذية ‪.VCC‬‬
‫‪ :NC‬ال يتم وصلها‪.‬‬
‫‪ :GND‬أرضي‪.‬‬

‫الشكل (‪ :)2‬أرجل الحساسين ‪ DHT11‬و ‪.DHT22‬‬


‫من الممكن أن يأتي الحساس ‪ DHT‬مثبتا على لوحة تحتوي على مقاومة السحب‪ ،‬ويخرج منها ثالث‬
‫أرجل ‪ VCC‬و ‪ Data out‬و ‪ GND‬كما هو موضح في الشكل (‪.)3‬‬

‫الشكل (‪ :)3‬الحساس ‪ DHT11‬مثبت على لوحة‪.‬‬

‫‪-2-1‬آلية نقل البيانات على خط النقل التسلسلي‬


‫يستخدم خط نقل وحيد لنقل البيانات والتزامن ما بين الحساس ‪ DHT‬والمتحكم الصغري‪ ،‬وتستغرق‬
‫عملية االتصال حوالي ‪ .4ms‬يتم إرسال كل من درجة الحرارة والرطوبة رقميا على جزأين صحيح‬
‫وعشري‪ .‬عدد البتات الكلي لالتصال ‪ 40 bit‬موزعة على الشكل التالي‪:‬‬
‫‪ 8‬بت للجزء الصحيح للرطوبة ‪ 8 +‬بت للجزء العشري للرطوبة ‪ 8 +‬بت للجزء الصحيح للحرارة‬
‫‪ 8 +‬بت للجزء العشري للحرارة ‪ 8 +‬بت للتأكد من عدم حدوث أخطاء‪.‬‬
‫يتم إجراء االتصال وفق المراحل التالية كما هو موضح في الشكل (‪:)4‬‬
‫‪-1‬يرسل المتحكم الصغري ‪ MCU‬إشارة البدء ‪ Start signal‬والتي تنقل الخط من المستوى المرتفع‬
‫إلى المستوى المنخفض‪ .‬تأخذ هذه العملية ‪ 18 ms‬للتأكد من أن ‪ DHT‬قد تحسس هذه اإلشارة‪ .‬بعد‬
‫ذلك يعمل المتحكم على سحب جهد الخط إلى المستوى المرتفع ‪ pull-up‬وينتظر لفترة زمنية‬
‫‪ 20-40µs‬لكي يستجيب ‪.DHT‬‬
‫‪2‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-2‬عندما يكتشف‪ DHT‬إشارة البدء فإنه يرسل إشارة االستجابة ‪ Response signal‬والتي تنقل‬
‫الخط من المستوى المرتفع إلى المستوى المنخفض‪ .‬تأخذ هذه العملية ‪ .80 µs‬بعد ذلك يعمل ‪DHT‬‬
‫على سحب جهد الخط ‪ pull-up‬إلى المستوى المرتفع وينتظر لفترة زمنية ‪ 80µs‬لإلعداد لإلرسال‪.‬‬
‫‪-3‬يتم إرسال بتات البيانات )‪ (40 bit‬بحيث كل بت يبدأ بمستوى جهد منخفض مدته ‪ 50 µs‬وبعد‬
‫ذلك المدة الزمنية لمستوى الجهد العالي تحدد فيما إذا كان البت '‪ '0‬أو '‪ .'1‬من أجل '‪ '0‬مدة مستوى‬
‫الجهد العالي ‪ ،26-28 µs‬أما '‪ '1‬حوالي ‪ 70 µs‬كما هو موضح في الشكل (‪.)4‬‬
‫‪-4‬بعد االنتهاء من نقل البيانات يعمل ‪ DHT‬على سحب الخط إلى مستوى جهد منخفض لمدة ‪50 µs‬‬
‫ومن ثم يتم سحب الخط عن طريق المقاومة إلى مستوى الجهد المرتفع والعودة إلى الحالة الحرة‪.‬‬

‫الشكل (‪ :)4‬نقل بيانات حساس ‪ DHT‬بشكل تسلسلي‪.‬‬

‫‪-3-1‬ربط حساس ‪ DHT‬مع لوحة األردوينو‬


‫يوضح الشكل (‪ )5‬كيفية وصل حساس ‪ DHT‬مع لوحة األردوينو إلرسال درجة الحرارة والرطوبة‬
‫للوحة األردوينو‪ .‬تم وصل رجل البيانات مع الرجل ‪ ،pin 2‬ويمكن استخدام أي رجل رقمية‪.‬‬

‫الشكل (‪ :)5‬وصل حساس ‪ DHT11‬مع لوحة األردوينو‪.‬‬

‫‪8‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-1‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بالحساس ‪ ،DHT‬سنستخدم مكتبتين متوفرتين على شبكة االنترنت‪.‬‬
‫لنتبع الخطوات التالية‪.‬‬
‫‪-1‬في البداية البد من أن تتوفر لدينا المكتبة ‪( DHT.zip‬المكتبة ‪ DHT.zip‬موجودة ضمن الملفات‬
‫المرفقة مع هذا الكتاب)‪.‬‬
‫‪-2‬نختار في بيئة التطوير لألردوينو من األعلى ‪ Sketch‬ثم ‪ Include Library‬ثم ‪Add .ZIP Library‬‬
‫كما هو موضح في الشكل (‪ .(6‬تظهر نافذة إضافة مكتبة‪ ،‬نختار الملف ‪.DHT.zip‬‬

‫الشكل (‪ :)6‬إضافة مكتبة لبرنامج ‪.Arduino IDE‬‬

‫بعد االنتهاء من هذه الخطوة نالحظ أنه قد تم إضافة مكتبة ‪ DHT‬لبرنامج ‪ Arduino IDE‬كما هو‬
‫موضح في الشكل (‪.)7‬‬

‫الشكل (‪ :)7‬إضافة مكتبة ‪.DHT‬‬


‫‪-3‬بنفس األسلوب نضيف مكتبة أخرى ‪( Adafruit_Sensor-master.zip‬المكتبة موجودة ضمن‬
‫الملفات المرفقة مع الكتاب)‪.‬‬
‫لكتابة كود برمجي نقوم باتباع الخطوات التالية‪:‬‬

‫‪9‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-1‬نقوم في البداية باستدعاء المكتبة ‪ DHT.h‬كما يلي في بداية البرنامج قبل ) ( ‪:void setup‬‬
‫>‪#include <DHT.h‬‬
‫‪-2‬نحدد رجل األردوينو الرقمية التي سنربطها مع رجل بيانات الحساس‪ .‬بفرض أن الرجل الرقمية‬
‫‪ 2‬هي التي سيتم ربطها مع الحساس‪ ،‬تكون التعليمة على الشكل التالي‪:‬‬
‫‪# define DHTPIN 2‬‬

‫‪ -3‬نحدد نوع الحساس هل ‪ DHT11‬أم ‪ .DHT22‬من أجل ‪ DHT11‬تكون التعليمة على الشكل التالي‪:‬‬
‫‪#define DHTTYPE DHT11‬‬
‫من أجل ‪ DHT22‬تكون التعليمة على الشكل التالي‪:‬‬
‫‪#define DHTTYPE DHT22‬‬
‫‪-4‬نعرف كائن لنسميه مثال ‪ dht‬كما يلي‪:‬‬
‫;)‪DHT dht(DHTPIN, DHTTYPE‬‬
‫‪-5‬يتم قراءة درجة الحرارة كما يلي‪:‬‬
‫;)(‪t = dht.readTemperature‬‬
‫‪ -6‬يتم قرارة الرطوبة كما يلي‪:‬‬
‫;)(‪h = dht.readHumidity‬‬

‫‪-5-1‬تطبيق عملي‪ :‬ربط حساس ‪ DHT‬مع لوحة األردوينو وإرسال درجة الحرارة‬
‫والرطوبة للحاسب‬
‫إلنجاز هذا التطبيق نقوم في البداية بوصل الدارة الموضحة في الشكل (‪ .)5‬ومن ثم نقوم بتحميل‬
‫الكود البرمجي التالي‪:‬‬
‫"‪#include "DHT.h‬‬
‫‪#define DHTPIN 2 // what pin we're connected to‬‬
‫‪#define DHTTYPE DHT11 // DHT 11‬‬
‫;)‪DHT dht(DHTPIN, DHTTYPE‬‬

‫{ )(‪void setup‬‬
‫;)‪Serial.begin(9600‬‬
‫;)"!‪Serial.println("DHTxx test‬‬
‫;)(‪dht.begin‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;‪float h, t‬‬
‫;)(‪h = dht.readHumidity‬‬
‫;)(‪t = dht.readTemperature‬‬
‫;)" ‪Serial.print("Humidity: "); Serial.print(h);Serial.print(" %‬‬

‫‪11‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫;)" ‪Serial.print("Temperature: "); Serial.print(t);Serial.println(" *C‬‬
‫‪delay(2000); // Wait a few seconds between measurements.‬‬
‫}‬
‫بعد تحميل الكود البرمجي‪ ،‬وتشغيل الدارة‪ ،‬نفتح نافذة المراقبة التسلسلية ‪( serial monitor‬التي‬
‫تأتي ضمن بيئة تطوير األردوينو) لتظهر لدينا درجة الحرارة والرطوبة‪.‬‬

‫الشكل (‪ :)8‬محاكاة ربط حساس ‪ DHT11‬مع األردوينو‪ ،‬وإرسال قيمتي درجة الحرارة والرطوبة إلى‬
‫الحاسب‪.‬‬

‫‪11‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2‬حساس المسافة عن طريق األمواج فوق الصوتية ‪HC-SR04‬‬


‫‪-1-2‬مقدمة‬
‫يعتمد مبدأ عمل الحساس ‪ HC-SR04‬على إرسال نبضات فوق صوتية تقع خارج مجال سمع اإلنسان‪،‬‬
‫لتنتشر على شكل مخروط وتنعكس مرة أخرى إلى الحساس من أي هدف يوجد في مسار هذه‬
‫األمواج‪ ،‬ليستقبلها ويولد تبعا لذلك نبضة خرج عرضها يساوي إلى زمن ذهاب وعودة األمواج‪ .‬يتوقف‬
‫الحساس لفترة قصيرة بعد أن ترسل األمواج فوق الصوتية وخالل ذلك يتم انتظار عودة األمواج‪.‬‬
‫بضرب زمن الذهاب واإلياب بسرعة الصوت (‪ 340m/s‬عند درجة حرارة الغرفة) نحصل على المسافة‬
‫ما بين الحساس والحاجز الذي أمامه‪ .‬يمكن استخدام المتحكم الصغري لحساب عرض النبضة التي‬
‫يولدها الحساس‪ ،‬وبالتالي حساب المسافة وإظهارها على شاشة إظهار أو االستفادة منها‬
‫باستخدامات أخرى‪.‬‬

‫الشكل (‪ :)9‬مبدأ عمل الحساس ‪.HC-SR04‬‬


‫للحساس ‪ HC-SR04‬أربع أرجل كما هو موضح في الشكل (‪:)10‬‬
‫‪ :VCC‬تغذية الحساس‪ ،‬يطبق جهد مقداره ‪.+5V‬‬
‫‪ :Trig‬رجل قدح‪ .‬يطبق عليها نبضة مدتها ‪ ،10µs‬ليبدأ الحساس بالعمل وإرسال األمواج فوق‬
‫الصوتية‪.‬‬
‫‪ :Echo‬رجل الصدى‪ .‬يولد الحساس على هذه الرجل نبضة عرضها يساوي زمن الذهاب واإلياب‪.‬‬
‫‪ :GND‬أرضي الحساس‪.‬‬

‫الشكل (‪ :)10‬أرجل الحساس ‪.HC-SR04‬‬


‫يعمل الحساس وفق المراحل التالية كما هو موضح في الشكل (‪:)11‬‬
‫‪ ‬في البداية تطبق نبضة مدتها ‪ 10µs‬على الرجل ‪.Trig‬‬

‫‪12‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ ‬يولد الحساس ‪ 8‬نبضات فوق صوتية‪ ،‬ويرسلها عبر الهواء‪.‬‬
‫‪ ‬ينتظر الحساس إشارة الصدى‪ ،‬وعندما يستقبلها يولد نبضة على الرجل ‪ Echo‬عرضها الزمني‬
‫يساوي إلى زمن الذهاب واإلياب‪.‬‬

‫الشكل (‪ :)11‬المخطط الزمني لعمل الحساس ‪.HC-SR04‬‬

‫يبين الجدول (‪ )2‬خواص الحساس ‪.HC-SR04‬‬


‫الجدول (‪ )2‬خواص الحساس ‪.HC-SR04‬‬
‫القيمة‬ ‫الخاصية‬
‫‪+5V‬‬ ‫جهد العمل‬
‫‪15mA‬‬ ‫تيار العمل‬
‫‪40KHz‬‬ ‫تردد العمل‬
‫‪4m‬‬ ‫أعظم مسافة يمكن قياسها‬
‫‪2cm‬‬ ‫أصغر مسافة يمكن قياسها‬
‫‪15 degree‬‬ ‫زاوية القياس‬
‫نبضة عرضها ‪.10μs‬‬ ‫إشارة القدح‬
‫نبضة يتناسب عرضها مع المسافة‬ ‫إشارة الصدى‬
‫‪45*20*15 mm‬‬ ‫األبعاد‬

‫‪-2-2‬ربط حساس ‪ HC-SR04‬مع لوحة األردوينو‬


‫يتم وصل أرجل الحساس ‪ Trig‬و‪ Echo‬مع أرجل رقمية للوحة األردوينو‪ .‬يوضح الشكل (‪)12‬‬
‫مثاال على كيفية ربط أرجل الحساس مع لوحة األردوينو‪ .‬تم وصل رجل ‪ Trig‬مع ‪ ،pin 10‬والرجل‬
‫‪ Echo‬مع ‪.pin 9‬‬

‫‪13‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)12‬وصل الحساس ‪ HC-SR04‬مع لوحة األردوينو‪.‬‬

‫‪-3-2‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بالحساس ‪ ،HC-SR04‬سنستخدم إحدى المكتبات المتوفرة على شبكة‬
‫االنترنت‪ .‬لنتبع الخطوات التالية‪.‬‬
‫‪-1‬في البداية نقوم بإضافة المكتبة ‪ HCSR04.zip‬لبيئة التطوير كما تم شرحه في الفقرة (‪.)4-1‬‬
‫المكتبة موجودة ضمن الملفات المرفقة مع الكتاب‪.‬‬
‫‪ -2‬نقوم باستدعاء المكتبة كما يلي في بداية البرنامج قبل ) ( ‪:void setup‬‬
‫>‪#include <HCSR04.h‬‬
‫‪-3‬نحدد األرجل الرقمية للوحة األردوينو التي ستتصل مع ‪ Trig‬و ‪ .Echo‬إذا تم إجراء التوصيل كما‬
‫في الشكل (‪: )12‬‬
‫;‪int triggerPin = 10‬‬
‫;‪int echoPin = 9‬‬
‫‪-4‬نعرف كائن اسمه مثال ‪ distanceSensor‬كما يلي‪:‬‬
‫;)‪UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin‬‬

‫‪ -4‬باستدعاء التعليمة )(‪ measureDistanceCm‬يمكن معرفة المسافة بالسنتمتر كما يلي‪:‬‬


‫;)(‪distance = distanceSensor.measureDistanceCm‬‬
‫إذا كانت المسافة أكبر من ‪ 400 cm‬تعيد التعليمة قيمة سالبة‪.‬‬
‫‪ -5‬تم حساب المسافة في التعليمة السابقة مع افتراض أن درجة الحرارة ‪ .20°C‬من أجل زيادة الدقة‬
‫يمكن تقديم درجة الحرارة المتوسطة للمكان الذي تتم فيه القياس أو باستخدام حساس حرارة‪.‬‬
‫بفرض أن درجة الحرارة الفعلية ‪ 3.5°C‬عندئذ تستخدم التعليمة ‪:‬‬

‫‪14‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
distanceSensor. measureDistanceCm(3.5);

‫ مع لوحة األردوينو وإرسال المسافة‬HC-SR04 ‫ ربط حساس‬:‫التطبيق العملي‬-4-2


‫للحاسب‬
‫ ومن ثم نقوم بتحميل‬.)12( ‫إلنجاز هذا التطبيق نقوم في البداية بوصل الدارة الموضحة في الشكل‬
:‫الكود البرمجي التالي‬
#include <HCSR04.h>

// Initialize sensor that uses digital pins 11 and 9.


int triggerPin = 10;
int echoPin = 9;
UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin);

void setup () {
Serial.begin(9600); // We initialize serial connection
}

void loop () {
unsigned int distance;
// Every 500 miliseconds, do a measurement and print the distance in centimeters.
distance = distanceSensor.measureDistanceCm();
Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm");
delay(500);
}

.‫ وإرسال قيمة المسافة إلى الحاسب‬،‫ مع األردوينو‬HC-SR04 ‫ محاكاة ربط الحساس‬:)13( ‫الشكل‬

15
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3‬حساس األلوان ‪TCS230‬‬


‫‪-1-3‬مقدمة‬
‫يستخدم الحساس ‪ TCS230‬لكشف ثالثة ألوان أساسية هي األحمر واألخضر واألزرق ‪(RGB‬‬
‫)‪ .Sensor‬ونظرا ألنه يمكن إنشاء أي لون من مستويات مختلفة من هذه األلوان األساسية‪ ،‬يمكنك‬
‫معرفة األلوان التي يتكون منها مصدر الضوء المطلوب‪.‬‬

‫الشكل (‪ : )14‬وحدة حساس األلوان ‪TCS230‬‬


‫تتكون هذه الوحدة من شريحة ‪ TCS230‬الموضحة في الشكل (‪ ،)15‬والتي تتألف من مصفوفة من‬
‫الكواشف الضوئية ‪ photodiodes‬والتي يبلغ عددها ‪ 8 x 8 = 64‬موزعة على ‪ 4‬مجموعات‪ ،‬كل‬
‫مجموعة تعمل كمرشح للون محدد‪ ،‬وتتصل كواشف المجموعة بشكل تفرعي بحيث يتم تفعيلها معا‪:‬‬
‫المجموعة األولى (‪ 16‬كاشف ضوئي) لترشيح اللون األحمر‪.‬‬
‫المجموعة الثانية (‪ 16‬كاشف ضوئي) لترشيح اللون األزرق‪.‬‬
‫المجموعة الثالثة (‪ 16‬كاشف ضوئي) لترشيح اللون األخضر‪.‬‬
‫المجموعة الرابعة (‪ 16‬كاشف ضوئي) شفافة‪.‬‬
‫يتم تزويد الوحدة أيضا بأربع ثنائيات ضوئية ‪.LED‬‬

‫الشكل (‪ : )15‬شريحة ‪ TCS320‬والتي تتكون من ‪ 4‬مرشحات لونية‪.‬‬


‫تولد الكواشف الضوئية تيارا عندما يسقط عليها ضوء ضمن مجال طول موجة الذي تعمل من خالله‪.‬‬
‫يبين الجدول (‪ )3‬مجال طول موجة األلوان الثالثة‪:‬‬
‫الجدول (‪ )3‬مجال طول موجة األلوان الثالثة‪.‬‬
‫مجال طول الموجة‬ ‫اللون‬
‫‪700 ~ 635‬‬ ‫أحمر‬
‫‪560 ~ 520‬‬ ‫أخضر‬
‫‪490 ~ 450‬‬ ‫أزرق‬

‫‪16‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫تحتوي الوحدة على مبدل تيار إلى تردد ‪ Current-to-Frequency Converter‬والذي يعطي في‬
‫خرجه موجة مربعة ترددها يتناسب مع التيار الناتج عن مجموعة الكواشف الضوئية‪.‬‬
‫يمكن تقسيم التردد الناتج عن المبدل إلى تردد أصغر بحيث نسمح للمعالجات البطيئة من قياس‬
‫التردد بسهولة أكبر‪ .‬ال يوجد خسارة في عملية القياس عنما يتم تقليل التردد‪ ،‬ولكن اإلشارة ذات‬
‫التردد األقل‪ ،‬ال تسمح بإجراء قياسات لونية بسرعة‪.‬‬
‫يتم تفعيل مجموعة ‪ 16‬كاشف ضوئي للون معين‪ ،‬ومن ثم يتم قياس التردد عن طريق المتحكم‬
‫الصغري‪ ،‬وتكرر العملية لبقية األلوان‪ ،‬وبهذا األسلوب يتم معرفة لون العنصر الواقع أمام الحساس‪.‬‬

‫الشكل (‪ :)16‬مراحل كشف لون الضوء‪.‬‬


‫يبن الجدول (‪ )4‬أرجل وحدة حساس األلوان‪:‬‬
‫الجدول (‪ :)4‬أرجل وحدة حساس األلوان‬
‫الوظيفة‬ ‫اسم الرجل‬
‫مداخل ضبط المقسم الترددي‪ .‬انظر الجدول (‪.)5‬‬ ‫)‪S0 , S1 (1,2‬‬
‫تفعيل إشارة الخرج (التفعيل عند المستوى المنخفض)‪.‬‬ ‫)‪OE (3‬‬
‫أرضي‪.‬‬ ‫)‪GND (4‬‬
‫جهد التغذية ‪2.7V to 5.5V‬‬ ‫)‪VDD (5‬‬
‫إشارة الخرج‬ ‫)‪OUT (6‬‬
‫مداخل الختيار مجموعة الترشيح الضوئية‪ .‬انظر الجدول (‪.)6‬‬ ‫)‪S2 , S3 (7,8‬‬

‫يبين الجدول (‪ )5‬كيفية ضبط المقسم الترددي (تردد إشارة الخرج) من خالل القيم المطبقة على‬
‫األرجل ‪ .S0, S1‬غالبا ما يتم اختيار ‪ S0=H, S1=L‬عند ربط الحساس مع لوحة األردوينو‪.‬‬
‫الجدول (‪ )5‬كيفية ضبط المقسم الترددي‪.‬‬

‫تردد الخرج األعظمي‬ ‫‪S0 S1‬‬


‫‪600kHz‬‬ ‫‪H‬‬ ‫‪H‬‬
‫‪120kHz‬‬ ‫‪H‬‬ ‫‪L‬‬
‫‪12kHz‬‬ ‫‪L‬‬ ‫‪H‬‬
‫‪Power down‬‬ ‫‪L‬‬ ‫‪L‬‬
‫‪12‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يبين الجدول (‪ )6‬كيفية تفعيل مجموعة ترشيح ضوئية من بين المجموعات األربعة من خالل القيم‬
‫المطبقة على األرجل ‪.S2, S3‬‬
‫الجدول (‪ )6‬كيفية تفعيل مجموعة ترشيح ضوئية‪.‬‬
‫مجموعة الكواشف الضوئية‬ ‫‪S2 S3‬‬
‫‪Red‬‬ ‫‪L‬‬ ‫‪L‬‬
‫‪Blue‬‬ ‫‪L‬‬ ‫‪H‬‬
‫‪Clear‬‬ ‫‪H‬‬ ‫‪L‬‬
‫‪Green‬‬ ‫‪H‬‬ ‫‪H‬‬

‫‪-2-3‬أنواع أخرى لحساسات األلوان‬


‫يوجد حساسات لونية أخرى هي ‪ TCS3200‬و ‪ . TCS3210‬يبين الجدول (‪ )2‬االختالف ما بين هذه‬
‫الحساسات والحساس ‪.TCS230‬‬
‫الجدول (‪ :)2‬االختالف ما بين هي ‪ TCS3200‬و ‪ TCS3210‬و ‪.TCS230‬‬
‫الواحدة‬ ‫]‪TCS3200/[TCS3210‬‬ ‫‪TCS230‬‬ ‫‪Parameter‬‬
‫‪-‬‬ ‫]‪64 / [24‬‬ ‫‪64‬‬ ‫عدد الكواشف الضوئية‬
‫‪mA‬‬ ‫)‪1.4 (max 2‬‬ ‫)‪2 (max 3‬‬ ‫تيار التشغيل‬

‫‪uA‬‬ ‫)‪0.1 (max 0.1‬‬ ‫)‪7 (max 15‬‬ ‫تيار االستطاعة المنخفضة‬
‫‪°C‬‬ ‫‪-40‬‬ ‫‪0‬‬ ‫أصغر درجة حرارة عمل‬

‫من الجدول أعاله‪ ،‬يمكنك أن ترى أن ‪ TCS3200‬و ‪ TCS3210‬أفضل عند العمل بنمط االستطاعة‬
‫المنخفضة ‪ power down mode‬وأيضا عند العمل بدرجة حرارة أقل من ‪ 0‬درجة مئوية‪.‬‬

‫‪-3-3‬االستجابة الطيفية للثنائيات الضوئية‬


‫جميع الثنائيات الضوئية تتفاعل مع ضوء األشعة تحت الحمراء (طول موجة فوق ‪ 211‬نانومتر)‪.‬‬
‫لذلك عندما تستخدم ‪ TCS230‬أو ‪( TCS3200‬نفس الثنائيات الضوئية) لقياس الضوء األحمر أو‬
‫األخضر أو األزرق أو األبيض‪ ،‬فستضيف بالفعل استجابة لألشعة تحت الحمراء أيضا‪ .‬هذا بالتأكيد‬
‫ليس بنفس استجابة العين للضوء‪ .‬ولكن طالما كان الكاشف محاطا ببيئة محددة‪ ،‬فسيعمل دائما‬
‫بنفس الطريقة‪( .‬ومع ذلك ‪ ،‬ضع في اعتبارك تأثيرات درجة الحرارة)‪ .‬يمكن استخدام مرشح أشعة‬
‫تحت حمراء ‪ IR filter‬للحصول على كشف لوني أكثر دقة وقريب جدا من عين اإلنسان‪.‬‬
‫تغير مسافة الكائن عن الحساس سيغير األلوان المقاسة أيضا اعتمادا على ظروف اإلضاءة المحيطة‪.‬‬

‫‪18‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)12‬االستجابة الطيفية للمجموعات األربعة للكواشف الضوئية‪.‬‬

‫‪-4-3‬ربط حساس األلوان مع لوحة األردوينو‬


‫يتم وصل أرجل الحساس ‪ S0,S1,S2,S3,OUT‬مع خمس أرجل رقمية للوحة األردوينو‪ .‬رجل التغذية‬
‫للحساس ‪ ،+5V‬رجل التفعيل ‪ OE‬ورجل ‪ GND‬تم وصلهم لألرضي‪ .‬يوضح الشكل (‪ )18‬مثاال على‬
‫كيفية ربط أرجل الحساس مع لوحة األردوينو‪ .‬تم وصل األرجل ‪ S0,S1,S2,S3,OUT‬مع األرجل‬
‫الرقمية ‪ 2,3,4,5,6‬على التتالي‪.‬‬

‫الشكل (‪ :)18‬وصل الحساس ‪ TCS230‬مع لوحة األردوينو‪.‬‬

‫‪19‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الكود البرمجي‬-5-3
:‫ نتبع الخطوات التالية‬TCS230 ‫لكتابة الكود البرمجي الخاص بالحساس‬
‫ إذا تم إجراء التوصيل‬. S0,S1,S2,S3,OUT ‫نحدد األرجل الرقمية لألردوينو التي ستتصل مع‬-1
:‫) سيتم تحديد األرجل كما يلي‬18( ‫الموضح في الشكل‬
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6
OUT ‫ والرجل المتصلة مع‬،‫ على أنها مخارج‬S0,S1,S2,S3 ‫ نفعل األرجل المتصلة مع‬،setup() ‫ضمن‬-2
:‫على أنها دخل كما يلي‬
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
:‫ على سبيل المثال‬:‫نحدد مجال تردد الخرج‬-3
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
:‫يتم قراءة تردد الخرج للون األحمر كما يلي‬-4
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
:‫يتم قراءة تردد الخرج للون األخضر كما يلي‬-5
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);

:‫يتم قراءة تردد الخرج للون األزرق كما يلي‬-6


digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);

21
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

‫ مع لوحة األردوينو وإرسال ترددات‬TCS230 ‫ ربط حساس‬:‫التطبيق العملي‬-6-3


‫خرج الحساس لأللوان الثالثة للحاسب‬
‫ ومن ثم نقوم بتحميل‬.)18( ‫إلنجاز هذا التطبيق نقوم في البداية بوصل الدارة الموضح في الشكل‬
:‫الكود البرمجي التالي‬
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6

int frequency = 0;

void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);

// Setting frequency-scaling to 20%


digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);

Serial.begin(9600);
}

void loop() {
// Setting red filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
// Printing the value on the serial monitor
Serial.print("R= ");//printing name
Serial.print(frequency);//printing RED color frequency
Serial.print(" ");
delay(100);

// Setting Green filtered photodiodes to be read


digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
// Printing the value on the serial monitor
Serial.print("G= ");//printing name
Serial.print(frequency);//printing RED color frequency
Serial.print(" ");
delay(100);
21
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪// Setting Blue filtered photodiodes to be read‬‬


‫;)‪digitalWrite(S2,LOW‬‬
‫;)‪digitalWrite(S3,HIGH‬‬
‫‪// Reading the output frequency‬‬
‫;)‪frequency = pulseIn(sensorOut, LOW‬‬
‫‪// Printing the value on the serial monitor‬‬
‫‪Serial.print("B= ");//printing name‬‬
‫‪Serial.print(frequency);//printing RED color frequency‬‬
‫;)" "(‪Serial.println‬‬
‫;)‪delay(100‬‬
‫}‬
‫إذا تم وضع عنصر لونه موافق للمرشح المفعل فإنه سيعطي التردد األقل‪ .‬على سبيل المثال بفرض أن‬
‫لون العنصر أزرق فإن تردد خرج اللون األزرق سيكون األقل بالمقارنة مع اللون األحمر واألخضر كما‬
‫هو موضح في الشكل (‪.)19‬‬

‫الشكل (‪ : )19‬ترددات خرج الحساس ‪ TCS230‬لأللوان الثالثة عند وجود عنصر لونه أزرق‬

‫يمكن أخذ قراءة للتردد عندما يكون العنصر قريب من الحساس‪ ،‬وقراءة التردد عندما يكون العنصر‬
‫بعيدا‪ ،‬وبالتالي تحديد مجال ترددي لكل لون‪.‬‬

‫‪22‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)21‬تحديد مجال تردد اللون األزرق عندما يكون العنصر قريب وبعيد عن الحساس‬

‫‪23‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4‬حساس الحركة ‪HC-SR501‬‬


‫‪-1-4‬مقدمة‬
‫جميع األجسام التي تكون درجة حرارتها أعلى من ‪ 0‬كلفن )‪ (-273 °C‬تبعث طاقة حرارية على شكل‬
‫أشعة تحت الحمراء ‪ ،‬بما في ذلك األجسام البشرية‪ .‬كلما كان الجسم أكثر سخونة‪ ،‬كلما زاد إشعاعه‪.‬‬
‫تم تصميم حساس الحركة خصيصا للكشف عن هذه المستويات من األشعة تحت الحمراء‪.‬‬
‫يستخدم الحساس ‪ HC-SR501‬لكشف حركة اإلنسان (أو الحيوانات)‪ .‬يعمل الحساس على قياس‬
‫كمية األشعة تحت الحمراء التي يصدرها اإلنسان‪ ،‬وعندما يجد أن هذه الكمية تتغير كنتيجة لحركته‬
‫فإنه يقدم إشارة تدل على وجود حركة‪.‬‬

‫الشكل (‪ :)21‬حساس الحركة ‪.HC-SR501‬‬


‫يتكون الحساس بشكل أساسي من جزأين رئيسيين‪ :‬حساس الكتروني حراري ‪ Pyroelectric‬وعدسة‬
‫خاصة تسمى عدسة فرينل ‪ Fresnel‬التي تركز إشارات األشعة تحت الحمراء على الحساس‬
‫االلكتروني الحراري‪.‬‬
‫للحساس االلكتروني الحراري فتحتان مستطيلتان مصنوعتان من مادة تسمح بمرور األشعة تحت‬
‫الحمراء‪ .‬وخلف ذلك‪ ،‬يوجد قطبين مستشعرين لألشعة تحت الحمراء‪ ،‬أحدهما مسؤول عن إنتاج‬
‫خرج موجب واآلخر خرج سالب‪ .‬والسبب في ذلك أننا نبحث عن تغيير في مستويات األشعة تحت‬
‫الحمراء وليس مستويات األشعة تحت الحمراء المحيطة‪ .‬يتم توصيل القطبين الكهربائيين بحيث‬
‫يلغي كل منهما اآلخر‪ .‬إذا رأى أحدهما إشعاع أشعة تحت الحمراء أكثر أو أقل من اآلخر ‪ ،‬فإن الخرج‬
‫سوف يتأرجح لألعلى أو األقل‪.‬‬
‫عندما يكون الحساس خامال (أي ال توجد حركة حول المستشعر) فإن كال الفتحتين تكتشفان نفس‬
‫كمية األشعة تحت الحمراء ‪ ،‬مما يؤدي إلى إشارة خرج صفرية‪.‬‬
‫ولكن عندما يمر جسم دافئ مثل اإلنسان أو الحيوان ؛ يعترض أوال نصف مستشعر ‪ ، PIR‬مما يتسبب‬
‫في تغير تفاضلي إيجابي بين النصفين‪ .‬عندما يغادر الجسم الدافئ منطقة االستشعار ‪ ،‬يحدث العكس‬
‫‪ ،‬حيث يولد المستشعر تغييرا تفاضليا سلبيا‪ .‬يؤدي نبض اإلشارات المقابل إلى قيام الحساس بوضع‬
‫رجل الخرج على المستوى المرتفع‪.‬‬

‫‪24‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)22‬األجزاء التي يتكون منها حساس الحركة‪.‬‬


‫بالنسبة لمعظم مشاريع ‪ Arduino‬التي تحتاج إلى اكتشاف متى غادر الشخص أو دخل المنطقة ‪ ،‬أو‬
‫اقترب ‪ ،‬تعد أجهزة استشعار ‪ HC-SR501 PIR‬خيارا مناسبا‪ .‬فهي ذات طاقة منخفضة وتكلفة‬
‫منخفضة‪ ،‬وسهلة التعامل وهي مشهورة بين الهواة‪.‬‬
‫يوضح الشكل (‪ )23‬العناصر التي يتكون منها الحساس ‪.HC-SR501‬‬

‫الشكل (‪ :)23‬العناصر التي يتكون منها الحساس ‪.HC-SR501‬‬


‫يمكن مالحظة وجود مقاومتين متغيرتين‪:‬‬
‫‪ ‬مقاومة متغيرة لضبط الحساسية ‪ Sensitivity‬أي الحد األقصى للمسافة التي يمكن الكشف‬
‫عن الحركة‪ .‬يتراوح من ‪ 3‬أمتار إلى حوالي ‪ 2‬أمتار كما هو موضح في الشكل (‪ .)24‬يمكن أن‬
‫تؤثر طوبولوجيا غرفتك على النطاق الفعلي الذي تحققه‪ .‬دوران المقاومة المتغيرة حتى‬
‫‪25‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫النهاية مع عقارب الساعة فإن مجال الكشف حوالي ‪ 3‬أمتار‪ .‬دوران المقاومة المتغيرة حتى‬
‫النهاية عكس عقارب الساعة مجال الكشف حوالي ‪ 7‬أمتار‪.‬‬
‫‪ ‬مقاومة متغيرة لضبط الوقت ‪ Time‬التي سيبقى فيها الخرج بالمستوى المرتفع بعد الكشف‪.‬‬
‫على األقل ‪ 3‬ثوان ‪ ،‬وبحد أقصى ‪ 311‬ثانية أو ‪ 5‬دقائق‪ .‬دوران المقاومة المتغيرة حتى‬
‫النهاية مع عقارب الساعة التأخير الزمني حوالي ‪ 5‬دقائق‪ .‬دوران المقاومة المتغيرة حتى‬
‫النهاية مع عقارب الساعة التأخير الزمني حوالي ‪ 3‬ثواني‪.‬‬

‫الشكل (‪ :)24‬الحد األقصى للمسافة التي يمكن الكشف عن الحركة‪.‬‬

‫يمكن مالحظة وجود وصلة مرور ‪ jumper‬والتي لها إعدادان ‪:‬‬


‫‪( H‬وضع التكرار والمسك) ‪ :‬سيواصل ‪ HC-SR501‬إخراج إشارة عالية طالما استمر في الكشف عن‬
‫الحركة‪.‬‬

‫الشكل (‪ :)25‬الوضع ‪.H‬‬

‫‪( L‬وضع عدم التكرار أو عدم المسك) ‪ :‬يبقى الخرج بحالة مرتفعة لفترة محددة تبعا لضبط المقاومة‬
‫المتغيرة الخاصة بالوقت ‪.Time‬‬

‫‪26‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)26‬الوضع ‪.L‬‬


‫تحتوي لوحة دائرة الحساس ‪ HC-SR501‬على صفيحتين لمكونين إضافيين‪ .‬وعادة ما يطلق عليها‬
‫اسم "‪ "RT‬و "‪."RL‬‬
‫‪ -RT ‬هذا مخصص لمقاومة حرارية ‪( thermistor‬مقاومة حساس لدرجة الحرارة)‪ .‬يسمح‬
‫إضافة هذا العنصر إلى أن يعمل ‪ HC-SR501‬في درجات الحرارة القصوى ‪ ،‬كما أنه يزيد من‬
‫دقة الكاشف إلى حد ما‪.‬‬
‫‪ –RL ‬هذا مخصص لمقاومة ضوئية (‪ . )LDR‬بإضافة هذا المكون‪ ،‬سيعمل ‪ HC-SR501‬في‬
‫الظالم فقط ‪ ،‬وهو تطبيق شائع ألنظمة اإلضاءة الحساسة للحركة‪.‬‬
‫يمكن لحام المكونات اإلضافية مباشرة باللوحة أو تمديدها إلى مواقع بعيدة باستخدام األسالك‬
‫والموصالت‪.‬‬

‫الشكل (‪ :)22‬صفيحتان ‪ RT‬و ‪.RL‬‬

‫يرتبط الحساس ‪ HC-SR501‬مع العالم الخارجي من خالل ثالث أرجل هي‪:‬‬


‫‪ : VCC‬رجل تغذية ‪ .4.5V to 12V‬بشكل نموذجي ‪.5V‬‬
‫‪ : Output‬رجل الخرج ‪ .3.3V TTL logic‬تعطي مستوى منخفض في حالة عدم وجود حركة‪،‬‬
‫ومستوى مرتفع عند كشف حركة‪.‬‬
‫‪ :GND‬أرضي‪.‬‬

‫‪22‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫بمجرد تشغيل الدائرة عليك االنتظار ‪ 61-31‬ثانية حتى يتأقلم ‪ PIR‬مع طاقة األشعة تحت الحمراء‬
‫في الغرفة‪.‬‬
‫ليتم اكتشاف الكائن بواسطة الحساس ‪ ، HC-SR501‬يجب أن يتحقق شرطان‪ :‬أن يتحرك ‪ ،‬وأن‬
‫تنبعث منه أشعة تحت الحمراء‪ .‬إذا كان الجسم يتحرك ولكن ال ينبعث منه األشعة تحت الحمراء‪ ،‬فلن‬
‫يكتشفه الحساس‪ .‬إذا كان الجسم ينبعث منه أشعة تحت الحمراء ولكنه ال يتحرك (على سبيل المثال‬
‫يقف الشخص بدون حركة) ‪ ،‬فلن يكتشفه الحساس‪.‬‬

‫‪-2-4‬ربط حساس الحركة مع لوحة األردوينو‬


‫يتم وصل رجل خرج الحساس مع أحد األرجل الرقمية‪ ،‬وتطبيق تغذية ‪.+5V‬‬

‫الشكل (‪ :)28‬وصل حساس الحركة مع لوحة األردوينو‪.‬‬

‫‪-3-4‬الكود البرمجي‬
‫يتم تفعيل الرجل الرقمية المتصلة مع حساس الحركة كرجل دخل‪ ،‬ويتم قراءة حالتها ‪ HIGH‬أو‬
‫‪. LOW‬‬

‫‪-4-4‬تطبيق عملي ‪ :‬تحسس لحركة شخص وتشغيل ثنائي ضوئي‪.‬‬


‫إلنجاز هذا التطبيق نقوم في البداية بوصل الدارة الموضح في الشكل (‪ .)28‬ومن ثم نقوم بتحميل‬
‫الكود البرمجي التالي‪:‬‬
‫{ )(‪void setup‬‬
‫;)‪pinMode(2,INPUT‬‬
‫;)‪pinMode(13,OUTPUT‬‬
‫}‬

‫‪28‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫{ )(‪void loop‬‬
‫;)‪if (digitalRead(2)==HIGH) digitalWrite(13,HIGH‬‬
‫;)‪if (digitalRead(2)==LOW) digitalWrite(13,LOW‬‬
‫;)‪delay(1‬‬
‫}‬

‫في حال وجود حركة أمام الحساس سيضيء الثنائي الضوئي المدمج مع لوحة االردوينو المتصل مع‬
‫الرجل الرقمية ‪.13‬‬
‫يمكن بدال من تشغيل الثنائي الضوئي تشغيل جهاز إنذار صوتي‪ ،‬أو إرسال رسالة قصيرة ‪ SMS‬عن‬
‫طريق الشبكة الخلوية باستخدام وحدة ‪ ، SIM800‬أو ربط الدارة مع شبكة االنترنت وهذا ما سنتعلمه‬
‫الحقا‪ ،‬وغير ذلك‪.‬‬

‫‪29‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-5‬حساس قياس معدل تدفق الماء ‪YF-S201‬‬


‫‪-1-5‬مقدمة‬
‫يستخدم الحساس ‪ YF-S201‬لقياس معدل تدفق الماء (أي الحجم المتدفق خالل زمن معين)‪ .‬يوضح‬
‫الشكل (‪ )29‬الحساس ‪.YF-S201‬‬

‫الشكل (‪ :)29‬جهاز قياس معدل تدفق الماء‪. YF-S201‬‬


‫يتكون جهاز القياس ‪ YF-S201‬من العناصر التالية كما هو موضح في الشكل (‪:)31‬‬
‫‪-1‬عجلة أو مروحة ذات زعانف صغيرة تدور مع تدفق الماء عبر األداة‪.‬‬
‫‪-2‬مغناطيس مثبت على العجلة‪ ،‬يولد حقال مغناطيسا‪.‬‬
‫‪-3‬حساس تأثير هول ‪ Hall Effect‬والذي يعطي جهدا عندما يكون معرضا لحقل مغناطسي‪ .‬لهذا‬
‫الحساس موضع ثابت ضمن الجهاز‪.‬‬

‫الشكل (‪ :)31‬األجزاء التي يتكون منها الحساس ‪.YF-S201‬‬


‫عندما يدخل السائل إلى الجهاز فإنه يعمل على جعل العجلة تدور‪ ،‬وهذا ما يؤدي بدوره إلى‬
‫اقتراب المغناطيس المثبت على العجلة من حساس تأثير هول ‪ Hall Effect‬والذي تبعا لذلك سيولد‬
‫نبضة جهد خرج مع كل دورة تدور بها العجلة‪ .‬نتيجة لذلك سيتولد عن حساس تأثير هول سلسلة من‬

‫‪31‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫النبضات والتي سيكون ترددها متناسبا مع دوران العجلة‪ .‬يمكن عد هذه النبضات من خالل المتحكم‬
‫الصغري خالل زمن معين‪ ،‬ومن خاللها يتم معرفة معدل السائل المتدفق‪.‬‬
‫يمكن لمقياس التدفق ‪ YF-S201‬قياس معدل تدفق ‪1-30Liters/Minute‬‬
‫العالقة بين معدل التدفق وعدد النبضات هي‬
‫‪Q =F ÷ 7.5‬‬
‫‪ : Q‬معدل التدفق ‪.Liters/Minute‬‬
‫‪ : F‬تردد نبضات حساس هول‪.‬‬
‫أسالك خرج الحساس ‪ YF-S201‬ثالثة هي‪:‬‬
‫السلك األحمر‪ :‬يطبق عليه جهد تغذية ‪.+5V‬‬
‫السلك األسود‪ :‬أرضي‪.‬‬
‫السلك األصفر‪ :‬من خالله يتم الحصول على نبضات خرج الحساس‪ ،‬لهذا يتم وصله مع المتحكم‬
‫الصغري لعد هذه النبضات الكتشاف معدل التدفق‪.‬‬

‫‪-2-5‬ربط حساس معدل التدفق مع لوحة األردوينو‬


‫يتم تطبيق تغذية ‪ +5V‬للحساس‪ ،‬ورجل الخرج يتم وصلها مع الرجل الرقمية ‪ 2‬والتي من خاللها‬
‫سيتم معرفة تردد نبضات خرج الحساس‪.‬‬

‫الشكل (‪ :)31‬ربط حساس معدل التدفق ‪ YF-S201‬مع لوحة األردوينو‬

‫‪31‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

‫ مع لوحة األردوينو وإرسال قيمة معدل‬YF-S201 ‫ ربط حساس‬:‫التطبيق العملي‬


‫التدفق إلى الحاسب‬
‫ ومن ثم نقوم بتحميل‬.)31( ‫إلنجاز هذا التطبيق نقوم في البداية بوصل الدارة الموضح في الشكل‬
:‫الكود البرمجي التالي‬

volatile int flow_frequency; // Measures flow sensor pulses


unsigned int l_hour; // Calculated litres/hour
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
void flow () // Interrupt function
{
flow_frequency++;
}
void setup()
{ pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
Serial.begin(9600);
attachInterrupt(0, flow, RISING); // Setup Interrupt
sei(); // Enable interrupts
currentTime = millis();
cloopTime = currentTime;
}
void loop ()
{ currentTime = millis();
// ‫كل ثانية يتم حساب معدل التدفق وطباعته على الحاسب‬
if(currentTime >= (cloopTime + 1000))
{ cloopTime = currentTime; // Updates cloopTime
// Pulse frequency (Hz) = 7.5*Q, Q is flow rate in L/min.
l_hour = (flow_frequency * 60 / 7.5); // (Pulse frequency x 60 min) / 7.5 in L/hour
flow_frequency = 0; // Reset Counter
Serial.print(l_hour, DEC); // Print litres/hour
Serial.println(" L/hour");
}
}

serial ‫عند تمر مياه ضمن الحساس باستخدام مضخة ماء سيظهر على نافذة المراقبة التسلسلية‬
.‫ قيمة معدل التدفق للمياه‬monitor

32
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-6‬وحدة حساس اللهب‬


‫‪-1-6‬مقدمة‬
‫حساس استشعار اللهب هو الحساس الذي يمكن استخدامه للكشف عن وجود مصدر نار أو أي مصادر‬
‫ضوئية أخرى‪ .‬هناك عدة طرق لتطبيق حساس اللهب‪ ،‬لكن الوحدة المستخدمة هنا هي حساس‬
‫األشعة تحت الحمراء‪ُ .‬تظهر الصورة التالية حساس لهب األشعة تحت الحمراء‪.‬‬

‫الشكل (‪ :)32‬حساس لهب األشعة تحت الحمراء‬


‫يستند حساس اللهب إلى الترانزستور الضوئي ‪ ،YG1006 NPN‬وهو الكائن األسود الموجود في‬
‫الجزء األمامي من الوحدة‪ .‬يشبه الترانزستور الضوئي ‪ YG1006 NPN‬الثنائي الضوئي ‪ LED‬ذي اللون‬
‫األسود‪ ،‬ولكنه عبارة عن ترانزستور بثالثة أطراف ‪ ، NPN Transistor‬حيث تمثل الرجل الطويلة‬
‫الباعث ‪ Emitter‬واألقصر المجمع‪ .‬ال يوجد رجل قاعدة حيث أن الضوء الذي يتم كشفه سيمكن من‬
‫تدفق التيار‪ .‬هذا الترانزستور مغلف باإلبوكسي األسود ‪ ،black epoxy‬مما يجعله حساس لإلشعاعات‬
‫تحت الحمراء في مدى طول موجي ممتد من ‪ 760 nm‬إلى ‪.1100 nm‬‬
‫باستخدام هذا النوع تحديدا من حساسات اللهب‪ ،‬يمكن اكتشاف ضوء األشعة تحت الحمراء على‬
‫مسافة ‪ 100 cm‬في حدود زاوية الكشف مقدارها ‪ 60‬درجة‪.‬‬

‫الشكل (‪ :)33‬زاوية كشف اللهب‬

‫‪33‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يوضح الشكل (‪ )34‬مخطط الدارة االلكتروني لوحدة حساس اللهب‪ .‬الدارة المتكاملة ‪ LM393‬عبارة‬
‫مكبري عمليات‪ .‬يستخدم أحدهما كمقارن ما بين الجهد الهابط على الترانزيستور الضوئي‪ ،‬وجهد‬
‫المقاومة المتغيرة ‪ . RS‬أي أنها تعمل كنقطة مرجعية لتحديد مستوى وجود لهب أم ال‪ .‬خرج المقارن‬
‫يمثل المخرج الرقمي لوحدة الحساس‪ .‬أما الجهد الهابط على الترانزيستور الضوئي ‪ A0‬فهو يمثل‬
‫الخرج التشابهي للحساس‪.‬‬

‫الشكل (‪ : )34‬مخطط الدارة االلكتروني لوحدة حساس اللهب‪.‬‬


‫هناك نوعان لوحدة حساسات اللهب ‪ Flame Sensors‬باستخدام الترانزيستور الضوئي ‪:YG1006‬‬
‫‪-‬وحدة حساس لهب تعطي مخرج رقمي فقط‪.‬‬
‫‪-‬وحدة حساس لهب تعطي مخرجين تشابهي ورقمي‪.‬‬
‫أرجل هذه الوحدة هي ‪:‬‬
‫‪ :D0‬مخرج رقمي‪.‬‬
‫‪ :VCC‬رجل تغذية الوحدة )‪.(+5V‬‬
‫‪ :GND‬أرضي‪.‬‬
‫‪ :A0‬مخرج تشابهي للوحدة‪ .‬تعطي جهدا متغيرا حسب بعد وحجم اللهب (شدة األشعة المستقبلة)‪.‬‬

‫الشكل (‪ : )35‬أرجل وحدة حساس اللهب‪.‬‬

‫‪34‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-6‬ربط حساس اللهب مع لوحة األردوينو‬


‫يتم وصل رجل خرج الحساس الرقمية مع أحد األرجل الرقمية لألردوينو‪ ،‬أو من الممكن وصل رجل‬
‫الخرج التشابهية مع إحدى األرجل التشابهية‪ .‬يتم تغذية الحساس بجهد ‪.+5V‬‬

‫الشكل (‪ :)36‬ربط حساس اللهب مع لوحة األردوينو‬

‫‪-3-6‬تطبيق عملي ‪ :‬تحسس لحريق وتشغيل ثنائي ضوئي‪.‬‬


‫إلنجاز هذا التطبيق نقوم في البداية بوصل الدارة الموضح في الشكل (‪ .)36‬ومن ثم نقوم بتحميل‬
‫الكود البرمجي التالي‪:‬‬
‫{ )(‪void setup‬‬
‫;)‪pinMode(2,INPUT‬‬
‫;)‪pinMode(13,OUTPUT‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;)‪if (digitalRead(2)==HIGH) digitalWrite(13,HIGH‬‬
‫;)‪if (digitalRead(2)==LOW) digitalWrite(13,LOW‬‬
‫}‬
‫في حال وجود حريق سيضيء الثنائي الضوئي في لوحة األردوينو المتصل مع الرجل الرقمية ‪.13‬‬
‫يمكن بدال من تشغيل الثنائي الضوئي تشغيل جهاز إنذار صوتي‪ ،‬أو إرسال رسالة قصيرة ‪ SMS‬عن‬
‫طريق الشبكة الخلوية باستخدام وحدة ‪ ، SIM800‬أو ربط الدارة مع شبكة االنترنت وهذا ما سنتعلمه‬
‫الحقا‪ ،‬وغير ذلك‪.‬‬

‫‪35‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-7‬حساس تجنب العوائق‬


‫‪-1-7‬مقدمة‬
‫يستخدم حساس تجنب العوائق عن طريق األشعة تحت الحمراء كحلل غيلر مكللف للكشلف علن وجلود‬
‫عوائق أمام الروبوتات والسيارات الذكية‪.‬‬

‫الشكل (‪ :)32‬وحدة حساس تجنب العوائق‬


‫يتكلون هلذا الحسللاس ملن مرسلل أشللعة تحلت الحملراء ومسللتقبل أشلعة تحلت الحمللراء‪ .‬تعملل الوحللدة‬
‫على إرسال طاقلة األشلعة تحلت الحملراء وتبحلث علن طاقلة األشلعة تحلت الحملراء المنعكسلة للكشلف‬
‫عن وجود أي عقبة أمام وحدة االستقبال‪ .‬تحتوي الوحدة على مقاومة متغيرة تتيح للمستخدم ضلبط‬
‫نطاق الكشف‪ .‬يتمتع المستشلعر باسلتجابة جيلدة ومسلتقرة للغايلة حتلى فلي اإلضلاءة المحيطلة أو فلي‬
‫الظالم الكامل‪.‬‬

‫الشكل (‪ : )38‬مبدأ عمل حساس تجنب العوائق عن طريق األشعة تحت الحمراء‪.‬‬

‫مواصفات الوحدة‪:‬‬
‫جهد العمل ‪DC 3.3V-5V :‬‬
‫تيار العمل ‪ :‬أعلى تقريبا من ‪.20mA‬‬
‫درجة حرارة العمل ‪-10℃ to+50℃ :‬‬
‫مسافة الكشف ‪2-40cm :‬‬
‫إشارة الخرج ‪ :‬متوافقة مع منطق ‪.TTL‬‬
‫الزاوية الفعالة‪35° :‬‬

‫‪36‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫األبعاد‪41.7*16.7mm :‬‬
‫الوزن ‪5g :‬‬
‫أرجل الوحدة ‪:‬‬
‫‪ :Vcc‬مدخل تغذية وحدة الحساس ‪.3.3V-5V‬‬
‫‪ :Gnd‬أرضي‪.‬‬
‫‪ :Out‬تعطي جهدا منخفضا عندما يكون العائق ضمن مجال الحساس‪.‬‬

‫الشكل (‪ : )39‬أرجل وعناصر وحدة تجنب العوائق‪.‬‬

‫‪-2-7‬ربط حساس تجنب العوائق مع لوحة األردوينو‬


‫يتم وصل رجل خرج الحساس مع أحد األرجل الرقمية لألردوينو بشكل مشابه لحساس اللهب في‬
‫الفقرة (‪.)2-6‬‬

‫‪-3-7‬الكود البرمجي‬
‫نفس الكود البرمجي لحساس اللهب في الفقرة (‪.)3-6‬‬

‫‪32‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-1-8‬حساس غاز أول أكسيد الكربون ‪MQ7‬‬


‫تستخدم في هذا الحساس مادة )‪ Tin Dioxide (SnO2‬الكتشاف غاز أول أكسيد الكربون‪ .‬تتصف‬

‫هذه ا لمادة بناقلية أقل عند الهواء النظيف‪ ،‬وتصبح ناقليتها أعلى مع ارتفاع تركيز الغاز‪ .‬تتم عملية‬

‫الكشف من خالل دورة رفع وإنقاص لدرجة حرارة الحساس‪ .‬عند درجة حرارة منخفضة (تسخين من‬

‫خالل جهد ‪ )1.5V‬يتم الكشف عن غاز أول أكسيد الكربون‪ ،‬وعند درجة حرارة أعلى (تسخين من‬

‫خالل جهد ‪ )5V‬يتم تنظيف الحساس من الغازات األخرى الممتصة عند درجة حرارة منخفضة‪ .‬يمكن‬

‫استخدام دارة الكترونية بسيطة لتحويل تغير الناقلية إلى إشارة خرج متوافقة مع تركيز الغاز‪.‬‬

‫الشكل (‪ : )41‬الحساس ‪.MQ-7‬‬


‫يبين الشكل (‪ )41‬دارة اختبار الحساس األساسية‪ .‬يحتاج الحساس إلى تطبيق جهدين‪ .‬الجهد األول‬
‫هو جهد التسخين ‪ VH‬والجهد اآلخر هو جهد الفحص ‪ .VC‬يستخدم ‪ VH‬لتوفير درجة الحرارة‬
‫المناسبة للحساس‪ ،‬بينما يستخدم ‪ VC‬الكتشاف الجهد (‪ )VRL‬على مقاومة الحمل(‪)RL‬التي هي‬
‫على التسلسل مع الحساس‪ .‬يتم ضبط قيمة ‪ RL‬للحصول على أفضل أداء‪.‬‬

‫الشكل (‪ :)41‬دارة اختبار الحساس‪.‬‬


‫يبين الشكل (‪ )42‬كيفية تغير إشارة خرج ‪ RL‬من حالة الهواء النقي إلى حالة هواء يحتوي أول‬
‫أكسيد الكربون‪ .‬يتضح من الشكل أن عملية اكتشاف الغاز تكون عند درجة الحرارة األقل كما ذكرنا‬
‫حيث ترتفع جهد إشارة الخرج بشكل كبير مع وجود الغاز‪.‬‬

‫‪38‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ : )42‬كيفية تغير إشارة خرج الحساس بوجود وعدم وجود غاز أول أكسيد الكربون‪.‬‬
‫يلخص الجدول (‪ )8‬الخواص الكهربائية للحساس‪.‬‬
‫الجدول (‪ :)8‬الخواص الكهربائية للحساس ‪.MQ-7‬‬
‫القيمة‬ ‫البارمتر‬
‫‪5V±0.1‬‬ ‫جهد الدارة‬
‫‪5V±0.1‬‬ ‫جهد التسخين (العالي)‬
‫‪1.4V±0.1‬‬ ‫جهد التسخين (المنخفض)‬
‫‪60±1 seconds‬‬ ‫زمن التسخين (العالي)‬
‫‪90±1 seconds‬‬ ‫زمن التسخين (المنخفض)‬
‫‪33 Ω ±5%‬‬ ‫مقاومة التسخين‬
‫قابلة للضبط‬ ‫مقاومة الحمولة‬

‫وفقا لورقة البيانات الخاصة بالحساس ‪ ، MQ-7‬يكتشف الحساس ما بين ‪ 21‬إلى ‪ 2111‬جزء في‬
‫المليون من أول أكسيد الكربون في الهواء‪ .‬يبين الشكل (‪ )43‬منحنى مميزة الحساسية‪ Rs .‬هي‬
‫مقاومة الحساس للغاز المستهدف بينما ‪ R0‬هي المقاومة في الهواء النظيف‪.‬‬

‫‪39‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ : )43‬ميزة الحساسية للحساس ‪.MQ-7‬‬

‫‪-2-8‬وحدة الحساس ‪MQ-7‬‬


‫يتوافر في األسواق الحساس ‪ MQ-7‬ضمن لوحة الكترونية مجهزا بالعناصر االلكترونية المطلوبة كما‬
‫هو موضح في الشكل (‪ .)44‬ويبين الشكل (‪ )45‬المخطط االلكتروني لهذه اللوحة‪ .‬المقاومة ‪ R2‬هي‬
‫مقاومة الحمل للحساس‪ .‬معظم اللوحات قيمتها ‪ .2KΩ‬الدارة المتكاملة ‪ LM393‬تعمل كمقارن ما بين‬
‫جهد خرج الحساس وجهد مقاومة متغير يمكن معايرتها‪ .‬تبعا لذلك سيضيء ثنائي ضوئي ‪ LED‬في‬
‫حال وجود غاز أول أكسيد الكربون بتركيز محدد‪ .‬أرجل هذه الوحدة هي‪:‬‬
‫‪ :Vcc‬جهد التغذية ويتم وصلها إلى ‪.+5V‬‬
‫‪ :DOUT‬مخرج رقمي للحساس‪،‬‬
‫‪ : AOUT‬مخرج تشابهي للحساس‪ .‬يعطي جهدا متناسبا مع تركيز الغاز‪.‬‬
‫‪ :GND‬أرضي‪.‬‬

‫الشكل (‪ : )44‬الحساس ‪ MQ-7‬مثبت على لوحة الكترونية‪.‬‬

‫‪41‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)45‬المخطط االلكتروني للوحة حساس ‪.MQ-7‬‬

‫‪-3-8‬ربط حساس ‪ MQ-7‬مع لوحة األردوينو‬


‫يتم وصل رجل خرج الحساس الرقمية مع أحد األرجل الرقمية لألردوينو بشكل مشابه لحساس اللهب‬
‫في الفقرة (‪ .)2-6‬أما رجل خرج الحساس التشابهية فيتم ربطها مع رجل تشابهية لألردوينو‪.‬‬

‫‪-4-8‬الكود البرمجي‬
‫نفس الكود البرمجي لحساس اللهب في الفقرة (‪.)3-6‬‬

‫‪41‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-9‬وحدة قياس إشارة القلب الكهربائية ‪AD8232‬‬


‫‪-1-9‬لمحة بسيطة عن إشارة القلب الكهربائية ‪ECG‬‬
‫يولد القلب نبضات كهربائية صغيرة تنتشر من خالل عضلة القلب وتتسبب في حدوث االنقباض‪.‬‬
‫تسبب هذه النبضات بنشوء توزع كموني أو فرق جهد متغير زمنيا بين أي نقطتين في الجسم يمكن‬
‫قياسه باالستعانة بإلكترودات معينة تتوضع في النقاط المراد فيها اقتباس اإلشارة وإن هذا الجهد هو‬
‫ما يطلق عليه اسم المخطط الكهربائي للقلب )‪ Electrocardiography (ECG‬والتي يوضحها الشكل‬
‫(‪ .)46‬يوجد إلشارة ‪ ECG‬خمسة موجات رئيسية هي‪:‬‬
‫‪ -1‬الموجة ‪ : P‬هي أول موجة تظهر وتدل على إزالة االستقطاب الناتج عن مرور تيار كهربائي في كل‬
‫من األذين األيمن وااليسر‪ .‬مدى ارتفاع الموجة يدل على قوة الجهد المبذولة وعرض الموجة يدل‬
‫على الفترة المستغرقة لذلك يتراوح مداها من ‪. 0.08-0.12 sec‬‬
‫‪ -2‬الموجة ‪ :Q‬تد ل هذه الموجة على إزالة االستقطاب الناتج من مرور تيار كهربائي على الحاجز بين‬
‫البطينين‪ .‬يوجد صعوبة في تحديدها كونها صغيرة جدا‪ .‬يتراوح مداها ‪ 0.03 - 0.04 sec‬وهي سلبية‬
‫دائما‪.‬‬
‫‪-3‬الموجة ‪ : R‬أعلى الموجات من ناحية الشدة وأقلها زمنا وتعتبر من أهم الموجات حيث أنها تدل‬
‫على زوال االستقطاب لكال من البطين األيمن وااليسر‪ .‬مداها حوالي ‪.0.05-0.08 sec‬‬
‫تعبر الفترة الزمنية ما بین الموجة ‪ P‬والموجة ‪ R‬عن الوقت الذي استغرقه التيار من نقطة بداية‬
‫الموجة ‪ P‬حتى نقطة البداية للموجة ‪ ،R‬أي من بداية إزالة استقطاب خاليا االذينين حتى وصول‬
‫التيار إلى البطينين‪ .‬يتراوح مداها من ‪..0.12 – 0.20 sec‬‬
‫‪ -4‬الموجة ‪ : S‬وتمثل زوال االستقطاب في الجزء المتبقي من قاعدة البطين األيسر و قاعدة البطين‬
‫األيمن والقسم العلوي من الحجاب البطيني وهي سلبية دائما و يتراوح أمدها بين ‪0.03-0.08 sec‬‬
‫‪ -5‬الموجة ‪ : T‬تمثل عودة االستقطاب البطيني وبالتالي انبساط البطينين لكي يمتلئا بالدم‪ .‬ومدتها‬
‫الوسطية ‪.0.20 sec‬‬
‫تتمثل الفترة الزمنية ما بین الموجة ‪ S‬والموجة ‪ T‬بسكون كهربائي‪ ،‬حيث ينتظر فيه البطينان إعادة‬
‫االستقطاب‪.‬‬

‫‪42‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)46‬تتبع تخطيط كهربائية القلب‪ .‬يقابل كل جزء حدثا واحدا في دورة القلب‪.‬‬

‫‪-2-9‬وحدة ‪AD8232‬‬
‫تم تصميم وحدة ‪ AD8232‬من أجل قياس إشارة القلب الكهربائية ‪ .ECG‬تعمل الوحدة على تكبير‬
‫إشارة ‪ ECG‬الضعيفة وترشيحها من إشارات الضجيج بحيث يمكن تحويلها إلى إشارة رقمية بسهولة‬
‫بواسطة المبدل التشابهي الرقمي ‪ ADC‬المدمج في شريحة المتحكم الصغري‪.‬‬

‫الشكل (‪ :)42‬لوحة ‪ AD8232‬والتي من خاللها يمكن قياس إشارة القلب الكهربائية ‪.ECG‬‬

‫تحتوي هذه اللوحة على دارة متكاملة ‪ AD8232‬مع عناصر الكترونية خارجية‪ .‬يبين الشكل (‪)48‬‬
‫مخططا صندوقيا لهذه اللوحة‪.‬‬

‫‪43‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)48‬مخطط صندوقي للوحة ‪.AD8232‬‬

‫يتضح من الشكل (‪ )48‬أن شريحة ‪ AD8232‬تتكون من أربع مكبرات عمليات‪:‬‬


‫‪-1‬مكبر القياس ‪ :instrumentation amplifier‬تتصل مداخل هذا المكبر مع اإللكترودات‬
‫‪ electrodes‬التي يتم تثبيتها على جسم اإلنسان اللتقاط إشارة ‪ ، ECG‬ويعمل على تضخيم إشارة‬
‫)‪ (ECG‬بربح مقداره ‪ .100‬يرتبط هذا المكبر مع مرشحي تمرير عالي على التسلسل‪ .‬تردد قطع مرشح‬
‫التمرير العالي األول‪:‬‬

‫بسبب الربح والتغذية العكسية لبنية المكبر فإن تردد القطع أعلى بل ‪ 111‬مرة من تردد قطع المرشح‬
‫النموذجي‪.‬‬
‫تردد قطع مرشح التمرير العالي الثاني‪:‬‬

‫‪44‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يشكل هذان المرشحان مرشح تمرير عالي ثنائي القطب ‪ 2-pole high-pass filter‬بمعدل تدحرج‬
‫‪ roll-off‬يساوي ‪ ،-40 dB/decade‬ومن خالله يمكن حذف المركبة المستمر ‪ DC‬الناتجة عن‬
‫اإللكترودات والتي قد تؤدي إلى إشباع مكبر العمليات عند القيمة العالية للربح‪.‬‬
‫‪-2‬مكبر العمليات ‪ : (A1) Operational Amplifier‬يقدم هذا المكبر ربحا إضافيا قيمته ‪11 v/v‬‬
‫لإلشارة‪ ،‬ليصبح التضخيم الكلي ‪ 1100 v/v‬إلشارة ‪ .EGC‬لذلك فإن القيمة العظمى إلشارة الدخل‬
‫التفاضلية هي ‪ .2mV p-p‬الشريحة محمية من الجهد الزائد عن ذلك‪ ،‬ففي حالة زيادة الجهد عن‬
‫المستوى األعظمي فإن اإلشارة ستتعرض لتشوه ولكن لن يؤدي ذلك إلى تلف الشريحة‪ .‬يمكن إعداد‬
‫هذا المكبر ليعمل أيضا كمرشح تمرير منخفض بقطبين (من نمط سالين كي ‪ . )Sallen Key‬يعطى‬
‫تردد قطع هذا المرشح وفق العالقة التالية‪:‬‬

‫يعطى الربح وفق العالقة ‪:‬‬

‫يستخدم هذا المرشح لحذف ضجيج الخط وأية تداخالت أخرى‪ .‬تردد القطع الموصي به ‪ .25 HZ‬إن‬
‫اإلشارة الناتجة عن هذه المرحلة تمثل إشارة ‪ ECG‬مضخمة وخالية من الضجيج‪.‬‬

‫الشكل (‪ :)49‬مراحل تضخيم وترشيح إشارة ‪ ECG‬باستخدام شريحة ‪.AD8232‬‬

‫‪45‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)51‬تابع النقل الكلي لمراحل تضخيم وترشيح إشارة ‪. ECG‬‬


‫‪-3‬مكبر عازل مرجعي ‪ : (A2) reference buffer‬تم تصميم شريحة ‪ AD8232‬لتعمل بتغذية‬
‫وحيدة واستطاعة منخفضة‪ .‬لذلك فإن األرضي يجب رفعه لمستوى ثابت (أرض زائفة ‪pseudo‬‬
‫‪ . ) ground‬يولد هذا المكبر ذلك الجهد لجعله نقطة مرجعية مشتركة داخل ‪ .AD8232‬يمكن‬
‫استخدام مقاومتين لضبط مستوى الجهد‪.‬‬
‫‪-4‬مضخم قيادة الرجل اليمنى ‪ : (A3) right leg drive amplifier:‬تم إضافة هذا المكبر بحيث‬
‫يوفر اتصاال مع الكترود ثالث‪ .‬يدخل هذا المكبر تيار صغير في المريض أو المستخدم للتخلص من‬
‫تغيرات جهد النمط المشترك ما بين ‪ AD8232‬والمريض‪ ،‬بالتالي تحسين رفض النمط المشترك لمكبر‬
‫القياس‪ .‬هذه الوظيفة ليست إلزامية لقياس ‪ ،ECG‬ولكن تجعلها أكثر مناعة لإلضرابات الخارجية مثل‬
‫ضجيج ‪ 50HZ/60HZ‬القادمة من التغذية أو اشعاعات أضواء ‪ LED‬ومصابيح الفلورسنت وأنظمة‬
‫اإلضاءة األخرى‪.‬‬

‫‪-1-2-9‬الكشف عن الفصل ‪LEAD OFF DETECTION‬‬


‫يمكن لشريحة ‪ AD8232‬مراقبة فصل االلكترودات عن جسم المريض‪ .‬يوجد خياران يمكن من‬
‫خاللهما كشف الفصل هما‪:‬‬
‫‪ : DC lead Off .1‬في هذه الحالة تراقب الشريحة جهد دخل اإللكترونات‪ .‬كل دخل منها مرتبط‬
‫مع مقاومة سحب للتغذية ‪ .pull-up‬عندما يصبح جهد أحد االلكترودات قيمته مرتفعة فهذا‬
‫يدل على حدوث فصل وعندئذ تعطي الرجل ‪ LO+‬أو ‪ LO-‬الموافقة مؤشرا على حدوث فصل‪.‬‬
‫‪ : AC Lead Off .2‬هذا الخيار يعتبر مناسبا في حال استخدام الكترودين فقط (أي من دون‬
‫ألكترود ‪ .)RLD‬يتم توليد تيار صغير تردده ‪ 100 kHz‬في االلكترودات‪ .‬ال يمكن من خالل‬
‫هذه الطريقة معرفة أي الكترود فاصل‪ ،‬تولد الرجل ‪ LO+‬فقط مؤشرا في حالة الفصل‪.‬‬

‫‪46‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-2-9‬االستعادة السريعة‬
‫نتيجة لكون تردد قطع مرشح التمرير العالي منخفضا في تطبيقات ‪ ECG‬فإن االشارات قد تتطلب‬
‫عدة ثواني لكي تستقر‪ .‬يؤدي الوقت المطلوب لالستقرار تأخيرا محبطا للمستخدم‪ .‬على سبيل المثال‬
‫عندما يتم وصل االلكترودات أول مرة‪.‬‬
‫تتضمن شريحة ‪ AD8232‬وظيفة االستعادة السريعة لمنع حدوث تأخيرات طويلة‪ .‬عندما تكشف‬
‫‪ AD8232‬حالة إشباع (اشارة كافية) على خرج مضخم القياس فإنها تبدل مقاومة مقدارها ‪10KΩ‬‬
‫على التفرع مع مقاومات المرشح‪ ،‬وهذا ما يؤدي إلى إزاحة القطب إلى تردد أعلى‪ ،‬وبالتالي زمن‬
‫استقرار أسرع‪ .‬بعد أن تستقر االشارة يعود المرشح بشكل آلي للعمل لمنع تلك الوظيفة‪ .‬يوضح الشكل‬
‫(‪ )51‬زمن استقرار ‪ AD8232‬مع تفعيل وبدون تفعيل االستعادة السريعة‪.‬‬

‫الشكل (‪ : )51‬زمن استقرار ‪ AD8232‬مع تفعيل وبدون تفعيل االستعادة السريعة‪.‬‬

‫يبين الجدول (‪ )9‬وظائف أرجل لوحة ‪.AD8232‬‬


‫الجدول (‪ : )9‬وظائف أرجل لوحة ‪.AD8232‬‬
‫الوظيفة‬ ‫اسم الرجل‬
‫أرضي‪.‬‬ ‫‪GND‬‬
‫تغذية اللوحة‪ .‬يطبق جهد ‪.3.3 V‬‬ ‫‪3.3v‬‬
‫إشارة الخرج (إشارة ‪.)ECG‬‬ ‫‪OUTPUT‬‬
‫رجل كشف الفصل ‪.-‬‬ ‫‪LO-‬‬
‫رجل كشف الفصل ‪.+‬‬ ‫‪LO+‬‬
‫عند تطبيق جهد مستوى منخفض ‪ LOW‬تصبح‬ ‫‪SDN‬‬
‫اللوحة بحالة الطاقة المنخفضة ‪.power down‬‬

‫‪42‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3-2-9‬مكان توضع الكترودات لوحة تخطيط القلب ‪ AD8232‬على الجسم‬


‫يأتي مع اللوحة ثالثة كابالت لها األلوان التالية ‪ :‬أحمر ‪ ،‬أصفر ‪ ،‬أخضر‪ .‬يبين الشكل (‪ )52‬األماكن‬
‫المناسبة لها‪.‬‬
‫)‪Red: RA (Right Arm‬‬
‫)‪Yellow: LA (Left Arm‬‬
‫)‪Green: RL (Right Leg‬‬

‫الشكل (‪ :)52‬أماكن توضع الكترودات لوحة ‪AD8232‬‬

‫‪-3-9‬ربط لوحة ‪ AD8232‬مع لوحة األردوينو‬


‫يتم تغذية لوحة ‪ AD8232‬بجهد ‪ .+3.3 V‬يتم وصل رجل الخرج ‪ OUTPUT‬مع إحدى األرجل‬
‫التشابهية للوحة األردوينو‪ .‬يتم وصل األرجل ‪ LO+ ، LO-‬مع أرجل رقمية‪ .‬تترك الرجل ‪ SDN‬من دون‬
‫أية توصيل‪.‬‬

‫‪48‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)53‬كيفية وصل لوحة ‪ AD8232‬مع لوحة األردوينو‪.‬‬

‫‪-4-9‬التطبيق العملي‪ :‬قياس إشارة القلب الكهربائية ‪ ECG‬ورسمها على الحاسب‬


‫إلنجاز هذا التطبيق نقوم في البداية بوصل الدارة الموضحة في الشكل (‪ .)53‬ومن ثم نقوم بتحميل‬
‫الكود البرمجي التالي‪:‬‬
‫{ )(‪void setup‬‬
‫‪// initialize the serial communication:‬‬
‫;)‪Serial.begin(9600‬‬
‫‪pinMode(2, INPUT); // Setup for leads off detection LO +‬‬
‫‪pinMode(3, INPUT); // Setup for leads off detection LO -‬‬
‫}‬
‫{ )(‪void loop‬‬
‫فصل االلكترودات‪if((digitalRead(2) == 1)||(digitalRead(3) == 1)) //‬‬
‫{‬
‫;)'!'(‪Serial.println‬‬
‫}‬
‫عدم فصل االلكترودات ‪else{ //‬‬
‫تحويل إشارة القلب الكهربائية لقيمة رقمية وإرسالها للحاسب ‪Serial.println(analogRead(A0)); //‬‬
‫}‬
‫‪//Wait for a bit to keep serial data from saturating‬‬
‫;)‪delay(1‬‬
‫}‬

‫‪49‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يمكن إظهار إشارة ‪ ECG‬على نافذة الرسم التسلسلي ‪ Serial plotter‬من بيئة التطوير لألردوينو‪.‬‬
‫ولكن هناك برنامج ‪ Processing IDE‬يسمح من رسم البيانات بشكل أوضح‪ .‬يمكن تحميله من شبكة‬
‫االنترنت‪ .‬بعد تشغيل البرنامج نفتح الكود البرمجي ‪( Heart_Rate_Display.pde‬المرفق مع الكتاب)‬
‫ونختار المنفذ التسلسلي الصحيح لتظهر إشارة ‪ ECG‬كما هو موضح في الشكل (‪.)54‬‬

‫الشكل (‪ : )54‬رسم إشارة ‪ ECG‬من خالل برنامج ‪.Processing IDE‬‬

‫‪51‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫بروتوكول االتصال التسلسلي ‪I2C‬‬

‫‪-1-11‬مقدمة عن بروتوكول االتصال التسلسلي ‪I2C‬‬


‫يعتبر بروتوكول االتصال )‪ I2C (Inter-Integrated Circuit‬أحد أشكال بروتوكوالت النقل‬
‫التسلسلية والذي تم تطويره من قبل شركة ‪ Philips‬في أوائل الثمانينات من القرن الماضي‪ .‬يستخدم‬
‫‪ I2C‬خطين إلجراء عملية النقل‪ :‬خط معطيات‪ ،‬وخط إشارة ساعة‪ .‬لهذا يعمل ‪ I2C‬وفق أسلوب النقل‬
‫المتزامن وبنصف ازدواجية ‪( half duplex‬أي إمكانية نقل البيانات في االتجاهين ولكن ليس بنفس‬
‫الوقت)‪ .‬يعرف ‪ I2C‬أيضا باسم ‪ (Two wire Interface) TWI‬ويلفظ "‪ "I squared C‬أو األكثر‬
‫شيوعا "‪."I two C‬‬
‫يستخدم ‪ I2C‬لتتبادل عدة دارات متكاملة البيانات فيما بينها‪ ،‬والتي من الممكن أن يصل‬
‫عددها إلى ‪ 112‬جهاز على الناقل الواحد ‪ ،Bus‬بسرعة نقل منخفضة نسبيا ولمسافة قصيرة‪.‬‬
‫يمكن أن يعمل ‪ I2C‬بثالث سرعات مختلفة‪:‬‬
‫‪ :Standard Mode ‬السرعة في هذا النمط ‪. 100 kbps‬‬
‫‪ :Fast Mode ‬السرعة في هذا النمط ‪.400 Kbps‬‬
‫‪ :High –speed Mode ‬السرعة في هذا النمط ‪.3.4 Mbps‬‬
‫يتطلب الناقل ‪ I2C‬وجود خطين‪:‬‬
‫‪ :SCL(serial clock) ‬خط إشارة ساعة ‪ ,‬يعرف هذا الخط أيضا ‪.SCK‬‬
‫‪ :SDA(serial data) ‬خط معطيات‪.‬‬

‫ال بد من إجراء عملية سحب أو شد لهذين الخطين من خالل مقاومتين سحب إلى ‪ .+5v‬قيم‬

‫‪ 4.7 k‬إلى ‪.47 k‬‬ ‫المقاومات ينبغي أن تكون بين‬


‫يوجد نوعين من العقد التي يتم وصلها على ناقل ‪:I2C‬‬
‫‪ :Master ‬العقدة التي تتحكم دائما بخط إشارة الساعة‪.‬‬
‫‪ :Slave ‬العقدة التي ال تتحكم بخط إشارة الساعة‪.‬‬
‫الوصل األكثر شيوعا هو أنه يوجد ‪ Master‬واحد وعدة أجهزة ‪ . Slave‬كالهما يستطيعان أن يجريا‬
‫عملية النقل على ناقل ‪ I2C‬ولكن عملية النقل يتحكم بها جهاز ‪ master‬دائما‪.‬‬

‫‪51‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)55‬مخطط وصل عقد مختلفة وفق بروتوكول ‪.I2C‬‬

‫‪-1-1-11‬عنونة األجهزة ‪Device addressing‬‬


‫كل جهاز ‪ slave‬يدعم عملية النقل وفق ‪ I2C‬ال بد أن يكون له عنوان وحيد على المسار ‪I2C‬‬
‫وهذا العنوان عادة ما يتم تحديده من قبل الشركة المصنعة للجهاز‪ .‬كل األجهزة ‪ Slave‬لها عنوان ‪7bit‬‬
‫أو نادرا ‪. 10 bit‬‬
‫المعطيات المرسلة ستكون عبارة عن ‪ .8 bit‬السبع بتات األولى هي عنوان الجهاز‪ ،‬والبت‬
‫الثامن يعرف نمط العملية (قراءة أو كتابة)‪ .‬للكتابة يأخذ هذا البت (‪ ,)0‬للقراءة يأخذ هذا البت (‪.)1‬‬
‫المعطيات المرسلة على ناقل ‪ I2C‬هي البت األكثر أهمية ‪ MSB‬أوال‪.‬‬

‫‪-2-1-11‬حوادث المسار ‪Bus Events‬‬


‫هناك العديد من الحوادث والتي تحدث على ناقل ‪ I2C‬وهي‪:‬‬
‫‪ :START ‬يصدر الجهاز ‪ master‬الحالة ‪ start‬لإلشارة إلى البدء بحالة النقل ويتم ذلك من‬
‫خالل سحب الخط ‪ SDA‬ثم الخط ‪ SCL‬للحالة المنخفضة ‪LOW‬‬
‫‪ :STOP ‬جهاز ‪ master‬مع نهاية عملية النقل يحرر جهاز ‪ Master‬كل من الخط ‪ SCL‬ثم الخط‬
‫‪.SDA‬‬
‫‪ :Acknowledge ‬جهاز ‪ slave‬المعنون أو جهاز ‪ master‬يسحب الخط ‪ SDA‬للحالة‬
‫المنخفضة‪.‬‬

‫الشكل (‪ :)56‬الحالة ‪ START‬والحالة ‪ STOP‬على ناقل ‪.I2C‬‬

‫‪52‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الحالة ‪ start‬تعلم كل األجهزة بأن هناك شيئا ما سيرسل على المسار ‪ .I2C‬الحالة ‪ stop‬تعلم‬
‫كل األجهزة بأن الرسالة قد اكتملت وانتهى إرسالها‪ .‬الحالة ‪ Acknowledge‬تقدم هذه الحالة من كل‬
‫جهاز (‪ master‬أو ‪ )slave‬بعد كل بايت مرسل لتشير إلى استالمها ذلك البايت‪.‬‬

‫الشكل (‪ : )52‬كيفية إرسال البيانات على ناقل ‪ :I2C‬الحالة ‪ ،START‬البيانات ‪ data‬المنقولة‪ ،‬اإلعالم‬
‫بالتسليم ‪ ،Acknowledge‬الحالة ‪.STOP‬‬
‫ينبغي على جهاز ‪ master‬أن يعطي إشارة اإلعالم بالتسليم ‪ Acknowledge‬بعد استقبال‬
‫بايت من جهاز ‪ slave‬في عملية القراءة‪ .‬وينبغي على جهاز ‪ slave‬أن يعطي إشارة ‪Acknowledge‬‬
‫بعد استقبال بايت من جهاز ‪ master‬في عملية كتابة‪ .‬و ينبغي على جهاز ‪ slave‬أن يعطي إشارة‬
‫‪ Acknowledge‬بعد عنونته‪ .‬في حال عدم إرسال هذه اإلشارة سيعتبر جهاز ‪ master‬بأن الجهاز غير‬
‫موجود‪.‬‬

‫الشكل (‪ :)58‬عنونة جهاز ‪ slave‬من قبل جهاز ‪ master‬في حالة الكتابة‪ ،‬وفي حالة القراءة‪ .‬قيمة‬
‫البت األخير المرسل في بايت البيانات )‪ (R/W‬تحدد كتابة أم قراءة‪.‬‬

‫‪-3-1-11‬البرمجة ‪Programming‬‬
‫من أجل جهاز ‪ master‬يكتب إلى جهاز ‪ slave‬يتم تنفيذ الخطوات التالية‪:‬‬
‫‪-1‬يتم إرسال إشارة البدء‪START‬‬
‫‪-2‬يتم إرسال عنوان جهاز‪ slave‬مع بت الكتابة(‪.)LOW‬‬
‫‪ -3‬يتم إرسال مسجل الجهاز المقصود المطلوب الكتابة إليه‪.‬‬
‫‪ -4‬يتم إرسال البايت المعطيات‪.‬‬
‫‪ -5‬يمكن إرسال بايتات أخرى‪.‬‬
‫‪-6‬يتم إرسال إشارة التوقف ‪STOP‬‬

‫‪53‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫من أجل جهاز ‪ master‬يقرأ من جهاز ‪ slave‬يتم تنفيذ الخطوات التالية‪:‬‬
‫‪-1‬يتم إرسال إشارة البدء‪START‬‬
‫‪ -2‬يتم إرسال عنوان جهاز ‪ slave‬مع بت الكتابة (‪)LOW‬‬
‫‪ -3‬يتم إرسال مسجل الجهاز المقصود المراد القراءة منه‬
‫‪ -4‬يتم إرسال إشارة البدء من جديد ‪start‬‬
‫‪ -5‬يتم إرسال عنوان جهاز ‪ slave‬مع بت القراءة(‪)high‬‬
‫‪-6‬يتم قراءة بايت المعطيات من جهاز‪slave‬‬
‫‪-2‬يتم إشارة التوقف ‪.STOP‬‬

‫‪-2-11‬وحدة الزمن الحقيقي ‪DS1307 RTC‬‬


‫تعمل وحدة ‪ DS1307 RTC‬كمؤقت زمني‪ ،‬فمن خاللها يستطيع المتحكم الصغري الحصول على‬
‫الزمن الحقيقي (ثانية‪ ،‬دقيقة‪ ،‬ساعة) والتاريخ (يوم‪ ،‬شهر‪ ،‬سنة)‪ .‬تزود هذه الوحدة ببطارية بحيث‬
‫تحافظ على الزمن والتاريخ حتى مع انقطاع التغذية الكهربائية‪ .‬تتكون الوحدة بشكل رئيسي من‬
‫العناصر التالية‪:‬‬
‫‪ ‬شريحة الزمن الحقيقي ‪.DS1307‬‬
‫‪ ‬ذاكرة ‪24C32 EEPRM‬‬
‫‪ ‬بطارية احتياطية‪.‬‬

‫الشكل (‪ :)59‬وحدة الزمن ‪.DS1307 RTC‬‬

‫‪-1-2-11‬شريحة الزمن الحقيقي ‪.DS1307‬‬


‫تعتبر شريحة ‪ DS1307‬قلب وحدة الزمن الحقيقي ‪ .RTC‬فهي تدير جميع وظائف ضبط الوقت‬
‫والتاريخ‪ .‬وهذه هي أهم خصائص الشريحة‪:‬‬
‫‪ ‬تستطيع شريحة ‪ DS1307‬أن تقوم بعد الثواني و الدقائق والساعات واأليام ‪ ،‬و إعطاء تاريخ‬
‫متضمنا اليوم والشهر والسنة‪ ،‬و تبقى سارية المفعول حتى عام ‪.2100‬‬
‫‪ ‬تحتوي على ذاكرة ‪ RAM‬بسعة ‪.56 bytes‬‬

‫‪54‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ ‬لها واجهة اتصال تسلسلية ‪ I2C‬بخطين ) ‪. (SDA – SCL‬‬
‫‪ ‬تعطي إشارة خرج مربعة ( نبضات ساعة ) قابلة للبرمجة )‪. (SQW‬‬
‫‪ ‬تستهلك أقل من ‪. 500 nA‬‬
‫‪ ‬تعمل ضمن مجال درجة حرارة واسع من ‪ -40Co‬و حتى ‪.85Co‬‬
‫يوجد بجانب هذه الشريحة هزاز كريستالي بتردد ‪.32 KHz‬‬

‫الشكل (‪ :)61‬شريحة الزمن الحقيقي ‪.DS1307‬‬

‫يوضح الشكل (‪ )61‬المخطط الصندوقي لشريحة ‪ . DS1307‬وكما هو واضح فهي تتكون من األجزاء‬
‫التالية‪:‬‬
‫‪ ‬مسجالت الزمن الحقيقي ‪ : RTC register‬تعتبر أهم جزء من دارة ‪ ، DS1307‬ففي هذه‬
‫المسجالت يتم تخزين الوقت و التاريخ الحالي على شكل ترميز ثنائي عشري ‪ .BCD‬عناوين‬
‫هذه المسجالت يمتد من ‪ 00h‬إلى ‪ .07h‬يوضح الشكل (‪ )62‬كيفية توزيع مسجالت ‪. RTC‬‬
‫البتات من ‪ 0‬و حتى ‪ 3‬لهذه المسجالت تشير إلى خانة اآلحاد‪ .‬البتات المتبقية تشير إلى خانة‬
‫العشرات و التي تختلف من مسجل آلخر‪ .‬البت السابع للمسجل األول هو ‪.(CH) Clock Halt‬‬
‫عندما يأخذ ‪ 1‬منطقي يتم إلغاء عمل المهتز‪ ،‬وعندما يأخذ ‪ 0‬منطقي يتم تفعيل المهتز‪ .‬البت‬
‫السادس في مسجل الساعة عندما يأخذ ‪ 1‬منطقي تعمل عندئذ ‪ DS1307‬وفق النمط ‪12‬‬
‫ساعة و عندما يأخذ البت ‪ 0‬منطقي تعمل عندئذ وفق النمط ‪ 24‬ساعة‪.‬‬
‫‪ ‬ذاكرة ‪ RAM‬تأخذ العناوين من ‪ 08h‬إلى ‪ 3Fh‬بسعة ‪.56 bytes‬‬
‫‪ ‬مسجل تحكم ‪ :control register‬من خالل هذا المسجل يتم التحكم بالنبضات المربعة التي‬
‫نحصل عليها على الرجل ‪ .SQW/OUT‬ال يهمنا كثيرا تفاصيل هذا المسجل‪.‬‬
‫‪ ‬وحدة إدارة الطاقة‪ :‬يتم تزويد الشريحة بمصدري طاقة منفصلين‪ .‬مصدر تغذية رئيسي ‪VCC‬‬
‫‪ ،‬ومصدر تغذية احتياطي والذي يتمثل بالبطارية‪ .‬تعمل وحدة إدارة الطاقة على مراقبة‬

‫‪55‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫التغذية ‪ VCC‬باستمرار‪ ،‬وفي حالة حدوث فشل في التغذية يتم التبديل بشكل آلي إلى‬
‫البطارية‪.‬‬
‫‪ ‬وحدة واجهة اتصال الناقل التسلسلي ‪ : I2C‬تعمل ‪ Ds1307‬وفق بروتوكول االتصال ‪I2C‬‬
‫الذي يستخدم خطين لنقل البيانات‪ ( SCL :‬الذي يمثل خط نبضات الساعة للتزامن ) ‪( SDA ،‬‬
‫الذي يمثل خط المعطيات و هو خط ثنائي االتجاه )‪ .‬تعمل ‪ Ds1307‬كجهاز ‪.Slave‬‬

‫الشكل (‪ :)61‬المخطط الصندوقي لدارة ‪.DS1307‬‬

‫الشكل (‪ : )62‬مسجالت الزمن الحقيق ‪.RTC‬‬


‫‪56‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-2-11‬بطارية احتياطية‬
‫يحمل الجانب السفلي من الوحدة حامل بطارية إلدخال بطارية ليثيوم ‪ .20 mm 3V‬تحافظ البطارية‬
‫على الوقت عند انقطاع مصدر الطاقة الرئيسي للوحدة‪.‬‬
‫بافتراض استخدام بطارية ‪ CR2032‬مشحونة بالكامل بسعة ‪ 47‬مللي أمبير في الساعة وتستهلك‬
‫الشريحة الحد األدنى من ‪ ، 300 nA‬يمكن للبطارية الحفاظ على تشغيل ‪ RTC‬لمدة ال تقل عن ‪17.87‬‬
‫عاما بدون مصدر طاقة خارجي ‪ 5‬فولت‪.‬‬
‫‪47mAh/300nA = 156666.67 hours = 6527.78 days = 17.87 years‬‬

‫الشكل (‪ :)63‬بطارية ‪.CR2032‬‬

‫‪-3-2-11‬ذاكرة ‪24C32 EEPROM‬‬


‫تأتي وحدة ‪ DS1307 RTC module‬مع شريحة ذاكرة ‪ 24C32 EEPROM‬والتي سعتها ‪.32Kb‬‬
‫تعمل الذاكرة من خالل واجهة اتصال ‪ I2C‬حيث تتشارك نفس ناقل ‪ I2C‬مع شريحة ‪ .DS1307‬عنوان‬
‫الذاكرة ‪.50HEX‬‬

‫الشكل (‪ :)64‬ذاكرة ‪24C32 EEPROM‬‬

‫‪52‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-2-11‬ثقوب لحساس درجة الحرارة ‪.DS18B20‬‬


‫يوجد ثقوب ثالثة موجودة في الزاوية العلوية بجوار حامل البطارية (تسمى ‪ )U1‬حيث يمكن تثبيت‬
‫حساس درة الحرارة ‪ .DS18B20‬بمجرد تثبيت ‪ ، DS18B20‬ستتمكن من الحصول على قراءات‬
‫درجة الحرارة من الرجل ‪ .DS‬يمكن أيضا استخدام هذه القراءات لتعويض االنحراف الزمني المستند‬
‫إلى درجة الحرارة في التعليمات البرمجية‪.‬‬

‫الشكل (‪ :)65‬ثقوب لحساس درجة الحرارة ‪.DS18B20‬‬

‫‪-5-2-11‬أرجل الوحدة‬
‫يبين الشكل (‪ )66‬كيفية توزع أرجل وحدة ‪ DS1307‬والجدول (‪ )11‬يبين وظائف هذه األرجل‪.‬‬

‫الشكل (‪ :)66‬أرجل الوحدة ‪.DS1307‬‬

‫الجدول (‪ :)11‬وظائف أرجل الوحدة ‪.DS1307‬‬


‫الوظيفة‬ ‫اسم الرجل‬ ‫رقم الرجل‬
‫ُيفترض أن تكون هذه الرجل لقراءة خرج وحدة حساس درجة حرارة‬ ‫‪DS‬‬ ‫‪1 , 11‬‬
‫‪.DS18B20‬‬
‫مدخل نبضات الساعة لواجهة االتصال ‪.I2C‬‬ ‫‪SCL‬‬ ‫‪2 , 10‬‬
‫مدخل ومخرج بيانات واجهة االتصال ‪.I2C‬‬ ‫‪SDA‬‬ ‫‪3,9‬‬
‫رجل التغذية الرئيسي للوحدة ‪3.3V to 5.5V‬‬ ‫‪VCC‬‬ ‫‪4,8‬‬
‫‪58‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫أرضي‬ ‫‪GND‬‬ ‫‪5,7‬‬
‫رجل التغذية االحتياطية للوحدة عن طريق أي بطارية ليثيوم ‪ 3V‬أو‬ ‫‪BAT‬‬ ‫‪6‬‬

‫أي مصدر طاقة آخر‪.‬‬


‫مخرج نبضات ساعة ‪ 1Hz, 4kHz, 8kHz or 32kHz‬ويتم تفعيلها‬ ‫‪SQW‬‬ ‫‪12‬‬

‫برمجيا‪.‬‬

‫‪-3-11‬أرجل تبادل البيانات وفق بروتوكول ‪ I2C‬في لوحات األردوينو‪.‬‬


‫يبين الجدول (‪ )11‬األرجل ‪ SCL‬و ‪ SDA‬لبروتوكول ‪ I2C‬في لوحات أردوينو مختلفة‪.‬‬

‫الجدول (‪ )11‬األرجل ‪ SCL‬و ‪ SDA‬لبروتوكول ‪ I2C‬في لوحات أردوينو مختلفة‪.‬‬


‫أرجل ‪ SCL‬و ‪ SDA‬لبروتوكول ‪I2C‬‬ ‫لوحة األردوينو‬
‫)‪ .A4 (SDA), A5 (SCL‬أو في اإلصدار ‪ UNO R3‬عن طريق المنفذين‬ ‫‪Uno‬‬
‫الواقعين بجانب ‪ AREF‬كما هو موضح في الشكل (‪.)62‬‬
‫)‪20 (SDA), 21 (SCL‬‬ ‫‪Mega2560‬‬
‫)‪2 (SDA), 3 (SCL‬‬ ‫‪Leonardo‬‬
‫‪20 (SDA), 21 (SCL), SDA1, SCL1‬‬ ‫‪Due‬‬

‫‪SCL‬‬ ‫‪SDA‬‬

‫‪SDA‬‬ ‫‪SCL‬‬

‫الشكل (‪ : )62‬أرجل ‪ SCL‬و ‪ SDA‬في لوحة األردوينو أونو‪.‬‬

‫‪59‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-11‬وصل لوحة األردوينو مع دارة ‪ DS1307‬وفق بروتوكول ‪I2C‬‬


‫يوضح الشكل (‪ )68‬كيفية وصل لوحة األردوينو أونو مع دارة ‪ DS1307‬وفق بروتوكول ‪ .I2C‬تم‬
‫وصل رجل ‪ SDA‬للوحة األردوينو مع رجل ‪ SDA‬لدارة ‪( DS1307‬السلك البرتقالي)‪ ،‬كذلك تم وصل‬
‫رجل ‪ SCL‬للوحة األردوينو مع المقابلة لها لدارة ‪( DS1307‬السلك األصفر)‪.‬‬

‫الشكل (‪ :)68‬كيفية ربط دارة ‪ DS1307‬مع لوحة األردوينو وفق بروتوكول ‪.I2C‬‬

‫‪-5-11‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بالتحكم بدارة ‪ DS1307‬البد من أن نحمل في البداية المكتبات التالية‪:‬‬
‫‪ ‬مكتبة ‪ :wire‬تسمح هذه المكتبة للوحة األردوينو باالتصال مع األجهزة األخرى وفق‬
‫بروتوكول ‪ .I2C‬هذه المكتبة موجودة ضمن بيئة التطوير ‪ Arduino IDE‬وال يوجد داع‬
‫لتحميلها‪.‬‬
‫‪ ‬مكتبة ‪ :RTClib‬المكتبة موجودة ضمن الملفات المرفقة مع الكتاب‪ .‬يتم إضافة هذه المكتبة‬
‫كما تم شرحه في الفقرة (‪.)4-1‬‬
‫نقوم في الكود البرمجي بما يلي‪:‬‬

‫‪61‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-1‬نقوم في البداية باستدعاء المكتبتين المذكورتين سابقا‪ .‬كما يلي في بداية البرنامج قبل ‪void‬‬
‫) (‪:setup‬‬
‫>‪#include <Wire.h‬‬
‫"‪#include "RTClib.h‬‬
‫‪-2‬نعرف كائن ‪ rtc‬وكائن ‪ now‬كما يلي‪:‬‬
‫;‪RTC_DS1307 rtc‬‬
‫;)(‪DateTime now = rtc.now‬‬
‫‪-3‬نكتب تعليمة التهيئة داخل برنامج ‪:void setup‬‬
‫;)(‪rtc.begin‬‬
‫‪ -4‬يمكن ضبط التاريخ والوقت باستخدام التعليمة التالية‪:‬‬
‫;))‪rtc.adjust(DateTime(year, month, day, hour, minute, second‬‬
‫على سبيل المثال بفرض أن التاريخ الحالي هو ‪ 21, January, 2014‬والوقت ‪ 3 am‬نكتب التعليمة‬
‫التالية‪:‬‬
‫;))‪rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0‬‬

‫‪-5‬يمكن معرفة التاريخ والوقت من خالل استدعاء التوابع التالية كما يلي‪:‬‬
‫)(‪now.year‬‬
‫)(‪now.month‬‬
‫)(‪now.day‬‬
‫)(‪now.dayOfTheWeek‬‬
‫)(‪now.hour‬‬
‫)(‪now.minute‬‬
‫)(‪now.second‬‬

‫‪-6-11‬تطبيق عملي‪ :‬ربط لوحة ‪ DS1307‬مع لوحة األردوينو وإظهار الوقت والتاريخ‬
‫على الحاسب‬
‫إلنجاز هذا التطبيق نقوم في البداية بوصل الدارة الموضح في الشكل (‪ .)68‬ومن ثم نقوم بتحميل‬
‫الكود البرمجي التالي‪:‬‬
‫>‪#include <Wire.h‬‬
‫"‪#include "RTClib.h‬‬

‫;‪RTC_DS1307 rtc‬‬

‫‪61‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"};

void setup () {
Serial.begin(9600);
rtc.begin();
rtc.adjust(DateTime(2018, 11, 16, 3, 0, 0)); // adjust date & time
}

void loop () {
DateTime now = rtc.now();
Serial.print(now.year());
Serial.print('/');
Serial.print(now.month());
Serial.print('/');
Serial.print(now.day());
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.println(") ");
Serial.print(now.hour());
Serial.print(':');
Serial.print(now.minute());
Serial.print(':');
Serial.println(now.second());
delay(1000);
}

‫ مع لوحة األردوينو وإظهار الوقت والتاريخ‬DS1307 ‫ ربط لوحة‬:‫تطبيق عملي‬-7-11


LCD ‫على شاشة‬
.)69( ‫إلنجاز هذا التطبيق نقوم في البداية بوصل الشكل‬

62
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

.LCD ‫ مخطط وصل إظهار التاريخ والوقت على شاشة‬:)69( ‫الشكل‬


:‫فيما يلي الكود البرمجي الخاص بهذا التطبيق‬
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>

LiquidCrystal lcd(0, 1, 2, 3, 4, 5);


RTC_DS1307 rtc;

void setup () {
lcd.begin(16, 2);
rtc.begin();
rtc.adjust(DateTime(2018, 11, 16, 3, 0, 0)); // adjust date & time
}

void loop () {
DateTime now = rtc.now();
lcd.setCursor(3, 0);
lcd.print(now.year());
lcd.print('/');
lcd.print(now.month());
lcd.print('/');
lcd.print(now.day());
lcd.setCursor(4, 1);
63
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫;))(‪lcd.print(now.hour‬‬
‫;)'‪lcd.print(':‬‬
‫;))(‪lcd.print(now.minute‬‬
‫;)'‪lcd.print(':‬‬
‫;))(‪lcd.print(now.second‬‬
‫;)‪delay(1000‬‬
‫}‬

‫‪-8-11‬حساس معدل نبضات القلب ونسبة األكسجين ‪MAX30100‬‬


‫‪-1-8-11‬مقدمة‬
‫يستخدم الحساس ‪ MAX30100‬لقياس كل من معدل نبضات القلب ‪ heart rate‬وتأكسج النبضات‬
‫‪ Pulse Oximetry‬لإلنسان في نفس الوقت‪.‬‬
‫يتكون الحساس من ثنائيين ضوئيين أحدهما ينبعث منه ضوء أحمر (‪ 651‬نانومتر) ‪ ،‬واآلخر ينبعث‬
‫منه ضوء أشعة تحت الحمراء (‪ 951‬نانومتر)‪ ،‬وكاشف ضوئي‪ ،‬وبصريات قابلة للتعديل ومعالج إشارة‪.‬‬
‫يستخدم الثنائيان معا لقياس تأكسج الدم‪ ،‬أما لقياس معدل نبضات القلب يكفي استخدام ثنائي‬
‫األشعة تحت الحمراء‪.‬‬
‫اعتمادا على كمية األكسجين الموجودة في الدم ‪ ،‬ستكون نسبة الضوء األحمر الممتص واألشعة تحت‬
‫الحمراء مختلفة‪ .‬بهذه النسبة‪ ،‬يمكننا بسهولة حساب مستوى األكسجين في الهيموغلوبين في الدم‪.‬‬
‫يعمل الحساس من ‪ 1.8‬فولت و ‪ 3.3‬فولت‪ ،‬ويمكن تقليل الطاقة المستهلكة من خالل البرمجة‪.‬‬
‫يتواصل هذا الحساس مع المتحكم الصغري عن طريق واجهة االتصال ‪ .I2C‬يحتوي نظام قياس‬
‫النبض في هذه الوحدة على إلغاء للضوء المحيط‪ ،‬ومبدل تشابهي رقمي ‪ ADC‬بل ‪ 16‬بت ‪ ،‬ومرشح‪.‬‬

‫الشكل (‪ :)21‬حساس ‪.MAX30100‬‬


‫يثبت هذا الحساس على لوحة مع العناصر االلكترونية األخرى والتي تسهل التعامل معه كمنظمات‬
‫الجهد ومقاومات‪.‬‬

‫‪64‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)21‬لوحة الحساس ‪.MAX30100‬‬

‫الشكل (‪ :)22‬المخطط االلكتروني للوحة ‪MAX30100‬‬


‫يبين الجدول (‪ )12‬وظائف أرجل اللوحة ‪.MAX30100‬‬
‫الجدول (‪ :)12‬وظائف أرجل اللوحة ‪.MAX30100‬‬
‫الوظيفة‬ ‫اسم الرجل‬ ‫رقم الرجل‬

‫تغذية اللوحة من ‪1.8V-5.5V‬‬ ‫‪Vin‬‬ ‫‪1‬‬

‫رجل نبضات الساعة لبروتوكول ‪.I2C‬‬ ‫‪SCL‬‬ ‫‪2‬‬

‫رجل البيانات لبروتوكول ‪.I2C‬‬ ‫‪SDA‬‬ ‫‪3‬‬

‫رجل مقاطعة‪ .‬فعالة عند المستوى المنخفض‪.‬‬ ‫‪INT‬‬ ‫‪4‬‬

‫هذه الرجل كاثود ثنائي األشعة تحت الحمراء‬ ‫‪IRD‬‬ ‫‪5‬‬

‫ويمكن ربطه مع نقطة قيادة للثنائي‪.‬‬


‫هذه الرجل كاثود الثنائي الضوئي األحمر ‪LED‬‬ ‫‪RD‬‬ ‫‪6‬‬

‫ويمكن ربطه مع نقطة قيادة للثنائي‪.‬‬


‫أرضي‬ ‫‪GND‬‬ ‫‪2‬‬

‫‪65‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-8-11‬وصل لوحة األردوينو مع الحساس ‪ MAX30100‬وفق بروتوكول ‪I2C‬‬


‫يبين الشكل (‪ )23‬كيفية وصل الحساس ‪ MAX30100‬مع لوحة األردوينو أونو‪.‬‬

‫الشكل (‪ :)23‬كيفية وصل الحساس ‪ MAX30100‬مع لوحة األردوينو أونو‬

‫‪-3-8-11‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بالتحكم بدارة ‪ MAX30100‬البد من أن نحمل في البداية المكتبات‬
‫التالية‪:‬‬
‫‪ ‬مكتبة ‪ :wire‬تسمح هذه المكتبة للوحة األردوينو باالتصال مع األجهزة األخرى وفق‬
‫بروتوكول ‪ .I2C‬هذه المكتبة موجودة ضمن بيئة التطوير ‪ Arduino IDE‬وال يوجد داع‬
‫لتحميلها‪.‬‬
‫يتم‬ ‫‪ ‬مكتبة ‪ :Arduino-MAX30100‬المكتبة موجودة ضمن الملفات المرفقة مع الكتاب‪.‬‬
‫إضافة هذه المكتبة كما تم شرحه في الفقرة (‪.)4-1‬‬
‫نقوم في الكود البرمجي بما يلي‪:‬‬
‫‪-1‬نقوم في البداية باستدعاء المكتبتين المذكورتين سابقا‪ .‬كما يلي في بداية البرنامج قبل ‪void‬‬
‫) (‪:setup‬‬
‫>‪#include <Wire.h‬‬
‫"‪#include " MAX30100_PulseOximeter.h‬‬
‫‪-2‬نعرف كائن ‪ pox‬كما يلي‪:‬‬
‫;‪PulseOximeter pox‬‬
‫‪-3‬نكتب تعليمة التهيئة داخل برنامج ‪:void setup‬‬
‫;)(‪pox.begin‬‬
‫‪66‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
.MAX30100 ‫ في حال نجاح االتصال ما بين األردوينو ولوحة‬true ‫تعيد هذه التعليمة‬

.‫نستدعي التعليمة التالية لكشف النبضات‬-4


pox.setOnBeatDetectedCallback(onBeatDetected);

‫ نستدعي التعليمات التالية بشكل متكرر لمعرفة معدل النبضات‬void loop ( ) ‫ ضمن برنامج‬-5
‫ونسبة األكسجين‬
pox.update();
pox.getHeartRate()
pox.getSpO2()

:‫ ويمكن تغييره من خالل التعلية التالية‬50 mA ‫ يساوي‬IR ‫ بشكل افتراضي فإن تيار الثنائي‬-6
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
.‫ لمعرفة الخيارات الممكنة‬MAX30100_Registers.h ‫يمكن االطالع على الملف‬

‫ قياس معدل نبضات القلب ونسبة األكسجين وإرسالها إلى‬:‫ تطبيق عملي‬-4-8-11
‫الحاسب‬
:‫ ومن ثم نحمل الكود البرمجي التالي‬.)23( ‫إلنجاز هذا التطبيق نقوم في البداية بوصل الشكل‬
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"

#define REPORTING_PERIOD_MS 1000

PulseOximeter pox;
uint32_t tsLastReport = 0;

void onBeatDetected()
{
Serial.println("Beat!");
}

void setup()
{
Serial.begin(115200);
Serial.print("Initializing pulse oximeter..");

// Initialize the PulseOximeter instance


// Failures are generally due to an improper I2C wiring, missing power supply
// or wrong target chip
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
62
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
} else {
Serial.println("SUCCESS");
}
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);

// Register a callback for the beat detection


pox.setOnBeatDetectedCallback(onBeatDetected);
}

void loop()
{
// Make sure to call update as fast as possible
pox.update();
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
Serial.print("Heart rate:");
Serial.print(pox.getHeartRate());
Serial.print("bpm / SpO2:");
Serial.print(pox.getSpO2());
Serial.println("%");

tsLastReport = millis();
}
}
‫ كما هو‬serial monitor ‫بعد االنتهاء من تحميل الكود البرمجي نفتح نافذة المراقبة التسلسلية‬
.)24 ( ‫موضح في الشكل‬

‫ عرض معدل نبضات القلب ونسبة األكسجين على نافذة المراقبة التسلسلية‬: )24( ‫الشكل‬

68
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫مالحظة هامة‪ :‬إذا اشتريت وحدة ‪ MAX30100‬الموضحة سابقا ‪ ،‬فقد ال تعمل نظرا لوجود مشكلة‬
‫خطيرة في التصميم‪ .‬تستخدم شريحة ‪ MAX30100‬جهد ‪ 1.8‬فولت لل ‪ ، VDD‬وتستخدم هذه‬
‫الوحدة الخاصة منظمين لتحقيق هذا الجهد‪ .‬ال مشكلة في ذلك‪ .‬ولكن ‪ ،‬إذا نظرت عن كثب إلى الشكل‬
‫(‪ ، )22‬يتم سحب دبابيس ‪ SCL‬و ‪ SDA‬عبر مقاومات ‪ 4.2‬كيلو أوم إلى ‪ 1.8‬فولت! هذا يعني أنها لن‬
‫تعمل بشكل جيد مع المتحكمات الصغرية ذات المستويات المنطقية األعلى‪ .‬لحل ذلك يكفي قطع‬
‫المسار في مكان الخط األحمر وإنشاء وصلة ‪ jumper‬كما هو موضح بالخط األصفر‪.‬‬

‫الشكل (‪ : )25‬حل مشكلة ربط الحساس ‪ max30100‬مع لوحة األردوينو أونو‪.‬‬

‫‪69‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫بروتوكول النقل التسلسلي (‪)SPI‬‬


‫‪-1-11‬مقدمة عن بروتوكول ‪SPI‬‬
‫بروتوكول )‪ Serial Peripheral Interface (SPI‬هو بروتوكول نقل تسلسلي من النمط المتزامن‬
‫‪( synchronous serial communication‬أي يوجد خط يرسل فيه نبضات ساعة)‪ ،‬يستخدم إلجراء‬
‫اتصال على مسافة قصيرة بشكل خاص في األنظمة المدمجة‪ .‬تم تطويره من قبل شركة ‪Motorola‬‬
‫في ثمانينات القرن الماضي‪ .‬يوجد العديد من التطبيقات التي يستخدم فيها هذا البروتوكول مثل‬
‫البطاقات الرقمية ‪ SD card‬وشاشات إظهار ‪.LCD‬‬
‫يعمل ‪ SPI‬وفق نمط اإلزدواجية التامة ‪( full duplex‬أي إمكانية إرسال البيانات في كال االتجاهين‬
‫بنفس الوقت على خطوط منفصلة)‪ .‬يعمل ‪ SPI‬وفق أسلوب ‪ .Master-slave‬جهاز ‪ master‬وحيد هو‬
‫‪ slave‬المطلوب‪ .‬يولد جهاز ‪ master‬نبضات‬ ‫الذي يبدأ عملية نقل المعطيات‪ ,‬ويختار جهاز‬
‫الساعة ‪ clock‬ألجهزة ‪ .slave‬جهاز ‪ slave‬الذي تم اختياره يستجيب لطلب ‪ ,master‬ويرسل‬
‫المعطيات المطلوبة إلى ‪– master‬إن لزم األمر‪ -‬مع كل نبضة ساعة‪ .‬لبروتوكول ‪ SPI‬أربع خطوط‬
‫(لهذا يعرف أيضا ‪ )four-wire serial bus‬هي‪:‬‬
‫‪ ‬خط نبضات الساعة )‪ : Serial Clock (SCLK‬تنتج عن الجهاز السيد‪.‬‬
‫‪ ‬خط )‪ : Master Output Slave Input (MOSI‬خط إرسال البيانات من جهاز السيد إلى‬
‫الجهاز التابع‪.‬‬
‫‪ ‬خط )‪ :Master Input Slave Output (MISO‬خط إرسال البيانات من جهاز التابع إلى‬
‫الجهاز السيد‪.‬‬
‫‪ ‬خط اختيار الجهاز التابع )‪ : Slave Select (SS‬يعرف أيضا ‪.CS‬‬
‫يوضح الشكل (‪ )26‬كيفية ربط جهاز ‪ master‬مع جهاز ‪ slave‬وفق بروتوكول ‪.SPI‬‬

‫الشكل الشكل (‪ )26‬كيفية ربط جهاز ‪ master‬مع جهاز ‪ slave‬وفق بروتوكول ‪.SPI‬‬

‫‪-2-11‬وحدة التعريف بالترددات الراديوية ‪RFID‬‬


‫التعريف بالترددات الراديوية )‪ Radio-Frequency Identification (RFID‬هو استخدام الموجات‬
‫الراديوية لقراءة المعلومات المخزنة على بطاقة مرتبطة بكائن ما‪ .‬يمكن استخدام نظام ‪ RFID‬لفتح‬
‫الباب‪ ،‬على سبيل المثال‪ُ ،‬يسمح فقط للشخص الذي لديه المعلومات الصحيحة على بطاقته بالدخول‪.‬‬

‫‪21‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يتكون نظام ‪ RFID‬من جزأين‪ :‬عالمة ‪( tag‬بطاقة) وقارئ‪ .‬تتكون العالمة ‪ RFID‬من جزأين‪:‬‬
‫‪ .1‬مستجيب ‪ transponder‬أو بطاقة ‪ tag‬موجودة على الكائن الذي نريد التعرف عليه‪ .‬تحتوي‬
‫على الرقم التسلسلي المحدد له‪.‬‬
‫‪ .2‬جهاز إرسال واستقبال ‪ transceiver‬أو قارئ ‪.reader‬‬

‫‪.3‬‬
‫الشكل (‪ :)22‬مكونات نظام ‪.RFID‬‬
‫هنالك نوعان رئيسيان من بطاقات ‪ RFID‬هما‪:‬‬
‫البطاقات النشطة ‪ : Active Tags‬هي التي تعتمد على بطارية‪ .‬وجود البطارية يجعل هذه الرقاقة‬
‫تتواصل حتى ‪ 111‬متر‪ ،‬بعض هذه الرقاقات مستقل تماما عن حقل القارئ إذ أنها متكاملة مع وحدة‬
‫إرسال خاصة مما يجعلها قادرة على التواصل لمسافة عدة كيلومترات باعتماد مبدأ الرادارات‪ .‬قد‬
‫يكون القارئ محموال بحيث ال يتجاوز وزنه النصف كيلوغرام ومزودا بذاكرة سعتها أكثر من ‪128‬‬
‫ميغابايت ومن الممكن أن يتصل بالحاسوب السلكيا‪.‬‬
‫البطاقات الخاملة (السلبية( ‪ : Passive Tags‬هي التي ال تعتمد على بطارية‪ .‬عدم وجود مصدر‬
‫الطاقة المستقل يحد من قدرة اإلرسال الخاصة بهذه البطاقات‪ .‬تتم تغذية هذه البطاقات بواسطة‬
‫طاقة الموجات الكهرومغناطيسية المتولدة من وحدة القارئ‪ .‬وتتناقص قدرة مجال القارئ بسرعة مع‬
‫ازدياد المسافة مما يحدد مجال قراءتها إلى مسافة ‪ 5-4‬متر باستخدام الترددات العالية جدا‬
‫‪.931- 861MHz‬‬

‫‪-2-2-11‬معرف الهوية ‪MFRC522 RFID‬‬


‫يوضح الشكل (‪ )28‬معرف الهوية ‪ MFRC522‬بجزأيه القارئ والبطاقة‪ .‬البطاقة من النمط الخامل‪.‬‬

‫الشكل (‪ )28‬مكونات معرف الهوية ‪.MFRC522‬‬

‫‪21‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يبين الجدول (‪ : )13‬خواص القارئ لمعرف الهوية ‪.MFRC522‬‬
‫الجدول (‪ : )13‬خواص القارئ لمعرف الهوية ‪.MFRC522‬‬
‫القيمة‬ ‫الخاصية‬
‫‪2.5 V to 3.3 V‬‬ ‫جهد التغذية‬
‫‪13~26mA‬‬ ‫تيار التشغيل‬
‫‪10~13mA‬‬ ‫تيار الخمول‬
‫‪<81μA‬‬ ‫تيار الراحة‬
‫‪13.56MHz‬‬ ‫تردد العمل‬
‫‪0~60mm‬‬ ‫مجال القراءة‬
‫‪SPI / I2C / UART‬‬ ‫واجهات االتصال‬
‫‪10Mbit/s‬‬ ‫معدل نقل البيانات على واجهة االتصال ‪SPI‬‬
‫‪20-80° Celsius‬‬ ‫درجة حرارة العمل‬

‫يبين الجدول (‪ : )14‬خواص البطاقة لمعرف الهوية ‪.MFRC522‬‬


‫الجدول (‪ : )14‬خواص البطاقة لمعرف الهوية ‪.MFRC522‬‬
‫القيمة‬ ‫الخاصية‬
‫ال تحتاج إلى تغذية‬ ‫جهد التغذية‬
‫‪8KB EEPROM‬‬ ‫السعة‬
‫‪ 32‬بت‬ ‫الرقم التسلسلي‬
‫‪106KBPS‬‬ ‫سرعة االتصال‬
‫‪13.56MHz‬‬ ‫تردد العمل‬
‫‪( ≤ 11cm‬بغض النظر عن القارئ)‪.‬‬ ‫مجال القراءة‬
‫‪20-50° Celsius‬‬ ‫درجة حرارة العمل‬
‫يبين الشكل (‪ )29‬أرجل وحدة القارئ‪ ،‬والتي وظائفها‪:‬‬
‫‪ :SS/SDA/Rx‬تعمل كخط ‪ Slave Select‬ضمن واجهة اتصال تسلسلية ‪ ،SPI‬أو خط بيانات ضمن‬
‫واجهة اتصال تسلسلية ‪ ،I2C‬أو مدخل بيانات ‪ RX‬ضمن واجهة اتصال تسلسلية ‪.UART‬‬
‫‪ :SCK‬خط نبضات الساعة التي يقدمها المتحكم الصغري )‪ (master‬لهذه الوحدة ضمن واجهة اتصال‬
‫تسلسلية ‪.SPI‬‬
‫‪ :MOSI‬تعمل كخط ‪ Master-Out-Slave-in‬ضمن واجهة اتصال تسلسلية ‪.SPI‬‬

‫‪22‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ :MISO/SCL/TX‬يمكن أن تعمل كخط ‪ Master-In-Slave-Out‬ضمن واجهة اتصال تسلسلية ‪،SPI‬‬
‫أو خط نبضات ساعة ضمن واجهة اتصال تسلسلية ‪ ،I2C‬أو مخرج بيانات ‪ TX‬ضمن واجهة اتصال‬
‫تسلسلية ‪.UART‬‬
‫‪ :IRQ‬رجل المقاطعة التي يمكن أن تنبه المتحكم عندما تكون بطاقة ‪ RFID‬بالقرب من الوحدة‪.‬‬
‫‪ :GND‬أرضي‪.‬‬
‫‪ :RST‬رجل إعادة اإلقالع ‪ Reset‬وخفض الطاقة ‪ .power-down‬عند تطبيق جهد منخفض ‪LOW‬‬
‫يتم تمكين حالة خفض الطاقة التي بها تتوقف كل مصبات التيار الداخلية بما في ذلك المذبذب‬
‫وأرجل الدخل تنفصل عن العالم الخارجي‪ .‬مع تطبيق حافة صاعدة يتم إعادة إقالع الوحدة‪.‬‬
‫‪ :Vcc‬رجل تغذية الوحدة‪ .‬يمكن تطبيق جهد ما بين ‪ 2.5V‬إلى ‪.3.3V‬‬

‫الشكل (‪ :)29‬أرجل وحدة القارئ‪.‬‬

‫‪-3-2-11‬أرجل تبادل البيانات وفق بروتوكول ‪ SPI‬في لوحات األردوينو‪.‬‬


‫يبين الجدول (‪ )15‬األرجل األربعة لبروتوكول ‪ SPI‬في لوحتي األردوينو أونو وميغا‪.‬‬
‫الجدول (‪ )15‬األرجل األربعة لبروتوكول ‪SPI‬‬
‫أرجل ‪ CS, MISO, MOSI, SCK‬لبروتوكول ‪.SPI‬‬ ‫لوحة األردوينو‬
‫‪ :CS‬الرجل ‪10‬‬ ‫‪ :MISO‬الرجل ‪12‬‬ ‫‪ :MOSI‬الرجل ‪11‬‬ ‫‪ :SCK‬الرجل ‪13‬‬ ‫‪Uno‬‬
‫‪ :CS‬الرجل ‪53‬‬ ‫‪ :MISO‬الرجل ‪51‬‬ ‫‪ :MOSI‬الرجل ‪51‬‬ ‫‪ :SCK‬الرجل ‪52‬‬ ‫‪Mega2560‬‬

‫‪-4-2-11‬ربط معرف الهوية ‪ MFRC522‬مع لوحة األردوينو‬


‫يبين الشكل (‪ )81‬كيفية ربط معرف الهوية ‪ MFRC522‬مع لوحة األردوينو وفق بروتوكول ‪ .SPI‬تم‬
‫وصل رجل ‪ SS‬مع الرجل الرقمية ‪ ، 10‬ورجل ‪ SCK‬مع الرجل الرقمية ‪ ،13‬ورجل ‪ MOSI‬مع الرجل‬
‫الرقمية ‪ ،11‬ورجل ‪ MISO‬مع الرجل الرقمية ‪ ،12‬ال يوجد داع لوصل الرجل ‪ .IRQ‬رجل ‪ GND‬إلى‬

‫‪23‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫أرضي لوحة األردوينو‪ ،‬رجل ‪ RST‬مع الرجل الرقمية ‪( 9‬يمكن اختيار أي رجل رقمية أخرى)‪ .‬تم تغذية‬
‫لوحة معرف الهوية بجهد ‪.+3.3 V‬‬

‫الشكل (‪ : )81‬ربط معرف الهوية ‪ MFRC522‬مع لوحة األردوينو‬

‫‪-5-2-11‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بوحدة تعريف الهوية ‪ ،RFID-RC522‬سنستخدم إحدى المكتبات‬
‫المتوفرة على شبكة االنترنت‪ .‬لنتبع الخطوات التالية‪.‬‬
‫‪-1‬في البداية نقوم بإضافة المكتبة ‪ rfid-master.zip‬لبيئة التطوير كما تم شرحه في الفقرة (‪.)4-1‬‬
‫المكتبة موجودة ضمن الملفات المرفقة مع الكتاب‪.‬‬
‫‪-2‬المرحلة التالية هي اكتشاف المعرف الفريد للعالمة (‪ .)UID‬وتتم من خالل تحميل الكود البرمجي‬
‫للمثال ‪ DumpInfo‬إلى لوحة األردوينو‪.‬‬

‫‪24‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ : )81‬اختيار المثال ‪ DumpInfo‬لمعرفة معلومات عن البطاقة‪.‬‬


‫بعد تحميل البرنامج نقوم بتشغيل ‪ .Serial Monitor‬نضع العالمة بشكل قريب من وحدة القارئ ‪،‬‬
‫عندئذ سيبدأ القارئ بقراءة معلومات العالمة وسيتم عرض جميع المعلومات من البطاقة على الشاشة‬
‫التسلسلية بما في ذلك المعرف الفريد للعالمة (‪ ، )UID‬والذاكرة الكاملة ‪.1 K‬‬

‫الشكل (‪ )82‬عرض جميع معلومات البطاقة على النافذة التسلسلية‪.‬‬

‫‪25‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-3‬لكتابة الكود الخاص بتطبيق معين نتبع الخطوات التالية‪:‬‬
‫نستدعي المكتبتين التاليتين‪:‬‬
‫>‪#include <SPI.h‬‬
‫>‪#include <MFRC522.h‬‬
‫نحدد أرجل األردوينو الرقمية التي ستتصل مع ‪ SS‬و ‪ . RST‬على سبيل المثال إذا قمنا بتوصيل‬
‫الشكل (‪:)82‬‬
‫;‪constexpr uint8_t SS_PIN = 10‬‬
‫;‪constexpr uint8_t RST_PIN = 9‬‬
‫نعرف كائن اسمه ‪ mfrc522‬مثال كما يلي‪:‬‬
‫;)‪MFRC522 mfrc522(SS_PIN, RST_PIN‬‬
‫ضمن برنامج ) (‪ void setup‬نقوم بتهيئة القارئ كما يلي‪:‬‬
‫;)(‪SPI.begin‬‬
‫;)(‪mfrc522.PCD_Init‬‬
‫ضمن البرنامج الرئيسي )( ‪ void loop‬يمكن فحص الكرت العالمة والتأكد من شرعيته كما سنرى في‬
‫التطبيق العملي‪.‬‬

‫‪-6-2-11‬تطبيق عملي‪ :‬نظام حماية باستخدام معرف الترددات ‪MFRC522‬‬


‫في البداية سنقوم بإجراء التوصيل الموضح في الشكل (‪.)83‬‬

‫الشكل (‪ : )83‬نظام حماية باستخدام معرف الترددات ‪.MFRC522‬‬


‫بعد ذلك نحمل الكور البرمجي التالي‪:‬‬

‫>‪#include <SPI.h‬‬
‫>‪#include <MFRC522.h‬‬
‫>‪#include <LiquidCrystal.h‬‬

‫‪#define RST_PIN 9‬‬


‫‪#define SS_PIN 10‬‬

‫;]‪byte readCard[4‬‬

‫‪26‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
String MasterTag = "20C3935E"; // REPLACE this Tag ID with your Tag ID!!!
String tagID = "";

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Parameters: (rs, enable, d4, d5, d6, d7)

void setup()
{
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen

lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}

void loop()
{
//Wait until new tag is available
while (getID())
{
lcd.clear();
lcd.setCursor(0, 0);

if (tagID == MasterTag)
{
lcd.print(" Access Granted!");
// You can write any code here like opening doors, switching on a relay, lighting up an LED, or
anything else you can think of.
}
else
{
lcd.print(" Access Denied!");
}
lcd.setCursor(0, 1);
lcd.print(" ID : ");
lcd.print(tagID);
delay(2000);

lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
}
22
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

//Read new tag if available


boolean getID()
{
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return false;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return false;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
//readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return true;
}

.‫ العبارة التي ستظهر على الشاشة مع بداية تشغيل الدارة‬:)84( ‫الشكل‬

..‫ العبارة التي ستظهر على الشاشة عند استخدام البطاقة المسموح لها‬:)85( ‫الشكل‬

28
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)86‬العبارة التي ستظهر على الشاشة عند استخدام البطاقة غير المسموح لها‪..‬‬

‫‪29‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫وحدة تحديد الموقع العالمي ‪GPS NEO-6M‬‬


‫‪-1-12‬مقدمة‬
‫يعتبر نظام تحديد الموقع ‪ GPS‬جزءا هاما من منظومة عمل األقمار الصناعية في الوقت الراهن‪ ،‬وقد‬
‫شاع مؤخرا استخدام هذا النظام في الكثير من دول العالم وذلك بهدف تحديد مواقع المستخدمين‬
‫لهذا النظام‪.‬‬
‫تتعدد استخدامات هذا النظام بشكل يصعب حصرها‪ ،‬ففي الوقت الراهن ‪ ،‬عمدت الكثير من شركات‬
‫النقل العالمية وشركات الشحن إلى متابعة حركة آلياتها وسفنها بواسطة هذا النظام الفعال للغاية ‪ ،‬كما‬
‫تم إدخال هذا النظام في الكثير من السيارات المصنعة حديثا والتي توفر للسائقين خرائط تفصيلية‬
‫لألماكن والشوارع التي يتواجدون فيها ‪ ،‬وأفضل الطرق وأقصرها والتي ينبغي سلوكها أثناء تنقالتهم‬
‫اليومية‪ .‬كذلك فقد شهد هذا النظام استخدامات أخرى من قبل شركات الطيران والمالحة الجوية‬
‫لتوجيه الطائرات في السماء بدقة متناهية ‪ ،‬ومؤخرا تم إدخال هذا النظام في أنظمة الرصد الجوي‪.‬‬
‫كذلك يستخدم نظام ‪ GPS‬بشكل مكثف للغاية في التطبيقات العسكرية‪.‬‬

‫‪ -2-12‬وحدة ‪GPS NEO-6M‬‬


‫تستخدم وحدة ‪ GPS NEO-6M‬الموضحة في الشكل (‪ )82‬كعنصر استقبال في نظام ‪ GPS‬وبالتالي‬
‫يمكن من خاللها تحديد الموقع الحالي عالميا‪ .‬يمكن االستفادة من هذه الوحدة في العديد من‬
‫المشاريع والتطبيقات االلكترونية‪.‬‬

‫الشكل (‪ :)82‬وحدة ‪.GPS NEO-6M‬‬


‫يبين الشكل (‪ )88‬مخطط التوصيل االلكتروني لوحدة ‪ NEO-6M GPS‬للعناصر االلكترونية‬
‫التي تتكون منها هذه الوحدة والتي تم شرحها بالتفصيل في الفقرات التالية‪.‬‬

‫‪81‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)88‬مخطط التوصيل االلكتروني لوحدة ‪.NEO-6M GPS‬‬

‫‪ -1-2-12‬شريحة ‪GPS NEO-6M‬‬


‫يوجد في قلب الوحدة شريحة ‪ .GPS NEO-6M‬على الرغم من أن هذه الرقاقة أقل من حجم الطابع‬
‫البريدي إال أنها تحزم كمية مذهلة من الميزات في إطارها الصغير‪.‬‬

‫الشكل (‪ :)89‬شريحة ‪.NEO-6M GPS‬‬


‫يمكنها تتبع ما يصل إلى ‪ 22‬قمرا صناعيا على ‪ 51‬قناة وتحقق أعلى مستوى من الحساسية ‪،-161dB‬‬
‫في حين تستهلك تيار تغذية فقط ‪.45 mA‬‬
‫على عكس وحدات ‪ GPS‬األخرى ‪ ،‬يمكن لهذه الوحدة القيام بما يصل إلى ‪ 5‬تحديثات للموقع في‬
‫الثانية مع دقة الموضع األفقي ‪ 2.5‬متر‪.‬‬
‫واحدة من أفضل الميزات التي توفرها الرقاقة هي وضع توفير الطاقة (‪ .)PSM‬يسمح بتقليل استهالك‬
‫طاقة النظام عن طريق التبديل الجزئي ألجزاء جهاز االستقبال ‪ ON‬و‪ .OFF‬هذا يقلل بشكل كبير من‬
‫استهالك الطاقة من الوحدة إلى ‪ 11mA‬فقط مما يجعلها مناسبة للتطبيقات الحساسة للطاقة مثل‬
‫ساعة اليد ‪.GPS‬‬

‫‪81‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫تتضمن الشريحة أرجل للتواصل مع المتحكم الصغري عبر ‪ .UART‬تدعم الوحدة معدل نقل من‬
‫‪ 4811‬بت في الثانية إلى ‪ 231411‬بت في الثانية مع معدل افتراضي ‪.9611‬‬
‫يلخص الجدول (‪ )16‬مواصفات شريحة ‪ ،NEO-6M GPS‬والشكل (‪ )91‬مخططا صندوقيا لها‪.‬‬
‫الجدول (‪ :)16‬مواصفات شريحة ‪.NEO-6M GPS‬‬
‫)‪50 channels, GPS L1(1575.42Mhz‬‬ ‫نمط المستقبل‬
‫‪2.5 m‬‬ ‫دقة الموقع األفقية‬
‫)‪1HZ (5Hz maximum‬‬ ‫معدل تحديث المالحة‬
‫‪Cool start: 27s‬‬ ‫زمن االلتقاط ‪capture time‬‬
‫‪Hot start: 1s‬‬
‫‪-161dBm‬‬ ‫حساسية المالحة‬
‫‪NMEA, UBX Binary, RTCM‬‬ ‫بروتوكول االتصال‬
‫)‪4800-230400 (default 9600‬‬ ‫معدل النقل التسلسلي‬
‫‪-40°C ~ 85°C‬‬ ‫درجة حرارة العمل‬
‫‪2.7V ~ 3.6V‬‬ ‫جهد العمل‬
‫‪45mA‬‬ ‫تيار العمل‬
‫‪511Ω‬‬ ‫ممانعة المرسل والمستقبل‬

‫الشكل (‪ :)90‬مخطط صندوقي يوضح البنية الداخلية لشريحة ‪.NEO-6M GPS‬‬

‫‪-2-2-12‬مؤشر تثبيت الموقع ‪Position Fix LED Indicator‬‬


‫يوجد ثنائي ضوئي ‪ LED‬على لوحة ‪ GPS NEO-6M‬يشير إلى حالة تثبيت الموقع‪ .‬يومض الثنائي‬
‫الضوئي بمعدالت مختلفة حسب الحالة التي تشير إليها‪:‬‬
‫بال وميض ‪ :‬يتم البحث عن أقمار صناعية‪.‬‬
‫يومض كل ‪ 1‬ثانية ‪ :‬تم العثور على مكان الموضع وتثبته ( أي تستطيع الوحدة مشاهدة أقمار صناعية‬
‫كافية)‪.‬‬

‫‪82‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)91‬مؤشر تثبيت الموقع لوحدة ‪.GPS NEO-6M‬‬

‫‪-3-2-12‬منظم جهد ‪3.3V LDO‬‬


‫الجهد التشغيلي لرقاقة ‪ NEO-6M‬يتراوح من ‪ 2.7‬إلى ‪ 3.6‬فولت‪ .‬لهذا فقد تم دعم الوحدة بمنظم‬
‫‪ . MIC520 3V3‬األرجل المنطقية تقدم تسامحا لتعمل بجهد ‪ ،+5V‬حتى نتمكن من توصيل اللوحة‬
‫بسهولة إلى ‪ Arduino‬أو أي متحكم صغري يعمل بجهد ‪ 5V‬دون استخدام أي محول مستوى المنطق‪.‬‬

‫الشكل (‪ :)92‬منظم جهد ‪ 3.3V LDO‬لوحدة ‪.GPS NEO-6M‬‬

‫‪-4-2-12‬بطارية وذاكرة ‪EEPROM‬‬


‫تم تجهيز الوحدة بذاكرة ‪ HK24C32‬من نوع ‪ EEPROM‬تعمل بشكل تسلسلي‪ .‬حجمها ‪ 4‬كيلوبايت‬
‫ومتصل بشريحة ‪ NEO-6M‬عبر بروتوكول ‪.I2C‬‬
‫تحتوي الوحدة أيضا على بطارية قابلة إلعادة الشحن تعمل كمدخر للطاقة‪ .‬تساعد ‪EEPROM‬‬
‫مع البطارية على االحتفاظ بذاكرة الوصول العشوائي المدعومة بالبطارية ‪battery backed RAM‬‬
‫)‪ .(BBR‬يحتوي ‪ BBR‬على بيانات الساعة وأحدث بيانات الموقع (بيانات مدار ‪ )GNSS‬وتكوين‬
‫الوحدة‪ .‬لكن هذا ال يعني التخزين الدائم للبيانات‪.‬‬

‫‪83‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫نظرا ألن البطارية تحتفظ بالساعة والموضع األخير ‪ ،‬فإن زمن اإلصالح أو التثبيت األول‬
‫)‪ time to first fix (TTFF‬يقلل بشكل كبير إلى ‪ 1‬ثانية‪ .‬وهذا يسمح بإقفال المكان بشكل أسرع‬
‫بكثير‪.‬‬
‫بدون البطارية ‪ ،‬يعمل نظام ‪ GPS‬دائما بالبداية الباردة ‪ ، cold-start‬وبالتالي فإن قفل ‪ GPS‬األولي‬
‫يستغرق وقتا أطول‪.‬‬
‫يتم شحن البطارية تلقائيا عند تطبيق التغذية ويتم االحتفاظ بالبيانات لمدة تصل إلى أسبوعين‬
‫بدون كهرباء‪.‬‬

‫الشكل (‪ :)93‬بطارية وذاكرة ‪ EEPROM‬لوحدة ‪.GPS NEO-6M‬‬

‫‪-5-2-12‬الهوائي ‪Antenna‬‬
‫يعتبر الهوائي مطلوبا الستخدام الوحدة ألي نوع من االتصاالت‪ .‬لذلك تأتي الوحدة مع هوائي رقعة‬
‫‪ patch antenna‬له حساسية ‪.-161 dBm‬‬

‫الشكل (‪ :)94‬هوائي لوحدة ‪.GPS NEO-6M‬‬

‫يمكنك تثبيت هذا الهوائي على موصل ‪ U.FL‬الصغير الموجود على الوحدة‪.‬‬
‫هوائي الرقعة مناسب جدا لمعظم المشاريع‪ .‬ولكن إذا كنت ترغب في تحقيق مزيد من الحساسية أو‬
‫وضع الوحدة الخاصة بك داخل علبة معدنية ‪ ،‬يمكنك استخدام أي هوائي ‪ GPS‬نشط عبر موصل‬
‫‪.U.FL‬‬

‫‪84‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)95‬موصل ‪ U.FL‬لوحدة موصل ‪.U.FL‬‬

‫‪-6-2-12‬أرجل وحدة ‪NEO-6M GPS‬‬


‫تحتوي وحدة ‪ GPS NEO-6M‬على ‪ 4‬أرجل تصلها بالعالم الخارجي هي‪:‬‬
‫‪ :GND ‬رجل األرضي ‪.‬‬
‫‪ :TX ‬رجل اإلرسال في بروتوكول االتصال التسلسلي ‪.UART‬‬
‫‪ :RX ‬رجل االستقبال في بروتوكول االتصال التسلسلي ‪.UART‬‬
‫‪ :VCC ‬رجل التغذية للوحدة‪ .‬يمكن تطبيق جهد ‪.+5V‬‬

‫الشكل (‪ :)96‬أرجل وحدة موصل ‪.U.FL‬‬

‫‪-7-2-12‬قراءة بيانات ‪GPS‬‬


‫تقوم وحدة ‪ GPS NEO-6M‬بإرسال البيانات على الرجل ‪ TX‬بمجرد تطبيق التغذية عليها‪ .‬لهذا يمكن‬
‫الحصول على هذه البيانات على نافذة الحاسب ‪ serial monitor‬باستخدام محول ‪ UART‬إلى ‪USB‬‬
‫أو باستخدام لوحة األردوينو (بوصل الرجل ‪ TX‬للوحة ‪ GPS NEO-6M‬مع الرجل ‪ TX‬في لوحة‬

‫‪85‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫األردوينو‪ ،‬ورجل ‪ Reset‬في لوحة األردوينو نصلها باألرضي إللغاء تفعيل المتحكم الصغري‬
‫‪ ATMEGA328‬ومن ثم نصل األردوينو مع منفذ ‪ USB‬للحاسب)‪ .‬يوضح الشكل (‪ )92‬البيانات‬
‫المرسلة من وحدة ‪ GPS NEO-6M‬والتي تم عرضها باستخدام ‪ Serial monitor‬في بيئة تطوير‬
‫األردوينو المدمجة‪.‬‬

‫الشكل (‪ :)92‬بيانات وحدة ‪.GPS‬‬

‫البيانات التي تحصل عليها هي في الواقع جمل ‪ NMEA‬وهو اختصار للجمعية الوطنية لإللكترونيات‬
‫البحرية ‪ .National Marine Electronics Association‬والذي هو تنسيق رسالة قياسي لجميع‬
‫أجهزة استقبال ‪ GPS‬تقريبا‪.‬‬
‫يتم تنسيق معيار ‪ NMEA‬في سطور من البيانات تسمى الجمل ‪ .sentences‬يتم فصل عناصر الجملة‬
‫بفواصل لتسهيل تحليلها بواسطة أجهزة الكمبيوتر والمتحكمات الصغرية‪.‬‬
‫يتم إرسال جمل ‪ NMEA‬هذه بفاصل زمني يسمى معدل التحديث‪ .‬تقوم وحدة ‪GPS NEO-6M‬‬
‫بتحديث هذه المعلومات مرة واحدة في الثانية (‪ )1Hz‬افتراضيا‪ .‬ولكن يمكنك تعديله إلى ‪5‬‬
‫تحديثات في الثانية (تردد ‪.)5Hz‬‬
‫هناك العديد من الجمل في معيار ‪ ، NMEA‬وأكثرها شيوعا هي‪:‬‬
‫‪ : Global Positioning Recommended Minimum Coordinates :$ GPRMC‬يقدم الوقت‬
‫والتاريخ وخطوط الطول والعرض واالرتفاع والسرعة المقدرة‪.‬‬
‫‪ : $ GPGGA‬توفر جملة بيانات اإلصالح (التثبيت) األساسية وهي بيانات الموقع ثالثية األبعاد‪،‬‬
‫والدقة‪.‬‬
‫لنأخذ مثاال على جملة ‪ $GPRMC NMEA‬من جهاز استقبال ‪:GPS‬‬
‫‪$GPRMC, 123519, A, 4807.038, N, 01131.000, E,022.4, 084.4, 230394, 003.1, W*6A‬‬

‫‪86‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫كل جملة ‪ NMEA‬تبدأ بحرف ‪.$‬‬ ‫‪$‬‬

‫اإلحداثيات الدنيا للموضع العالمي‬ ‫‪GPRMC‬‬

‫الوقت الحالي في ‪12:35:19 : UTC‬‬ ‫‪123519‬‬

‫الحالة‪A=active or V=Void. :‬‬ ‫‪A‬‬

‫خط الطول ‪48 deg 07.038' N :‬‬ ‫‪4807.038, N‬‬

‫خط العرض ‪11 deg 31.000' E :‬‬ ‫‪01131.000, E‬‬

‫السرعة على األرض بالعقدة‪.‬‬ ‫‪022.4‬‬

‫زاوية المسار بالدرجات‬ ‫‪084.4‬‬

‫التاريخ الحالي‪22rd of March 2018:‬‬ ‫‪230394‬‬

‫التباين المغناطيسي‬ ‫‪003.1‬‬

‫بيانات المجموع االختباري ‪ ، checksum‬تبدأ دائما بل *‬ ‫‪*6A‬‬

‫‪-8-2-12‬توصيل وحدة ‪ GPS NEO-6M‬مع لوحة األردوينو‬


‫يوضح الشكل (‪ )98‬كيفية توصيل وحدة ‪ GPS NEO-6M‬مع لوحة األردوينو وفق بروتوكول ‪.UART‬‬
‫رجل اإلرسال ‪ TX‬مع الرجل الرقمية ‪( 2‬ويمكن اختيار أي رجل رقمية) ‪ ،‬رجل االستقبال ‪ RX‬مع الرجل‬
‫الرقمية ‪( 3‬ويمكن اختيار أي رجل رقمية)‪.‬‬

‫الشكل (‪ :)98‬توصيل وحدة ‪ GPS NEO-6M‬مع لوحة األردوينو‬

‫‪82‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-9-2-12‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بوحدة ‪ ، GPS NEO-6M‬سنستخدم إحدى المكتبات المتوفرة على‬
‫شبكة االنترنت ‪ .TinyGPSPlus-master‬لنتبع الخطوات التالية‪.‬‬
‫‪-1‬في البداية نقوم بإضافة المكتبة ‪ TinyGPSPlus-master.zip‬لبيئة التطوير كما تم شرحه في‬
‫الفقرة (‪ .)4-1‬المكتبة موجودة ضمن الملفات المرفقة مع الكتاب‪.‬‬
‫‪-2‬في البداية البد من استدعاء هذه المكتبة في بداية الشيفرة البرمجية كما يلي‪:‬‬
‫>‪#include <TinyGPS++.h‬‬
‫يتم بعد ذلك تعريف كائن لنسميه مثال ‪ gps‬كما يلي‪:‬‬
‫;‪TinyGPSPlus gps‬‬
‫لجعل مكتبة ‪ TinyGPS ++‬تعمل‪ ،‬البد من نقل األحرف (جمل ‪ )NEMA‬إليها بشكل متكرر من وحدة‬
‫‪GPS‬باستخدام طريقة ) ( ‪ . encode‬على سبيل المثال إذا كانت وحدة ‪ GPS‬الخاصة بك متصلة‬
‫بأرجل المتحكم الصغري ‪ (RX) 2‬و ‪ ، (TX) 3‬فيمكنك كتابة الشيفرة البرمجية كمايلي ‪:‬‬
‫;)‪SoftwareSerial ss(2, 3‬‬
‫)(‪void loop‬‬
‫{‬
‫)‪while (ss.available() > 0‬‬
‫;)‪gps.encode(ss.read‬‬
‫‪...‬‬
‫بعد ذلك يمكن استخدام الكائن الذي تم تعريفه مسبقا )‪ (gps‬مع التعليمات التالية‪:‬‬
‫الشرح‬ ‫التعليمة‬
‫تعيد خط العرض بالدرجات )‪(double‬‬ ‫)(‪gps.location.lat‬‬
‫تعيد خط الطول بالدرجات )‪(double‬‬ ‫)(‪gps.location.lng‬‬
‫تعيد التاريخ على الشكل ‪.(u32) DDMMYY‬‬ ‫)(‪gps.date.value‬‬
‫تعيد السنة )‪(u16‬‬ ‫)(‪gps.date.year‬‬
‫تعيد الشهر )‪(u8‬‬ ‫)(‪gps.date.month‬‬
‫تعيد اليوم )‪(u8‬‬ ‫)(‪gps.date.day‬‬
‫تعيد الوقت على الشكل ‪.(u32) HHMMSSCC‬‬ ‫)(‪gps.time.value‬‬
‫تعيد الساعة )‪(u8) (0-23‬‬ ‫)(‪gps.time.hour‬‬
‫تعيد الدقيقة )‪(u8‬‬ ‫)(‪gps.time.minute‬‬
‫تعيد الثانية )‪(u8‬‬ ‫)(‪gps.time.second‬‬
‫تعيد أجزاء الثانية )‪(u8) (0-99‬‬ ‫)(‪gps.time.centisecond‬‬
‫تعيد السرعة بواحدة ‪(double) miles per hour‬‬ ‫)(‪gps.speed.mph‬‬
‫تعيد السرعة بواحدة ‪(double) meters per second‬‬ ‫)(‪gps.speed.mps‬‬

‫‪88‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫تعيد السرعة بواحدة ‪kilometers per hour‬‬ ‫)(‪gps.speed.kmph‬‬
‫تعيد االرتفاع بواحدة ‪.(i32) centimeters‬‬ ‫)(‪gps.altitude.value‬‬
‫تعيد االرتفاع بواحدة ‪(double) meters‬‬ ‫)(‪gps.altitude.meters‬‬
‫تعيد االرتفاع بواحدة ‪(double) kilometers‬‬ ‫)(‪gps.altitude.kilometers‬‬
‫عدد األقمار الصناعية المستخدمة )‪(u32‬‬ ‫)(‪gps.satellites.value‬‬
‫التقليل األفقي للدقة‪.‬‬ ‫)(‪gps.hdop.value‬‬
‫تستخدم لمعرفة فيما إذا كان الكائن ‪ location‬يحتوي‬ ‫)(‪gps.location.isValid‬‬
‫على بيانات صابحة‪ ،‬وعندئذ فإنها تعيد ‪.True‬‬
‫تستخدم لمعرفة فيما إذا كان الكائن ‪ date‬يحتوي على‬ ‫)(‪gps.date.isValid‬‬
‫بيانات صالحة‪ ،‬وعندئذ فإنها تعيد ‪.True‬‬
‫تستخدم لمعرفة فيما إذا كان الكائن ‪ time‬يحتوي على‬ ‫)(‪gps.time.isValid‬‬
‫بيانات صاحة‪ ،‬وعندئذ فإنها تعيد ‪.True‬‬
‫تستخدم لمعرفة فيما إذا كان الكائن ‪ speed‬يحتوي‬ ‫)( ‪gps.speed.isValid‬‬
‫على بيانات صالحة‪ ،‬وعندئذ فإنها تعيد ‪.True‬‬
‫تعيد عدد الحروف الكلي التي تلقاها الكائن‬ ‫)(‪gps. charsProcessed‬‬

‫‪ -11-2-12‬تطبيق عملي‪ :‬طباعة معلومات الموقع (خطوط الطول والعرض‬


‫واالرتفاع) والتوقيت العالمي (التاريخ والوقت) على الحاسب‬
‫في البداية نقوم بإجراء التوصيل الموضح في الشكل (‪ ،)98‬ومن ثم نحمل الكود البرمجي التالي‪:‬‬
‫>‪#include <TinyGPS++.h‬‬
‫>‪#include <SoftwareSerial.h‬‬

‫‪// Choose two Arduino pins to use for software serial‬‬


‫;‪int RXPin = 2‬‬
‫;‪int TXPin = 3‬‬

‫;‪int GPSBaud = 9600‬‬

‫‪// Create a TinyGPS++ object‬‬


‫;‪TinyGPSPlus gps‬‬

‫"‪// Create a software serial port called "gpsSerial‬‬


‫;)‪SoftwareSerial gpsSerial(RXPin, TXPin‬‬

‫)(‪void setup‬‬
‫{‬
‫‪// Start the Arduino hardware serial port at 9600 baud‬‬
‫;)‪Serial.begin(9600‬‬
‫‪89‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
// Start the software serial port at the GPS's default baud
gpsSerial.begin(GPSBaud);
}

void loop()
{
// This sketch displays information every time a new sentence is correctly encoded.
while (gpsSerial.available() > 0)
if (gps.encode(gpsSerial.read()))
displayInfo();

// If 5000 milliseconds pass and there are no characters coming in


// over the software serial port, show a "No GPS detected" error
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println("No GPS detected");
while(true);
}
}

void displayInfo()
{
if (gps.location.isValid())
{
Serial.print("Latitude: ");
Serial.println(gps.location.lat(), 6);
Serial.print("Longitude: ");
Serial.println(gps.location.lng(), 6);
Serial.print("Altitude: ");
Serial.println(gps.altitude.meters());
}
else
{
Serial.println("Location: Not Available");
}

Serial.print("Date: ");
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print("/");
Serial.print(gps.date.day());
Serial.print("/");
Serial.println(gps.date.year());
}
else
{ Serial.println("Not Available"); }
Serial.print("Time: ");
if (gps.time.isValid())
91
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(":");
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(":");
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(".");
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.println(gps.time.centisecond());
}
else
{
Serial.println("Not Available");
}
Serial.println();
Serial.println();
delay(1000);
}
‫ مع بداية تشغيل الدارة‬Not Available ‫مراقب المنفذ التسلسلي في بيئة التطوير سيظهر في البداية‬
‫ بعد مرور وقت معين يومض مؤشر‬،‫حيث لم يتم استقبال إشارات أقمار صناعية كافية ومعالجتها‬
‫تثبيت الموقع وتظهر معلومات الوقت والتاريخ والموقع‬

.‫ تظهر معلومات الموقع والوقت والتاريخ على شاشة الحاسب‬:)99( ‫الشكل‬

91
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫وحدة االتصال بالشبكة الخلوية ‪SIM800L GSM / GPRS‬‬


‫‪-1-13‬مقدمة‬
‫وحدة ‪ SIM800L GSM / GPRS‬عبارة عن مودم ‪ GSM‬مصغر‪ ،‬يمكن دمجه في عدد كبير من مشاريع‬
‫إنترنت األشياء‪ .‬يمكنك استخدام هذه الوحدة إلنجاز أي شيء يمكن للهاتف الخلوي العادي القيام به‪:‬‬
‫إرسال واستقبال الرسائل النصية القصيرة ‪ ،SMS‬وإجراء أو استقبال المكالمات الهاتفية ‪ ،‬واالتصال‬
‫باإلنترنت من خالل ‪ ، TCP / IP ، GPRS‬وأكثر‪ .‬تدعم الوحدة شبكة ‪ GSM / GPRS‬رباعية الحزم ‪ ،‬مما‬
‫يعني أنها تعمل إلى حد كبير في أي مكان في العالم‪.‬‬

‫الشكل (‪ : )111‬وحدة ‪.SIM800L GSM / GPRS‬‬


‫قلب الوحدة هي شريحة ‪ SIM800L GSM‬الخلوية من ‪ .SimCom‬الجهد التشغيلي للشريحة‬
‫من‪ 3.4V‬إلى‪ ، 4.4V‬مما يجعل بطارية ‪ LiPo‬المرشح المثالي إلمداد الوحدة بالطاقة‪.‬‬
‫تحتوي الوحدة على األرجل الالزمة للتواصل مع متحكم عبر بروتوكول ‪ .UART‬وتدعم معدل نقل من‬
‫‪ 1200bps‬إلى ‪ 115200bps‬مع اكتشاف معدل النقل تلقائيا‪.‬‬
‫تحتاج الوحدة إلى هوائي خارجي لالتصال بشبكة‪ .‬تأتي الوحدة عادة مع هوائي حلقي ويتم لحمه‬
‫مباشرة إلى الرجل ‪ NET‬على الدارة المطبوعة ‪ .PCB‬تحتوي اللوحة أيضا على أداة توصيل ‪ U.FL‬في‬
‫حال أردت إبقاء الهوائي بعيدا عن اللوحة‪.‬‬

‫الشكل (‪ :)111‬األجزاء التي تتكون منها حدة ‪.SIM800L GSM‬‬


‫هناك مقبس ‪ SIM‬في الخلف‪ .‬يمكن ألي بطاقة ‪ SIM‬صغيرة الحجم من الجيل الثاني أن تعمل بشكل‬
‫مثالي‪ .‬عادة ما يتم نقش االتجاه الصحيح إلدخال بطاقة ‪ SIM‬على سطح مقبس ‪.SIM‬‬

‫‪92‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)112‬مقبس بطاقة ‪ SIM‬لوحدة ‪.SIM800L GSM‬‬


‫تبلغ مساحة هذه الوحدة ‪ 1‬بوصة فقط‪ ،‬ولكنها تحتوي كمية مذهلة من الميزات في إطارها الصغير‪.‬‬
‫بعض هذه المزايا مدرج أدناه‪:‬‬
‫‪ ‬تدعم أربع حزم‪ DCS1800 ،EGSM900 ،GSM850 :‬و ‪PCS1900‬‬
‫‪ ‬يمكنها االتصال بأي شبكة ‪ GSM‬عالمية باستخدام أي بطاقة ‪.2G SIM‬‬
‫‪ ‬يمكنها إجراء واستقبال المكالمات الصوتية باستخدام سماعة وميكرفون خارجيين‪.‬‬
‫‪ ‬إرسال واستقبال الرسائل القصيرة‬
‫‪ ‬إرسال واستقبال بيانات ‪(TCP / IP, HTTP,…) GPRS‬‬
‫‪ ‬مسح واستقبال البث اإلذاعي ‪FM‬‬
‫‪ ‬طاقة اإلرسال‬
‫‪Class 4 (2W) for GSM850 ‬‬
‫‪Class 1 (1W) for DCS1800 ‬‬
‫‪ ‬تتعامل مع مجموعة أوامر ‪ AT‬التسلسلية‬
‫‪ ‬تدعم موصالت ‪ FL‬لهوائيات الخلية‬
‫‪ ‬تقبل بطاقة ‪.Micro SIM‬‬

‫‪-2-13‬مؤشرات حالة الثنائي الضوئي‬


‫يوجد مؤشر ضوئي على الجانب األيمن العلوي من الوحدة الخلوية ‪ SIM800L‬التي تشير إلى حالة‬
‫الشبكة الخلوية‪ .‬سوف تومض بمعدالت مختلفة إلظهار الحالة التي تشير إليها‪:‬‬

‫‪ ‬وميض كل ‪ 1‬ثانية‪ :‬الوحدة قيد التشغيل لكنها لم تقم بإجراء اتصال بالشبكة الخلوية حتى‬
‫اآلن‪.‬‬

‫‪ ‬وميض كل ‪ 2‬ثانية‪ :‬اتصال بيانات ‪ GPRS‬الذي طلبته نشط‪.‬‬

‫‪ ‬وميض كل ‪ 3‬ثوان‪ :‬اتصلت الوحدة بالشبكة الخلوية ويمكنها إرسال ‪ /‬استقبال الصوت‬
‫والرسائل النصية القصيرة‪.‬‬

‫‪93‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3-13‬اختيار الهوائي‬
‫يعتبر الهوائي مطلوبا الستخدام الوحدة ألي نوع من االتصاالت الصوتية أو اتصاالت البيانات وكذلك‬
‫بعض أوامر ‪ .SIM‬لذا فإن اختيار الهوائي يعد أمرا مهما‪ .‬هناك طريقتان يمكنك من خاللها إضافة‬
‫هوائي إلى وحدة ‪ SIM800L‬الخاصة بك ‪:‬‬
‫الطريقة األولى‪ :‬هوائي ‪ GSM‬الحلزوني الذي يأتي عادة مع الوحدة ويتم لحمه مباشرة إلى الرجل‬
‫‪ NET‬على لوحة الدارة المطبوعة ‪ .PCB‬يعد هذا الهوائي مفيدا جدا للمشاريع التي تحتاج إلى توفير‬
‫مساحة ولكنها تكافح بصعوبة في الحصول على إمكانية االتصال وخاصة إذا كان مشروعك في‬
‫الداخل‪.‬‬

‫الشكل (‪ :)113‬هوائي ‪ GSM‬الحلزوني لوحدة ‪.SIM800L‬‬

‫الطريقة الثانية هي أي هوائي ‪ GSM 3dBi‬مع محول ‪ U.FL‬إلى ‪ .SMA‬يمكنك تثبيت هذا الهوائي على‬
‫موصل ‪ U.FL‬الصغير الموجود في الزاوية العلوية اليسرى من الوحدة‪ .‬يتمتع هذا النوع من الهوائي‬
‫بأداء أفضل ويسمح بوضع الوحدة الخاصة بك داخل علبة معدنية ‪ -‬طالما كان الهوائي بالخارج‪.‬‬

‫الشكل (‪ :)114‬هوائي ‪ GSM‬يمكن وصله مع وحدة ‪.SIM800L‬‬

‫‪94‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-13‬الطاقة الالزمة لوحدة ‪SIM800L‬‬


‫أحد أهم األجزاء لتشغيل وحدة ‪ SIM800L‬هو تزويدها بالطاقة الكافية‪ .‬يبلغ الحد األقصى لسحب‬
‫التيار للوحدة حوالي ‪ 2A‬أثناء رشقة اإلرسال ‪ .transmission burst‬في العادة لن تسحب الوحدة‬
‫كثيرا ‪ ،‬تتطلب حوالي ‪ 216mA‬خالل المكالمات الهاتفية أو ‪ 80mA‬خالل عملية نقل البيانات‪ .‬يلخص‬
‫الجدول التالي استهالك التيار للوحدة تبعا لحاالت مختلفة‪.‬‬
‫الجدول (‪ :)12‬استهالك التيار للوحدة‬
‫استهالك التيار‬ ‫الحالة‬
‫‪60 uA‬‬ ‫حفظ الطاقة ‪Power down‬‬
‫‪1 mA‬‬ ‫نمط الراحة ‪Sleep mode‬‬
‫‪18 mA‬‬ ‫نمط االستعداد ‪Stand by‬‬
‫‪GSM850: 199mA‬‬ ‫مكالمة‬
‫‪ESM900: 216mA‬‬
‫‪DCS1800: 146mA‬‬
‫‪PCS1900: 131mA‬‬
‫‪453 mA‬‬ ‫‪GPRS‬‬
‫‪2A‬‬ ‫دفعة اإلرسال ‪Transmission Burst‬‬

‫نظرا ألن وحدة ‪ SIM800L‬ال تأتي مع منظم جهد على اللوحة ‪ ،‬يلزم توفير مصدر طاقة‬
‫خارجي مضبوط على الجهد بين ‪ 3.4V‬إلى ‪ 4.1V( 4.4V‬المثالي)‪ .‬يجب أن يكون مصدر الطاقة قادرا‬
‫أيضا على تقديم تيار ‪ ، 2A‬وإال فإن الوحدة لن تعمل‪ .‬فيما يلي بعض الخيارات التي يمكنك التفكير بها‬
‫لتشغيل وحدة ‪ GSM‬الخاصة بك بشكل صحيح‪.‬‬
‫بطاريات ‪ Li-Po‬جهدها يتراوح بشكل عام بين ‪ 3.7‬فولت و ‪ 4.2‬فولت‪ ،‬وهو مثالي لوحدة ‪.SIM800L‬‬
‫تعتبر أي بطارية بحجم ‪ 1200mAh‬أو أكبر أفضل خيار ألنها يمكن أن توفر نطاق الجهد الصحيح‬
‫حتى أثناء ارتفاعات التيار إلى ‪.2A‬‬

‫الشكل (‪ :)115‬بطاريات ‪.Li-Po‬‬


‫يمكن ألي محول ‪ DC-DC Buck‬مثل ‪ LM2596‬أن يعمل لتغذية الوحدة أيضا‪.‬‬

‫‪95‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)116‬محول ‪.DC-DC Buck‬‬

‫‪-5-13‬أرجل وحدة ‪SIM800L GSM‬‬


‫تحتوي وحدة ‪ SIM800L‬على ‪ 12‬رجل تصلها بالعالم الخارجي كما هو موضح في الشكل (‪:)112‬‬
‫‪ :NET‬يمكنك لحام الهوائي الحلزوني على هذه الرجل‪.‬‬
‫‪ :VCC‬رجل تزويد الوحدة بالطاقة الالزمة‪ ،‬من ‪ 3.4V‬إلى ‪.4.4V‬‬
‫‪ :RST‬رجل إعادة إقالع‪.‬‬
‫‪ :RXD‬رجل االستقبال في نمط االتصال التسلسلي ‪.UART‬‬
‫‪ :TXD‬رجل اإلرسال في نمط االتصال التسلسلي ‪.UART‬‬
‫‪ :GND‬أرضي‪.‬‬
‫‪ :RING‬يعمل بمثابة مؤشر للرنين‪ .‬تعتبر في األساس مقاطعة خرج من الوحدة‪ .‬الرجل بحالة جهد‬
‫مرتفع افتراضيا وتنخفض لمدة ‪ 120‬مللي ثانية عند تلقي مكالمة‪ .‬يمكن أيضا إعداده عند تلقي رسالة‬
‫نصية قصيرة‪.‬‬
‫‪ :DTR‬رجل تنشيط أو تعطيل وضع الراحة ‪ .sleep mode‬سحبها إلى الحالة المرتفعة ‪ HIGH‬سيضع‬
‫الوحدة في وضع الراحة‪ ،‬مما يؤدي إلى تعطيل االتصال التسلسلي‪ .‬سحبها إلى حالة منخفضة سيؤدي‬
‫إلى استيقاظ الوحدة‪.‬‬
‫‪ :MIC±‬مداخل تفاضلية للميكرفون‪ .‬يمكن وصل الميكرفون بشكل مباشر إليها‪.‬‬
‫‪ :SPK±‬واجهة سماعة تفاضلي‪ .‬يمكن وصل السماعة بشكل مباشر إليها‪.‬‬

‫الشكل (‪ :)112‬أرجل وحدة ‪.SIM800L GSM‬‬

‫‪96‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-6-13‬أوامر ‪AT‬‬
‫يتم إرسال هذه األوامر إلى الرجل ‪ RX‬للوحدة وفق بروتوكول ‪ UART‬كما هو موضح في الجدول‬
‫(‪ .)18‬البد بعد كل أمر أن يتم إرسال الرمزين )‪.13 (\r) , 10 (\n‬‬
‫الجدول (‪ :)18‬أوامر ‪ AT‬لوحدة ‪.SIM800L GSM‬‬
‫مثال‬ ‫الوصف‬ ‫األمر‬
‫تعيد الحروف ‪ AT‬مرة أخرى ومن ثم ‪ OK‬للداللة على نجاح ‪AT‬‬ ‫‪AT‬‬
‫‪OK‬‬
‫االتصال بشكل صحيح ما بين المتحكم والوحدة‪ .‬تهيئ هذه‬
‫التعليمة أيضا ميزة معدل النقل التلقائي‪.‬‬
‫تتفحص قوة اإلشارة‪ ،‬وتعيد مؤشر شدة اإلشارة المستقبلة ‪AT+CSQ‬‬ ‫‪AT+CSQ‬‬
‫‪+CSQ: 4,0‬‬
‫)‪ ،received signal strength indication(RSSI‬ومعدل خطأ البت‬
‫للقناة ‪.BER‬‬
‫قيمة ‪ RSSI‬من ‪ 0‬وحتى ‪ 31‬توافق استطاعة من ‪ -115dBm‬وحتى‬
‫‪ .-52dBm‬أي أن القيمة األعلى أفضل‪.‬‬
‫الحصول على رقم بطاقة ‪ - SIM‬وهذا يختبر أنه تم العثور على‬ ‫‪AT+CCID‬‬

‫بطاقة ‪ SIM‬على ما يرام‪.‬‬


‫يعطي هذا األمر معلومات حول تقنية الوصول للخلية المخدمة و‬ ‫?‪AT+CREG‬‬

‫?‪AT+CREG‬‬ ‫حالة التسجيل‪.‬‬


‫‪+CREG:‬‬
‫تأخذ تقنية الوصول القيم التالية‪:‬‬
‫‪1,1‬‬
‫‪OK‬‬ ‫‪0 GSM‬‬
‫‪//MT is‬‬ ‫‪1 GSM Compact‬‬
‫‪registered‬‬ ‫‪2 UTRAN‬‬
‫‪in home‬‬ ‫‪3 GSM w/EGPRS‬‬
‫‪PLMN‬‬ ‫‪4 UTRAN w/HSDPA‬‬
‫‪5 UTRAN w/HSUPA‬‬
‫‪6 UTRAN w/HSDPA and HSUPA‬‬
‫‪7 E-UTRAN‬‬
‫تأخذ حالة التسجيل القيم التالية‪:‬‬
‫‪ :0‬غير مسجل‪ ،‬ال تبحث الوحدة حاليا عن مشغل جديد للتسجيل‪.‬‬
‫‪ :1‬تم التسجيل‪ ،‬شبكة محلية ‪.home‬‬
‫‪ :2‬مسجل‪ ،‬لكن الوحدة تبحث حاليا عن مشغل جديد للتسجيل‪.‬‬
‫‪ :3‬تم رفض التسجيل‪.‬‬
‫‪ : 4‬غير معلوم‪.‬‬
‫‪ :5‬تم التسجيل بحالة تجوال ‪.roaming‬‬
‫‪ :6‬تم التسجيل لرسائل ‪ SMS‬فقط‪ .‬شبكة محلية‪.‬‬
‫‪ .7‬تم التسجيل لرسائل ‪ SMS‬فقط‪ .‬تجوال‪.‬‬
‫‪ :8‬مرتبط لخدمات حامل الطوارئ فقط‪.‬‬

‫‪92‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫أوامر ‪ AT‬إلرسال رسالة ‪:SMS‬‬
‫مثال‬ ‫الوصف‬ ‫األمر‬
‫‪AT+CMGF=1‬‬ ‫تحديد نمط رسالة ‪.SMS‬‬ ‫‪AT+CMGF=X‬‬
‫‪PDU Format : X=0‬‬
‫‪Text mode : X=1‬‬
‫يتم تحديد رقم هاتف المرسل إليه الرسالة‪:‬‬ ‫‪AT+CMGS=+ZZxxxxxxxxxx‬‬

‫‪ : ZZ‬رمز الدولة‪.‬‬
‫‪ : Xxxxxxxxxx‬رقم هاتف المرسل إليه‬

‫‪-7-13‬ربط وحدة ‪ SIM800‬مع لوحة األردوينو أونو‬


‫يوضح الشكالن (‪ )119( )118‬كيفية وصل وحدة ‪ SIM800‬مع لوحة األردوينو أونو استخدام‬
‫بطارية ‪ 3.7‬فولت أو محول ‪ .DC-DC‬تتبادل وحدة ‪ SIM800‬البيانات مع لوحة األردوينو وفق‬
‫بروتوكول ‪ .UART‬رجل اإلرسال ‪ TX‬لوحدة ‪ SIM800‬مع أي رجل رقمية لألردوينو (مثال الرجل‬
‫الرقمية ‪ 3‬في الشكل)‪ .‬كرجل استقبال ‪ .RX‬رجل استقبال ‪ RX‬لوحدة ‪ SIM800‬مع أي رجل رقمية‬
‫لألردوينو (مثال الرجل الرقمية ‪ 2‬في الشكل)‪ .‬باعتبار أن لوحة األردوينو تعمل بجهد ‪ ، +5V‬ووحدة‬
‫‪ SIM800‬بجهد ‪ 4‬فولت تقريبا‪ .‬ال يوجد مشكلة عندما ترسل وحدة ‪ SIM800‬البيانات الرقمية إلى‬
‫األردوينو‪ ،‬في المقابل عندما يرسل األردوينو لوحدة ‪ SIM800‬البد من تخفيض الجهد من ‪ 5V‬إلى ‪4V‬‬
‫تقريبا‪ .‬يمكن ببساطة استخدام مقاومتين إلنجاز ذلك قيمتهما ‪ 1KΩ,2KΩ‬كما هو موضح في الشكل‪.‬‬

‫الشكل (‪ :)118‬ربط وحدة ‪ SIM800‬مع لوحة األردوينو مع تغذيتها عن طريق بطارية ‪.3.7V‬‬

‫‪98‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

.DC-DC ‫ مع لوحة األردوينو مع تغذيتها عن طريق محول‬SIM800 ‫ ربط وحدة‬:)119( ‫الشكل‬

‫ كتابة كود برمجي الختبار االتصال والحصول على بعض‬: ‫تطبيق عملي‬-8-13
.‫المعلومات‬
‫ وهي اختبار جودة‬SIM800 ‫في هذا المثال سنقوم بالحصول على بعض المعلومات من وحدة‬
، AT+CCID ‫ باستخدام التعليمة‬SIM ‫ ومعلومات عن بطاقة‬، AT+CSQ ‫اإلشارة عن طريق التعليمة‬
.AT+CREG? ‫وهل الشريحة تم تسجيلها في الشبكة باستخدام التعليمة‬
SIM800 ‫ لوحدة‬SIM ‫( وندخل بطاقة‬109) ‫ أو‬.)118( ‫نقوم بإجراء التوصيل الموضح في الشكل‬
:‫ومن ثم نحمل الكود البرمجي التالي‬

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L


SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM800L


mySerial.begin(9600);

Serial.println("Initializing...");
delay(1000);

mySerial.println("AT"); //Once the handshake test is successful, it will back to OK


updateSerial();
99
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
mySerial.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
updateSerial();
mySerial.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
updateSerial();
mySerial.println("AT+CREG?"); //Check whether it has registered in the network
updateSerial();
}

void loop()
{
updateSerial();
}

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

‫ ومعلومات عن‬، CSQ ‫ وهي جودة اإلشارة‬SIM800 ‫ المعلومات التي أرسلتها وحدة‬: )111( ‫الشكل‬
.+CREG: 0,1 ‫ والبطاقة تم تسجيلها على الشبكة‬، SIM ‫بطاقة‬

111
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

SMS ‫ إرسال رسالة‬:‫تطبيق عملي‬-9-13


:‫ سنستخدم التعليمات التالية‬.SMS ‫في هذا التطبيق سنعمل على إرسال رسالة‬
AT+CMGF=1
‫ رقم‬xxxxxxxxxx ، )963 ‫ رمز البلد (سوريا مثال‬ZZ ‫ حيث‬: AT+CMGS=\"+ZZxxxxxxxxxx\
.SMS ‫الهاتف الذي سترسل إليه رسالة‬
.26 ‫بعد ذلك نرسل النص المطلوب وننهي النص بإرسال الرمز‬
‫ ومن‬SIM800 ‫ لوحدة‬SIM ‫ وندخل بطاقة‬.)119( ‫) أو‬118( ‫نقوم بإجراء التوصيل الموضح في الشكل‬
:‫ثم نحمل الكود البرمجي التالي‬
#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L


SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM800L


mySerial.begin(9600);

Serial.println("Initializing...");
delay(1000);

mySerial.println("AT"); //Once the handshake test is successful, it will back to OK


updateSerial();

mySerial.println("AT+CMGF=1"); // Configuring TEXT mode


updateSerial();
mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\"");//change ZZ with country code and
xxxxxxxxxxx with phone number to sms
updateSerial();
mySerial.print("Hello from SIM800"); //text content
updateSerial();
mySerial.write(26);
}

void loop()
{
}

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
111
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

SMS ‫قراءة رسالة‬-11-13


.‫ وإرسالها إلى الحاسب‬SIM800 ‫ من قبل وحدة‬SMS ‫في هذا التطبيق سنعمل على استقبال رسالة‬
:‫سنستخدم التعليمات التالية‬
AT+CMGF=1
AT+CNMI=1,2,0,0,0
SIM800 ‫ لوحدة‬SIM ‫ وندخل بطاقة‬..)119( ‫) أو‬118( ‫نقوم بإجراء التوصيل الموضح في الشكل‬
‫ بعد ذلك‬.arduino IDE ‫ في برنامج‬Serial Monitor ‫ نفتح‬.‫ومن ثم نحمل الكود البرمجي التالي‬
.Serial Monitor ‫ لتظهر الرسالة على نافذة‬SIM ‫نرسل رسالة إلى رقم بطاقة‬

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L


SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM800L


mySerial.begin(9600);

Serial.println("Initializing...");
delay(1000);

mySerial.println("AT"); //Once the handshake test is successful, it will back to OK


updateSerial();

mySerial.println("AT+CMGF=1"); // Configuring TEXT mode


updateSerial();
mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should
be handled
updateSerial();
}

void loop()
{
updateSerial();
}

112
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

‫إجراء مكالمة‬-11-13
:‫ سنستخدم التعليمات التالية‬. SIM800 ‫في هذا المثال سنعمل على إجراء مكالمة من وحدة‬
: ATD+ +ZZxxxxxxxxxx
.‫ رقم الهاتف الذي ستجري مكالمة إليه‬xxxxxxxxxx ، )963 ‫ رمز البلد (سوريا مثال‬ZZ ‫حيث‬
: ‫إلنهاء المكالمة تستخدم التعليمة‬
: ATH
‫ يمكن إضافة مكيروفون وسماعة‬..)119( ‫) أو‬118( ‫نقوم بإجراء التوصيل الموضح في الشكل‬
‫ ومن ثم نحمل الكود البرمجي‬SIM800 ‫ لوحدة‬SIM ‫ وندخل بطاقة‬.‫وتوصيلهما مع األرجل المناسبة‬
.‫ سيتم إجراء اتصال لفترة زمنية ومن ثم سيتم إنهاء المكالمة‬.‫التالي‬

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L


SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);

//Begin serial communication with Arduino and SIM800L


mySerial.begin(9600);

Serial.println("Initializing...");
delay(1000);

mySerial.println("AT"); //Once the handshake test is successful, i t will back to OK


updateSerial();

113
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
mySerial.println("ATD+ +ZZxxxxxxxxxx;"); // change ZZ with country code and xxxxxxxxxxx
with phone number to dial
updateSerial();
delay(20000); // wait for 20 seconds...
mySerial.println("ATH"); //hang up
updateSerial();
}

void loop()
{
}

void updateSerial()
{
delay(500);
while (Serial.available())
{
mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
}
}

114
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫التحكم والمراقبة من خالل تقنية االتصال البلوتوث‬


‫‪-1-14‬مقدمة‬
‫البلوتوث هو تقنية اتصال السلكية تم اختراعها للسماح بتبادل البيانات ما بين األجهزة على‬
‫مسافات قصيرة‪ ،‬وبدون وجود خط نظر ‪ line of sight‬فيما بينها (أي حتى مع وجود حواجز)‪ ،‬مع‬
‫استهالك استطاعة منخفض‪ .‬يستخدم البلوتوث أمواجا راديوية ذات موجة قصيرة في الحزمة ‪ISM‬‬
‫‪Personal Area‬‬ ‫من ‪ 2.4GHz‬إلى ‪ .2.485GHz‬يتبع البلوتوث لشبكات المنطقة الشخصية‬
‫)‪ ،Networks (PAN‬وإلى المعيار ‪ IEEE 802.15.1‬الصادر عن منظمة ‪ .IEEE‬يمكن تصنيف أجهزة‬
‫البلوتوث ضمن أربع فئات تبعا الستطاعة اإلرسال وما يقابلها من مدى اتصال كما هو موضح في‬
‫الجدول (‪ .)19‬معظم األجهزة الخلوية تتبع للفئة ‪ .2‬عموما يتغير مدى االتصال الفعال تبعا لظروف‬
‫االنتشار وبنية الهوائيات وحالة البطارية‪ ،‬وحساسية المستقبل وغير ذلك‪.‬‬
‫الجدول (‪ : )19‬تصنيف أجهزة البلوتوث ضمن أربع فئات تبعا الستطاعة اإلرسال‬
‫مدى االتصال‬ ‫االستطاعة المسموح بها العظمى‬ ‫الفئة‬
‫النموذجي‬ ‫)‪(dBm‬‬ ‫)‪(mW‬‬
‫‪~100 m‬‬ ‫‪20‬‬ ‫‪100‬‬ ‫‪1‬‬
‫‪~10 m‬‬ ‫‪4‬‬ ‫‪2.5‬‬ ‫‪2‬‬
‫‪~1 m‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪3‬‬
‫‪~0.5 m‬‬ ‫‪-3‬‬ ‫‪0.5‬‬ ‫‪4‬‬

‫حتى الوقت الحاضر يوجد للبلوتوث ‪ 5‬إصدارات ‪ .versions‬يقارن الجدول التالي ما بين سرعة نقل‬
‫آخر ثالثة إصدارات ومجال اإلرسال األعظمي‪.‬‬
‫الجدول (‪ : )21‬معدل نقل أجهزة البلوتوث‬
‫مدى االتصال األعظمي‬ ‫سرعة النقل العظمى‬ ‫رقم اإلصدار ‪version‬‬
‫‪10 m‬‬ ‫‪25bit/s‬‬ ‫‪3.0‬‬
‫‪60 m‬‬ ‫‪25bit/s‬‬ ‫‪4.0‬‬
‫‪240 m‬‬ ‫‪50bit/s‬‬ ‫‪5‬‬

‫يستخدم البلوتوث اآلن في معظم االجهزة المحيطة بنا كالطابعات والكاميرات وأجهزة الحاسب‪،‬‬
‫واألجهزة الخلوية وسماعات الرأس وغيرها الكثير من األجهزة‪.‬‬

‫‪-2-14‬وحدة اتصال البلوتوث ‪HC-05‬‬


‫يمكن للمتحكمات الصغرية ولوحات األردوينو أن تتبادل البيانات مع األجهزة التي تعمل‬
‫بتقنية البلوتوث من خالل استخدام وحدات ‪ modules‬تعرف بوحدات بلوتوث التي تأخذ شكل منفذ‬

‫‪115‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫تسلسلي )‪ .Serial Port Profile (SPP‬توفر هذه الوحدات اتصاال تسلسليا وفق بروتوكول ‪UART‬‬
‫من جهة‪ ،‬واتصاال مع شبكة البلوتوث من جهة أخرى كما هو موضح في الشكل (‪.)111‬‬

‫‪SSP Bluetooth module‬‬

‫‪UART‬‬

‫الشكل (‪ : )111‬استخدام وحدة بلوتوث ‪ SPP‬لربط لوحة األردوينو مع شبكة بلوتوث‪.‬‬


‫يوجد عدة نماذج لوحدات ‪ SPP‬تبعا للبرنامج الدائم ‪ firmware‬الذي تبرمج به ‪:‬‬
‫‪ ‬وحدة ‪ HC-05‬ووحدة ‪ :HC-03‬يمكن لكل من هاتين الوحدتين أن تعمال ‪Master Mode‬‬
‫و‪ ،Slave Mode‬حيث يسمح البرنامج الدائم ‪ firmware‬من التبديل بينهما في أي وقت‪.‬‬
‫وحدة ‪ HC-03‬منتج صناعي‪ ،‬ووحدة ‪ HC-05‬منتج تجاري‪.‬‬
‫‪ ‬وحدة ‪ HC-06‬ووحدة ‪ :HC-04‬هاتين الوحدتين تعمالن إما في وضعية ‪ Master Mode‬أو‬
‫‪ Slave Mode‬حسب ضبط المصنع‪ ،‬وال يمكن التبديل بينهما‪ .‬وحدة ‪ HC-04‬منتج صناعي‪،‬‬
‫ووحدة ‪ HC-06‬منتج تجاري‪ .‬يعرف برنامج ‪ HC-06‬أيضا بل ‪.Linvor‬‬
‫تتشابه الوحدتان ‪ HC-06‬و ‪ HC-05‬من حيث البنية االلكترونية ولكن تختلفان من حيث البرنامج‬
‫الدائم ‪ firmware‬كما ذكرنا‪ .‬يوضح الشكل (‪ )112‬هاتين الوحدتين‪ .‬تتضمن هذه الوحدة شريحة‬
‫البلوتوث ‪ BC417143‬التي تعمل وفق اإلصدار ‪ 2‬ونظام ‪ EDR‬بسرعة نقل ‪ ،3Mbit/s‬وهذه الشريحة‬
‫تحديدا هي التي توفر اتصاال وفق بروتوكول ‪ UART‬من جهة ومع شبكة البلوتوث الالسلكية من‬
‫جهة أخرى‪ .‬يوجد أيضا ذاكرة خارجية ‪ MX 29LV800CBXBI-70G‬من نوع ‪ ،flash‬وهوائي مدمج‬
‫على اللوحة ‪ ، PCB RF antenna‬مع إمكانية وصل هوائي خارجي‪.‬‬

‫‪116‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪PCB RF‬‬
‫‪Antenna‬‬

‫‪BC417143‬‬

‫‪MX 29LV800CBXBI-‬‬
‫‪70G‬‬

‫الشكل (‪ : )112‬وحدة بلوتوث ‪ HC-05‬أو ‪.HC-06‬‬

‫يوضح الشكل (‪ )113‬أرجل وحدة ‪ HC-05‬الخارجية‪.‬‬

‫الشكل (‪ : )113‬أرجل وحدة ‪ HC-05‬الخارجية‪.‬‬

‫يوضح الجدول (‪ )21‬شرحا لوظائف أرجل وحدة ‪ HC-05‬المهمة التصال البلوتوث‪:‬‬


‫الجدول (‪ :)21‬وظائف أهم أرجل في وحدة ‪HC-05‬‬
‫وظيفة الرجل‬ ‫اسم الرجل‬ ‫رقم‬
‫الرجل‬
‫رجل إرسال اإلشارة التسلسلية وفق بروتوكول ‪ ،UART‬يمكن وصلها مع‬ ‫‪UART_TXD‬‬ ‫‪PIN1‬‬
‫رجل استقبال المتحكم الصغري‪.‬‬
‫رجل استقبال اإلشارة التسلسلية وفق بروتوكول ‪ ،UART‬يمكن وصلها مع‬ ‫‪UART_RXD‬‬ ‫‪PIN2‬‬
‫رجل إرسال المتحكم الصغري‪.‬‬

‫‪112‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫عند تطبيق مستوى منخفض على هذه الرجل يتم إعادة تشغيل الوحدة‪.‬‬ ‫‪RESET‬‬ ‫‪PIN11‬‬
‫يمكن عدم وصل هذه الرجل‪.‬‬
‫يتم هنا تطبيق جهد تغذية ما بين ‪ 3 V‬و ‪ .4.2 V‬الجهد النموذجي ‪.3.3 V‬‬ ‫‪VCC‬‬ ‫‪PIN12‬‬
‫رجل األرضي‪.‬‬ ‫‪GND‬‬ ‫‪PIN13‬‬
‫مؤشر نمط العمل‪ .‬تعطي هذه الرجل إشارة مربعة ترددها يختلف حسب نمط‬ ‫‪LED1‬‬ ‫‪PIN31‬‬
‫العمل ‪ :‬نمط أوامر ‪ ،AT‬أو نمط قابلية االقتران ‪ ،pairable mode‬أو نمط‬
‫االتصال ‪ .Connection Mode‬لهذا يمكن وصل ثنائي ضوئي مع هذه الرجل‬
‫لمعرفة نمط العمل‪ .‬على سبيل المثال عندما يحدث اتصال ما بين الوحدة مع‬
‫وحدة بلوتوث أخرى يضيء الثنائي الضوئي مرتين ويتوقف لفترة طويلة‬
‫(ثانيتين تقريبا)‪ ،‬وتكرر العملية‪.‬‬
‫مؤشر حالة االتصال‪ .‬تعطي هذه الرجل إشارة ذات مستوى منخفض في‬ ‫‪LED2‬‬ ‫‪PIN32‬‬
‫حالة عدم وجود اتصال ما بين الوحدة مع وحدة بلوتوث أخرى‪ ،‬وإشارة ذات‬
‫مستوى مرتفع في حالة وجود اتصال‪.‬‬
‫مدخل اختيار نمط العمل‪ .‬إذا تم تطبيق إشارة ذات مستوى منخفض تكون‬ ‫‪KEY‬‬ ‫‪PIN34‬‬
‫الوحدة في نمط االقتران أو االتصال‪ .‬إذا تم تطبيق إشارة ذات مستوى‬
‫مرتفع تدخل الوحدة في نمط األوامر ‪.AT‬‬

‫يمكن إجمال خواص الوحدتين ‪ HC-05‬و ‪ HC-06‬بما يلي‪:‬‬


‫‪ ‬تعمل وفق تقنية البلوتوث اإلصدار ‪.EDR + 2‬‬
‫‪ ‬إمكانية تبادل المعطيات مع الوحدات األخرى (كالمتحكمات الصغرية) وفق بروتوكول ‪.UART‬‬
‫‪ ‬استطاعة اإلرسال العظمى ‪.4 dBm‬‬
‫‪ ‬الحساسية النموذجية ‪.-80dBm‬‬
‫‪ ‬تصل التغطية إلى ‪.10m‬‬
‫‪ ‬جهد التغذية ‪.3.3V‬‬
‫‪ ‬يمكن ضبط بارامترات الوحدة وأوامر التحكم من خالل أوامر ‪.AT‬‬
‫‪ ‬معدل النقل التسلسلي األعظمي ‪1382400 bps‬‬
‫‪ ‬توفر ‪ 7‬منافذ دخل وخرج‪.‬‬
‫‪ ‬توفر مؤشرات حالة وجود أو عدم وجود اتصال‪.‬‬
‫‪ ‬تتصل بشكل آلي مع جهاز آخر مع بداية التشغيل بشكل افتراضي‪.‬‬

‫‪118‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫وحدة ‪ HC-07‬تعتبر بديال لوحدة ‪ HC-06‬حيث تختلف عنها من حيث بنيتها االلكترونية‪،‬‬
‫حيث تستخدم شريحة ‪ CSR 41C‬بذاكرة وميضية ‪ flash‬داخلية بسعة ‪ ،8 Mbit‬وبالتالي ال يوجد‬
‫ذاكرة وميضية خارجية‪.‬‬
‫‪ultra low power‬‬ ‫تمتاز وحدة ‪ HC-08‬بأنها ذات استطاعة منخفضة جدا‬
‫‪ .Bluetooth protocol v4.0‬تعمل بجهد ما بين ‪ 2V‬إلى ‪ ،3.6 V‬ومدى من ‪ 8m‬إلى ‪ ،10m‬ويمكن أن‬
‫تعمل إما ‪ master‬أو ‪.slave‬‬
‫وحدة ‪ :HC-09‬تعتبر بديال لوحدة ‪ HC-06‬ووحدة ‪.HC-07‬‬

‫الشكل (‪ :)114‬وحدات بلوتوث ‪.HC-09 , HC-08 , HC-07‬‬

‫‪-3-14‬لوحة ‪hc-05 FC-114‬‬


‫بسبب صعوبة التعامل مع منافذ وحدتي ‪ HC-05‬و ‪ HC-06‬باإلضافة إلى أنها تعمل بجهد تغذية ‪3.3V‬‬
‫مما يستدعي استخدام منظم جهد‪ ،‬فقد تم تركيبها ولحمها على لوحة وإضافة عناصر الكترونية إليها‬
‫كما هو موضح في الشكل (‪ .)115‬تتضمن اللوحة منظم جهد ‪ ، 3.3V‬مما يساعد على تطبيق جهد ‪5V‬‬
‫الذي تعمل به المتحكمات الصغرية ومعظم لوحات األردوينو‪ .‬كذلك تم إضافة ثنائي ضوئي موصول‬
‫مع الرجل ‪ PIN31‬التي ذكرنا وظيفتها سابقا في الداللة على نمط العمل‪ .‬يوجد في لوحة ‪HC-05‬‬
‫أيضا مفتاح لحظي ‪ button‬تم وصله مع الرجل ‪ PIN34‬التي من خاللها يتم تحديد نمط العمل‪ .‬عند‬
‫الضغط على المفتاح تتصل الرجل ‪ PIN34‬مع التغذية ‪ 3.3V‬وبالتالي الدخول في نمط أوامر ‪ .AT‬من‬
‫دون الضغط على المفتاح يطبق على الرجل ‪ 0V‬وبالتالي الدخول في نمط االتصال‪.‬‬

‫‪119‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫وحدة ‪HC-05‬‬

‫ثنائي ضوئي ‪LED1‬‬


‫منظم جهد ‪3.3 V‬‬

‫مفتاح لحظي‬

‫أرجل الخرج‬

‫الشكل (‪ : )115‬لوحة ‪ HC-05 FC-114‬ذات أرجل خرج يمكن التعامل معها بسهولة‪.‬‬

‫أرجل الخرج للوحة هي ‪:‬‬


‫الجدول (‪ :)22‬وظائف أرجل لوحة ‪HC-05‬‬
‫الوظيفة‬ ‫الرجل‬
‫هذه الرجل هي نفسها )‪ PIN32 (LED2‬لوحدة ‪ HC-05‬والتي ذكرنا أهميتها سابقا في‬ ‫‪STATE‬‬
‫الجدول (‪ .)19‬تعطي مستوى مرتفع في حالة كون الوحدة متصلة‪.‬‬
‫هذه الرجل هي نفسها )‪ PIN2 (UART_RXD‬لوحدة ‪ HC-05‬المذكورة في الجدول (‪.)19‬‬ ‫‪RXD‬‬
‫هذه الرجل هي نفسها )‪ PIN1 (UART_TXD‬لوحدة ‪ HC-05‬المذكورة في الجدول (‪.)19‬‬ ‫‪TXD‬‬
‫أرضي‬ ‫‪GND‬‬
‫يطبق جهد تغذية ‪.+5V‬‬ ‫‪Vcc‬‬
‫هذه الرجل متصلة مع رجل ‪ CE‬لمنظم الجهد‪ .‬عند تطبيق مستوى منخفض ال يعمل‬ ‫‪EN‬‬
‫المنظم‪ ،‬وبالتالي ال يتم تطبيق جهد تغذية على وحدة ‪ .HC-05‬مع تطبيق مستوى مرتفع‬
‫أو عدم تطبيق أية إشارة يعمل المنظم‪ .‬أي أن هذه الرجل تعمل كرجل تفعيل للوحة‪.‬‬

‫‪-4-14‬االنتقال إلى نمط األوامر ‪AT‬‬


‫ذكرنا سابقا أن وحدة ‪ HC-05‬يمكن أن تعمل وفق نمط األوامر ‪ AT‬أو وفق نمط االتصال‪ ،‬وتستخدم‬
‫الرجل )‪ PIN34 (KEY‬ل لالنتقال ما بين النمطين‪ .‬يمكن من الشكل (‪ )116‬مالحظة أنه ال يوجد رجل‬
‫تخرج من اللوحة تتصل مع الرجل )‪ PIN34 (KEY‬الخاصة لالنتقال ما بين نمط األوامر ونمط‬
‫االتصال‪ ،‬وإنما فقط مفتاح لحظي يتطلب استمرار الضغط عليه لضمان الدخول في نمط األوامر‪ .‬لحل‬
‫تلك المشكلة يمكن وصل سلك خارجي مع الرجل ‪ PIN34‬لوحدة ‪( HC-05‬آخر رجل في الطرف‬
‫األيمن من األعلى) كما هو موضح في الشكل (‪ .)112‬يتم الدخول في نمط األوامر من خالل توصيل‬

‫‪111‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الرجل )‪ PIN34 (KEY‬إلى المستوى المرتفع )‪ (+3.3 V‬باستخدام السلك الخارجي أو الضغط على‬
‫المفتاح اللحظي‪ ،‬ومن ثم يتم تطبيق التغذية ‪ +5V‬على اللوحة‪ .‬معدل نقل بتات األوامر ‪.38400b/s‬‬
‫بعد الدخول في نمط األوامر يمكن عندئذ البدء بإرسالها من الحاسب أو متحكم صغري واستقبال‬
‫الردود باستخدام األرجل ‪ .TX, RX‬عند اختيار الحاسوب البد من استخدام لوحة شريحة ‪FT232R‬‬
‫التي تعمل كمحول ‪ ،USB-UART‬وقد تم دراستها سابقا في المستوى المبتدئ‪ .‬يوضح الشكل (‪)112‬‬
‫مخططا لكيفية وصل لوحة ‪ HC-05‬مع لوحة شريحة ‪ .FT232R‬تم وصل رجل إرسال وحدة‬
‫البلوتوث‪ HC-05‬مع رجل استقبال لوحة شريحة ‪ FT232R‬بشكل مباشر‪ .‬عند استخدام لوحة شريحة‬
‫‪ FT232R‬التي تحوي على مفتاح يبدل مستوى إشارة ‪ UART-TTL‬من ‪ 5V‬إلى ‪ 3.3V‬يمكن عندئذ‬
‫وصل رجل استقبال وحدة البلوتوث‪ HC-05‬مع رجل إرسال لوحة شريحة ‪ FT232R‬بشكل مباشر‬
‫كما في الشكل‪ .‬إذا لم تكن تحتوي هذا المفتاح البد من استخدام مقاومتين على التسلسل قيمتهما‬
‫مثال ‪ 1KΩ , 2KΩ‬بحيث يتم تحويل مستوى جهد الواحد المنطقي )‪ (+5V‬لرجل إرسال لوحة‬
‫‪ FT232R‬إلى مستوى جهد الواحد المنطقي للوحة البلوتوث )‪ .(+3.3V‬كذلك يتم وصل التغذية‬
‫واألرضي للشريحتين بحيث يتم تأمين الطاقة المطلوبة لوحدة ‪ HC-05‬من منفذ ‪ USB‬للحاسب‪ .‬ال‬
‫يوجد حاجة لربط الرجل ‪ state‬و الرجل ‪ EN‬لوحدة ‪ .HC-05‬أخيرا ال بد من وصل الرجل ‪PIN34‬‬
‫)‪ (KEY‬للوحة ‪ HC-05‬إلى جهد ‪ 3.3V‬للعمل وفق نمط األوامر كما تم ذكره‪ ،‬أو الضغط على المفتاح‬
‫اللحظي في اللوحة‪ .‬تم تأمين هذا الجهد انطالقا من الجهد ‪ +5V‬باستخدام مقاومتين ‪1KΩ , 2KΩ‬‬
‫كما هو موضح في الشكل‪.‬‬

‫‪USB-UART‬‬
‫‪Converter‬‬

‫الشكل (‪ :)112‬ربط لوحة ‪ HC-05‬مع محول ‪ USB-UART‬إلرسال أوامر ‪ AT‬عن طريق الحاسب‪.‬‬

‫‪111‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫بنفس الطريقة يمكن استخدام لوحة أردوينو لتعمل كمحول ‪ USB-Serial‬كما هو موضح في الشكل‬
‫(‪ ،)118‬ولكن نصل منفذ ‪ Reset‬إلى األرضي بحيث نلغي عمل المتحكم الصغري ‪Atmega328‬‬
‫الرئيسي‪ ،‬أيضا نستخدم مقاومتين ‪ 1KΩ , 2KΩ‬لتخفيض الجهد المرسل من لوحة األردوينو من ‪+5V‬‬
‫إلى ‪.3.3V‬‬

‫الشكل (‪ :)118‬ربط لوحة ‪ HC-05‬مع لوحة األردوينو إلرسال أوامر ‪ AT‬عن طريق الحاسب‪.‬‬

‫البد من اإلشارة إلى أن كل أمر مرسل من الحاسب إلى لوحة ‪ HC-05‬البد من أن ينتهي بل "‪ "\n\r‬أو‬
‫)‪ (0X0D 0X0A‬أو مفتاح ‪ ENTER‬كمؤشر على نهاية األمر‪ .‬اإلجابة من لوحة ‪ HC-05‬ال تنتهي بل‬
‫‪ ."\n\r‬يمكن استخدام نافذة المراقبة التسلسلية ‪ serial monitoring‬في بيئة التطوير ‪Arduino‬‬
‫‪ . IDE‬في هذه النافذة يمكن ضبط أن يرسل "‪ "\n\r‬بعد كل أمر‪ ،‬باإلضافة إلى معدل النقل‬
‫‪ 38400b/s‬كما هو موضح في الشكل (‪.)119‬‬

‫‪112‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)119‬ضبط نافذة المراقبة التسلسلية إلرسال األوامر بمعدل ‪ 38400 b/s‬مع إرسال "‪"\n\r‬‬
‫بعد كل أمر‪.‬‬
‫يبين الجدول (‪ )23‬أهم أوامر ‪ AT‬المرسلة إلى لوحة ‪ HC-05‬والردود عليها من قبل لوحة‬
‫‪ .HC-05‬لضمان تنفيذ كل األوامر البد من الحفاظ على تطبيق إشارة مستوى مرتفع على الرجل‬
‫)‪.PIN34 (KEY‬‬
‫الجدول (‪ )23‬أهم أوامر ‪ AT‬المرسلة إلى لوحة ‪HC-05‬‬
‫الشرح‬ ‫االستجابة‬ ‫صيغة األمر‬
‫يستخدم هذا األمر الختبار االتصال‪.‬‬ ‫‪OK‬‬ ‫‪AT‬‬
‫يستخدم هذا األمر إلعادة تشغيل الوحدة‪.‬‬ ‫‪OK‬‬ ‫‪AT+RESET‬‬
‫يستخدم لمعرفة إصدار البرنامج ‪.firmware‬‬ ‫>‪+VERSION: <Param‬‬ ‫?‪AT+VERSION‬‬
‫‪OK‬‬
‫حيث البارامتر ‪ Param‬في رسالة االستجابة‬
‫يدل على رقم اإلصدار‪.‬‬
‫امر اعادة ضبط المصنع‪.‬‬ ‫‪OK‬‬ ‫‪AT+ORGL‬‬
‫يستخدم لمعرفة عنوان وحدة البلوتوث‪ ،‬وهو‬ ‫>‪+ADDR: <Param‬‬ ‫?‪AT+ADDR‬‬
‫‪OK‬‬
‫يأتي من المصنع وال يمكن تغييره‪ .‬حيث‬
‫البارامتر ‪ Param‬في رسالة االستجابة يدل‬
‫على العنوان‪ .‬يأخذ العنوان الشكل التالي‪:‬‬
‫)‪NAP: UAP: LAP(Hexadecimal‬‬
‫مثال على رسالة الرد‬
‫‪+ADDR:1234:56:abcdef‬‬
‫‪OK‬‬
‫يستخدم لتغيير اسم وحدة البلوتوث‪ .‬حيث‬ ‫‪OK‬‬ ‫>‪AT+NAME=<Param‬‬
‫البارامتر ‪ Param‬في األمر يدل على االسم‬
‫الجديد‪ .‬مثال على رسالة األمر‪:‬‬
‫‪AT+NAME=HC-05‬‬
‫يستخدم لمعرفة اسم وحدة البلوتوث‪ .‬حيث‬ ‫>‪+NAME:<Param‬‬ ‫?‪AT+NAME‬‬
‫‪OK‬‬
‫البارامتر ‪ Param‬في رسالة اإلجابة يدل على‬

‫‪113‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫االسم‪ .‬مثال على رسالة الرد‪:‬‬
‫‪+NAME:HC-05‬‬
‫‪OK‬‬
‫يستخدم لالستعالم عن اسم جهاز بلوتوث‬ ‫>‪1. +NAME:<Param2‬‬ ‫‪AT+RNAME?<Param‬‬
‫‪OK----success‬‬ ‫>‪1‬‬
‫مخزن في ذاكرة الوحدة تم االقتران معه‪.‬‬
‫‪2. FAIL----failure‬‬
‫في األمر هو‬ ‫حيث البارامتر ‪Param1‬‬
‫والبارامتر‬ ‫عنه‪.‬‬ ‫نستعلم‬ ‫الذي‬ ‫العنوان‬
‫‪ Param2‬هو اسم الجهاز‪ .‬مثال ‪:‬‬
‫بفرض أن األمر هو‪:‬‬
‫‪at+rname? 0002,72,od2224‬‬
‫الرد هو على سبيل المثال‪:‬‬
‫‪+NAME:Bluetooth‬‬
‫‪OK‬‬
‫يستخدم لتغيير كلمة المرور‪ .‬حيث البارامتر‬ ‫‪OK‬‬ ‫>‪AT+PSWD=<Param‬‬
‫‪ Param‬في األمر هو كلمة المرور الجديدة‪.‬‬
‫مثال على رسالة األمر‪:‬‬
‫‪AT+PSWD=12345‬‬
‫يستخدم لالستعالم عن كلمة المرور‪ .‬حيث‬ ‫>‪+ PSWD : <Param‬‬ ‫?‪AT+ PSWD‬‬
‫‪OK‬‬
‫البارامتر ‪ Param‬في رسالة الرد كلمة المرور‬
‫الحالية‪ .‬مثال على رسالة الرد‪:‬‬
‫‪+PSWD:1234‬‬
‫‪OK‬‬
‫يستخدم لالستعالم عن عدد األجهزة المخزنة‬ ‫‪+ADCN:<Param> OK‬‬ ‫?‪AT+ADCN‬‬
‫في الوحدة والتي تم عمل اقتران معها‪.‬‬
‫مثال على رسالة الرد‪:‬‬
‫‪+ADCN:3‬‬
‫‪OK‬‬
‫التسلسلي‬ ‫االتصال‬ ‫إعدادات‬ ‫لتغيير‬ ‫أمر‬ ‫‪OK‬‬ ‫>‪AT+UART=<Param1‬‬
‫<‪,‬‬
‫‪ .UART‬حيث ‪ param1‬هو معدل النقل‪،‬‬
‫>‪Param2>,<Param3‬‬
‫‪ param2‬هو بت التوقف يأخذ ‪ 0‬أو ‪0 .1‬‬
‫للداللة على أن بت التوقف بت واحد‪1 ،‬‬
‫للداللة أن بت التوقف عبارة عن بتين‪.‬‬
‫‪ Param3‬هو بت التفحص ويأخذ ‪ 0‬أو ‪ 1‬أو‬
‫‪ 0 .2‬للداللة إلى عدم استخدام بت التفحص‪،‬‬
‫‪ 1‬استخدام بت تفحص فردي ‪2 ،odd‬‬
‫استخدام بت تفحص زوجي ‪ .even‬مثال على‬

‫‪114‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫رسالة أمر‬
‫‪AT+UART=115200,1,2‬‬
‫يستخدم لالستعالم عن إعدادات االتصال‬
‫‪+UART=<Param>,<Para‬‬ ‫?‪AT+UART‬‬
‫>‪m2>,<Param3‬‬
‫التسلسلي ‪ .UART‬حيث ‪ param1‬هو‬
‫‪OK‬‬
‫معدل النقل‪ param2 ،‬هو بت التوقف‪،‬‬
‫‪ Param3‬هو بت التفحص‪ .‬مثال على رسالة‬
‫رد‪:‬‬
‫‪+UART:115200,1,2‬‬
‫‪OK‬‬
‫يتم حذف كل األجهزة من قائمة االقتران‬ ‫‪OK‬‬ ‫‪AT+RMAAD‬‬
‫يستخدم لتغيير نمط العمل تبعا للبارمتر‬ ‫‪OK‬‬ ‫>‪AT+ROLE=<Param‬‬
‫‪ param‬الذي يأخذ ‪ 0‬او ‪ 1‬أو ‪ 0 .2‬للداللة‬
‫إلى نمط ‪ 1 ،slave‬للداللة إلى نمط‬
‫‪ 2 ،master‬للداللة إلى النمط ‪.slave loop‬‬
‫مثال على رسالة أمر‪:‬‬
‫‪AT+ROLE=0‬‬
‫يستخدم لالستعالم عن نمط عمل وحدة‬ ‫>‪+ROLE:<Param‬‬ ‫?‪AT+ ROLE‬‬
‫‪OK‬‬
‫البلوتوث تبعا لقيمة ‪ Param‬في رسالة الرد‪.‬‬
‫‪ 0‬للداللة إلى نمط ‪ 1 ،slave‬للداللة إلى‬
‫نمط ‪ 2 ،master‬للداللة إلى النمط ‪slave‬‬
‫‪ .loop‬مثال على رسالة رد‪:‬‬
‫‪+ROLE:0‬‬
‫‪OK‬‬

‫يبين الشكل (‪ )121‬مثاال الستخدام أمر معرفة اسم وحدة البلوتوث ورسالة اإلجابة عليها من وحدة‬
‫‪.HC-05‬‬

‫الشكل (‪ : )121‬استخدام أمر معرفة اسم وحدة البلوتوث ورسالة اإلجابة عليها من وحدة ‪.HC-05‬‬

‫‪115‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-5-14‬تطبيق عملي‪ :‬إرسال درجة الحرارة من لوحة األردوينو إلى الحاسب باستخدام‬
‫وحدة البلوتوث ‪HC-05‬‬
‫يوضح الشكل (‪ )121‬مخططا لكيفية توصيل لوحة األردوينو مع لوحة ‪ .HC-05‬تم وصل رجل‬
‫إرسال وحدة البلوتوث‪ HC-05‬مع رجل استقبال لوحة األردوينو )‪ PIN0 (RX‬بشكل مباشر‪ .‬في حين‬
‫تم وصل رجل إرسال لوحة األردوينو )‪ PIN1 (TX‬مع رجل استقبال وحدة البلوتوث ‪ HC-05‬عن‬
‫طريق استخدام مقاومتين على التسلسل قيمتهما ‪ 1KΩ , 2KΩ‬ووفق الترتيب الموضح في الشكل‪.‬‬
‫الهدف من هاتين المقاومتين تحويل مستوى جهد الواحد المنطقي )‪ (+5V‬لرجل إرسال لوحة‬
‫األردوينو‪ ،‬إلى مستوى جهد الواحد المنطقي للوحة البلوتوث )‪ .(+3.3V‬ال يوجد حاجة لربط الرجل‬
‫‪ state‬و الرجل ‪ EN‬والرجل )‪ PIN34 (KEY‬لوحدة ‪ .HC-05‬تم وصل حساس الحرارة ‪ LM35‬إلى‬
‫المدخل التشابهي ‪ .A0‬البد من اإلشارة إلى أن وحدة البلوتوث في هذا التطبيق تعمل وفق نمط‬
‫‪ slave‬وهو النمط االفتراضي لها‪.‬‬

‫الشكل (‪ : )121‬ربط لوحة األردوينو مع لوحة ‪ HC-05‬إلرسال درجة الحرارة عبر البلوتوث‪.‬‬
‫تتم عملية تبادل البيانات ما بين لوحة األردوينو ولوحة ‪ HC-05‬وفق بروتوكول ‪ UART‬بشكل‬
‫مشابه لتبادل البيانات مع شريحة ‪ FT232R‬لذلك سنستخدم نفس تعليمات االتصال وفق بروتوكول‬
‫‪ UART‬التي سبق وأن تم دراستها سابقا لذلك‪.‬‬

‫‪116‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫)(‪void setup‬‬
‫{‬
‫;)‪Serial.begin(38400‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;‪unsigned int sensorValue‬‬
‫;‪sensorValue=analogRead(0)/2‬‬
‫;)‪Serial.println(sensorValue‬‬
‫;)‪delay(1000‬‬
‫}‬

‫بعد تحميل الكود البرمجي وتشغيل الدارة‪ ،‬البد من إجراء عملية اقتران ما بين الحاسب‬
‫ووحدة البلوتوث ‪ .HC-05‬نضغط على زر تشغيل البلوتوث في الحاسب‪ .‬نفتح في الحاسب لوحة‬
‫التحكم ‪ control panel‬نختار األجهزة والطابعات ‪ .Devices and printer‬نختار إضافة جهاز ‪add a‬‬
‫‪ ،device‬إذا كانت وحدة البلوتوث مطبق عليها التغذية سيظهر لدينا وحدة البلوتوث ‪ HC-05‬كما هو‬
‫موضح في الشكل (‪.) 122‬‬

‫الشكل (‪ :)122‬ظهور وحدة ‪ HC-05‬أثناء البحث عن أجهزة بلوتوث في الحاسب‪.‬‬

‫بعد اختيار الوحدة تظهر لدينا قائمة تحديد نمط االقتران كما هو موضح في الشكل (‪،)123‬‬
‫نختار االحتمال الثاني وهو إدخال شيفرة االقتران ‪ .Enter the device's pairing code‬ندخل‬
‫الشيفرة االفتراضية وهي ‪ .1234‬بذلك يكون قد تم االقتران‪.‬‬

‫‪112‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ : )123‬اختيار إدخال شيفرة اقتران الجهاز‪.‬‬


‫إذا تم فتح نافذة إدارة األجهزة ‪ device manager‬سنالحظ أنه قد تم تعريف جهاز جديد‬
‫ضمن قائمة )‪ Ports (COM&LPT‬كما هو موضح في الشكل (‪ .)124‬هذا يعني أن الحاسب سيتعامل‬
‫مع وحدة ‪ HC-05‬المتصل معها عبر شبكة البلوتوث على أنها منفذ ‪ COM‬افتراضي بشكل مشابه‬
‫لوحدة ‪ FT232R‬التي ذكرناها سابقا‪ .‬بالتالي فإنه يمكننا استخدام نافذة المراقبة التسلسلية في بيئة‬
‫‪ .Arduino IDE‬أو استخدام برامج مثل ‪ Matlab‬أو ‪ Visual Basic‬لرسم وإظهار درجة الحرارة‪.‬‬

‫الشكل (‪ : )124‬يتم تعريف وحدة البلوتوث أثناء اتصالها مع الحاسب على أنها منفذ ‪ COM‬افتراضي‪.‬‬

‫‪-6-14‬تطبيق عملي‪ :‬إرسال درجة الحرارة من لوحة األردوينو إلى الهاتف الخلوي‬
‫باستخدام وحدة البلوتوث ‪HC-05‬‬
‫نفس التطبيق السابق سنقوم بوصل الدارة في الشكل (‪ )121‬وتحميل الكود السابق‪ ،‬وتشغيل الدارة‪.‬‬
‫البد من إجراء عملية اقتران ما بين الهاتف ووحدة البلوتوث ‪ .HC-05‬نضغط على زر تشغيل البلوتوث‬
‫في الهاتف‪ ،‬ونقوم بعملية بحث عن أجهزة البلوتوث‪ .‬سيظهر لدينا وحدة البلوتوث ‪ HC-05‬كما هو‬
‫موضح في الشكل (‪ ،)125‬نختارها وندخل رمز ‪ PIN‬االفتراضي وهو ‪ 1234‬بذلك يكون قد تم‬
‫االقتران‪.‬‬

‫‪118‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)125‬ظهور وحدة البلوتوث ‪ HC-05‬عند البحث عن أجهزة بلوتوث في الهاتف الخلوي‪.‬‬
‫البد اآلن من تحميل إحدى التطبيقات التي تسمح بعرض درجة الحرارة من االنترنت‪ .‬يمكن مثال‬
‫تحميل التطبيق التالي والذي نافذته موضحة في الشكل (‪.)126‬‬
‫سنتعلم الحقا كيفية صنع تطبيقات على األجهزة المحمولة للتحكم من خاللها بلوحة األردوينو‬
‫وباستخدام وحدة ‪.HC-05‬‬

‫الشكل (‪ :)126‬عرض درجة الحرارة على الهاتف الخلوي‪.‬‬

‫‪119‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫التحكم والمراقبة عن طريق شبكة ‪Wi-Fi‬‬


‫‪--1-15‬مقدمة‬
‫الشبكات المحلية الالسلكية (‪ )WLANs‬أو شبكة ‪ Wi-Fi‬هي نفس الشبكة المحلية السلكية التقليدية‬
‫ولكن لديها واجهة السلكية‪ .‬تمكن الشبكة المحلية ألجهزة الكمبيوتر من تبادل البيانات أو المعلومات‬
‫األخرى عن طريق موجات الراديو وبدون استخدام الكابالت‪.‬‬
‫فيما يلي بعض المصطلحات الخاصة بشبكة ‪ Wi-Fi‬والتي ستهمنا الحقا‪:‬‬
‫‪ ‬المحطة )‪ :Station (STA‬الجهاز الذي يتصل مع شبكة ‪ WiFi‬مثل الحاسب المحمول أو‬
‫الهاتف الخلوي‪.‬‬
‫‪ ‬نقطة الوصول )‪ :Access Point (AP‬الجهاز الذي ينشئ شبكة ‪ ،WiFi‬بحيث تسمح للمحطات‬
‫‪ STA‬باالتصال فيما بينها‪ ،‬كما أنها تشكل رابطا لالتصال ما بين شبكة ‪ WiFi‬الالسلكية‪ ،‬وشبكة‬
‫سلكية‪ .‬يمكن أن تتصل مع جهاز الموجه ‪ router‬أو قد تكون مدمجة معه للمساح لشبكة‬
‫‪ WiFi‬بالوصول إلى االنترنت‪.‬‬
‫‪ : SSID (service set identifier( ‬اسم شبكة ‪ WiFi‬التي أنشأتها نقطة الوصول‪.‬‬
‫‪ ‬المخدم ‪ : Server‬الجهاز الذي يقدم وظائف أو خدمات إلى أجهزة أخرى تعرف بالزبائن‬
‫‪ clients‬مثل مشاركة ملفات أو إنجاز عملية حسابية‪.‬‬
‫‪ ‬مخدم الويب ‪ :Web server‬الجهاز الحاسوبي الذي يعالج طلبات نقل النص التشعبي ‪HTTP‬‬
‫)‪( (Hypertext Transfer Protocol‬البروتوكول المستخدم لنشر المعلومات على شبكة‬
‫االنترنت العالمية)‪.‬‬
‫‪ ‬الزبون ‪ :client‬الجهاز الذي يطلب وظيفة ما متوفرة عند الجهاز المخدم‪.‬‬

‫‪-2-15‬شريحة ‪ESP8266‬‬
‫تعتبر شريحة ‪ ESP8266‬بمثابة نظام على رقاقة )‪ system on chip (SoC‬تم تصنيعها من قبل‬
‫شركة ‪ Espressif‬الصينية‪ ،‬وتتألف من‪.‬‬
‫‪ ‬وحدة تحكم صغرية (معالج وذواكر)‪ .‬لهذا يمكن برمجة هذه الشريحة بشكل مشابه للوحات‬
‫األردوينو أو المتحكم الصغري‪.‬‬
‫‪ ‬مرسل – مستقبل ‪.WiFi‬‬
‫‪ ‬وحدات اتصال تسلسلية ‪.UART, I2C, I2S, SPI, SDIO‬‬
‫‪ ‬وحدة توليد ‪.PWM‬‬
‫‪ ‬مبدل تشابهي رقمي ‪.ADC‬‬

‫‪121‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫لهذه الشريحة ‪ 17‬رجل دخل‪-‬خرج رقمية )‪ . General Purpose Input/Output (GPIO‬تستخدم‬
‫ستة أرجل منها لالتصال مع ذاكرة وميضية ‪ ،flash‬ويتبقى ‪ 11‬رجل‪.‬‬
‫أهم ما يميز شريحة ‪ ESP8266‬هو قدرتها على إجراء اتصال وفق بروتوكوالت شبكة ‪ ،WiFi‬بالتالي‬
‫إمكانية إجراء تطبيقات عديدة كالربط مع شبكة االنترنت‪ ،‬أو أن تعمل كمخدم صفحات ويب ‪Web‬‬
‫‪ ،server‬أو ربط الهاتف الخلوي معها وغير ذلك‪ ،‬لهذا ال عجب من القول بأن هذه الشريحة أصبحت‬
‫كوحدة إلنترنت األشياء )‪ Internet of Thing (IoT‬األكثر شعبية‪.‬‬

‫الشكل (‪ :)122‬شريحة ‪.ESP8266‬‬

‫يوضح الشكل (‪ )128‬مخططا صندوقيا للبينة الداخلية لشريحة ‪.ESP8266‬‬

‫الشكل (‪ :)128‬مخطط صندوقي يوضح البينة الداخلية لشريحة ‪.ESP8266‬‬

‫يلخص الجدول (‪ )24‬خواص شريحة ‪.ESP8266‬‬

‫‪121‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الجدول (‪ )24‬خواص شريحة ‪.ESP8266‬‬
‫القيمة‬ ‫الخاصية‬
‫‪Tensilica L106 32-bit micro controller‬‬ ‫وحدة المعالجة المركزية ‪CPU‬‬
‫‪ 80 MHz‬افتراضيا (يمكن أن تصل إلى ‪)160 MHz‬‬ ‫سرعة نبضات ساعة المعالج‬
‫‪64 KB of Boot ROM‬‬ ‫الذواكر‬
‫‪64 KB of instruction RAM‬‬
‫‪96 KB of data RAM‬‬
‫ال يوجد ذاكرة قابلة للبرمجة ‪ ،programmable ROM‬ولكن تستخدم‬
‫ذاكرة وميضية خارجية‪ .‬سعة الذاكرة نموذجيا ما بين ‪ 512KB‬إلى‬
‫‪( 4MB‬يمكن أن تصل إلى ‪.)16 MB‬‬
‫البروتوكوالت‪802.11 b/g/n :‬‬ ‫مزايا ‪WiFI‬‬
‫نمط العمل ‪.Station /Soft AP/Soft AP+Station :‬‬
‫السرية ‪.WEP, WPA, WPA2 or open networks :‬‬
‫التشفير‪WEP/TKIP/AES :‬‬
‫بروتوكوالت الشبكة‪IPv4, TCP/UDP/HTTP/FTP :‬‬
‫المجال الترددي‪2.4GHz ~ 2.5GHz :‬‬
‫استطاعة اإلرسال‪:‬‬
‫‪802.11 b: +20 dBm, 802.11 g: +17 dBm, 802.11 n: +14dBm‬‬
‫حساسية االستقبال‪:‬‬
‫‪802.11 b: -91dBm (11Mbps), 802.11 g: -75dbm (54Mbps),‬‬
‫)‪802.11 n: -72 dBm (MCS7‬‬
‫وحدات اتصال تسلسلية ‪.UART, I2C, I2S, SPI, SDIO‬‬ ‫الوحدات الملحقة‬
‫‪ 3‬وحدات توليد ‪.PWM‬‬
‫مبدل تشابهي رقمي ‪ ADC‬بدقة ‪ ،10 bit‬الجهد المرجعي للمبدل ‪.1V‬‬
‫‪ 16‬رجل‪ .‬تعمل هذه األرجل أيضا كوسائط لالتصال مع الوحدات‬ ‫عدد أرجل دخل‪-‬خرج رقمية‬
‫الملحقة المذكورة‪.‬‬ ‫‪GPIO‬‬
‫‪2.5V ~ 3.6V‬‬ ‫جهد العمل‬
‫القيمة المتوسط ‪.80 mA :‬‬ ‫تيار العمل‬
‫‪12 mA‬‬ ‫تيار الرجل الرقمية األعظمي‬
‫(مصدر – مصب)‬
‫‪PCB Trace, External, IPEX Connector, Ceramic Chip‬‬ ‫الهوائي‬
‫‪33 connection pads — 8 pads along each side and one‬‬ ‫عدد األرجل الكلي‬
‫‪large thermal/ground pad in the center.‬‬
‫‪5 mm × 5 mm‬‬ ‫أبعاد الشريحة‬

‫‪122‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3-15‬لوحات شريحة ‪ESP8266‬‬


‫يتم تثبيت شريحة ‪ ESP8266‬عادة ضمن لوحة مع عناصر الكترونية أخرى كذاكرة وميضية خارجية‪،‬‬
‫وهوائي على اللوحة‪ ،‬وكريستالة‪ ،‬وثنائيات ضوئية ومنافذ خرج وغير ذلك‪ .‬يوجد العديد من الشركات‬
‫المصنعة لهذه اللوحات مثل‪:‬‬
‫‪ ‬شركة ‪ : Espressif‬تقدم حاليا نموذجين من اللوحات ‪ ESP-WROOM-02‬و ‪ESP-WROOM-‬‬
‫‪.S2‬‬
‫‪ ‬شركة ‪ : Ai-Thinker‬تقدم لوحات توصف بشكل موجز ‪ .ESP-XX‬حاليا يوجد لوحات من‬
‫‪ ESP-01‬وحتى ‪ ESP-14‬موضحة في الشكل (‪.)129‬‬
‫‪ ‬شركة ‪ : Wireless-Tag‬تقدم لوحات ‪ WT8266-S1‬و ‪.WT8266-S2‬‬
‫يوجد أيضا لوحات مطورة ‪ development boards‬يتم فيها غالبا دمج شريحة ‪ ESP8266‬مع‬
‫محول ‪ USB-to-serial‬ومنظم جهد ‪ ،3.3V‬مثل لوحة ‪ NodeMCU Development Kits‬التي‬
‫تستخدم لوحات ‪ ، Ai-Thinker‬ولوحة ‪ Adafruit Feather HUZZAH‬التي تستخدم ‪Ai-Thinker‬‬
‫‪ ESP-12‬مع شريحة ‪.SiLabs CP2104 USB-to-serial‬‬

‫الشكل (‪ :)129‬نماذج للوحات شرحة ‪ ESP8266‬التابعة لشركة ‪ Ai-Thinker‬األكثر شهرة‪.‬‬

‫‪-4-15‬لوحة ‪ESP-01‬‬
‫يوضح الشكل (‪ )131‬العناصر التي تتكون منها لوحة ‪ ESP-01‬وهي‪:‬‬
‫‪ .1‬شريحة ‪ ESP8266‬التي تم شرحها سابقا في الفقرة (‪.)1-15‬‬

‫‪123‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ : BG25Q80A .2‬ذاكرة وميضية ‪ flash‬لتخزين البرنامج‪ ،‬حيث كما ذكرنا سابقا ال تحتوي‬
‫شريحة ‪ ESP8266‬على هذه الذاكرة لهذا تم إضافتها خارجيا‪.‬‬
‫‪ .3‬هوائي ‪ WiFi‬مدمج على اللوحة ‪.PCB‬‬
‫‪ .4‬ثنائيات ضوئية ‪ :LEDs‬ثنائي لونه أحمر لإلشارة إلى وجود تغذية للوحة‪ ،‬وثنائي لونه أزرق‬
‫يتصل مع الرجل ‪( TX‬أو الرجل الرقمية ذات الرقم ‪.)1‬‬
‫‪ .5‬أرجل ‪ :Pins‬التي من خاللها يتم وصل الطاقة للوحة والحساسات وإرسال البرنامج‪.‬‬

‫‪Antenna WiFi‬‬
‫‪LEDs‬‬
‫‪BG25Q80A‬‬
‫‪Memory flash‬‬
‫‪ESP8266‬‬

‫‪Pins‬‬

‫الشكل (‪ :)131‬لوحة ‪.ESP-01‬‬


‫للوحة ‪ ESP-01‬ثمانية أرجل ‪ ،pins‬لكل منها وظيفية محددة كما هو موضح في الشكل (‪.)131‬‬

‫الشكل (‪ :)131‬أرجل لوحة ‪.ESP-01‬‬

‫يبين الجدول (‪ )25‬وظيفية أرجل لوحة ‪.ESP-01‬‬

‫‪124‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫الجدول (‪ )25‬وظيفية أرجل لوحة ‪ESP-01‬‬
‫الوظيفة‬ ‫الرجل‬
‫أرضي‬ ‫‪GND‬‬
‫رجل دخل – خرج رقمية ذات الرقم ‪.2‬‬ ‫‪GPIO2‬‬
‫رجل دخل – خرج رقمية ذات الرقم ‪.1‬‬ ‫‪GPIO0‬‬
‫رجل استقبال اإلشارة التسلسلية وفق بروتوكول ‪ .UART‬تعمل عند جهد ‪.3.3V‬‬ ‫‪RXD‬‬
‫يمكن استخدامها كرجل دخل – خرج رقمية ذات الرقم ‪. 3‬‬
‫رجل إرسال اإلشارة التسلسلية وفق بروتوكول ‪ .UART‬تعمل عند جهد ‪ .3.3V‬يمكن‬ ‫‪TXD‬‬
‫استخدامها كرجل دخل – خرج رقمية ذات الرقم ‪. 1‬‬
‫لتشغيل أو إيقاف اللوحة‪ .‬عند تطبيق )‪ 0 V (LOW‬يتم إيقاف عمل اللوحة‪ ،‬وعند‬ ‫‪CH_PD‬‬
‫تطبيق )‪ 3.3 V (HIGH‬فإنها تعمل‪.‬‬
‫إعادة تشغيل للوحة‪ .‬إذا تم تطبيق )‪ 0 V (LOW‬يعاد تشغيل اللوحة‪.‬‬ ‫‪RESET‬‬
‫تغذية اللوحة‪ .‬يطبق جهد ‪ .3.3 V‬الجهد المسموح به ال يتجاوز ‪ .3.6 V‬يجب أن‬ ‫‪Vcc‬‬
‫يكون تيار التغذية أعلى من ‪.200 mA‬‬

‫‪-1-4-15‬أنماط عمل لوحة ‪ESP-01‬‬


‫يمكن أن تعمل لوحة ‪ ESP-01‬بإحدى األنماط التالية‪:‬‬
‫‪ ‬محطة ‪ : Station‬في هذه الحالة تتصل شريحة ‪ ESP8266‬مع نقطة وصول ‪ AP‬من خالل‬
‫شبكة ‪ WiFi‬التي أنشأتها ‪.AP‬‬
‫‪ ‬نقطة وصول لينة ‪ :Soft access point‬في هذه الحالة تنشئ شريحة ‪ ESP8266‬شبكة ‪WiFi‬‬
‫لتتصل األجهزة األخرى بها‪ .‬ال يوجد لشريحة ‪ ESP8266‬واجهة ارتباط مع شبكة سلكية‪ ،‬لهذا‬
‫تسمى نقطة الوصول باللينة ‪ .Soft‬يصل عدد األجهزة المتصلة مع ‪ soft-AP‬إلى ‪.5‬‬
‫‪ ‬محطة ‪ +‬نقطة وصول لينة ‪ :‬يستخدم هذا النمط عندما يتم إعداد شريحة ‪ ESP8266‬لتعمل‬
‫في شبكة تشعبية ‪.mesh network‬‬

‫الشكل (‪ :)132‬تعمل شريحة ‪ ESP8266‬في نمط المحطة ‪.STA‬‬

‫‪125‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)133‬تعمل شريحة ‪ ESP8266‬في نمط نقطة وصول ‪.AP‬‬

‫الشكل (‪ :)134‬تعمل شريحة ‪ ESP8266‬كزبون ‪.client‬‬

‫الشكل (‪ :)135‬تعمل شريحة ‪ ESP8266‬كمخدم ‪.server‬‬

‫‪126‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-5-15‬برمجة لوحة ‪ESP8266‬‬


‫يمكن برمجة لوحة ‪ ESP8266‬بثالث طرق مختلفة‪:‬‬
‫‪ ‬من خالل أرجل االتصال التسلسلية )‪ (TX,RX‬مع استخدام بيئة تطوير األردوينو ‪Arduino‬‬
‫‪.IDE‬‬
‫‪ ‬من خالل أرجل االتصال التسلسلية )‪ (TX, RX‬مع استخدام أوامر ‪.AT‬‬
‫‪ ‬السلكيا عبر الهواء )‪.over the Air (OTA‬‬

‫‪-1-5-15‬برمجة لوحة ‪ ESP8266‬من خالل بيئة تطوير األردوينو ‪.Arduino IDE‬‬


‫يمكن استخدام أوامر ومكتبات بيئة التطوير ‪ Arduino IDE‬التي تعلمناها سابقا لبرمجة لوحة‬
‫‪ ،ESP8266‬ولكن ال بد من تنصيب نواة أردوينو لشريحة ‪ ESP8266‬على المراحل التالية‪:‬‬
‫‪ -1‬نفتح نافذة بيئة التطوير ونختار من قائمة األدوات ‪ File‬ومن ثم نختار ‪ Preferences‬كما هو‬
‫موضح في الشكل التالي‪.‬‬

‫‪ -2‬نكتب في الحقل ‪ Additional Board Manager URLs‬العبارة التالية ‪:‬‬


‫‪http://arduino.esp8266.com/stable/package_esp8266com_index.json‬‬

‫‪122‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3‬نختار من قائمة األدوات ‪ Tools‬ومن ثم نختار ‪ Boards‬ومنها ‪Boards Manager‬‬

‫‪128‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪-4‬نكتب في األعلى ‪ ،ESP8266‬ومن ثم نضغط ‪ Install‬كما هو موضح في الشكل‪ .‬يتم تحميل‬
‫الحزمة من االنترنت‪ ،‬وهي حوالي ‪.250 Mbytes‬‬

‫بعد تحميل الحزمة نختار من قائمة األدوات ‪ Tools‬ومن ثم ‪ boards‬ونختار المنصة ‪Generic‬‬
‫‪ .ESP8266 Module‬بذلك تكون بيئة ‪ Arduino IDE‬جاهزة لالستخدام لبرمجة لوحة ‪.ESP8266‬‬

‫‪-1-1-5-15‬مراحل البرمجة‬
‫‪ -1‬في البداية نقوم بوصول لوحة ‪ ESP8266‬مع محول ‪ USB-UART‬كما هو موضح في الشكل‬
‫(‪ .)135‬تم وصل رجل إرسال وحدة ‪ (TXD) ESP8266‬مع رجل استقبال لوحة شريحة ‪FT232R‬‬
‫بشكل مباشر‪ .‬عند استخدام لوحة شريحة ‪ FT232R‬التي تحوي على مفتاح يبدل مستوى إشارة‬
‫‪ UART-TTL‬من ‪ 5V‬إلى ‪ 3.3V‬يمكن عندئذ وصل رجل استقبال وحدة ‪ (RXD) ESP8266‬مع رجل‬

‫‪129‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫إرسال لوحة شريحة ‪ FT232R‬بشكل مباشر كما في الشكل (‪ .)136‬إذا لم تكن تحتوي هذا المفتاح‬
‫البد من استخدام مقاومتين على التسلسل قيمتهما مثال ‪ 1KΩ , 2KΩ‬بحيث يتم تحويل مستوى جهد‬
‫الواحد المنطقي )‪ (+5V‬لرجل إرسال لوحة ‪ FT232R‬إلى مستوى جهد الواحد المنطقي للوحة‬
‫‪ .(+3.3V) ESP8266‬تم إضافة منظم جهد ‪ (LM1117 3.3) 3.3 V‬لتغذية اللوحة )‪ .(Vcc‬رجل ‪GND‬‬
‫للوحة تم وصلها مع األرضي‪ .‬تم وصل رجل إعادة التشغيل ‪ RESET‬مع مفتاح دائم ‪ S1‬موصول إلى‬
‫األرضي‪ .‬تم أيضا وصل الرجل ‪ GPIO0‬مع مفتاح دائم ‪ S2‬موصول إلى األرضي من دون استخدام‬
‫لمقاومة خارجية‪ ،‬حيث تتضمن اللوحة داخليا على مقاومة سحب إلى ‪.3.3 V‬‬

‫‪S2‬‬ ‫‪S1‬‬

‫الشكل (‪ :)136‬الدارة المستخدمة لتحميل برنامج للوحة ‪ ESP-01‬عن طريق محول ‪.USB-Serial‬‬

‫بنفس الطريقة يمكن استخدام لوحة أردوينو لتعمل كمحول ‪ USB-Serial‬كما هو موضح في الشكل‬
‫(‪ ،)132‬ولكن نصل منفذ ‪ Reset‬إلى األرضي بحيث نلغي عمل المتحكم الصغري ‪Atmega328‬‬
‫الرئيسي‪ ،‬أيضا نستخدم مقاومتين على التسلسل لتخفيض الجهد المرسل من لوحة األردوينو من‬
‫‪ +5V‬إلى ‪.3.3V‬‬

‫‪131‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪S2‬‬ ‫‪S1‬‬

‫الشكل (‪ :)132‬الدارة المستخدمة لتحميل برنامج للوحة ‪ ESP-01‬عن طريق لوحة أردوينو‪.‬‬

‫‪-2‬نقوم بوصول المحول ‪ USB-UART‬أو لوحة األردوينو إلى منفذ ‪ USB‬للحاسب‪.‬‬


‫‪ -3‬نضغط على المفتاحين‪ ،S2 ،S1‬أي سيتم وصل الرجلين ‪ RESET‬و ‪ GPIO0‬لألرضي‪.‬‬
‫‪-4‬نقوم بتحرير المفتاح ‪ ، S1‬أي وصل الرجل ‪ RESET‬إلى ‪ .3.3 V‬بهذا نكون قد أدخلنا وحدة‬
‫‪ ESP8266‬في نمط تحميل البرنامج‪.‬‬
‫‪ -2‬نفتح نافذة ‪ ،Arduino IDE‬ونكتب البرنامج المطلوب‪ .‬نختار المنفذ الصحيح لمحول ‪UART-USB‬‬
‫أو لوحة األردوينو ‪ ،‬ونضغط على تحميل ‪ Upload‬بشكل مشابه لتحميل برنامج إلى األردوينو‪ ،‬ليتم‬
‫برمجة لوحة ‪.ESP8266‬‬

‫الشكل (‪ : )138‬تحميل كود برمجي بلغة ‪ Arduino IDE‬إلى شريحة ‪.ESO8266‬‬

‫‪131‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-2-1-5-15‬تعليمات الدخل والخرج الرقمية ‪ Digital IO‬والتأخير الزمني‬


‫الشرح‬ ‫التعليمة‬
‫تستخدم هذه التعليمة لتحديد رجل معينة كدخل أو خرج‪ ،‬أو دخل مع‬ ‫)‪pinMode(pin,mode‬‬
‫تفعيل لمقاومة السحب الداخلية‪.‬‬
‫‪ :Pin‬رقم الرجل المطلوب ضبط نمطها‪ : .‬تأخذ إحدى القيم التالية‬
‫‪ INPUT_PULLUP، OUTPUT،INPUT‬لتحديد نمط الرجل دخل‪ ،‬خرج‪،‬‬
‫دخل مع تفعيل مقاومة السحب‪.‬‬
‫يتم من خالل هذه التعليمة إخراج ‪ 1‬منطقي‪ ،‬أو ‪ 0‬منطقي على رجل‬ ‫)‪digitalWrite(pin,value‬‬
‫محددة‪ .‬جهد ‪ 1‬منطقي ‪ ، +3.3V‬وجهد ‪ 0‬منطقي ‪.0V‬‬
‫‪ :Pin‬رقم الرجل المطلوب اإلخراج عليها‪.‬‬
‫‪ :value‬تأخذ إحدى القيمتين التاليتين‪.HIGH ،LOW :‬‬
‫يتم من خالل هذه التعليمة قراءة حالة رجل محددة وتعيد إحدى‬ ‫)‪digitalRead(pin‬‬
‫‪ HIGH‬أو ‪.LOW‬‬ ‫القيمتين التاليتين‬
‫إيقاف تنفيذ البرنامج بشكل مؤقت ولفترة زمنية محددة ‪value‬‬ ‫;)‪delay(value‬‬
‫بواحدة الميلي ثاني‪.‬‬
‫إيقاف تنفيذ البرنامج بشكل مؤقت ولفترة زمنية محددة ‪value‬‬ ‫;)‪delaymicroseconds(value‬‬
‫بواحدة الميكرو ثاني‪.‬‬

‫مثال‪:‬‬
‫{() ‪void setup‬‬
‫;)‪pinMode(2, OUTPUT‬‬
‫}‬

‫{() ‪void loop‬‬


‫;)‪digitalWrite(2, LOW‬‬
‫;)‪delay(1000‬‬
‫;)‪digitalWrite(2, HIGH‬‬
‫;)‪delay(1000‬‬
‫}‬

‫‪-3-1-5-15‬تعليمات االتصال التسلسلي ‪UART‬‬


‫الوظيفة‬ ‫التعلمية‬
‫تعيد هذه التعليمة عدد البايتات (الحروف) المستقبلة والمخزنة في ذاكرة‬ ‫)(‪Serial.available‬‬
‫االستقبال التسلسلية والجاهزة للقراءة‪.‬‬
‫تستخدم هذه التعليمة لتحديد معدل اإلرسال من خالل البارامتر ‪.speed‬‬ ‫)‪Serial.begin(speed‬‬
‫‪132‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫تسمح هذه التعليمة بإرسال معطيات على المنفذ التسلسلي على شكل‬ ‫)‪Serial.print(val‬‬
‫نص ‪ ASCII‬من خالل البارامتر ‪ .val‬يأخذ البارامتر ‪ val‬أي نمط من‬
‫المعطيات (أرقام أو حروف) وكلها ترسل على شكل ‪.ASCII‬‬
‫نفس وظيفة التعليمة السابقة‪ ،‬ولكن يتبع النص التسلسلي برمز عودة‬ ‫)‪Serial.println(val‬‬
‫النقل )'‪ ،(ASCII 13 or '\r‬ورمز السطر الجديد )'‪(ASCII 10 or '\n‬‬
‫يتم قراءة البايت األول للمعطيات التسلسلية القادمة والمتاحة‪.‬‬ ‫)(‪Serial.read‬‬
‫تعمل على قراءة سلسلة الرموز الموجودة من الذاكرة التسلسلية‪ .‬تنتهي‬ ‫)(‪Serial.readString‬‬
‫هذه الوظيفية في حالة انتهاء المهلة (تحددها التعليمة ‪setTimeout‬‬
‫ومدة المهلة افتراضيا ثانية)‪.‬‬

‫مالحظة ‪ :‬يمكن استخدام بقية تعليمات االتصال التسلسلي ‪ UART‬الموضحة سابقا ‪.‬‬
‫مثال‪:‬‬
‫{ )(‪void setup‬‬
‫;)‪Serial.begin(9600‬‬
‫;)‪delay(100‬‬
‫;)"‪Serial.println("Hello World‬‬
‫}‬

‫{ )(‪void loop‬‬
‫;‪String data‬‬
‫)‪if (Serial.available() > 0‬‬
‫{‬
‫;)(‪data = Serial.readString‬‬
‫;)‪Serial.println(data‬‬
‫}‬
‫}‬

‫‪-4-1-5-15‬تعليمات مكتبة ‪WiFi‬‬


‫الوظيفة‬ ‫التعلمية‬
‫حيث ‪ mode‬تأخذ إحدى‬ ‫تحديد نمط عمل شريحة ‪.ESP8266‬‬ ‫)‪WiFi.mode(mode‬‬
‫القيم التالية‪:‬‬
‫‪WIFI_AP, WIFI_STA , WIFI_AP_STA , WIFI_OFF‬‬
‫إلعداد شبكة مفتوحة لشريحة ‪ .ESP8266‬حيث ‪ :ssid‬اسم‬ ‫)‪WiFi.softAP(ssid‬‬
‫شبكة ‪.WiFi‬‬
‫إلعداد شبكة محمية ‪ WPA2-PSK‬لشريحة ‪ .ESP8266‬حيث‪:‬‬ ‫)‪WiFi.softAP(ssid, password‬‬
‫‪ :ssid‬اسم شبكة ‪ :Pass .WiFi‬كلمة السر التي ال يجب أن تقل‬
‫عن ‪ 8‬حروف‪.‬‬
‫إدخال اسم شبكة ‪ WiFi‬مفتوحة‪ ،‬لالتصال معها‪.‬‬ ‫;)‪WiFi.begin(ssid‬‬
‫‪133‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫إدخال اسم شبكة ‪ WiFi‬محمية ‪ ،WPA2-PSK‬و وكلمة سر‪.‬‬ ‫;)‪WiFi.begin(ssid, pass‬‬
‫قطع االتصال مع شبكة ‪.WiFi‬‬ ‫;)(‪WiFi.disconnect‬‬
‫إدخال إعدادت الشبكة يدويا ‪ :‬عنوان ‪ ،ip‬تغيير ‪ ،DNS‬تغيير عنوان‬ ‫;)‪WiFi.config(ip‬‬
‫;)‪WiFi.config(ip, dns‬‬
‫البوابة ‪ ،gateway‬تغيير عنوان الشبكة الفرعية ‪ .subnet‬إذا‬
‫‪WiFi.config(ip, dns,‬‬
‫استخدمت التعليمة )(‪ WiFi.begin‬فقط‪ ،‬من دون هذه التعليمة‬ ‫;)‪gateway‬‬
‫سيتم إعداد الشبكة تلقائيا‪.‬‬
‫تعيد اسم الشبكة ‪ SSID‬لنقطة الوصول‪ .‬حيث‬ ‫)(‪WiFi.SSID‬‬
‫)‪WiFi.SSID(wifiAccessPoint‬‬
‫‪ wifiAccessPoint‬رقم نقطة الوصول‪.‬‬
‫تعيد عنوان ‪ MAC‬لجهاز الموجه ‪ router‬المتصل معه‪.‬‬ ‫;)‪WiFi.BSSID(bssid‬‬
‫تعيد قوة إشارة اتصال الموجه ‪ router‬المستقبلة بواحدة‬ ‫;)(‪WiFi.RSSI‬‬
‫‪.dBm‬‬
‫;)‪WiFi.RSSI(wifiAccessPoint‬‬
‫تعيد نمط تشفير الشبكة الحالية‪.‬‬
‫;)(‪WiFi.encryptionType‬‬
‫‪TKIP (WPA) = 2 , CCMP (WPA) = 4 , WEP = 5 , NONE = WiFi.encryptionType(wifiAcc‬‬
‫‪7 , AUTO = 8‬‬ ‫;)‪essPoint‬‬
‫تعيد عدد شبكات ‪ WiFI‬المتاحة‪.‬‬ ‫;)(‪WiFi.scanNetworks‬‬
‫تعيد حالة االتصال‪:‬‬ ‫;)(‪WiFi.status‬‬
‫‪WL_CONNECTED, WL_IDLE_STATUS,‬‬
‫‪WL_NO_SSID_AVAIL, WL_CONNECTION_LOST,‬‬
‫‪WL_DISCONNECTED…..‬‬
‫تعيد عنوان ‪ IP‬لنقطة الوصول ‪.ESP8266‬‬ ‫)(‪WiFi.softAPIP‬‬
‫تعيد عنوان ‪ IP‬للمحطة ‪.ESP8266‬‬ ‫;)(‪WiFi.localIP‬‬
‫تعيد عنوان ‪ MAC‬للمحطة ‪. ESP8266‬‬ ‫;)‪WiFi.macAddress(mac‬‬

‫‪-5-1-5-15‬تعليمات مكتبة ‪Server‬‬


‫الوظيفة‬ ‫التعلمية‬
‫إنشاء مخدم مع منفذ ‪ port‬يستمع من خالله‪.‬‬ ‫;)‪Server(port‬‬
‫للبدء باالستماع للرزم الواردة‪.‬‬ ‫)(‪server.begin‬‬
‫كتابة بيانات ‪ data‬إلى كل الزبائن المتصلة مع المخدم‪.‬‬ ‫)‪server.write(data‬‬
‫كتابة بيانات ‪ data‬إلى كل الزبائن المتصلة مع المخدم‪ .‬يتم إرسال العدد‬ ‫)‪server.print(data‬‬
‫على شكل سلسلة من األرقام‪ ،‬كل منها يرسل على شكل رمز أسكي‪ .‬مثال‬
‫يرسل العدد ‪ 123‬على شكل ثالثة رموز '‪.'1', '2', '3‬‬
‫نفس تعليمة )‪ server.print(data‬مع إرسال رمز عودة النقل ‪(ASCII 13‬‬ ‫)‪server.println(data‬‬
‫)'‪ ،or '\r‬ورمز السطر الجديد )'‪(ASCII 10 or '\n‬‬

‫‪134‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-6-1-5-15‬تعليمات مكتبة ‪Client‬‬


‫الوظيفة‬ ‫التعلمية‬
‫محددين وفق‬ ‫إنشاء زبون يمكن له االتصال مع عنوان ‪ IP‬ومنفذ ‪port‬‬ ‫)(‪WiFiClient‬‬
‫التعليمة )‪client.connect(ip, port‬‬
‫للبدء باالستماع للرزم الواردة‪.‬‬ ‫)(‪client.begin‬‬
‫لمعرفة إذا كان البون متصال أم ال‪ .‬أي أنها تعيد ‪ true‬أو ‪.false‬‬ ‫)(‪client.connected‬‬
‫االتصال بعنوان ‪ ip‬ومنفذ ‪ port‬محددين‪ .‬تعيد ‪ true‬في حال نجاح االتصال‪.‬‬ ‫‪client.connect(ip,‬‬
‫)‪port‬‬
‫يدعم التعليمة عمليات بحث نظام أسماء النطاقات ‪ DNS‬عند استخدام اسم‬
‫نطاق (على سبيل المثال‪.)google.com :‬‬
‫كتابة بيانات ‪ data‬إلى المخدم المتصل مع الزبون‪.‬‬ ‫)‪client.write(data‬‬
‫كتابة بيانات ‪ data‬إلى المخدم المتصل مع الزبون‪ .‬يتم إرسال العدد على شكل‬ ‫)‪client.print(data‬‬
‫سلسلة من األرقام‪ ،‬كل منها يرسل على شكل رمز أسكي‪ .‬مثال يرسل العدد‬
‫‪ 123‬على شكل ثالثة رموز '‪.'1', '2', '3‬‬
‫‪ client.println(data‬نفس تعليمة )‪ client.print(data‬مع إرسال رمز عودة النقل ‪(ASCII 13 or‬‬
‫)‬
‫)'‪ ،'\r‬ورمز السطر الجديد )'‪(ASCII 10 or '\n‬‬
‫تعيد عدد البايتات المتوفرة للقراءة (أي مقدار البيانات التي تم كتابتها إلى‬ ‫)(‪client.available‬‬
‫البزيون بواسطة الخادم المتصل به)‪.‬‬
‫يتم قراءة البايت التالي المستقبل من الخادم الذي يتصل معه الزبون (بعد آخر‬ ‫)(‪client.read‬‬
‫استدعاء للقراءة)‪ .‬في حال عدم وجود بايت تالي تعيد ‪.-1‬‬
‫تجاهل أي بايتات تم كتابتها إلى الزبون ولكن لم تقرأ بعد‪.‬‬ ‫)(‪client.flush‬‬
‫قطع االتصال مع المخدم‪.‬‬ ‫)(‪client.stop‬‬

‫‪-7-1-5-15‬تطبيقات عملية‬
‫شريحة ‪ ESP8266‬كنقطة وصول ‪ AP‬ومخدم ‪Web‬‬
‫لجعل شريحة ‪ ESP8266‬تعمل كمخدم ‪ Web‬يوجد طريقتان لتنفيذ ذلك‪ :‬إما أن يتم جعلها أيضا‬
‫كنقطة وصول وهو ما سننجزه في هذا المثال‪ ،‬أو أن يتم وصلها مع موجه ‪.WiFi‬‬
‫نحتاج إلجراء البرمجة إلى المكتبات التالية‪.‬‬
‫‪ : ESP8266WiFi.h‬مطلوبة إلنجاز كل الوظائف المرتبطة بشبكة ‪ WiFi‬مثل االتصال‪ ،‬إنشاء نقطة‬
‫وصول‪....‬الخ‪.‬‬
‫‪ : WiFiClient.h‬مطلوبة إلرسال طلب إلى متصفح ‪.Web‬‬
‫‪ : ESP8266WebServer.h‬تتعامل مع بروتوكوالت ‪.HTTP‬‬

‫‪135‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫فيما يلي الكود البرمجي الذي من خالله ستظهر كلمة ‪ hello‬على متصفح االنترنت‪:‬‬
‫>‪#include <ESP8266WiFi.h‬‬
‫>‪#include <WiFiClient.h‬‬
‫>‪#include <ESP8266WebServer.h‬‬

‫ندخل هنا اسم الشبكة وكلمة السر‪//‬‬


‫;"‪const char* ssid = "ESPWebServer‬‬
‫;"‪const char* password = "12345678‬‬

‫‪ESP8266WebServer server(80); //Server on port 80‬‬

‫‪ //‬نكتب هنا صفحة االنترنت المطلوب عرضها باستخدام لغة ‪html‬‬


‫{ )(‪void handleRoot‬‬
‫;">‪String web_page = "<H1>hello from esp8266!</H1‬‬
‫;)‪server.send(200, "text/html", web_page‬‬
‫)‪//Code 211 corresponds to the “OK” response (The request has succeeded.‬‬
‫}‬

‫{ )‪void setup(void‬‬
‫;)‪WiFi.mode(WIFI_AP‬‬ ‫‪//Only Access point‬‬
‫;)‪WiFi.softAP(ssid, password‬‬
‫‪server.on("/", handleRoot); // this is root location (192.168.4.1),‬‬
‫;)(‪server.begin‬‬ ‫‪//Start server‬‬
‫}‬

‫{ )‪void loop(void‬‬
‫;)(‪server.handleClient‬‬ ‫‪//Handle client requests‬‬
‫}‬

‫باستخدام الهاتف الخلوي أو حاسوب نبحث في الشبكة الالسلكية ‪ WiFi‬عن شبكة‬


‫‪ ،ESPWebServer‬نتصل معها وندخل كلمة السر ‪ .12345678‬نفتح متصفح وندخل ‪ IP‬التالي ‪:‬‬
‫‪ ، 192.168.4.1‬لتظهر كلمة !‪.hello from esp8266‬‬
‫البد من تعلم كيفية بناء صفحة انترنت باستخدام لغة ‪.html‬‬

‫فيما يلي كود برمجي آخر الذي من خالله سيظهر زرين ‪ ON , OFF‬على متصفح االنترنت‬
‫عندما يتم االتصال مع شريحة ‪ ESP8266‬وطلب ‪ ip‬في المتصفح ‪ .192.168.4.1‬عند الضغط على‬
‫زر ‪ ON‬سيعمل الثنائي الضوئي المتصل مع الرجل ‪ ،0‬وعند الضغط على زر ‪ OFF‬سينطفئ الثنائي‬
‫الضوئي المتصل مع الرجل ‪. 0‬‬

‫‪136‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

html ‫ نكتب هنا صفحة االنترنت المطلوب عرضها باستخدام لغة‬//


const char MAIN_page[] PROGMEM = R"=====(
<HTML>
<BODY>

<FORM method="post" action="/form">

<INPUT TYPE=SUBMIT VALUE="ON1" name=submit>


<INPUT TYPE=SUBMIT VALUE="OFF1" name=submit>

<H1>@@L1@@</TD></H1>

</BODY>
</HTML>
)=====";

//‫ندخل هنا اسم الشبكة وكلمة السر‬


const char* ssid = "ESPWebServer";
const char* password = "12345678";
String L1Status;

ESP8266WebServer server(80); //Server on port 80

// This rutine is exicuted when you open its IP in browser


void handleRoot() {
String s = MAIN_page;
s.replace("@@L1@@", L1Status);
server.send(200, "text/html", s);
}

void handleForm() {
String t_state = server.arg("submit");

//Change Load-1 State as per request


if(t_state=="ON1")
{
L1Status="ON";
digitalWrite(0, HIGH); //Load1 Turned on
}

132
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
if(t_state=="OFF1")
{
L1Status="OFF";
digitalWrite(0, LOW); //Load1 Turned off
}

server.sendHeader("Location", "/");
server.send(302, "text/plain", "Updated-- Press Back Button"); //This Line Keeps It
on Same Page

delay(500);
}

void setup(void) {
pinMode(0,OUTPUT);
WiFi.mode(WIFI_AP); //Only Access point
WiFi.softAP(ssid, password); //Start HOTspot removing password will disable
security
server.on("/", handleRoot); // this is root location (192.168.4.1),
server.on("/form", handleForm);
server.begin(); //Start server
}

void loop(void) {
server.handleClient(); //Handle client requests
}

.html ‫البد من تعلم كيفية بناء صفحة انترنت باستخدام لغة‬

Web ‫ كمحطة ومخدم‬ESP8266 ‫شريحة‬


‫ الذي‬router ‫ تعمل كمحطة تتصل مع جهاز‬ESP8266 ‫في هذا التطبيق سنجعل شريحة‬
‫ نقوم بضبط‬.Web ‫ في نفس الوقت تعمل الشريحة كمخدم‬.‫يتصل بدوره مع شبكة االنترنت العالمية‬
‫ جهاز‬ip ‫ بحيث عندما يتم طلب‬،)1( ‫ كما هو موضح في الملحق‬router ‫بعض اإلعدادات في الموجه‬
‫ ضمن شبكة االنترنت وذلك في أي متصفح من العالم سيتم الدخول إلى الشريحة وعرض‬router
‫ يمكن تعميم هذا التطبيق إلنجاز تطبيقات احترافية أكثر مثل عرض درجة‬.‫ على المتصفح‬hello ‫كلمة‬
‫ وتشغيل و إطفاء أجهزة اإلنارة وغيرها في أي مكان من العالم عن‬،‫الحرارة والرطوبة وإصدار تنبيه‬
.‫طريق شبكة االنترنت‬
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

138
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫ندخل هنا اسم الموجه لديك وكلمة السر‪//‬‬
‫;"‪const char* ssid = "your_router_name‬‬
‫;"‪const char* password = " your_router_password‬‬

‫‪ESP8266WebServer server(80); //Server on port 80‬‬


‫‪ //‬نكتب هنا صفحة االنترنت المطلوب عرضها باستخدام لغة ‪html‬‬
‫{ )(‪void handleRoot‬‬
‫;">‪String web_page = "<H1>hello from esp8266!</H1‬‬
‫;)‪server.send(200, "text/html", web_page‬‬
‫)‪//Code 211 corresponds to the “OK” response (The request has succeeded.‬‬
‫}‬

‫{ )‪void setup(void‬‬
‫;)‪WiFi.mode(WIFI_STA‬‬
‫;)‪WiFi.begin(ssid, password‬‬
‫{ )‪while (WiFi.status() != WL_CONNECTED‬‬
‫};)‪delay(500‬‬
‫‪server.on("/", handleRoot); // this is root location (192.168.4.1),‬‬
‫;)(‪server.begin‬‬ ‫‪//Start server‬‬
‫}‬

‫{ )‪void loop(void‬‬
‫;)(‪server.handleClient‬‬ ‫‪//Handle client requests‬‬
‫}‬

‫‪-2-5-15‬برمجة لوحة ‪ ESP8266‬من خالل استخدام أوامر ‪.AT‬‬


‫تأتي شريحة ‪ ESP8266‬محمل عليها افتراضيا برنامج ‪ firmware‬يسمح بتنفيذ أوامر محددة تدعى‬
‫‪ .AT commands‬يتم إرسال أوامر ‪ AT‬إلى الشريحة واستقبال الردود منها من خالل أرجل االتصال‬
‫التسلسلية )‪ ،(TX, RX‬لذلك يمكن استخدام الحاسب أو لوحة األردوينو إلرسالها‪ .‬يبين الجدول (‪)26‬‬
‫أوامر ‪ AT‬والردود عليها‪.‬‬
‫الجدول (‪ )26‬أوامر ‪ AT‬والردود عليها‪.‬‬
‫الشرح‬ ‫االستجابة‬ ‫صيغة األمر‬
‫يستخدم هذا األمر الختبار االتصال‪.‬‬ ‫‪OK‬‬ ‫‪AT‬‬
‫يستخدم هذا األمر إلعادة تشغيل الوحدة‪.‬‬ ‫‪……..‬‬ ‫‪AT+RST‬‬
‫يستخدم هذا األمر لمعرفة إصدار برنامج ‪.firmware‬‬ ‫‪version, OK‬‬ ‫‪AT+GMR‬‬
‫حيث البارامتر ‪ version‬في رسالة االستجابة هو‬
‫رقم اإلصدار‪.‬‬
‫منع الصدى (عدم إعادة إرسال األمر المستقبل)‪.‬‬ ‫‪OK‬‬ ‫‪ATE0‬‬
‫تفعيل الصدى (إعادة إرسال األمر المستقبل قبل‬ ‫‪OK‬‬ ‫‪ATE1‬‬
‫رسالة اإلجابة)‪.‬‬

‫‪139‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫معرفة األنماط المسموح بها للعمل‪.‬‬ ‫)‪+CWMODE:(1-3‬‬ ‫?=‪AT+CWMODE‬‬
‫‪OK‬‬
‫معرفة نمط ‪ WiFi‬الحالي لشريحة ‪ .ESP8266‬يحدد‬ ‫‪+CWMODE:mode‬‬ ‫?‪AT+CWMODE‬‬
‫‪OK‬‬
‫البارامتر ‪ mode‬في رسالة اإلجابة النمط كما يلي‪:‬‬
‫)‪1 = Station mode (client‬‬
‫)‪2 = AP mode (host‬‬
‫‪3 = AP + Station mode‬‬
‫ضبط شريحة ‪ ESP8266‬لتعمل وفق نمط محدد‪.‬‬ ‫‪AT+CWMODE=mode‬‬
‫يحدد البارامتر ‪ mode‬في رسالة األمر النمط كما‬
‫يلي‪:‬‬
‫)‪1 = Station mode (client‬‬
‫)‪2 = AP mode (host‬‬
‫‪3 = AP + Station mode‬‬
‫أمر لشريحة ‪ ESP8266‬باالتصال بنقطة وصول‬ ‫‪OK‬‬
‫‪AT+ CWJAP=ssid,pwd‬‬
‫محددة‪ .‬حيث البارامترين ‪ SSID‬و ‪ pwd‬هما اسم‬
‫الشبكة وكلمة السر لنقطة الوصول‪ .‬مثال على‬
‫األمر‪:‬‬
‫"‪AT+CWJAP="my-test-wifi","1234test‬‬
‫معرفة ‪ SSID‬لنقطة الوصول ‪ AP‬التي اتصلت معها‬ ‫‪+ CWJAP:ssid‬‬ ‫?‪AT+CWJAP‬‬
‫‪OK‬‬
‫شريحة ‪ .ESP8266‬مثال على رد اإلجابة‪:‬‬
‫"‪+CWJAP:"my-test-wifi‬‬
‫معرفة نقاط الوصول المتاحة‪ .‬تتضمن رسالة الرد‬ ‫‪AT+CWLAP‬‬
‫البارامترات التالية‪:‬‬ ‫‪AT+CWLAP:ecn,ssi‬‬
‫‪d,rssi,mac‬‬
‫‪ :Ecn‬طريقة التشفير‪:‬‬
‫‪OK‬‬
‫‪0 = OPEN‬‬
‫‪1 = WEP‬‬
‫‪2 = WPA_PSK‬‬
‫‪3 = WPA2_PSK‬‬
‫‪4 = WPA_WPA2_PSK‬‬
‫‪ :SSID‬اسم الشبكة الالسلكية‪.‬‬
‫‪ :Rssi‬قوة اإلشارة‪.‬‬
‫‪ :Mac‬عنوان ‪MAC‬‬
‫البحث عن نقاط الوصول التي لها خواص محدد‬ ‫‪+CWLAP:ecn,ssid,r‬‬ ‫‪AT+CWLAP=ssid,mac‬‬
‫‪.ssid,mac,ch‬‬
‫‪ssi,mac,ch‬‬ ‫‪,ch‬‬
‫‪OK‬‬
‫مثال على أمر‪:‬‬
‫‪AT+CWLAP="abc","20:cf:30:ce:60:fe",11‬‬
‫والرد مثال‪:‬‬
‫‪+CWLAP:(3,"abc",-‬‬
‫)‪53,"20:cf:30:ce:60:fe",11‬‬
‫‪141‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫قطع االتصال مع نقطة الوصول ‪ AP‬التي تتصل‬ ‫‪OK‬‬ ‫‪AT+CWQAP‬‬
‫معها شريحة ‪.ESP8266‬‬
‫‪ +CWSAP:ssid,pwd,c‬معرفة بارامترات إعدادات نقطة الوصول ‪ESP8266‬‬
‫‪h,ecn‬‬ ‫?‪AT+ CWSAP‬‬
‫‪ . softAP‬مثال على رسالة الرد‪:‬‬
‫‪OK‬‬
‫‪+CWSAP:"esp_123","1234test",5,3‬‬
‫ضبط إعدادات نمط نقطة الوصول ‪ESP8266‬‬ ‫‪OK‬‬ ‫‪AT+CWSAP=ssid,pwd‬‬
‫‪,ch,ecn‬‬
‫‪ .softAP‬مثال على رسالة األمر‪:‬‬
‫‪AT+CWSAP="esp_123","1234test",5,3‬‬
‫معرفة عناوين ‪ IP‬للمحطات التي تتصل بها نقطة‬ ‫]‪[ip,MAC‬‬ ‫‪AT+CWLIF‬‬
‫‪OK‬‬
‫الوصول ‪ . ESP8266‬مثال على رسالة رد‪:‬‬
‫‪192.168.4.100,c0:ee:fb:25:33:ec‬‬

‫تفعيل أو عدم تفعيل ‪ DHCP‬للمنط المحدد حيث‬ ‫‪OK‬‬ ‫‪AT+CWDHCP=mode,e‬‬


‫‪n‬‬
‫البارامتر ‪:mode‬‬
‫‪0 : set ESP8266 as a softAP‬‬
‫‪1 : set ESP8266 as a station‬‬
‫‪2 : set both ESP8266 to both softAP and a‬‬
‫‪station‬‬
‫البارامتر ‪: en‬‬
‫‪0 : Enable DHCP‬‬
‫‪1 : Disable DHCP‬‬
‫الحصول على عنوان ‪ MAC‬لمحطة ‪ESP8266‬‬ ‫‪+CIPSTAMAC:macO‬‬ ‫?‪AT+CIPSTAMAC‬‬
‫‪K‬‬
‫الحالية‪.‬‬
‫تحديد عنوان ‪ MAC‬لمحطة ‪.ESP8266‬‬ ‫‪OK‬‬ ‫‪AT+CIPSTAMAC=mac‬‬
‫مثال على رسالة أمر‪:‬‬
‫"‪AT+CIPSTAMAC="18:aa:35:97:d4:7b‬‬
‫الحصول على عنوان ‪ MAC‬لنقطة وصول ‪ESP8266‬‬ ‫‪+CIPAPMAC:mac‬‬ ‫?‪AT+CIPAPMAC‬‬
‫‪OK‬‬
‫الحالية‪.‬‬
‫تحديد عنوان ‪ MAC‬لنقطة وصول ‪ .ESP8266‬مثال‬ ‫‪OK‬‬ ‫‪AT+CIPAPMAC=mac‬‬
‫على رسالة أمر‪:‬‬
‫”‪AT+CIPAPMAC=”2c:aa:35:92:d4:2b‬‬
‫الحصول على عنوان ‪ IP‬للمحطة ‪.ESP8266‬‬ ‫‪+CIPSTA:ip‬‬ ‫?‪AT+CIPSTA‬‬
‫‪OK‬‬
‫تحديد عنوان ‪ IP‬للمحطة ‪.ESP8266‬‬ ‫‪OK‬‬ ‫‪AT+CIPSTA=ip‬‬
‫مثال على رسالة أمر‪:‬‬
‫”‪AT+CIPSTA=”192.168.111.118‬‬
‫الحصول على عنوان ‪ IP‬لنقطة الوصول ‪.ESP8266‬‬ ‫‪+CIPAP:ip‬‬ ‫?‪AT+CIPAP‬‬
‫‪OK‬‬
‫‪141‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫تحديد عنوان ‪ IP‬لنقطة الوصول ‪ .ESP8266‬مثال‬ ‫‪OK‬‬ ‫‪AT+CIPAP=ip‬‬
‫على رسالة أمر‪:‬‬
‫"‪AT+CIPAP="192.168.5.1‬‬
‫هذه التعليمة قد ال تعمل على مع برنامج‬
‫‪ firmware‬ذي اإلصدار ‪00160901‬‬
‫إنشاء اتصال زبون ‪( client‬نمط اتصال مفرد) حيث ‪:‬‬ ‫‪OK‬‬ ‫‪AT+CIPSTART=type,a‬‬
‫”‪type: String, “TCP” or “UDP‬‬ ‫‪ddr,port‬‬
‫‪addr: String, remote IP‬‬
‫‪port: String, remote por‬‬

‫إنشاء اتصال زبون ‪( client‬نمط اتصال متعدد) حيث‪:‬‬ ‫‪OK‬‬ ‫‪AT+CIPSTART=id,typ‬‬


‫‪id: 0-4, id of connection‬‬ ‫‪e,addr,port‬‬
‫”‪type: String, “TCP” or “UDP‬‬
‫‪addr: String, remote IP‬‬
‫‪port: String, remote port‬‬

‫ضبط طول البيانات التي سيتم إرسالها من أجل‬ ‫‪SEND‬‬ ‫‪AT+CIPSEND=length‬‬


‫‪OK‬‬
‫اتصال مفرد حيث البارامتر‪:‬‬
‫‪ :length‬طول المعطيات‪ .‬القيمة العظمى ‪2048‬‬
‫‪byte‬‬
‫ضبط طول البيانات التي سيتم إرسالها من أجل‬ ‫‪SEND‬‬ ‫‪AT+CIPSEND=id,lengt‬‬
‫‪OK‬‬ ‫‪h‬‬
‫اتصال متعدد‪.‬‬
‫أمر البدء بإرسال البيانات‪ .‬من أجل نمط اإلرسال‬ ‫> ‪ : Wrap return‬بعد‬ ‫‪AT+CIPSEND‬‬
‫الصريح ‪unvarnished transmission‬‬ ‫تنفيذ األمر‪.‬‬
‫عند استقبال ‪ +++‬تعيد‬
‫شريحة ‪ ESP8266‬إلى‬
‫نمط األوامر الطبيعي‬
‫إغالق اتصال ‪ TCP‬أو ‪( UDP‬نمط اتصال مفرد)‪.‬‬ ‫‪OK‬‬ ‫‪AT+CIPCLOSE‬‬
‫إغالق اتصال ‪ TCP‬أو ‪( UDP‬نمط اتصال متعدد)‪.‬‬ ‫‪OK‬‬ ‫‪AT+CIPCLOSE=id‬‬
‫الحصول على عنوان ‪ IP‬المحلي‪.‬‬ ‫‪+CIFSR:ip OK‬‬ ‫‪AT+CIFSR‬‬
‫تفعيل أو عدم تفعيل نمط اتصال متعدد‪ .‬حيث‬ ‫‪OK‬‬ ‫‪AT+CIPMUX=mode‬‬
‫البارامتر ‪:mode‬‬
‫‪0: Single connection‬‬
‫)‪1: Multiple connections (MAX 4‬‬
‫حذف أو إنشاء مخدم ‪ TCP‬حيث البارامتر ‪:mode‬‬ ‫‪OK‬‬ ‫‪AT+CIPSERVER=mod‬‬
‫)‪0: Delete server (need to follow by restart‬‬ ‫]‪e[,port‬‬
‫‪1: Create server‬‬

‫‪142‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫والبارامتر ‪ port‬رقم المنفذ (افتراضيا ‪.)333‬‬


‫مالحظة‪ :‬يمكن إنشاء مخدم فقط عند تنفيذ‬
‫التعليمة‪:‬‬
‫‪AT+CIPMUX=1‬‬
‫معرفة نمط النقل‪ ،‬حيث البارامتر ‪:mode‬‬ ‫‪+CIPMODE:modeO‬‬ ‫?‪AT+CIPMODE‬‬
‫‪0: normal mode‬‬ ‫‪K‬‬
‫‪1: unvarnished transmission mode‬‬

‫ضبط نمط النقل‪ ،‬حيث البارامتر ‪:mode‬‬ ‫‪OK‬‬ ‫‪AT+CIPMODE=mode‬‬


‫‪0: normal mode‬‬
‫‪1: unvarnished transmission mode‬‬
‫استقبال بيانات الشبكة من اتصال مفرد‪ ،‬حيث‬ ‫‪+IPD,len:data‬‬
‫‪len: data length‬‬
‫‪data: data received‬‬
‫استقبال بيانات الشبكة من اتصال متعدد‪ ،‬حيث‬ ‫‪+IPD,id,len:data‬‬
‫‪id: id no. of connection‬‬

‫يوضح الشكل (‪ )139‬الدارة التي تمكننا من إرسال أوامر ‪ AT‬عن طريق الحاسب باستخدام‬
‫محول ‪ .USB-Serial‬تم استخدام منظم جهد ‪ 3.3V‬لتغذية لوحة ‪ .ESP-01‬الرجل األولى للمنظم (من‬
‫اليسار في الشكل) تم وصلها مع األرضي‪ ،‬والرجل الثالثة للمنظم تم وصلها مع تغذية ‪ ،+5V‬الرجل‬
‫الوسطى تعطي جهد ‪ +3.3V‬تم وصلها مع رجل التغذية للوحة ‪( Vcc‬الرجل رقم ‪ ،)8‬ومع رجل‬
‫‪( CH_PD‬الرجل ‪ .)6‬تم وصل أرضي اللوحة أيضا‪ .‬تم وصل رجل اإلرسال ‪ TX‬للوحة مع رجل‬
‫االستقبال ‪ RX‬للمحول‪ ،‬ورجل االستقبال للوحة ‪ RX‬مع رجل اإلرسال ‪ TX‬للمحول مع افتراض أن‬
‫لوحة محول ‪ USB-Serial‬تحتوي على زر تحويل جهد أرجل اإلرسال واالستقبال لديه من ‪ 5V‬إلى‬
‫‪ 3.3V‬إلن لوحة ‪ ESP-01‬تعمل بجهد ‪ .3.3V‬في حالة أن لوحة المحول ال تحتوي على هذه الخاصية‬
‫فيمكن استخدام مقاومتين على التسلسل‪ ،‬قيمة أحدهما ‪ 2KΩ‬واألخرى ‪ ،1KΩ‬بحيث يتم تخفيض‬
‫جهد رجل إرسال ‪ TX‬المحول من ‪ 5V‬إلى ‪ ،3.3V‬وال يوجد داع لوضع هاتين المقاومتين ما بين رجل‬
‫إرسال ‪ ESP-01‬ورجل االستقبال للمحول‪.‬‬

‫‪143‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ : )139‬الدارة التي تسمح بإرسال أوامر ‪ AT‬إلى لوحة ‪ ESP-01‬عن طريق الحاسب باستخدام‬
‫محول ‪. USB-Serial‬‬

‫الشكل (‪ : )141‬الدارة التي تسمح بإرسال أوامر ‪ AT‬إلى لوحة ‪ ESP-01‬عن طريق الحاسب باستخدام‬
‫لوحة األردوينو‪.‬‬

‫‪144‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-1-2-5-15‬أمثلة عملية على تطبيق أوامر ‪AT‬‬


‫‪-1‬ضبط لوحة ‪ ESP-01‬لتعمل كنقطة وصول ومخدم ‪WEB‬‬
‫بعد تطبيق الدارة (‪ ،)139‬أو الدارة (‪ ،)141‬نفتح نافذة المراقبة التسلسلية في برنامج ‪،Arduino IDE‬‬
‫ونتبع الخطوات التالية‪:‬‬
‫‪ .1‬في البداية نضبط لوحة ‪ ESP-01‬لتعمل كنقطة وصول ‪ access point‬ومخدم من خالل‬
‫األوامر التالية‪:‬‬
‫‪AT+CWMODE=2‬‬
‫‪AT+CWSAP="ESP_network","12345678",4,4‬‬
‫‪AT+CIPMUX=1‬‬
‫‪AT+CIPSERVER=1,80‬‬
‫‪ .2‬نستعلم عن عنوان المخدم أو نقطة الوصول )‪ (IP,MAC‬من خالل األمر التالي‪:‬‬
‫‪AT+CIFSR‬‬
‫‪ .3‬لندخل إلى نقطة الوصول التي تم إنشاؤها عن طريق حاسب أو هاتف محمول‪ ،‬ومن ثم نفتح‬
‫نافذة متصفح انترنت ونكتب عنوان ‪ IP‬للمخدم أو نقطة الوصول الذي تم الحصول عليه من‬
‫الخطوة السابقة مع رقم المنفذ (مثال ‪ .)192.168.4.1:80‬سنستقبل عندئذ على نافذة‬
‫االستقبال من شريحة ‪ ESP8266‬بيانات أنه تم طلب صفحة‪ ،‬ومنها الرقم ‪.id‬‬

‫الشكل (‪ :)141‬البيانات المستقبلة من شريحة ‪ ESP8266‬التي تعمل كنقطة وصول ومخدم‪ ،‬وذلك‬
‫عند طلبها عن طريق متصفح انترنت‪.‬‬

‫‪145‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ .4‬نقوم بإرسال بيانات من المخدم إلى المتصفح من خالل كتابة التعليمة التالية‪ ،‬حيث ‪،id=0‬‬
‫وطول البيانات ‪.10‬‬
‫‪AT+CIPSEND=0,10‬‬
‫بعد إرسال التعليمة بشكل صحيح تظهر العالمة > ‪.‬‬
‫في حال الرد بل ‪ ERROR‬في المتصفح البد من طلب الصفحة من جديد (أي ‪.)192.168.4.1‬‬

‫‪ .5‬نرسل اآلن البيانات التالية على شكل نص ‪.HTML‬‬

‫>‪<H1>Hello</H1‬‬
‫يظهر على المتصفح الكلمة المرسلة‬

‫الشكل (‪ :)142‬نافذة المتصفح‬


‫مالحظة إذا تم إعادة إقالع اللوحة البد من إعادة تنفيذ أوامر إنشاء مخدم‪.‬‬
‫لمعرفة عناوين )‪ (IP,MAC‬األجهزة المتصلة نستخدم التعليمة‪:‬‬
‫‪AT+CWLIF‬‬
‫‪-2‬ضبط لوحة ‪ ESP-01‬لتعمل كزبون‬
‫بعد تطبيق الدارة (‪ ،)139‬أو الدارة (‪ ،)141‬نفتح نافذة المراقبة التسلسلية في برنامج ‪،Arduino IDE‬‬
‫ونضبط لوحة ‪ ESP-01‬لتعمل كزبون من خالل تنفيذ األوامر التالية‪ ،‬مع افتراض أن اسم شبكة ‪WiFi‬‬
‫التي ستتصل معها لوحة ‪ ESP-01‬هي ‪ D-Link-Net‬وكلمة السر ‪.1234567‬‬
‫‪AT+CIPMUX=1‬‬
‫‪AT+CWMODE=1‬‬
‫"‪AT+CWJAP="D-Link-Net","12345678‬‬
‫‪AT+CIPSTART=0,"TCP","google.com",80‬‬
‫‪AT+CIPSEND=0,18‬‬
‫‪GET / HTTP/1.0‬‬
‫نرسل سطر فارغ‬
‫‪146‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يوضح الشكل (‪ )143‬رسالة اإلجابة الناتجة‪.‬‬

‫الشكل (‪ :)143‬رسالة اإلجابة بعد طلب موقع ‪.google.com‬‬

‫‪-6-15‬مراحل تحميل برنامج ‪Firmware‬‬


‫إذا تم برمجة وحدة ‪ ESP8266‬باستخدام بيئة التطوير ‪ ، Arduino IDE‬فإنه سيتم حذف البرنامج‬
‫االفتراضي ‪ Firmware‬لوحدة ‪ ، ESP8266‬ولن يمكننا استخدام أوامر ‪ AT‬من جديد‪ .‬بالتالي البد من‬
‫إعادة تحميله من جديد وفق الخطوات التالية‪:‬‬
‫‪-1‬نقوم بتنفيذ الخطوات األربعة األولى المذكورة في فقرة مراحل البرمجة (‪.)1-1-5-15‬‬
‫‪ -2‬نفتح برنامج التحميل مثل ‪ ESP8266 Flash Downloader‬كما هو موضح في الشكل (‪،)144‬‬
‫من الزر ‪ Bin‬نختار البرنامج ‪ ، Firmware‬ونختار رقم المنفذ ‪ COM‬الصحيح للمحول ‪.USB-UART‬‬
‫يمكن تحميل البرنامج ‪ ESP8266 Flash Downloader‬وبرنامج ‪ Firmware‬من المسارين التاليين‪:‬‬
‫‪https://dominicm.com/wp-content/uploads/2015/05/esp8266_flasher.zip‬‬
‫‪https://dominicm.com/wp-content/uploads/2015/05/v0.9.5.2-AT-Firmware.zip‬‬
‫‪142‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)144‬نافذة برنامج ‪.ESP8266 Flash Downloader‬‬


‫‪-6‬اضغط على زر التحميل وانتظر انتهاء عملية تحميل برنامج ‪ .Firmware‬ال تؤثر رسالة ‪Failed to‬‬
‫‪ leave Flash mode‬على عملية التحميل‪.‬‬

‫‪ -2‬نحرر المفتاح ‪ ،S2‬بالتالي ستتصل الرجل ‪ GPIO0‬إلى ‪ 3.3 V‬تلقائيا (بسبب المقاومة الداخلية)‪.‬‬
‫بهذا نكون قد عدنا إلى نمط تنفيذ البرنامج‪ ،‬ويمكن عندئذ تنفيذ أوامر ‪ AT‬من جديد‪.‬‬

‫‪148‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫التحكم والمراقبة عن طريق شبكة ‪LAN‬‬


‫‪-1-16‬لوحة ‪ENC28J60‬‬
‫تستخدم شريحة (‪ )ENC28J60‬لتقديم واجهة اتصال ما بين المتحكم الصغري وشبكة االثرنت‬
‫(‪ .)Ethernet‬يتصل المتحكم مع هذه الشريحة من خالل بروتوكول النقل التسلسلي (‪ )SPI‬والذي‬
‫سبق وأن تم دراسته في الفقرة (‪ .)1-11‬المتحكم الصغري هو الجهاز السيد ‪ ،master‬أما شريحة‬
‫‪ ENC28J60‬فتكون الجهاز التابع ‪.slave‬‬

‫الشكل (‪ : )144‬شريحة ‪ENC28J60‬‬


‫يمكن إجمال خواص هذه الشريحة بما يلي‪:‬‬
‫‪ ‬هذه الشريحة منسجمة مع المعيار (‪.)IEEE 802.3‬‬
‫‪ ‬تدعم المنفذ (‪.)10 base-T‬‬
‫‪ ‬تدعم النمطين (‪.)full and half duplex‬‬
‫‪ ‬تستطيع إعادة اإلرسال بشكل تلقائي في حال حدوث تصادم‪.‬‬
‫‪ ‬تقوم بتوليد وإضافة بتات الفحص (‪ )CRC‬بشكل تلقائي‪.‬‬
‫‪ ‬تستطيع رفض الباكيتات المستقبلة الخاطئة ‪.‬‬
‫‪ ‬لها واجهة اتصال (‪ )SPI‬مع سرعة تصل إلى (‪.)20 MHZ‬‬
‫‪ ‬تحتوي على ذاكرة بسعة(‪ )8K byte‬لتخزين الباكيتات المرسلة والمستقبلة ‪.‬‬
‫تحتوي على مخرجين يمكن ربطهما مع ثنائي ضوئي يعطيان مؤشر عن حالة خط اإلرسال‬ ‫‪‬‬
‫واالستقبال‪ ,‬والتصادم‪.‬‬
‫‪ ‬تعمل بجهد تشغيل يتراوح مابين (‪ )3.1V‬إلى (‪ 3.3V ( )3.6V‬القيمة النموذجية )‬
‫‪ ‬تسمح بإدخال جهود لها قيمة (‪)5V‬‬
‫‪ ‬تعمل بنبضات ساعة (‪)25MHZ‬‬
‫‪ ‬تعمل بمجال درجة حرارة ( ‪ )-40°C TO 85°C‬صناعيا" ‪ )0°C TO 70°C(,‬تجاريا‪.‬‬
‫يوضح الشكل (‪ )145‬كيفية وصل شريحة ‪ ENC28J60‬مع المتحكم الصغري ‪ MCU‬وفق بروتوكول‬
‫‪ SPI‬من جهة‪ ،‬ومع شبكة االثرنت من جهة أخرى وفق بروتوكول ‪.TCP/IP‬‬

‫‪149‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ : )145‬واجهة االتصال النموذجية لشريحة (‪)ENC28J60‬‬


‫تأتي شريحة ‪ ENC28J60‬ضمن لوحة مع العناصر االلكترونية المطلوبة لتسهيل التعامل معها‪ .‬األرجل‬
‫التي على شكل دبابيس يتم وصلها مع التغذية‪ ،‬ومع المتحكم الصغري وفق بروتوكول ‪ ، SPI‬أما منفذ‬
‫الشبكة ‪ RJ45‬فيتم وصله مع كبل شبكة ومنه إلى منفذ شبكة لحاسب أو موجه ‪.router‬‬

‫الشكل (‪ :)146‬لوحة ‪.ENC28J60‬‬


‫يلخص الجدول (‪ )25‬وظائف األرجل التي على شكل دبابيس‪:‬‬
‫الجدول (‪ )25‬وظائف أرجل لوحة ‪ENC28J60‬‬
‫الوظيفة‬ ‫اسم الرجل‬
‫مدخل لتغذية اللوحة بجهد ‪ .+3.3V‬بعض إصدارات اللوحات تتضمن منظم جهد ويمكن‬ ‫‪VCC‬‬
‫تغذيتها بجهد ‪.+5V‬‬
‫أرضي‬ ‫‪GND‬‬
‫رجل تفعيل للشريحة لبروتوكول ‪SPI‬‬ ‫‪CS‬‬
‫مدخل تصفير (إعادة تشغيل) للشريحة‪ ,‬و التفعيل عند المنطق المنخفض‬ ‫‪RESET‬‬
‫رجل دخل البيانات لبروتوكول ‪SPI‬‬ ‫)‪ST (SI‬‬
‫رجل نبضات الساعة لبروتوكول ‪SPI‬‬ ‫‪SCK‬‬

‫‪151‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫خاصية ‪Wake on LAN‬‬ ‫‪WOL‬‬
‫رجل خرج البيانات لبروتوكول ‪SPI‬‬ ‫‪SO‬‬
‫مخرج نبضات ساعة‪.‬‬ ‫‪CLK‬‬
‫مخرج مقاطعة‬ ‫‪INT‬‬

‫‪-2-16‬وصل لوحة األردوينو مع لوحة ‪ ENC28J60‬وفق بروتوكول ‪SPI‬‬


‫يوضح الشكل (‪ )142‬كيفية وصل لوحة األردوينو أونو مع لوحة ‪ ENC28J60‬وفق بروتوكول ‪.SPI‬‬
‫تم وصل الرجل ‪ )SCK( 13‬للوحة األردوينو مع رجل ‪ SCK‬للوحة ‪( ENC28J60‬السلك الزهري)‪ ،‬وتم‬
‫وصل الرجل ‪ )MISO( 12‬للوحة األردوينو مع رجل ‪ SO‬للوحة ‪( ENC28J60‬السلك البرتقالي)‪ ،‬وتم‬
‫وصل الرجل ‪ )MOSI( 11‬للوحة األردوينو مع رجل )‪ ST (SI‬للوحة ‪( ENC28J60‬السلك األصفر)‪ ،‬تم‬
‫وصل الرجل ‪ )CS( 10‬للوحة األردوينو مع رجل ‪ CS‬للوحة ‪( ENC28J60‬السلك األزرق)‪ .‬إذا كانت‬
‫اللوحة تتضمن منظم جهد ‪ 3.3 V‬فيمكن وصل تغذية إليها ‪ . 5V‬إذا كانت ال تحتوي فيتم تغذيتها‬
‫‪( +3.3V‬السلك األحمر) واألرضي (السلك األسود) للوحة‪ .‬من األفضل استخدام منظم جهد خارجي‬
‫في حالة عدم وجود منظم جهد ضمن اللوحة لضمان تزويد اللوحة بالتيار المطلوب‪.‬‬

‫الشكل (‪ :)142‬ربط لوحة األردوينو أونو مع لوحة ‪ ENC28J60‬وفق بروتوكول ‪.SPI‬‬

‫‪-3-16‬تطبيق عملي‬
‫البد من إضافة مكتبة ‪ UIPEthernet.h‬إلى بيئة التطوير لألردينو كما تم شرحه في الفقرة (‪.)4-1‬‬
‫المكتبة موجودة ضمن الملفات المرفقة مع الكتاب‪.‬‬
‫‪151‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
‫ ومن ثم نحمل الكود البرمجي التالي إلى‬.)142( ‫بعد ذلك نقوم بإجراء التوصيل الموضح في الشكل‬
.‫لوحة األردوينو‬
#include <UIPEthernet.h> // Used for Ethernet

// **** ETHERNET SETTING ****


byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };
IPAddress ip(192, 168, 1, 10);
EthernetServer server(80);

void setup() {
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
}

void loop() {
// listen for incoming clients
EthernetClient client = server.available();

if (client)
{
while (client.connected())
{
if (client.available())
{
char c = client.read();

// if you've gotten to the end of the line (received a newline character)


if (c == '\n')
{
// ‫يتم هنا كتابة صفحة االنترنت‬
client.println("<html><body><h3>Hello World!</h3></body>");
break;
}
}
}

// give the web browser time to receive the data


delay(10);

// close the connection:


client.stop();
}
}

152
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫بعد تحميل الكود البرمجي نقوم بوصل لوحة ‪ ENC28J60‬مع منفذ الشبكة للحاسب باستخدام كبل‬
‫شبكة‪ .‬البد من إعداد الحاسب ولوحة ‪ ENC28J60‬بحيث يكونان على نفس الشبكة الفرعية‪ .‬في‬
‫الكود البرمجي تم ضبط عنوان ‪ IP‬لوحة ‪ .192.168.1.10 : ENC28J60‬نفتح خصائص الشبكة‬
‫المحلية للحاسب ونضبط ‪ IP‬كما هو موضح في الشكل (‪.)148‬‬

‫الشكل (‪ : )148‬ضبط خصائص الشبكة المحلية للحاسب‪.‬‬


‫بعد تطبيق التغذية وفتح متصفح على الحاسب وكتابة ‪ IP‬الخاص بلوحة ‪192.168.1.11 : enc28j60‬‬
‫ستظهر لدينا الصفحة الموضحة في الشكل (‪.)149‬‬

‫الشكل (‪ :)149‬الصفحة التي ستظهر على الحاسب‪.‬‬


‫البد من تعلم لغة ‪ html‬لكتابة صفحات االنترنت المطلوبة‪.‬‬
‫يمكن ربط لوحة ‪ enc28j60‬مع الموجه ‪ router‬بدال من الحاسب كما هو موضح في الملحق (‪،)1‬‬
‫بحيث عندما يتم طلب ‪ ip‬جهاز ‪ router‬ضمن شبكة االنترنت وذلك في أي متصفح من العالم سيتم‬
‫الدخول إلى الشريحة وعرض كلمة !‪ HelloWord‬على المتصفح‪ .‬يمكن تعميم هذا التطبيق إلنجاز‬
‫تطبيقات احترافية أكثر مثل عرض درجة الحرارة والرطوبة وإصدار تنبيه‪ ،‬وتشغيل و إطفاء أجهزة‬
‫اإلنارة وغيرها في أي مكان من العالم عن طريق شبكة االنترنت‪.‬‬

‫‪153‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫شاشة اللمس الملونة ‪2.4” TFT LCD‬‬


‫‪-1-17‬مقدمة‬
‫يوضح الشكل (‪ )151‬الشاشة التي سنستخدمها لعرض الصور واألشكال المخلتفة بشكل ملون‪ .‬يمكن‬
‫استخدام شاشات ملونة أخرى مع األردوينو‪ ،‬ولكن هذه الشاشة تمتاز بالتكلفة المنخفضة‪ ،‬وبساطة‬
‫التعامل معها‪ ،‬وتركيبها على لوحة األردوينو أونو بسهولة‪ .‬تتضمن الشاشة منفذا لبطاقة ‪microSD‬‬
‫بحيث يمكن تخزين صور عليها وعرضها على الشاشة‪ .‬باإلضافة لذلك تمتاز الشاشة بأنها تعمل باللمس‬
‫أيضا‪.‬‬

‫الشكل (‪ :)149‬شاشة ‪.2.4” TFT LCD‬‬

‫الشكل (‪ :)151‬تركيب شاشة ‪ 2.4” TFT LCD‬على لوحة األردوينو أونو وعرض صورة ملونة‪.‬‬

‫‪-2-17‬الخواص‬
‫‪ ‬نمط الشاشة‪.2.4" diagonal LCD TFT :‬‬
‫‪ ‬الدقة ‪.240x320 : resolution‬‬
‫‪ ‬بتات اللون ‪.18-bit (262,000) :‬‬

‫‪154‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ ‬المتحكم المستخدم ‪ :‬شريحة ‪.spfd5408‬‬
‫‪ ‬أرجل االتصال مع الشاشة ‪.4 control lines + 8 bit digital interface :‬‬
‫‪ 4 ‬ثنائيات اإلضاءة الخلفية‪.‬‬
‫‪ ‬أربع أسالك لشاشة اللمس‪.‬‬
‫‪ ‬األبعاد‪ ،71 x 52 x 7 mm :‬الوزن‪.31g :‬‬

‫الجدول (‪ )26‬وظائف أرجل شاشة ‪.2.4” TFT LCD‬‬


‫رجل األردوينو أونو‬ ‫الوظيفة‬ ‫اسم الرجل‬
‫المقابلة‬
‫تغذية ‪3.3V‬‬ ‫تغذية‬ ‫‪3.3V‬‬
‫تغذية ‪5V‬‬ ‫تغذية‬ ‫‪5V‬‬
‫أرضي‬ ‫أرضي‬ ‫‪GND‬‬
‫‪A0‬‬ ‫رجل تحكم للشاشة (قراءة)‬ ‫‪LCD_RD‬‬
‫‪A1‬‬ ‫رجل تحكم للشاشة (كتابة)‬ ‫‪LCD_WR‬‬
‫‪TOUCH_YP‬‬
‫رجل تحكم لشاشة اللمس‪.‬‬
‫رجل تحكم للشاشة (اختيار المسجل)‬ ‫‪LCD_RS‬‬
‫‪TOUCH_XM‬‬
‫‪A2‬‬ ‫رجل تحكم لشاشة اللمس‪.‬‬

‫‪A3‬‬ ‫رجل تحكم للشاشة (اختيار الشريحة)‬ ‫‪LCD_CS‬‬


‫‪A4‬‬ ‫‪LCD Reset‬‬ ‫‪LCD_RST‬‬
‫‪D2‬‬ ‫‪LCD Data‬‬ ‫‪LCD_D2‬‬
‫‪D3‬‬ ‫‪LCD Data‬‬ ‫‪LCD_D3‬‬
‫‪D4‬‬ ‫‪LCD Data‬‬ ‫‪LCD_D4‬‬
‫‪D5‬‬ ‫‪LCD Data‬‬ ‫‪LCD_D5‬‬
‫‪D6‬‬ ‫‪LCD Data/ Touch Data‬‬ ‫‪LCD_D6 / TOUCH XP‬‬
‫‪D7‬‬ ‫‪LCD Data / Touch Data‬‬ ‫‪LCD_D7 / TOUCH YM‬‬
‫‪D8‬‬ ‫‪LCD Data‬‬ ‫‪LCD_D0‬‬
‫‪D9‬‬ ‫‪LCD Data‬‬ ‫‪LCD_D1‬‬
‫‪D10‬‬ ‫‪SD Select‬‬ ‫‪SD_CS‬‬
‫‪D11‬‬ ‫‪SD Data‬‬ ‫‪SD_DI‬‬
‫‪D12‬‬ ‫‪SD Data‬‬ ‫‪SD_DO‬‬
‫‪D13‬‬ ‫‪SD Clock‬‬ ‫‪SD_SCK‬‬

‫‪-3-17‬الكود البرمجي‬
‫لكتابة الكود البرمجي الخاص بالتحكم بشاشة ”‪ 2.4‬الملونة البد من أن نحمل في البداية المكتبات‬
‫التالية‪:‬‬

‫‪155‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ ‬مكتبة ‪ : Adafruit_TFTLCD‬تضم هذه المكتبة برامج قيادة الشاشة لشرائح ‪ chip‬مختلفة‬
‫(‪( . ).ILI9325, ILI9341 , HX8347G, HX8357‬المكتبة مع الملفات المرفقة)‪.‬‬

‫‪ ‬مكتبة ‪ : Adafruit_GFX‬تستخدم هذه المكتبة لتوفير التعليمات البرمجية الالزمة لصنع‬


‫الرسوميات على الشاشة (النقاط والدوائر والخطوط‪ ،‬وما إلى ذلك)‪( .‬المكتبة مع الملفات‬
‫المرفقة)‪.‬‬
‫‪ ‬مكتبة ‪ : TouchScreen‬مسؤولة عن ترجمة وتفسير إحداثيات لوحة اللمس التي تعمل‬
‫بأسلوب المقاومات في الشاشة‪( .‬المكتبة مع الملفات المرفقة)‪.‬‬
‫‪ ‬مكتبة ‪ :SD‬تستخدم للوصول واالتصال مع بطاقات ‪ SD‬أو ‪ .microSD‬هذه المكتبة موجودة‬
‫ضمن بيئة التطوير ‪ Arduino IDE‬وال يوجد حاجة لتحميلها‪.‬‬
‫بعد ذلك نضمن هذه المكتبات ضمن بيئة التطوير كما تم ذكره في الفقرة (‪ .)4-1‬نختار الملفات الثالثة‬
‫السابقة التي قمنا بتحميلها في الخطوة السابقة بالترتيب‪.‬‬
‫نقوم في الكود البرمجي بما يلي‪:‬‬
‫‪-1‬نقوم في البداية باستدعاء المكتبات األربعة المذكورة كما يلي في بداية البرنامج قبل ‪void‬‬
‫) (‪:setup‬‬
‫>‪#include <Adafruit_TFTLCD.h‬‬
‫>‪#include <Adafruit_GFX.h‬‬
‫>‪#include <SD.h‬‬
‫>‪#include <TouchScreen.h‬‬

‫‪-2‬نعرف كائن (لنسميه مثال ‪ ،)tft‬مع تحديد ألرجل الشاشة التي سترتبط مع األردوينو وبشكل يتوافق‬
‫مع ما تم ذكره في الجدول (‪.)26‬‬
‫‪#define LCD_CS A3 // Chip Select goes to Analog 3‬‬
‫‪#define LCD_CD A2 // Command/Data goes to Analog 2‬‬
‫‪#define LCD_WR A1 // LCD Write goes to Analog 1‬‬
‫‪#define LCD_RD A0 // LCD Read goes to Analog 0‬‬
‫‪#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin‬‬

‫;)‪Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET‬‬

‫إذا أردنا استخدام لوحة اللمس أيضا نعرف كائن (لنسميه مثال ‪ ،)ts‬مع تحديد ألرجل الشاشة التي‬
‫سترتبط مع األردوينو وبشكل يتوافق مع ما تم ذكره في الجدول (‪.)26‬‬
‫‪#define YP A1‬‬
‫‪#define XM A2‬‬
‫‪#define YM 7‬‬
‫‪#define XP 6‬‬

‫‪156‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪#define TS_MINX 150‬‬
‫‪#define TS_MINY 120‬‬
‫‪#define TS_MAXX 920‬‬
‫‪#define TS_MAXY 940‬‬

‫‪#define MINPRESSURE 10‬‬


‫‪#define MAXPRESSURE 500‬‬

‫;)‪TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300‬‬

‫إذا أردنا استخدام بطاقة ‪ ،SD‬فقط نحدد رجل اختيار الكرت ‪ ،SD_CS‬وكما تم ذكره في الجدول (‪)26‬‬
‫هي الرجل الرقمية ‪.10‬‬
‫‪#define SD_CS 10‬‬

‫يضاف لما سبق تعاريف خاصة باأللوان )‪ (16-bit‬يمكن استخدامها في التعليمات‪.‬‬


‫‪#define BLACK 0x0000‬‬
‫‪#define BLUE 0x001F‬‬
‫‪#define RED 0xF800‬‬
‫‪#define GREEN 0x07E0‬‬
‫‪#define CYAN 0x07FF‬‬
‫‪#define MAGENTA 0xF81F‬‬
‫‪#define YELLOW 0xFFE0‬‬
‫‪#define WHITE 0xFFFF‬‬

‫‪-3‬يوضح الجدول (‪ )22‬األوامر التي يمكن استخدامها لتهيئة الشاشة والرسم عليها‪.‬‬
‫الجدول (‪ )22‬األوامر التي يمكن استخدامها لتهيئة الشاشة والرسم عليها‬
‫الشرح‬ ‫التعليمة‬
‫إعادة تشغيل الشاشة ‪.Reset Screen‬‬ ‫()‪tft.reset‬‬
‫تعيد هذه التعليمة رقم تعريف الشاشة‪ .‬قد يأخذ إحدى‬ ‫)(‪tft.readID‬‬
‫القيم التالية‪:‬‬
‫; ‪identifier = 0x9325; 0x9328; 0x7575; 0x9341‬‬
‫‪.0x8357‬‬
‫لكل شاشة ‪ identifier‬خاص بها‪.‬‬
‫ضبط برنامج قيادة الشاشة ‪ .LCD driver‬حيث‬
‫‪ identifier‬رقم تعريف الشاشة‪ .‬يمكن معرفته من‬ ‫;)‪tft.begin(identifier‬‬
‫التعليمة السابقة‪.‬‬
‫تعيد طول الشاشة بالبيكسل‪(320) .‬‬ ‫;)( ‪tft.height‬‬
‫تعيد عرض الشاشة بالبيسكل‪(240) .‬‬ ‫;)( ‪tft.width‬‬
‫تدوير الشاشة‪(A = 0, 1, 2, 3;) .‬‬ ‫)‪tft.setRotation (A‬‬

‫‪152‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫ضبط لون خلفية الشاشة‪ .‬حيث البارامتر ‪ color‬يمثل‬ ‫;)‪tft.fillScreen (color‬‬
‫اللون المطلوب‪ ،‬وهو عبارة عن ‪ 16‬بت‪.‬‬
‫ضبط مكان المؤشر ‪ cursor‬على إحداثيات ‪ X, Y‬للشاشة‪.‬‬ ‫;)‪tft.setCursor (X, Y‬‬
‫ضبط حجم النص ‪ Text‬المطلوب إظهاره تبعا للبارامتر ‪.A‬‬ ‫;)‪tft.setTextSize (A‬‬
‫)‪(A = 1; 2; 3; 4; ....‬‬
‫ضبط لون النص ‪ Text‬المطلوب إظهاره تبعا للبارامتر‬ ‫;)‪tft.setTextColor (color‬‬
‫‪color‬‬
‫طباعة نص "‪ "text‬على الشاشة‪.‬‬ ‫;)"‪tft.print ("text‬‬
‫طباعة نص "‪ "text‬على الشاشة مع تحريك المؤشر إلى‬ ‫;)"‪tft.println ("text‬‬
‫سطر جديد‪.‬‬
‫رسم خط‪ .‬بداية الخط )‪ (Xs, Ys‬ونهايته )‪ .(Xf, Yf‬ولونه‬ ‫‪tft.drawLine (Xs, Ys, Xf, Yf,‬‬
‫;)‪color‬‬
‫وفق البارامتر ‪.color‬‬
‫رسم مربع أو مستطيل‪ .‬بدايته )‪ ،(Xs, Ys‬وعرضه ‪،width‬‬ ‫‪tft.drawRect (Xs, Ys, width,‬‬
‫;)‪height, color‬‬
‫وارتفاعه ‪ ،height‬واللون ‪.color‬‬
‫نفس التعليمة السابقة‪ ،‬ولكن بدال من رسم حواف المربع‬ ‫‪tft.fillRect (Xs, Ys, width, height,‬‬
‫;)‪color‬‬
‫أو المستطيل‪ ،‬يتم رسمهما ممتلئين‪.‬‬
‫رسم دائرة‪ .‬المركز )‪ ،(Xs, Ys‬ونصف القطر ‪،Radius‬‬ ‫‪tft.drawCircle (Xs, Ys, Radius,‬‬
‫;)‪color‬‬
‫واللون ‪.color‬‬
‫نفس التعليمة السابقة‪ ،‬ولكن الدائرة هنا ممتلئة‪.‬‬ ‫‪tft.fillCircle (Xs, Ys, Radius,‬‬
‫;)‪color‬‬
‫رسم مثلث‪ .‬رأس المثلث األعلى )‪ ،(Xs, Ys‬ورأسه‬ ‫‪tft.drawTriangle (Xs, Ys, Xl, Yl,‬‬
‫;)‪Xr, Yr, color‬‬
‫اليساري )‪ ، (Xl, Yl‬ورأسه اليمني )‪ .(Xr, Yr‬واللون‬
‫‪.color‬‬
‫نفس التعليمة السابقة‪ ،‬ولكن المثلث هنا ممتلئ‪.‬‬ ‫‪tft.fillTriangle (Xs, Ys , Xl, Yl, Xr,‬‬
‫;)‪Yr, color‬‬
‫رسم مستطيل ذو زوايا مستديرة‪ .‬بدايته )‪،(Xs, Ys‬‬ ‫‪tft.drawRoundRect (Xs, Ys,‬‬
‫‪width, height, color, radius,‬‬
‫وعرضه ‪ ،width‬وارتفاعه ‪ ،height‬نصف قطر الزاوية‬
‫;)‪color‬‬
‫‪ .radius‬اللون ‪.color‬‬
‫نفس التعليمة السابقة‪ ،‬ولكن المستطيل هنا ممتلئ‪.‬‬ ‫‪tft.fillRoundRect (Xs, Ys, width,‬‬
‫;)‪height, color, radius, color‬‬

‫يوضح الجدول (‪ )28‬األمر الذي يتم استخدامه مع لوحة اللمس‪:‬‬


‫الجدول (‪ )28‬األمر الذي يتم استخدامه مع لوحة اللمس‬
‫الشرح‬ ‫التعليمة‬
‫تعيد هذه التعليمة إحداثيات )‪ (x,y‬للمكان المضغوط‬ ‫;)(‪TSPoint p = ts.getPoint‬‬
‫وزمن الضغط على شكل ‪.p.x , p.y , p.z‬‬
‫‪158‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
:SD ‫) األوامر التي يتم استخدامها للتعامل مع بطاقة الذاكرة‬29( ‫يوضح الجدول‬
SD ‫) األوامر التي يتم استخدامها للتعامل مع بطاقة الذاكرة‬29( ‫الجدول‬
‫الشرح‬ ‫التعليمة‬
.SD ‫تهيئة بطاقة‬ SD.begin(SD_CS(
‫) مخزن على البطاقة‬a.BMP) ‫تفتح هذه الوظيفة ملف‬ bmpDraw("a.bmp", x, y(;
.x,y ‫ وتعرضه على الشاشة عند اإلحداثيات‬SD

‫ رسم بعض األشكال الهندسية ونص‬: ‫ تطبيق عملي‬-4-17


: )151( ‫في هذا التطبيق سنقوم بإظهار الصورة الموضحة في الشكل‬

.‫ ورسم بعض األشكال‬،‫ اختبار عمل الشاشة من خالل كتابة نص‬: )151( ‫الشكل‬

:‫ ومن ثم نحمل الكود البرمجي التالي‬،‫نقوم بتركيب الشاشة على لوحة األردوينو أونو بشكل مباشر‬
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

#define LCD_CS A3 // Chip Select goes to Analog 3


#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// Assign human-readable names to some common 16-bit color values:


#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
159
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

void setup(void) {
uint16_t identifier;
tft.reset();
identifier=0x7575 ; //identifier
tft.begin(identifier);
tft.fillScreen (BLACK);
tft.setRotation (0); // Set the position of the Vertical or Horizontal screen
tft.setCursor (60, 10); // We position the cursor (240,320) maximum.
tft.setTextSize (5); // We define text size from 1 to 10
tft.setTextColor (CYAN); // We define the text color
tft.println ("Homs"); // We write our text on the LCD.
tft.drawLine (20,70,200,70, GREEN); // StartPoint X, StartPointY, EndPoint X, EndPoint Y, Color
int X = tft.width (); // We store in the integer variable X the width of the LCD in pixels
int Y = tft.height (); // We store in the entire variable AND the height of the LCD in pixels
tft.setCursor (15, 90); // We place the cursor in a new position of the LCD
tft.setTextSize (3); // We define text size.
tft.setTextColor (RED); // We define the text color
tft.print ("X="); tft.print (X, DEC); // We print on the screen the value of the variables in decimal
tft.print (" Y="); tft.println (Y, DEC);
tft.drawRect (20, 125, 200, 25, YELLOW); // We draw a square / rectangle with no fill color
tft.fillRect (20, 165, 60, 60, BLUE); // We draw a square / rectangle filled with color
tft.drawCircle (120, 195, 30, WHITE); // We draw a circle without fill color
tft.fillCircle (120, 195, 20, WHITE); // We draw a circle filled with color (x, y, radius, color)
tft.drawTriangle (190,163,160,225,222,225, CYAN); // Triangle with vertices
tft.fillTriangle (190,240,160,302,222,302, MAGENTA); // Triangle with vertices and fill color
tft.drawRoundRect (20, 245, 130, 60, 20, RED); // draw square/rectangle with rounded edges
tft.fillRoundRect (35, 255, 100, 40, 15, YELLOW);

}
void loop () {
}

‫ إظهار صورة على الشاشة‬: ‫تطبيق عملي‬-5-17


: )152( ‫في هذا التطبيق سنقوم بإظهار الصورة الموضحة في الشكل‬

161
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

.‫ إظهار صورة على الشاشة‬:)152( ‫الشكل‬


.bmp ‫ وذات الحقة‬، 241*321 ‫ أبعادها‬، SD-Card ‫في البداية البد من تخزين صورة في بطاقة‬
:‫ ومن ثم نحمل الكود البرمجي التالي‬.tiger bmp ‫سنسمي هذه الصورة‬
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <SD.h>

// In the SD card, place 24 bit color BMP files (be sure they are 24-bit!)

#define SD_CS 10 // Card select for shield use

#define LCD_CS A3 // Chip Select goes to Analog 3


#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);


uint8_t spi_save;

void setup()
{
Serial.begin(9600);

tft.reset();

161
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
uint16_t identifier = tft.readID();
identifier=0X7575;
if(identifier == 0x9325) {
Serial.println(F("Found ILI9325 LCD driver"));
} else if(identifier == 0x9328) {
Serial.println(F("Found ILI9328 LCD driver"));
} else if(identifier == 0x7575) {
Serial.println(F("Found HX8347G LCD driver"));
} else if(identifier == 0x9341) {
Serial.println(F("Found ILI9341 LCD driver"));
} else {
Serial.print(F("Unknown LCD driver chip: "));
Serial.println(identifier, HEX);
Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, the line:"));
Serial.println(F(" #define USE_ADAFRUIT_SHIELD_PINOUT"));
Serial.println(F("should appear in the library header (Adafruit_TFT.h)."));
Serial.println(F("If using the breakout board, it should NOT be #defined!"));
Serial.println(F("Also if using the breakout, double-check that all wiring"));
Serial.println(F("matches the tutorial."));
return;
}

tft.begin(identifier);

Serial.print(F("Initializing SD card..."));
if (!SD.begin(SD_CS)) {
Serial.println(F("failed!"));
return;
}
Serial.println(F("OK!"));
spi_save = SPCR;

bmpDraw("tiger.bmp", 0, 0);
delay(1000);
}

void loop()
{
}

// This function opens a Windows Bitmap (BMP) file and


// displays it at the given coordinates. It's sped up
// by reading many pixels worth of data at a time
// (rather than pixel by pixel). Increasing the buffer
// size takes more of the Arduino's precious RAM but
// makes loading a little faster. 20 pixels seems a
// good balance.

162
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

#define BUFFPIXEL 20

void bmpDraw(char *filename, int x, int y) {


File bmpFile;
int bmpWidth, bmpHeight; // W+H in pixels
uint8_t bmpDepth; // Bit depth (currently must be 24)
uint32_t bmpImageoffset; // Start of image data in file
uint32_t rowSize; // Not always = bmpWidth; may have padding
uint8_t sdbuffer[3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel)
uint16_t lcdbuffer[BUFFPIXEL]; // pixel out buffer (16-bit per pixel)
uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer
boolean goodBmp = false; // Set to true on valid header parse
boolean flip = true; // BMP is stored bottom-to-top
int w, h, row, col;
uint8_t r, g, b;
uint32_t pos = 0, startTime = millis();
uint8_t lcdidx = 0;
boolean first = true;

if((x >= tft.width()) || (y >= tft.height())) return;

Serial.println();
Serial.print("Loading image '");
Serial.print(filename);
Serial.println('\'');
// Open requested file on SD card
SPCR = spi_save;
if ((bmpFile = SD.open(filename)) == NULL) {
Serial.print("File not found");
return;
}

// Parse BMP header


if(read16(bmpFile) == 0x4D42) { // BMP signature
Serial.print(F("File size: ")); Serial.println(read32(bmpFile));
(void)read32(bmpFile); // Read & ignore creator bytes
bmpImageoffset = read32(bmpFile); // Start of image data
Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
// Read DIB header
Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));
bmpWidth = read32(bmpFile);
bmpHeight = read32(bmpFile);
if(read16(bmpFile) == 1) { // # planes -- must be '1'
bmpDepth = read16(bmpFile); // bits per pixel
Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);
if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed

163
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬

goodBmp = true; // Supported BMP format -- proceed!


Serial.print(F("Image size: "));
Serial.print(bmpWidth);
Serial.print('x');
Serial.println(bmpHeight);

// BMP rows are padded (if needed) to 4-byte boundary


rowSize = (bmpWidth * 3 + 3) & ~3;

// If bmpHeight is negative, image is in top-down order.


// This is not canon but has been observed in the wild.
if(bmpHeight < 0) {
bmpHeight = -bmpHeight;
flip = false;
}

// Crop area to be loaded


w = bmpWidth;
h = bmpHeight;
if((x+w-1) >= tft.width()) w = tft.width() - x;
if((y+h-1) >= tft.height()) h = tft.height() - y;

// Set TFT address window to clipped image bounds


SPCR = 0;
tft.setAddrWindow(x, y, x+w-1, y+h-1);

for (row=0; row<h; row++) { // For each scanline...


// Seek to start of scan line. It might seem labor-
// intensive to be doing this on every line, but this
// method covers a lot of gritty details like cropping
// and scanline padding. Also, the seek only takes
// place if the file position actually needs to change
// (avoids a lot of cluster math in SD library).
if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
else // Bitmap is stored top-to-bottom
pos = bmpImageoffset + row * rowSize;
SPCR = spi_save;
if(bmpFile.position() != pos) { // Need seek?
bmpFile.seek(pos);
buffidx = sizeof(sdbuffer); // Force buffer reload
}

for (col=0; col<w; col++) { // For each column...


// Time to read more pixel data?

164
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
if (buffidx >= sizeof(sdbuffer)) { // Indeed
// Push LCD buffer to the display first
if(lcdidx > 0) {
SPCR = 0;
tft.pushColors(lcdbuffer, lcdidx, first);
lcdidx = 0;
first = false;
}
SPCR = spi_save;
bmpFile.read(sdbuffer, sizeof(sdbuffer));
buffidx = 0; // Set index to beginning
}

// Convert pixel from BMP to TFT format


b = sdbuffer[buffidx++];
g = sdbuffer[buffidx++];
r = sdbuffer[buffidx++];
lcdbuffer[lcdidx++] = tft.color565(r,g,b);
} // end pixel
} // end scanline
// Write any remaining data to LCD
if(lcdidx > 0) {
SPCR = 0;
tft.pushColors(lcdbuffer, lcdidx, first);
}
Serial.print(F("Loaded in "));
Serial.print(millis() - startTime);
Serial.println(" ms");
} // end goodBmp
}
}

bmpFile.close();
if(!goodBmp) Serial.println("BMP format not recognized.");
}

// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.

uint16_t read16(File f) {
uint16_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read(); // MSB
return result;
}

165
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
uint32_t read32(File f) {
uint32_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read();
((uint8_t *)&result)[2] = f.read();
((uint8_t *)&result)[3] = f.read(); // MSB
return result;
}

166
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫تصميم برامج على الهواتف المحمولة للتحكم باألردوينو باستخدام‬


‫‪RemoteXY‬‬
‫‪-1-18‬مقدمة‬
‫‪ RemoteXY‬هي طريقة سهلة لصنع واجهة مستخدم رسومية ‪ GUI‬على األجهزة المحمولة‬
‫)‪ (smartphone or tablet‬للتحكم من خاللها بلوحة األردوينو وباستخدام وحدة ‪ HC-05‬أو وحدة‬
‫‪ .ESP8266‬يوضح الشكل (‪ )153‬آلية عمل نظام ‪ .RemoteXY‬في البداية يتم تصميم واجهة التحكم‬
‫المطلوبة من خالل محرر واجهة المستخدم الرسومية ‪ RemoteXY GUI editor‬الذي يمكن الوصول‬
‫إليه من الموقع ‪ .www.remotexy.com/en/editor‬بعد ذلك يتم توليد الكود البرمجي (سكتش)‬
‫‪ sketch‬من نفس الموقع الذي يمكن تحميله إلى لوحة األردوينو باستخدام بيئة التطوير ‪Arduino‬‬
‫‪ .IDE‬من جهة أخرى يتم في الهاتف الخلوي تثبيت برنامج ‪ Mobile app RemoteXY‬الذي يسمح‬
‫باستقبال السكتش المرسل من قبل لوحة األردوينو باستخدام تقنية البلوتوث أو الواي فاي‪ ،‬وبالتالي‬
‫توليد واجهة ‪ GUI‬التي تم تصميمها‪.‬‬

‫الشكل (‪ :)153‬آلية عمل نظام ‪.RemoteXY‬‬

‫‪-2-18‬محرر واجهة المستخدم الرسومية ‪RemoteXY GUI editor‬‬


‫يتألف محرر ‪ GUI‬من ثالثة أجزاء كما هو موضح في الشكل (‪: )154‬‬
‫لوحة العناصر ‪:elements panel‬‬ ‫‪‬‬
‫‪ ‬منطقة المحرر ‪editor area‬‬
‫‪ ‬لوحة الخصائص واإلعدادات ‪properties and settings panel‬‬

‫‪162‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)154‬محرر واجهة المستخدم الرسومية ‪.RemoteXY GUI editor‬‬

‫‪-1-2-18‬لوحة العناصر ‪elements panel‬‬


‫تضم المجموعات الفرعية التالية‪:‬‬
‫‪ ‬مجموعة عناصر التحكم ‪.Controls‬‬
‫‪ ‬مجموعة عناصر العرض ‪.Indications‬‬
‫‪ ‬مجموعة عناصر الديكور ‪Decoration‬‬
‫تستخدم عناصر التحكم إلرسال معلومات (أوامر) من الهاتف الخلوي إلى المتحكم الصغري (لوحة‬
‫األردوينو)‪ ،‬تضم هذه المجموعة العناصر التالية‪:‬‬
‫‪ :Button‬يرسل إلى المتحكم الصغري حالة "‪ "1‬عند الضغط عليه‪ ،‬ويرسل الحالة األخرى الطبيعية‬
‫”‪ “1‬عند عدم الضغط‪.‬‬
‫‪ :Switch‬يرسل إلى المتحكم الصغري إحدى الحالتين الثابتتين ‪ OFF “1” :‬أو ”‪.ON “1‬‬
‫‪ :Select‬يرسل إلى المتحكم الصغري عدة قيم حسب الموقع الذي تم اختياره‪ .‬الموقع ‪ :A‬القيمة ”‪،“1‬‬
‫الموقع ‪ :B‬القيمة ”‪ ، “1‬الموقع ‪ :C‬القيمة ”‪.....“2‬وهكذا‪.‬‬
‫‪ :Slider‬يرسل إلى المتحكم الصغري قيمة صحيحة من ‪ 0‬وحتى ‪.100‬‬

‫‪168‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ : Joystick‬يرسل إلى المتحكم الصغري اإلحداثي ‪ (-111….111) X‬واإلحداثي ‪(-111….111) Y‬‬
‫حسب حركة اإلصبع ضمن منطقة هذا العنصر‪.‬‬
‫‪ : Edit field‬يسمح بإدخال سلسلة نصية أو رقم ويتم إرساله إلى المتحكم الصغري‪.‬‬

‫الشكل (‪ :)155‬مجموعة عناصر التحكم‪.‬‬


‫تستخدم عناصر العرض إلرسال معلومات من المتحكم الصغري (لوحة األردوينو) إلى الهاتف الخلوي‪،‬‬
‫ويتم عرضها عليه وتضم هذه المجموعة العناصر التالية كما هو موضح في الشكل (‪:)156‬‬
‫‪ :LED‬يتغير سطوع لون هذا العنصر حسب القيمة المستقبلة من المتحكم الصغري والتي تأخذ المجال‬
‫من ‪ 0‬وحتى ‪ .255‬يمكن اختيار ثالثة ألوان رئيسية هي األحمر واألخضر واألزرق‪ ،‬ولون ناتج عن‬
‫مزجهم‪ .‬إذا كانت القيمة المستقبلة هي ”‪ “1‬عندئذ ال يضيء الليد‪ ،‬وإذا كانت ‪ 255‬فإنه يضيء‪.‬‬
‫‪ :Level‬يعتبر هذا العنصر تمثيل رسومي للقيم التشابهية لمتغير‪ ،‬والتي يتم إرسالها من المتحكم‬
‫الصغري إلى الهاتف الخلوي‪ .‬يزداد المستوى ‪ level‬مع زيادة القيمة المستقبلة والتي تأخذ المجال من‬
‫‪ 0‬وحتى ‪ .100‬لهذا العنصر عدة أشكال‪ Linear, Arc, Linear division, Arc division :‬كما هو‬
‫موضح في الشكل (‪.)154‬‬
‫‪ :Text string‬تسمح بعرض معلومات نصية على شاشة الهاتف الخلوي‬

‫الشكل (‪ :)156‬مجموعة عناصر العرض‪.‬‬


‫ال تشارك عناصر الديكور في عملية تبادل المعلومات ما بين المتحكم الصغري والهاتف الخلوي‪،‬‬
‫وتستخدم لتصميم واجهات إضافية‪ .‬تضم هذه المجموعة العناصر التالية كما هو موضح في الشكل‬
‫(‪:)152‬‬
‫‪169‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ :Label‬تسمح بكتابة نص ما ضمن منطقة العمل‬
‫‪ :Panel‬تسمح بإضافة لوحة ضمن منطقة العمل‪.‬‬
‫‪ :Page‬يسمح هذا العنصر بتقسيم منطقة العمل ضمن عدد من الصفحات بحيث يتم االنتقال فيما‬
‫بينها‪ .‬يمكن العودة للموقع لمعرفة كيفية ضبط هذا العنصر‪.‬‬

‫الشكل (‪ :)152‬مجموعة عناصر الديكور‪.‬‬

‫‪-2-2-18‬منطقة المحرر ‪editor area‬‬


‫ضمن هذه المنطقة يتم تصميم واجهة البرنامج التي ستظهر على شاشة الهاتف الخلوي‪،‬‬
‫وتحتوي على العناصر المذكورة في الفقرة السابقة‪ .‬يوجد أيضا في األعلى من الجهة اليسرى أزرار‬
‫لبناء مشروع جديد‪ ،‬وحفظ المشروع‪ ،‬وفتح مشروع‪ ،‬وفي األعلى من الجهة اليمنى يوجد زر‬
‫الحصول على الكود البرمجي والذي يتم تحمليه إلى المتحكم الصغري (لوحة األردوينو)‪.‬‬

‫الشكل (‪ :)158‬منطقة المحرر‪.‬‬

‫‪-3-2-18‬لوحة الخصائص واإلعدادات ‪properties and settings panel‬‬


‫تضم هذه اللوحة ما يلي كما هو موضح في الشكل (‪.)159‬‬
‫‪ ‬التبويب ‪.Configuration‬‬
‫‪ ‬التبويب ‪.Module interface‬‬

‫‪121‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫‪ ‬التبويب ‪.View‬‬
‫‪ ‬التبويب ‪.element‬‬

‫الشكل (‪ :)159‬لوحة الخصائص واإلعدادات‬


‫من خالل التبويب ‪ Configuration‬يتم ضبط مايلي‪:‬‬
‫‪ ‬طريقة االتصال (بلوتوث أو واي فاي)‬
‫‪ ‬لوحة األردوينو المستخدمة (‪)...UNO, Nano, MEGA 2560, Pro Mini‬‬
‫‪ ‬وحدة االتصال المستخدمة )‪، (HC-05(06), HM-10‬‬
‫‪ ‬البرنامج الذي سيتم كتابة الكود البرمجي استنادا إليه ) ‪.(Arduino IDE, FLProg IDE‬‬

‫من خالل التبويب ‪ Module interface‬يتم ضبط إعداد االتصال التسلسلي للوحة األردوينو كما يلي‪:‬‬
‫واجهة االتصال ‪ :connection interface‬إما اتصال تسلسلي برمجي ‪ ،Software Serial‬أو اتصال‬
‫تسلسلي بنيوي ‪( Hardware Serial‬أي عن طريق األرجل ‪ pin 0 , pin 1‬للوحة األردوينو)‪.‬‬
‫‪ ‬رجل االستقبال ‪ ،RX pin‬ورجل اإلرسال ‪.TX pin‬‬
‫‪ ‬السرعة أو معدل النقل )‪.Speed (baud rate‬‬

‫‪121‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫من خالل التبويب ‪ View‬يتم ضبط لون خلفية الواجهة ‪ Background‬واتجاهها بالنسبة للهاتف‬
‫الخلوي أفقية ‪ horizontal‬أم عمودية ‪ ، vertical‬وطلب إدخال كلمة سر قبل ظهور الواجهة‪.‬‬

‫يتم من خالل التبويب ‪ element‬ضبط لخصائص العنصر المضاف في الواجهة مثل لونه‪ ،‬وشكله‪،‬‬
‫والنص‪ ،‬والرجل التي سيتم التحكم بها‪ ،‬واسم المتغير الممثل للعنصر )‪ (Variable name‬في الكود‬
‫البرمجي المولد‪ ،‬وغير ذلك‪.‬‬

‫‪-3-18‬تنصيب مكتبة ‪ RemoteXY‬ضمن بيئة ‪Arduino IDE‬‬


‫في البداية نحمل المكتبة من الموقع ‪ .http://remotexy.com/en/library‬في بيئة التطوير ‪Arduino‬‬
‫‪ IDE‬نختار القائمة ‪ sketch‬و نختار ‪ include library‬ومن ثم ‪ add .zip library‬كما هو موضح في‬
‫الشكل (‪ .)161‬نختار الملف الذي قمنا بتحميله‪.‬‬

‫الشكل (‪ :)161‬إضافة مكتبة ‪ RemoteXY‬ضمن بيئة ‪Arduino IDE‬‬

‫‪122‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-4-18‬خطوات التحكم بتشغيل وإطفاء ثنائي ضوئي باستخدام تقنية البلوتوث‬


‫‪-1‬إنشاء واجهة ‪ :GUI‬ندخل إلى محرر ‪ RemoteXY‬من الموقع ‪ .http://remotexy.com/en/editor‬ضع‬
‫زر ‪ button‬ضمن الهاتف الخلوي كما هو موضح في الشكل (‪ ،)161‬واضبط خصائصه‪ .‬لنختار على‬
‫سبيل المثال التحكم بالرجل ‪ 13‬عن طريق التبويب ‪.Element‬‬

‫الشكل (‪ :)161‬تصميم الواجهة‬

‫‪-2‬ضبط إعدادات المشروع‪ :‬في لوحة الخصائص واإلعدادات نختار التبويب ‪.Configuration‬‬
‫ونضبطه على الشكل التالي‪:‬‬

‫الشكل (‪ :)162‬التبويب ‪Configuration‬‬


‫أيضا في لوحة الخصائص نختار التبويب ‪ ،Module interface‬ونضبطه كما في الشكل (‪ ،)163‬حيث‬
‫تم إعداد اتصال تسلسلي بنيوي ‪ Hardware Serial‬للوحة األردوينو‪ ،‬من خالل رجل استقبال ‪،pin 0‬‬
‫ورجل إرسال ‪ pin 1‬اللتين سيتم وصلهما مع رجل اإلرسال واالستقبال لوحدة البلوتوث‪ ،‬وبمعدل نقل‬
‫‪.38400b/s‬‬
‫‪123‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)163‬التبويب ‪Module interface‬‬


‫‪-3‬الحصول على السكتش وتحميله إلى لوحة األردوينو‪ :‬نضغط على زر ‪ Get source code‬في‬
‫المحرر‪ ،‬ليظهر ليدنا الكود البرمجي ‪ ،project.ino‬مع زر تحميل الكود )‪ .(Download code‬نضغط‬
‫على زر التحميل‪ .‬نفتح بيئة التطوير ‪ Arduino IDE‬ومن ثم نفتح الكود البرمجي المحمل‪ ،‬ونرسله‬
‫إلى لوحة األردوينو كما هو معروف من خالل زر ‪.Upload‬‬
‫مالحظة للسكتش المولد‪ :‬يتم التعامل مع العنصر المولد على الشكل ‪.RemoteXY.Variable_name‬‬
‫حيث ‪ Variable_name‬هو االسم الذي تم إدخاله في لوحة الخصائص واإلعدادات ضمن التبويب‬
‫‪ .element‬لذلك يمكنك التعديل على الكود المولد تبعا لمشروعك‪ ،‬كما في التطبيق التالي‪.‬‬

‫‪ -4‬قم بوصل لوحة األردوينو مع وحدة البلوتوث ‪ HC-05‬كما تم دراسته سابقا في الشكل (‪. )121‬‬
‫وتشغيل الدارة‪.‬‬

‫‪ -5‬قم بتنصيب التطبيق ‪ Mobile app RemoteXY‬على الهاتف الخلوي‪( .‬التطبيق مرفق مع ملفات‬
‫الكتاب ويمكن تحميله من االنترنت)‪ .‬بعد فتح التطبيق اضغط على زر "‪ "+‬في اللوحة العليا‪ ،‬في‬
‫النافذة المفتوحة اختر "‪ . "Bluetooth connection‬إذا كنت تستخدم وحدة ‪ HM-10‬اختر االتصال‬
‫”‪ .“Bluetooth BLE‬في النافذة التالية قم بتشغيل البلوتوث‪ ،‬واضغط على زر التحديث في األعلى‬
‫لمعرفة األجهزة المتاحة‪ .‬اختر وحدة البلوتوث ‪ HC-05‬أو ‪ .HC-06‬تفتح نافذة إدخال كلمة سر‬
‫االقتران والتي هي بشكل افتراضي ‪ 1234‬أو ‪ .0000‬مع إدخال كلمة السر يكون االتصال قد اكتمل‪،‬‬
‫َ‬
‫ومباشرة تظهر واجهة ‪ ،GUI‬والتي من خاللها سنتحكم بتشغيل وإطفاء الثنائي الضوئي المتصل مع‬
‫الرجل ‪ 13‬أو الثنائي المدمج في اللوحة‪.‬‬

‫‪-5-18‬خطوات إرسال درجة الحرارة إلى الهاتف الخلوي باستخدام تقنية البلوتوث‬
‫‪-1‬إنشاء واجهة ‪ :GUI‬ندخل إلى محرر ‪ RemoteXY‬من الموقع ‪,http://remotexy.com/en/editor‬‬
‫ضع عنصر ‪ ،text string‬وعنصر ‪ .label‬العنصر ‪ text string‬ستظهر فيه درجة الحرارة‪ ،‬أم عنصر‬
‫‪ label‬إلظهار كلمة ‪ Temperature‬على الواجهة‪.‬‬

‫‪124‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)164‬تصميم الواجهة‬


‫في لوحة الخصائص واإلعدادات نختار التبويب ‪.Configuration‬‬ ‫‪-2‬ضبط إعدادات المشروع‪:‬‬
‫ونضبطه على الشكل التالي‪.‬‬

‫‪125‬‬
‫ حسام الوفائي‬.‫م‬.‫د‬ ‫األردوينو من البداية وحتى االحتراف‬
.‫ ونضبطه كما في الشكل التالي‬،Module interface ‫أيضا في لوحة الخصائص نختار التبويب‬

‫ في‬Get source code ‫ نضغط على زر‬:‫الحصول على السكتش وتحميله إلى لوحة األردوينو‬-3
‫ نضغط‬.(Download code) ‫ مع زر تحميل الكود‬،project.ino ‫ ليظهر لدينا الكود البرمجي‬،‫المحرر‬
‫ قبل إرسال الكود إلى لوحة األدروينو البد من إضافة بعض التعديالت عليه لتمكين‬.‫على زر التحميل‬
.‫ التعليمات باللون األحمر في الكود التالي هي التعليمات المضافة‬.‫إظهار درجة الحرارة‬
#define REMOTEXY_MODE__HARDSERIAL

#include <RemoteXY.h>
#include <RemoteXY.h>

// RemoteXY connection settings


#define REMOTEXY_SERIAL Serial
#define REMOTEXY_SERIAL_SPEED 38400

#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 38400

// RemoteXY configurate
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255, 0, 0, 11, 0, 33, 0, 8, 13, 1,
67, 4, 21, 19, 20, 5, 2, 26, 11, 129,
0, 11, 9, 40, 6, 17, 84, 101, 109, 112,
101, 114, 97, 116, 117, 114, 101, 32, 58, 0
};

// this structure defines all the variables of your control interface


struct {
// output variable
char text_1[11]; // string UTF8 end zero
// other variable
uint8_t connect_flag; // =1 if wire connected, else =0
126
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫;‪} RemoteXY‬‬
‫)‪#pragma pack(pop‬‬

‫)(‪void setup‬‬
‫{‬
‫;)( ‪RemoteXY_Init‬‬
‫}‬

‫)(‪void loop‬‬
‫{‬
‫;‪unsigned int sensorValue‬‬

‫;)( ‪RemoteXY_Handler‬‬
‫;‪sensorValue = analogRead(0) / 2‬‬
‫;)‪dtostrf(sensorValue, 3, 1, RemoteXY.text_1‬‬
‫}‬
‫الحظ أنه تم التعامل مع العنصر ‪ test string‬عن طريق ‪.RemoteXY.text_1‬‬

‫‪ -4‬قم بوصل لوحة األردوينو مع وحدة البلوتوث ‪ HC-05‬كما تم دراسته سابقا في الشكل (‪. )121‬‬

‫‪ -5‬قم بتنصيب التطبيق ‪ Mobile app RemoteXY‬على الهاتف الخلوي‪ .‬بعد فتح التطبيق اضغط‬
‫على زر "‪ "+‬في اللوحة العليا‪ ،‬في النافذة المفتوحة اختر "‪ . "Bluetooth connection‬إذا كن‬
‫تستخدم وحدة ‪ HM-10‬اختير االتصال ”‪ .“Bluetooth BLE‬في النافذة التالية قم بتشغيل البلوتوث‪،‬‬
‫واضغط على زر التحديث في األعلى لمعرفة األجهزة المتاحة‪ .‬اختر وحدة البلوتوث ‪ HC-05‬أو ‪HC-‬‬
‫‪ .06‬تفتح نافذة إدخال كلمة سر االقتران والتي هي بشكل افتراضي ‪ 1234‬أو ‪ .0000‬مع إدخال كلمة‬
‫َ‬
‫ومباشرة تظهر واجهة ‪ ،GUI‬والتي من خاللها سنتحكم بتشغيل‬ ‫السر يكون االتصال قد اكتمل‪،‬‬
‫وإطفاء الثنائي الضوئي المتصل مع الرجل ‪ 13‬أو الثنائي المدمج في اللوحة‪.‬‬

‫‪-6-18‬خطوات التحكم بتشغيل وإطفاء ثنائي ضوئي باستخدام شبكة ‪WiFi‬‬


‫‪-1‬إنشاء واجهة ‪ : GUI‬ندخل إلى محرر ‪ RemoteXY‬من الموقع ‪.http://remotexy.com/en/editor‬‬
‫ضع زر ‪ button‬ضمن الهاتف الخلوي كما هو موضح في الشكل ( )‪ ،‬واضبط خصائصه‪ .‬لنختار على‬
‫سبيل المثال التحكم بالرجل ‪ 13‬عن طريق التبويب ‪.Element‬‬

‫‪122‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫الشكل (‪ :)163‬تصميم الواجهة‬


‫‪-2‬ضبط إعدادات المشروع‪ :‬في لوحة الخصائص واإلعدادات نختار التبويب ‪.Configuration‬‬
‫ونضبطه على الشكل التالي‪.‬‬

‫أيضا في لوحة الخصائص نختار التبويب ‪ ،Module interface‬ونضبطه كما في الشكل ( )‪ ،‬حيث تم‬
‫إعداد اتصال تسلسلي بنيوي ‪ Hardware Serial‬للوحة األردوينو‪ ،‬من خالل رجل االستقبال ‪،pin 0‬‬
‫ورجل اإلرسال ‪ pin 1‬اللتين سيتم وصلهما مع رجل اإلرسال واالستقبال لوحدة ‪ ،ESP8266‬وبمعدل‬
‫نقل ‪ .115200b/s‬كذلك تم إعداد اسم نقطة الوصول ‪ ،RemoteXY‬وكلمة سر ‪ ،12345678‬ورقم‬
‫المنفذ ‪.6377‬‬

‫‪128‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫‪-3‬الحصول على السكتش وتحميله إلى لوحة األردوينو‪ :‬نضغط على زر ‪ Get source code‬في‬
‫المحرر‪ ،‬ليظهر لدينا الكود البرمجي ‪ ،project.ino‬مع زر تحميل الكود )‪ .(Download code‬نضغط‬
‫على زر التحميل‪ .‬نفتح بيئة التطوير ‪ Arduino IDE‬ونحمل الكود البرمجي إلى لوحة األردوينو‪.‬‬

‫‪ -4‬قم بوصل لوحة األردوينو مع وحدة ‪ ESP8266‬كما تم دراسته سابقا في الشكل (‪ )122‬من دون‬
‫استخدام لألزرار ‪ .S1,S2‬البد أن يكون البرنامج ‪ firmware‬مثبت على وحدة ‪ ،ESP8266‬والذي‬
‫يكون موجد عليها بشكل افتراضي عند شرائها‪.‬‬

‫‪ -5‬قم بتنصيب التطبيق ‪ Mobile app RemoteXY‬على الهاتف الخلوي‪ .‬بعد فتح التطبيق اضغط‬
‫على زر "‪ "+‬في اللوحة العليا‪ ،‬في النافذة المفتوحة اختر "‪ . "Wi-Fi point‬في النافذة التالية قم‬
‫بتشغيل ‪ ،Wi-Fi‬وتأكد من أن المنفذ هو ‪ .6377‬اضغط على زر التحديث في األعلى لمعرفة األجهزة‬
‫المتاحة‪ .‬اختر وحدة ‪ ، ESP8266‬تفتح نافذة إلدخل كلمة السر والتي هي ‪ 12345678‬كما تم إعداده‬
‫َ‬
‫ومباشرة تظهر واجهة ‪ ،GUI‬والتي من خاللها‬ ‫سابقا‪ .‬مع إدخال كلمة السر يكون االتصال قد اكتمل‪،‬‬
‫سنتحكم بتشغيل وإطفاء الثنائي الضوئي المتصل مع الرجل ‪ 13‬أو الثنائي المدمج في اللوحة‪.‬‬

‫‪129‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫ملحق ‪1‬‬
‫وصل وحدة ‪ ESP-01‬ووحدة ‪ ECN28J60‬مع االنترنت‬
‫في هذا الملحق سنقدم شرحا عن كيفية وصل وحدة ‪ ESP-01‬ووحدة ‪ ECN28J60‬مع شبكة االنترنت‬
‫‪ ،‬وعملية إعداد الشبكة ‪ .‬يوضح الشكل التالي مخططا لوصل أجهزة حواسيب ودارة مدمجة (وحدة‬
‫‪ ESP-01‬ووحدة ‪ ) ECN28J60‬مع شبكة االنترنت وذلك باستخدام ‪. router / switch‬‬

‫يتم وصل المودم والموجه ‪ Router‬إلى منفذ االنترنت ‪ .Internet Port‬ويتم وصل منافذ التبديل‬
‫‪ Switch ports‬للموجة إلى األجهزة المختلفة الموجودة ضمن الشبكة المحلية ‪ LAN‬والتي تحتوي‬
‫على الدارة المدمجة ‪. IP‬‬
‫مزود خدمة االنترنت وبشكل ديناميكي يخصص عنوانا ‪( Public IP‬في هذا المثال ‪) 24.0.X.Y‬‬
‫تستخدم الشبكة المحلية عنوان الشبكة الخاص ‪ (192.168.1.0)Private IP‬مع قناع شبكة‬
‫‪ 255.255.255.0‬وهذا يقدم مجاال لعناوين أجهزة الشبكة يمتد من ‪ 192.168.1.1‬حتى‬
‫‪. 192.168.1.254‬‬
‫يعمل الموجه على توزيع العناوين على أجهزة الشبكة من خالل ‪ . DHCP‬واجهة اتصال الموجة على‬
‫شبكة ‪ LAN Ethernet‬يخصص لها العنوان ‪ . 192.168.1.1‬لجهاز ‪ PCI‬العنوان ‪. 192.168.1.2‬‬
‫وللدارة المدمجة العنوان ‪ 192.168.1.201‬مع قناع للشبكة ‪ . 255.255.255.0‬البوابة االفتراضية‬
‫‪ default gate ways‬هي ‪. 192.168.1.1‬‬
‫من الممكن أن يتم تحديد ‪ IP‬للدارة المدمجة من خالل ‪ . DHCP‬ولكن يفضل أن يتم وضعها يدويا‬
‫بدون ‪ DHCP‬وخصوصا إذا أردت الوصول إلى هذه الدارة من موقع بعيد على شبكة االنترنت ‪.‬‬
‫يوضح الشكل التالي مثاال على كيفية إعداد موجة ‪ Switch / Router‬من نوع ‪ Linksys‬وذلك‬
‫اعتمادا على البارامترات المذكورة ‪.‬‬

‫‪181‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫بعد االنتهاء من اإلعدادات السابقة ال بد من تفعيل منفذ النقل ‪ port forwarding‬للموجه وذلك‬
‫لتمكين عملية الوصول من موقع بعيد على شبكة االنترنت ‪.‬‬
‫إن الجهاز البعيد ال يعلم عن كيفية الوصول إلى الدارة المدمجة فالمعلومة الوحيدة التي لديه هي‬
‫العنوان العام ‪ Public‬للموجه والذي تم تحديده من المزود ‪ ISP‬لهذا فإنه على الموجه أن يعمل على‬
‫نقل الباكيتات ‪ forward packet‬إلى منفذ معين (‪ ) UDP , TCP‬وإلى عنوان محدد في الشبكة ( في‬
‫المثال لدينا )‪ . ) 192.168.1.201‬يوضح الشكل التالي كيفية إعداد الموجه بحيث أي اتصال يتضمن‬
‫منفذ مقصود ‪ 8080‬سيعمل على توجيهه إلى العنوان ‪ 192.168.1.201‬وهو عنوان الدارة المدمجة‬
‫‪IP‬‬

‫‪181‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫بعد القيام باإلجراء السابق سيمكنك الوصول إلى الدارة المدمجة ‪ IP‬من خالل ‪URL = http :‬‬
‫‪. //24.0.x.y : 8080/‬‬
‫‪ host name‬كذلك ال بد‬ ‫من المفضل أن يتم الوصول إلى الدارة المدمجة من خالل استخدام اسم‬
‫من االنتباه إلى أن العنوان ‪ IP‬للموجه والذي يتم تحديده من قبل المزود ‪ ISP‬يتغير بشكل ديناميكي‬
‫لذلك ال يوجد ضمان بأن العنوان سيبقى نفسه ولحل هذه المشكلة فإننا نحتاج إلى ما يعرف بل ‪(DDNS‬‬
‫‪ ) Dynamic DNS‬والتي تعمل على إعطاء عناوين ‪ IP‬لمواقع الشبكة المختلفة ‪.‬‬
‫هناك العديد من مخدمات ‪ DDNS‬والتي تقدم هذه الخدمة مجانا ََ وبشكل مؤقت ( إذا أردت‬
‫تخصيص اسم ثابت ال بد من دفع مال لتقديم هذه الخدمة ) ‪ .‬وال بد من أن يدعم الموجه خاصية‬
‫‪.DDNS‬‬

‫‪182‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬
‫يوضح الشكل التالي كيفية إعداد ‪ DDNS‬للموجه ‪ Linksys‬وذلك من خالل المخدم ‪DYNDNS.Com‬‬
‫‪ .‬وتم اختيار االسم ‪my board .dnsalias.net‬‬

‫باستخدام الخاصية السابقة فإنه عندما يتم إقالع الموجه أو في حال تغيير ‪ IP‬فإنه سيتم تسجيل‬
‫‪ IP‬الجديد في ‪ Dyn DNS.com‬والمرتبط مع االسم ‪ . My board .dnsalias.net‬وسوف يمكنك‬
‫‪URL = http : // my board‬‬ ‫الوصول إلى مخدم ‪( http‬الدارة المدمجة ) من خالل ‪:‬‬
‫‪. .dnsalias.net:8080/‬‬

‫‪183‬‬
‫د‪.‬م‪ .‬حسام الوفائي‬ ‫األردوينو من البداية وحتى االحتراف‬

‫يمكن تحميل المكتبات من الموقع التالي‪:‬‬


‫‪http://www.mediafire.com/file/lczsdq1d2uqwoqb/Libraries.rar/file‬‬

‫يتناول كتاب األردوينو من البداية وحتى االحتراف في المستوى التالي ‪:‬‬


‫تطبيق دارات ومشاريع الكترونية متقدمة باستخدام األردوينو – متحكمات ‪ESP32‬‬

‫‪184‬‬

You might also like