Professional Documents
Culture Documents
الأردوينو متوسط
الأردوينو متوسط
1
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
مقدمة
يتناول كتاب األردوينو من البداية وحتى االحتراف – مستوى المتوسط – ما يلي:
حساس األلوان TCS230 حساس المسافة HC-SR04 حساس الحرارة والرطوبة DHT
وحدة إشارة القلب 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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الفهرس
5
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
6
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
من الواضح أن DHT22أكثر دقة من DHT11مع مجال قياس أكبر.
للحساسين DHT11و DHT22أربع أرجل كما هو موضح في الشكل (:)2
:VCCرجل التغذية .(3-5)V
:Dataرجل البيانات .يتم وصلها إلى متحكم صغري .تتطلب إضافة مقاومة سحب pull-upقيمتها
10KΩأو 5KΩما بين هذه الرجل وجهد التغذية .VCC
:NCال يتم وصلها.
:GNDأرضي.
8
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-4-1الكود البرمجي
لكتابة الكود البرمجي الخاص بالحساس ،DHTسنستخدم مكتبتين متوفرتين على شبكة االنترنت.
لنتبع الخطوات التالية.
-1في البداية البد من أن تتوفر لدينا المكتبة ( DHT.zipالمكتبة DHT.zipموجودة ضمن الملفات
المرفقة مع هذا الكتاب).
-2نختار في بيئة التطوير لألردوينو من األعلى Sketchثم Include Libraryثم Add .ZIP Library
كما هو موضح في الشكل ( .(6تظهر نافذة إضافة مكتبة ،نختار الملف .DHT.zip
بعد االنتهاء من هذه الخطوة نالحظ أنه قد تم إضافة مكتبة DHTلبرنامج Arduino IDEكما هو
موضح في الشكل (.)7
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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
12
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يولد الحساس 8نبضات فوق صوتية ،ويرسلها عبر الهواء.
ينتظر الحساس إشارة الصدى ،وعندما يستقبلها يولد نبضة على الرجل Echoعرضها الزمني
يساوي إلى زمن الذهاب واإلياب.
13
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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
14
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
distanceSensor. measureDistanceCm(3.5);
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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
16
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
تحتوي الوحدة على مبدل تيار إلى تردد Current-to-Frequency Converterوالذي يعطي في
خرجه موجة مربعة ترددها يتناسب مع التيار الناتج عن مجموعة الكواشف الضوئية.
يمكن تقسيم التردد الناتج عن المبدل إلى تردد أصغر بحيث نسمح للمعالجات البطيئة من قياس
التردد بسهولة أكبر .ال يوجد خسارة في عملية القياس عنما يتم تقليل التردد ،ولكن اإلشارة ذات
التردد األقل ،ال تسمح بإجراء قياسات لونية بسرعة.
يتم تفعيل مجموعة 16كاشف ضوئي للون معين ،ومن ثم يتم قياس التردد عن طريق المتحكم
الصغري ،وتكرر العملية لبقية األلوان ،وبهذا األسلوب يتم معرفة لون العنصر الواقع أمام الحساس.
يبين الجدول ( )5كيفية ضبط المقسم الترددي (تردد إشارة الخرج) من خالل القيم المطبقة على
األرجل .S0, S1غالبا ما يتم اختيار S0=H, S1=Lعند ربط الحساس مع لوحة األردوينو.
الجدول ( )5كيفية ضبط المقسم الترددي.
uA )0.1 (max 0.1 )7 (max 15 تيار االستطاعة المنخفضة
°C -40 0 أصغر درجة حرارة عمل
من الجدول أعاله ،يمكنك أن ترى أن TCS3200و TCS3210أفضل عند العمل بنمط االستطاعة
المنخفضة power down modeوأيضا عند العمل بدرجة حرارة أقل من 0درجة مئوية.
18
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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);
21
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
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);
الشكل ( : )19ترددات خرج الحساس TCS230لأللوان الثالثة عند وجود عنصر لونه أزرق
يمكن أخذ قراءة للتردد عندما يكون العنصر قريب من الحساس ،وقراءة التردد عندما يكون العنصر
بعيدا ،وبالتالي تحديد مجال ترددي لكل لون.
22
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)21تحديد مجال تردد اللون األزرق عندما يكون العنصر قريب وبعيد عن الحساس
23
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
24
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
( Lوضع عدم التكرار أو عدم المسك) :يبقى الخرج بحالة مرتفعة لفترة محددة تبعا لضبط المقاومة
المتغيرة الخاصة بالوقت .Time
26
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
22
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
بمجرد تشغيل الدائرة عليك االنتظار 61-31ثانية حتى يتأقلم PIRمع طاقة األشعة تحت الحمراء
في الغرفة.
ليتم اكتشاف الكائن بواسطة الحساس ، HC-SR501يجب أن يتحقق شرطان :أن يتحرك ،وأن
تنبعث منه أشعة تحت الحمراء .إذا كان الجسم يتحرك ولكن ال ينبعث منه األشعة تحت الحمراء ،فلن
يكتشفه الحساس .إذا كان الجسم ينبعث منه أشعة تحت الحمراء ولكنه ال يتحرك (على سبيل المثال
يقف الشخص بدون حركة) ،فلن يكتشفه الحساس.
-3-4الكود البرمجي
يتم تفعيل الرجل الرقمية المتصلة مع حساس الحركة كرجل دخل ،ويتم قراءة حالتها HIGHأو
. LOW
28
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
{ )(void loop
;)if (digitalRead(2)==HIGH) digitalWrite(13,HIGH
;)if (digitalRead(2)==LOW) digitalWrite(13,LOW
;)delay(1
}
في حال وجود حركة أمام الحساس سيضيء الثنائي الضوئي المدمج مع لوحة االردوينو المتصل مع
الرجل الرقمية .13
يمكن بدال من تشغيل الثنائي الضوئي تشغيل جهاز إنذار صوتي ،أو إرسال رسالة قصيرة SMSعن
طريق الشبكة الخلوية باستخدام وحدة ، SIM800أو ربط الدارة مع شبكة االنترنت وهذا ما سنتعلمه
الحقا ،وغير ذلك.
29
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
31
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
النبضات والتي سيكون ترددها متناسبا مع دوران العجلة .يمكن عد هذه النبضات من خالل المتحكم
الصغري خالل زمن معين ،ومن خاللها يتم معرفة معدل السائل المتدفق.
يمكن لمقياس التدفق YF-S201قياس معدل تدفق 1-30Liters/Minute
العالقة بين معدل التدفق وعدد النبضات هي
Q =F ÷ 7.5
: Qمعدل التدفق .Liters/Minute
: Fتردد نبضات حساس هول.
أسالك خرج الحساس YF-S201ثالثة هي:
السلك األحمر :يطبق عليه جهد تغذية .+5V
السلك األسود :أرضي.
السلك األصفر :من خالله يتم الحصول على نبضات خرج الحساس ،لهذا يتم وصله مع المتحكم
الصغري لعد هذه النبضات الكتشاف معدل التدفق.
31
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
serial عند تمر مياه ضمن الحساس باستخدام مضخة ماء سيظهر على نافذة المراقبة التسلسلية
. قيمة معدل التدفق للمياهmonitor
32
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
33
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يوضح الشكل ( )34مخطط الدارة االلكتروني لوحدة حساس اللهب .الدارة المتكاملة LM393عبارة
مكبري عمليات .يستخدم أحدهما كمقارن ما بين الجهد الهابط على الترانزيستور الضوئي ،وجهد
المقاومة المتغيرة . RSأي أنها تعمل كنقطة مرجعية لتحديد مستوى وجود لهب أم ال .خرج المقارن
يمثل المخرج الرقمي لوحدة الحساس .أما الجهد الهابط على الترانزيستور الضوئي A0فهو يمثل
الخرج التشابهي للحساس.
34
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
{ )(void loop
;)if (digitalRead(2)==HIGH) digitalWrite(13,HIGH
;)if (digitalRead(2)==LOW) digitalWrite(13,LOW
}
في حال وجود حريق سيضيء الثنائي الضوئي في لوحة األردوينو المتصل مع الرجل الرقمية .13
يمكن بدال من تشغيل الثنائي الضوئي تشغيل جهاز إنذار صوتي ،أو إرسال رسالة قصيرة SMSعن
طريق الشبكة الخلوية باستخدام وحدة ، SIM800أو ربط الدارة مع شبكة االنترنت وهذا ما سنتعلمه
الحقا ،وغير ذلك.
35
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( : )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تعطي جهدا منخفضا عندما يكون العائق ضمن مجال الحساس.
-3-7الكود البرمجي
نفس الكود البرمجي لحساس اللهب في الفقرة (.)3-6
32
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
هذه ا لمادة بناقلية أقل عند الهواء النظيف ،وتصبح ناقليتها أعلى مع ارتفاع تركيز الغاز .تتم عملية
الكشف من خالل دورة رفع وإنقاص لدرجة حرارة الحساس .عند درجة حرارة منخفضة (تسخين من
خالل جهد )1.5Vيتم الكشف عن غاز أول أكسيد الكربون ،وعند درجة حرارة أعلى (تسخين من
خالل جهد )5Vيتم تنظيف الحساس من الغازات األخرى الممتصة عند درجة حرارة منخفضة .يمكن
استخدام دارة الكترونية بسيطة لتحويل تغير الناقلية إلى إشارة خرج متوافقة مع تركيز الغاز.
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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
41
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-4-8الكود البرمجي
نفس الكود البرمجي لحساس اللهب في الفقرة (.)3-6
41
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
42
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)46تتبع تخطيط كهربائية القلب .يقابل كل جزء حدثا واحدا في دورة القلب.
-2-9وحدة AD8232
تم تصميم وحدة AD8232من أجل قياس إشارة القلب الكهربائية .ECGتعمل الوحدة على تكبير
إشارة ECGالضعيفة وترشيحها من إشارات الضجيج بحيث يمكن تحويلها إلى إشارة رقمية بسهولة
بواسطة المبدل التشابهي الرقمي ADCالمدمج في شريحة المتحكم الصغري.
الشكل ( :)42لوحة AD8232والتي من خاللها يمكن قياس إشارة القلب الكهربائية .ECG
تحتوي هذه اللوحة على دارة متكاملة AD8232مع عناصر الكترونية خارجية .يبين الشكل ()48
مخططا صندوقيا لهذه اللوحة.
43
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
بسبب الربح والتغذية العكسية لبنية المكبر فإن تردد القطع أعلى بل 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مضخمة وخالية من الضجيج.
45
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
46
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-2-2-9االستعادة السريعة
نتيجة لكون تردد قطع مرشح التمرير العالي منخفضا في تطبيقات ECGفإن االشارات قد تتطلب
عدة ثواني لكي تستقر .يؤدي الوقت المطلوب لالستقرار تأخيرا محبطا للمستخدم .على سبيل المثال
عندما يتم وصل االلكترودات أول مرة.
تتضمن شريحة AD8232وظيفة االستعادة السريعة لمنع حدوث تأخيرات طويلة .عندما تكشف
AD8232حالة إشباع (اشارة كافية) على خرج مضخم القياس فإنها تبدل مقاومة مقدارها 10KΩ
على التفرع مع مقاومات المرشح ،وهذا ما يؤدي إلى إزاحة القطب إلى تردد أعلى ،وبالتالي زمن
استقرار أسرع .بعد أن تستقر االشارة يعود المرشح بشكل آلي للعمل لمنع تلك الوظيفة .يوضح الشكل
( )51زمن استقرار AD8232مع تفعيل وبدون تفعيل االستعادة السريعة.
42
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
48
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
49
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يمكن إظهار إشارة ECGعلى نافذة الرسم التسلسلي Serial plotterمن بيئة التطوير لألردوينو.
ولكن هناك برنامج Processing IDEيسمح من رسم البيانات بشكل أوضح .يمكن تحميله من شبكة
االنترنت .بعد تشغيل البرنامج نفتح الكود البرمجي ( Heart_Rate_Display.pdeالمرفق مع الكتاب)
ونختار المنفذ التسلسلي الصحيح لتظهر إشارة ECGكما هو موضح في الشكل (.)54
51
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
ال بد من إجراء عملية سحب أو شد لهذين الخطين من خالل مقاومتين سحب إلى .+5vقيم
51
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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
54
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
لها واجهة اتصال تسلسلية I2Cبخطين ) . (SDA – SCL
تعطي إشارة خرج مربعة ( نبضات ساعة ) قابلة للبرمجة ). (SQW
تستهلك أقل من . 500 nA
تعمل ضمن مجال درجة حرارة واسع من -40Coو حتى .85Co
يوجد بجانب هذه الشريحة هزاز كريستالي بتردد .32 KHz
يوضح الشكل ( )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
-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
52
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-5-2-11أرجل الوحدة
يبين الشكل ( )66كيفية توزع أرجل وحدة DS1307والجدول ( )11يبين وظائف هذه األرجل.
برمجيا.
SCL SDA
SDA SCL
59
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)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);
}
62
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
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
}
64
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
65
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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 تعيد هذه التعليمة
نستدعي التعليمات التالية بشكل متكرر لمعرفة معدل النبضات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"
PulseOximeter pox;
uint32_t tsLastReport = 0;
void onBeatDetected()
{
Serial.println("Beat!");
}
void setup()
{
Serial.begin(115200);
Serial.print("Initializing pulse oximeter..");
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كما هو موضح بالخط األصفر.
69
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل الشكل ( )26كيفية ربط جهاز masterمع جهاز slaveوفق بروتوكول .SPI
21
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يتكون نظام RFIDمن جزأين :عالمة ( tagبطاقة) وقارئ .تتكون العالمة RFIDمن جزأين:
.1مستجيب transponderأو بطاقة tagموجودة على الكائن الذي نريد التعرف عليه .تحتوي
على الرقم التسلسلي المحدد له.
.2جهاز إرسال واستقبال transceiverأو قارئ .reader
.3
الشكل ( :)22مكونات نظام .RFID
هنالك نوعان رئيسيان من بطاقات RFIDهما:
البطاقات النشطة : Active Tagsهي التي تعتمد على بطارية .وجود البطارية يجعل هذه الرقاقة
تتواصل حتى 111متر ،بعض هذه الرقاقات مستقل تماما عن حقل القارئ إذ أنها متكاملة مع وحدة
إرسال خاصة مما يجعلها قادرة على التواصل لمسافة عدة كيلومترات باعتماد مبدأ الرادارات .قد
يكون القارئ محموال بحيث ال يتجاوز وزنه النصف كيلوغرام ومزودا بذاكرة سعتها أكثر من 128
ميغابايت ومن الممكن أن يتصل بالحاسوب السلكيا.
البطاقات الخاملة (السلبية( : Passive Tagsهي التي ال تعتمد على بطارية .عدم وجود مصدر
الطاقة المستقل يحد من قدرة اإلرسال الخاصة بهذه البطاقات .تتم تغذية هذه البطاقات بواسطة
طاقة الموجات الكهرومغناطيسية المتولدة من وحدة القارئ .وتتناقص قدرة مجال القارئ بسرعة مع
ازدياد المسافة مما يحدد مجال قراءتها إلى مسافة 5-4متر باستخدام الترددات العالية جدا
.931- 861MHz
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 درجة حرارة العمل
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
23
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
أرضي لوحة األردوينو ،رجل RSTمع الرجل الرقمية ( 9يمكن اختيار أي رجل رقمية أخرى) .تم تغذية
لوحة معرف الهوية بجهد .+3.3 V
-5-2-11الكود البرمجي
لكتابة الكود البرمجي الخاص بوحدة تعريف الهوية ،RFID-RC522سنستخدم إحدى المكتبات
المتوفرة على شبكة االنترنت .لنتبع الخطوات التالية.
-1في البداية نقوم بإضافة المكتبة rfid-master.zipلبيئة التطوير كما تم شرحه في الفقرة (.)4-1
المكتبة موجودة ضمن الملفات المرفقة مع الكتاب.
-2المرحلة التالية هي اكتشاف المعرف الفريد للعالمة ( .)UIDوتتم من خالل تحميل الكود البرمجي
للمثال DumpInfoإلى لوحة األردوينو.
24
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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يمكن فحص الكرت العالمة والتأكد من شرعيته كما سنرى في
التطبيق العملي.
>#include <SPI.h
>#include <MFRC522.h
>#include <LiquidCrystal.h
;]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
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
.. العبارة التي ستظهر على الشاشة عند استخدام البطاقة المسموح لها:)85( الشكل
28
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)86العبارة التي ستظهر على الشاشة عند استخدام البطاقة غير المسموح لها..
29
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
81
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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Ω ممانعة المرسل والمستقبل
82
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
83
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
نظرا ألن البطارية تحتفظ بالساعة والموضع األخير ،فإن زمن اإلصالح أو التثبيت األول
) time to first fix (TTFFيقلل بشكل كبير إلى 1ثانية .وهذا يسمح بإقفال المكان بشكل أسرع
بكثير.
بدون البطارية ،يعمل نظام GPSدائما بالبداية الباردة ، cold-startوبالتالي فإن قفل GPSاألولي
يستغرق وقتا أطول.
يتم شحن البطارية تلقائيا عند تطبيق التغذية ويتم االحتفاظ بالبيانات لمدة تصل إلى أسبوعين
بدون كهرباء.
-5-2-12الهوائي Antenna
يعتبر الهوائي مطلوبا الستخدام الوحدة ألي نوع من االتصاالت .لذلك تأتي الوحدة مع هوائي رقعة
patch antennaله حساسية .-161 dBm
يمكنك تثبيت هذا الهوائي على موصل U.FLالصغير الموجود على الوحدة.
هوائي الرقعة مناسب جدا لمعظم المشاريع .ولكن إذا كنت ترغب في تحقيق مزيد من الحساسية أو
وضع الوحدة الخاصة بك داخل علبة معدنية ،يمكنك استخدام أي هوائي GPSنشط عبر موصل
.U.FL
84
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
85
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
األردوينو ،ورجل Resetفي لوحة األردوينو نصلها باألرضي إللغاء تفعيل المتحكم الصغري
ATMEGA328ومن ثم نصل األردوينو مع منفذ USBللحاسب) .يوضح الشكل ( )92البيانات
المرسلة من وحدة GPS NEO-6Mوالتي تم عرضها باستخدام Serial monitorفي بيئة تطوير
األردوينو المدمجة.
البيانات التي تحصل عليها هي في الواقع جمل 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تبدأ بحرف .$ $
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
)(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();
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 مراقب المنفذ التسلسلي في بيئة التطوير سيظهر في البداية
بعد مرور وقت معين يومض مؤشر،حيث لم يتم استقبال إشارات أقمار صناعية كافية ومعالجتها
تثبيت الموقع وتظهر معلومات الوقت والتاريخ والموقع
91
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
92
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
وميض كل 1ثانية :الوحدة قيد التشغيل لكنها لم تقم بإجراء اتصال بالشبكة الخلوية حتى
اآلن.
وميض كل 3ثوان :اتصلت الوحدة بالشبكة الخلوية ويمكنها إرسال /استقبال الصوت
والرسائل النصية القصيرة.
93
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-3-13اختيار الهوائي
يعتبر الهوائي مطلوبا الستخدام الوحدة ألي نوع من االتصاالت الصوتية أو اتصاالت البيانات وكذلك
بعض أوامر .SIMلذا فإن اختيار الهوائي يعد أمرا مهما .هناك طريقتان يمكنك من خاللها إضافة
هوائي إلى وحدة SIM800Lالخاصة بك :
الطريقة األولى :هوائي GSMالحلزوني الذي يأتي عادة مع الوحدة ويتم لحمه مباشرة إلى الرجل
NETعلى لوحة الدارة المطبوعة .PCBيعد هذا الهوائي مفيدا جدا للمشاريع التي تحتاج إلى توفير
مساحة ولكنها تكافح بصعوبة في الحصول على إمكانية االتصال وخاصة إذا كان مشروعك في
الداخل.
الطريقة الثانية هي أي هوائي GSM 3dBiمع محول U.FLإلى .SMAيمكنك تثبيت هذا الهوائي على
موصل U.FLالصغير الموجود في الزاوية العلوية اليسرى من الوحدة .يتمتع هذا النوع من الهوائي
بأداء أفضل ويسمح بوضع الوحدة الخاصة بك داخل علبة معدنية -طالما كان الهوائي بالخارج.
94
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
نظرا ألن وحدة SIM800Lال تأتي مع منظم جهد على اللوحة ،يلزم توفير مصدر طاقة
خارجي مضبوط على الجهد بين 3.4Vإلى 4.1V( 4.4Vالمثالي) .يجب أن يكون مصدر الطاقة قادرا
أيضا على تقديم تيار ، 2Aوإال فإن الوحدة لن تعمل .فيما يلي بعض الخيارات التي يمكنك التفكير بها
لتشغيل وحدة GSMالخاصة بك بشكل صحيح.
بطاريات Li-Poجهدها يتراوح بشكل عام بين 3.7فولت و 4.2فولت ،وهو مثالي لوحدة .SIM800L
تعتبر أي بطارية بحجم 1200mAhأو أكبر أفضل خيار ألنها يمكن أن توفر نطاق الجهد الصحيح
حتى أثناء ارتفاعات التيار إلى .2A
95
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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
92
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
أوامر ATإلرسال رسالة :SMS
مثال الوصف األمر
AT+CMGF=1 تحديد نمط رسالة .SMS AT+CMGF=X
PDU Format : X=0
Text mode : X=1
يتم تحديد رقم هاتف المرسل إليه الرسالة: AT+CMGS=+ZZxxxxxxxxxx
: ZZرمز الدولة.
: Xxxxxxxxxxرقم هاتف المرسل إليه
الشكل ( :)118ربط وحدة SIM800مع لوحة األردوينو مع تغذيتها عن طريق بطارية .3.7V
98
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
كتابة كود برمجي الختبار االتصال والحصول على بعض: تطبيق عملي-8-13
.المعلومات
وهي اختبار جودةSIM800 في هذا المثال سنقوم بالحصول على بعض المعلومات من وحدة
، AT+CCID باستخدام التعليمةSIM ومعلومات عن بطاقة، AT+CSQ اإلشارة عن طريق التعليمة
.AT+CREG? وهل الشريحة تم تسجيلها في الشبكة باستخدام التعليمة
SIM800 لوحدةSIM ( وندخل بطاقة109) أو.)118( نقوم بإجراء التوصيل الموضح في الشكل
:ومن ثم نحمل الكود البرمجي التالي
#include <SoftwareSerial.h>
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
Serial.println("Initializing...");
delay(1000);
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
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
Serial.println("Initializing...");
delay(1000);
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
}
}
#include <SoftwareSerial.h>
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
Serial.println("Initializing...");
delay(1000);
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>
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
Serial.println("Initializing...");
delay(1000);
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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
حتى الوقت الحاضر يوجد للبلوتوث 5إصدارات .versionsيقارن الجدول التالي ما بين سرعة نقل
آخر ثالثة إصدارات ومجال اإلرسال األعظمي.
الجدول ( : )21معدل نقل أجهزة البلوتوث
مدى االتصال األعظمي سرعة النقل العظمى رقم اإلصدار version
10 m 25bit/s 3.0
60 m 25bit/s 4.0
240 m 50bit/s 5
يستخدم البلوتوث اآلن في معظم االجهزة المحيطة بنا كالطابعات والكاميرات وأجهزة الحاسب،
واألجهزة الخلوية وسماعات الرأس وغيرها الكثير من األجهزة.
115
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
تسلسلي ) .Serial Port Profile (SPPتوفر هذه الوحدات اتصاال تسلسليا وفق بروتوكول UART
من جهة ،واتصاال مع شبكة البلوتوث من جهة أخرى كما هو موضح في الشكل (.)111
UART
116
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
PCB RF
Antenna
BC417143
MX 29LV800CBXBI-
70G
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
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
119
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
وحدة HC-05
مفتاح لحظي
أرجل الخرج
الشكل ( : )115لوحة HC-05 FC-114ذات أرجل خرج يمكن التعامل معها بسهولة.
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
بعد اختيار الوحدة تظهر لدينا قائمة تحديد نمط االقتران كما هو موضح في الشكل (،)123
نختار االحتمال الثاني وهو إدخال شيفرة االقتران .Enter the device's pairing codeندخل
الشيفرة االفتراضية وهي .1234بذلك يكون قد تم االقتران.
112
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( : )124يتم تعريف وحدة البلوتوث أثناء اتصالها مع الحاسب على أنها منفذ COMافتراضي.
-6-14تطبيق عملي :إرسال درجة الحرارة من لوحة األردوينو إلى الهاتف الخلوي
باستخدام وحدة البلوتوث HC-05
نفس التطبيق السابق سنقوم بوصل الدارة في الشكل ( )121وتحميل الكود السابق ،وتشغيل الدارة.
البد من إجراء عملية اقتران ما بين الهاتف ووحدة البلوتوث .HC-05نضغط على زر تشغيل البلوتوث
في الهاتف ،ونقوم بعملية بحث عن أجهزة البلوتوث .سيظهر لدينا وحدة البلوتوث HC-05كما هو
موضح في الشكل ( ،)125نختارها وندخل رمز PINاالفتراضي وهو 1234بذلك يكون قد تم
االقتران.
118
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)125ظهور وحدة البلوتوث HC-05عند البحث عن أجهزة بلوتوث في الهاتف الخلوي.
البد اآلن من تحميل إحدى التطبيقات التي تسمح بعرض درجة الحرارة من االنترنت .يمكن مثال
تحميل التطبيق التالي والذي نافذته موضحة في الشكل (.)126
سنتعلم الحقا كيفية صنع تطبيقات على األجهزة المحمولة للتحكم من خاللها بلوحة األردوينو
وباستخدام وحدة .HC-05
119
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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األكثر شعبية.
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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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
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
125
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
126
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
122
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
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عن طريق لوحة أردوينو.
131
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
مثال:
{() void setup
;)pinMode(2, OUTPUT
}
مالحظة :يمكن استخدام بقية تعليمات االتصال التسلسلي 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
}
}
134
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-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
{ )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
}
فيما يلي كود برمجي آخر الذي من خالله سيظهر زرين ON , OFFعلى متصفح االنترنت
عندما يتم االتصال مع شريحة ESP8266وطلب ipفي المتصفح .192.168.4.1عند الضغط على
زر ONسيعمل الثنائي الضوئي المتصل مع الرجل ،0وعند الضغط على زر OFFسينطفئ الثنائي
الضوئي المتصل مع الرجل . 0
136
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
<H1>@@L1@@</TD></H1>
</BODY>
</HTML>
)=====";
void handleForm() {
String t_state = server.arg("submit");
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
}
138
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
ندخل هنا اسم الموجه لديك وكلمة السر//
;"const char* ssid = "your_router_name
;"const char* password = " your_router_password
{ )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
}
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
142
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
يوضح الشكل ( )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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)141البيانات المستقبلة من شريحة ESP8266التي تعمل كنقطة وصول ومخدم ،وذلك
عند طلبها عن طريق متصفح انترنت.
145
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
.4نقوم بإرسال بيانات من المخدم إلى المتصفح من خالل كتابة التعليمة التالية ،حيث ،id=0
وطول البيانات .10
AT+CIPSEND=0,10
بعد إرسال التعليمة بشكل صحيح تظهر العالمة > .
في حال الرد بل ERRORفي المتصفح البد من طلب الصفحة من جديد (أي .)192.168.4.1
><H1>Hello</H1
يظهر على المتصفح الكلمة المرسلة
-2نحرر المفتاح ،S2بالتالي ستتصل الرجل GPIO0إلى 3.3 Vتلقائيا (بسبب المقاومة الداخلية).
بهذا نكون قد عدنا إلى نمط تنفيذ البرنامج ،ويمكن عندئذ تنفيذ أوامر ATمن جديد.
148
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
149
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
151
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
خاصية Wake on LAN WOL
رجل خرج البيانات لبروتوكول SPI SO
مخرج نبضات ساعة. CLK
مخرج مقاطعة INT
-3-16تطبيق عملي
البد من إضافة مكتبة UIPEthernet.hإلى بيئة التطوير لألردينو كما تم شرحه في الفقرة (.)4-1
المكتبة موجودة ضمن الملفات المرفقة مع الكتاب.
151
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
ومن ثم نحمل الكود البرمجي التالي إلى.)142( بعد ذلك نقوم بإجراء التوصيل الموضح في الشكل
.لوحة األردوينو
#include <UIPEthernet.h> // Used for Ethernet
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();
152
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
بعد تحميل الكود البرمجي نقوم بوصل لوحة ENC28J60مع منفذ الشبكة للحاسب باستخدام كبل
شبكة .البد من إعداد الحاسب ولوحة ENC28J60بحيث يكونان على نفس الشبكة الفرعية .في
الكود البرمجي تم ضبط عنوان IPلوحة .192.168.1.10 : ENC28J60نفتح خصائص الشبكة
المحلية للحاسب ونضبط IPكما هو موضح في الشكل (.)148
153
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
الشكل ( :)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 :
-3-17الكود البرمجي
لكتابة الكود البرمجي الخاص بالتحكم بشاشة ” 2.4الملونة البد من أن نحمل في البداية المكتبات
التالية:
155
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
مكتبة : Adafruit_TFTLCDتضم هذه المكتبة برامج قيادة الشاشة لشرائح chipمختلفة
(( . ).ILI9325, ILI9341 , HX8347G, HX8357المكتبة مع الملفات المرفقة).
-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
إذا أردنا استخدام لوحة اللمس أيضا نعرف كائن (لنسميه مثال ،)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
إذا أردنا استخدام بطاقة ،SDفقط نحدد رجل اختيار الكرت ،SD_CSوكما تم ذكره في الجدول ()26
هي الرجل الرقمية .10
#define SD_CS 10
-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
. ورسم بعض األشكال، اختبار عمل الشاشة من خالل كتابة نص: )151( الشكل
: ومن ثم نحمل الكود البرمجي التالي،نقوم بتركيب الشاشة على لوحة األردوينو أونو بشكل مباشر
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
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 () {
}
161
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
// In the SD card, place 24 bit color BMP files (be sure they are 24-bit!)
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()
{
}
162
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
#define BUFFPIXEL 20
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;
}
163
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
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
}
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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
162
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
168
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
: Joystickيرسل إلى المتحكم الصغري اإلحداثي (-111….111) Xواإلحداثي (-111….111) Y
حسب حركة اإلصبع ضمن منطقة هذا العنصر.
: Edit fieldيسمح بإدخال سلسلة نصية أو رقم ويتم إرساله إلى المتحكم الصغري.
121
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
التبويب .View
التبويب .element
من خالل التبويب 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في الكود
البرمجي المولد ،وغير ذلك.
122
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
-2ضبط إعدادات المشروع :في لوحة الخصائص واإلعدادات نختار التبويب .Configuration
ونضبطه على الشكل التالي:
-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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
125
حسام الوفائي.م.د األردوينو من البداية وحتى االحتراف
. ونضبطه كما في الشكل التالي،Module interface أيضا في لوحة الخصائص نختار التبويب
فيGet source code نضغط على زر:الحصول على السكتش وتحميله إلى لوحة األردوينو-3
نضغط.(Download code) مع زر تحميل الكود،project.ino ليظهر لدينا الكود البرمجي،المحرر
قبل إرسال الكود إلى لوحة األدروينو البد من إضافة بعض التعديالت عليه لتمكين.على زر التحميل
. التعليمات باللون األحمر في الكود التالي هي التعليمات المضافة.إظهار درجة الحرارة
#define REMOTEXY_MODE__HARDSERIAL
#include <RemoteXY.h>
#include <RemoteXY.h>
#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
};
)(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أو الثنائي المدمج في اللوحة.
122
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
أيضا في لوحة الخصائص نختار التبويب ،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
د.م .حسام الوفائي األردوينو من البداية وحتى االحتراف
184