نظام مسح الفضاء المحيط

في هذا المشروع سنتعلم كيفية استخدام حساس الموجات الفوق صوتية (Ultrasonic) مع الأردوينو في عمل مسح للفضاء المحيط

المكونات المطلوبة

 

arduino uno r3

الأردوينو (Arduino Uno)

حساس المسافة (Ultrasonic Sensor)

محرك سيرفو (Servo Motor)

Full size breadboard 830

 لوحة تجارب (Breadboard)

Breadboard Jumper Wire 65 pcs

أسلاك توصيل (Wires)

محرك السيرفو (Servo Motor)

هو عبارة عن جهاز يقوم بتحويل الاشارة الكهربائية إلى حركة ميكانيكية. يختلف هذا المحرك عن محركات التيار المستمر (DC) في ان حركته غير مستمرة.

Servo Motor: استخدام مقاومة متغيرة للتحكم فى حركة محرك سيرفو

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

مداخل محرك السيرفة :

Servo Motor: استخدام مقاومة متغيرة للتحكم فى حركة محرك سيرفو

كيفية عمله

يعمل محرك السيرفو بوضع اشارة كهربائية PWM بزمن محدد . تقوم مكتبة السيرفو في الاردوينو بالاهتمام بهذا الامر عنك، فحسب هذه الإشارة يتحرك السيرفو بزاوية معينة من 0 إلى 180 درجة.

   لمعلومات اكتر راجع درس محرك السيرفو Servo Motor

 

حساس الموجات فوق الصوتية

يقوم مستشعر الموجات فوق الصوتية بقياس المسافة. حيث يقوم باطلاق موجات صوتية عالية التردد لا يمكن للأذن البشرية سماعها وعند اصطدام هذه الموجات بجسم ما ترتد على شكل صدى Echo ،عند ارتداد هذه الموجات يتم حساب الزمن الذي استغرقته للعودة إلى المستشعر ثم يتم حساب المسافة.

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

توصيل الدارة

قم بتوصيل الدارة كما هو موضح بالصورة التالية :

Room Map-Making Using Ultrasonic With Arduino

تم توصيل حساس الموجات الفوق صوتية (Ultrasonic) مع الأردوينو كما هو موضح بالصورة :

Room Map-Making Using Ultrasonic With Arduino

قم توصيل محرك السيرفو كما هو موضح بالجدول :

الطرف التوصيل
الاحمر Vcc / 5 V
البرتقالى Arduino Pin 9
البنى Ground

يتم تثبيت حساس الموجات الصوتية فوق محرك السيرفو، ينتمكن من إلتقاط الأبعاد للمكان بالكامل. انظر إلى الصورة التالية :

Room Map-Making Using Ultrasonic With Arduino

 

التوصيل كاملا :

 

Room Map-Making Using Ultrasonic With Arduino

البرمجة :

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

وبدلا من قراءة هذه النتائج على الشاشة التسلسلية (Serial Monitor) نقوم بتشغيل برنامج الماتلاب. نقوم بالماتلاب بعمل كود خاص به ليتم تشغيله لإجراء بعض الحسابات ومن ثم إعطاء مخطط بسيط لخريطة المكان.

برمجة الأردوينو :

#include <Servo.h>
#include <NewPing.h>

#define TRIGGER_PIN  12 
#define ECHO_PIN     11  
#define MAX_DISTANCE 200 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
Servo myservo;  

int pos = 0;   
int it = 10;

void setup() {
  myservo.attach(9); 
  Serial.begin(9600);
  delay(3000);
}

void loop() {
  int i = 0;
  int t = 0;
  int a = 0;

  for (i = 0; i < 180; i ++)
  {
    unsigned int uS = sonar.ping();
    myservo.write(i);
    delay(20);
    for (t = 0; t < it; t++)
    {
      uS = sonar.ping();
      a = uS/US_ROUNDTRIP_CM + a;
      delay(30);
    }
    
    a = a / (it-1);
    t = 0;

    Serial.println(a); 
    a = 0;
  }

}

شرح الشفرة البرمجية (Code):

 في البداية قمنا بادراج المكتبات المستخدمة مثل مكتبة السيرفو ومكتبة حساس الموجات فوق الصوتية ثم قمنا بتسمية منافذ الأردوينو المستخدمة في المشروع :

#include <Servo.h>
#include <NewPing.h>

#define TRIGGER_PIN  12 
#define ECHO_PIN     11  
#define MAX_DISTANCE 200

بعد ذلك اعلنا عن المتغيرات اللازمة مثل المتغيرات الخاصة بالسيرفو و حساس الموجات فوق الصوتية والتي تستخدمها المكتبات ايضا. اعلنا عن متغير pos المستخدم في تسجيل موضع السيرفو و المتغير it المستخدم كعداد.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
Servo myservo;  

int pos = 0;   
int it = 10;

في الدالة ()setup قمنا بوضع الاعدادات اللازمة مثل تشغيل السيرفو و السيريال ثم الانتظار 3 ثوان حتى نضمن ان المحرك اصبح في وضعه الصحيح :

void setup() {
  myservo.attach(9); 
  Serial.begin(9600);
  delay(3000);
}

في الدالة ()loop نقوم بتحريك السيرفو حركة واحدة واخذ 10 قراءات للحساس، لحساب المتوسط لها، ثم كتابتها على المنفذ التسلسلي الذي لاحقا سنقوم باستقبال النتائج من خلاله على برنامج الماتلاب.

ثم بعد ذلك نقوم بتحريك السيرفو درجة اخرى و ننفذ كل ماسبق مرة اخرى و هكذا حتى يكتمل دوران السيرفو 180 درجة .

void loop() {
  int i = 0;
  int t = 0;
  int a = 0;

  for (i = 0; i < 180; i ++)
  {
    unsigned int uS = sonar.ping();
    myservo.write(i);
    delay(20);
    for (t = 0; t < it; t++)
    {
      uS = sonar.ping();
      a = uS/US_ROUNDTRIP_CM + a;
      delay(30);
    }
    
    a = a / (it-1);
    t = 0;

    Serial.println(a); 
    a = 0;
  }

}

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

بعد رفع كود الأردوينو نقوم بتشغيل برنامج الماتلاب عم طريق كتابة الكود الخاص بالماتلاب في ملف file.m . اي عند كتابة كود الماتلاب في ملف نصي تأكد من أن الإمتداد له m. أو قم بإنشاء ملف script من داخل اماتلاب وضع الكود به.

الشفرة البرمجية للماتلاب

theta = 0:(pi/180):pi;
s = serial('/dev/ttyS1011');
s.BaudRate=9600
fopen(s)
i = 0;

inc = 1;

while i<180
   A = fgets(s);
   num(i+1) = str2num(A);
   i = i+1;
end
fclose(s)

j = 1

while j<181
    tab(j,1) = (j-1)*inc
    tab(j,2) = num(j)
    tab(j,3) = num(j)*cosd((j-1)*inc)
    tab(j,4) = num(j)*sind((j-1)*inc)
    j = j+1
end
%figure
%polar(theta,num)

plot(tab(:,3),tab(:,4))

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

Room Map-Making Using Ultrasonic With Arduino

ملاحظة :

التغيير الوحيد الذي ستقوم بة في كود الماتلاب هو تغير اسم منفذ السيريال الذي يستخدمه الاردوينو.

Room Map-Making Using Ultrasonic With Arduino

فتقوم بتغييرة الى COM0 او COM1 او ايا كان اسم المنفذ الذي يستخدمة الاردوينو

Room Map-Making Using Ultrasonic With Arduino

و بعد ان تنتهي من كل شيء تقوم بضغط Run في برنامج الماتلاب و تنتظر إلى ان ينتهي السيرفو من عمل المشوار كامل ثم تظهر النتائج على الشاشة

ملاحظة : عند تشغيل كود الماتلاب تاكد ان لا يكون الSerial Monitor الخاص ببرنامج الاردوينو مفتوح

جهاز للتحكم وقياس درجة الحرارة

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

جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35

المكونات المطلوبة

arduino uno r3

Arduino Uno

LM35 Temperature Sensor

LM35

HD44780

LCD 16×2

220 Ω resistor

مقاومة 220 اوم

10K Ohms Resistors

Push Buttons

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

الشاشة LCD

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال
تعمل الشاشة في احد الحالات التالية:

استقبال أمر من الأردوينو وتنفيذه، على سبيل المثال : أمر التهيئة ومسح الشاشة:

lcd.begin(16,2);
lcd.clear();

استقبال معلومات من الأردوينو وعرضها، على سبيل المثال : كتابة جملة معينة :

lcd.print("Hello");
 للإطلاع على المزيد حول شاشة الـ LCD قم بالإطلاع على درس التحكم بشاشة LCD

حساس الحرارة LM35

LM35 Temperature Sensor

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

توصيله في الدارة :

مُخرج هذا الحساس يكون قيمة تناظرية (Analog) ، اي نحتاج إلى توصيله على أحد المنافذ التناظرية (Analog) في الأردوينو. الأطراف التناظرية في الأردوينو من A0 إلى A5 .

جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35

الطرف (بداية من اليسار) التوصيل
1 Vcc
2 Output To Arduino
3 Ground

ملاحظة هامة :

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

شرح الدارة

قم بتوصيل الدارة كما هو موضح بالصورة التالية :

جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35

سيقوم الحساس LM35 بقياس درجة الحرارة بإستمرار وعرضها على شاشة الـ LCD وبإستخدام مفتاح التحكم (Push Buttons) يمكننا التحكم في رفع أو خفض درجة الحرارة المطلوبة في المكان.

جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35

الكود البرمجي :

قم بكتابة الكود التالي ورفعه على الأردوينو :

#include <LiquidCrystal.h>
#define tempPin A0 
#define tup 10 
#define tdown 9
 
float temp; 
int defC = 23; 
int upstate = 0; 
int downstate = 0; 

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 2); 
  lcd.setCursor(0, 0); 
  lcd.print("Config.."); 
  delay(900);
  lcd.clear(); 
  pinMode(tup, INPUT); 
  pinMode(tdown, INPUT); 
}

void loop() {
  upstate = digitalRead(tup); 
  downstate = digitalRead(tdown); 
  int tvalue = analogRead(tempPin);  
  
  if (upstate == HIGH) { 
    defC = defC + 1; 
  }
  if (downstate == HIGH) { 
    defC = defC - 1; 
  }
  temp = tvalue * 0.48828;

  lcd.setCursor(0, 0);
  lcd.print("Current ");
  lcd.print (temp);  
  lcd.print ('C');
  
  lcd.setCursor (0, 1); 
  lcd.print ("Desired "); 
  lcd.print (defC);
  lcd.print ('C');

  delay(200);
}

شرح الكود :

في البداية، نقوم بإضافة المكتبة الخاصة بشاشة الـ LCD :

#include <LiquidCrystal.h>

ثم نقوم بتسمية منافذ الأردوينو المستخدمة في المشروع :

#define tempPin A0 
#define tup 10 
#define tdown 9

بعد ذلك، نقوم بالإعلان عن المتغيرات التي سيتم استخدامها في البرنامج لتسجيل قيم درجات الحرارة :

float temp; 
int defC = 23; 
int upstate = 0; 
int downstate = 0;

يتم تسجيل درجة الحرارة الناتجة من حساس الحرارة على المتغير temp. واستخدام المتغير defC لتسجيل درجة الحرارة المطلوبة. والمتغير upstate لتسجيل حالة المفتاح الأول الخاص برفع درجة الحرارة المطلوبة. والمتغير downstate لتسجيل حالة المفتاح الثاني الخاص بخفض درجة الحرارة المطلوبة.

ثم نقوم بإنشاء المتغير الخاص بشاشة الـ LCD وتحديد الأرجل التي سيتم توصيلها مع الأردوينو :

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

في الدالة ()setup، نقوم بضبط الإعدادات اللازمة، كإعدادات شاشة الـ LCD وضبط المفاتيح (Push Buttons) كمخرج :

void setup() {
  lcd.begin(16, 2); 
  lcd.setCursor(0, 0); 
  lcd.print("Config.."); 
  delay(900);
  lcd.clear(); 
  pinMode(tup, INPUT); 
  pinMode(tdown, INPUT); 
}

في الدالة ()loop، نقوم بقراءة المفاتيح (Push Buttons) ، وقراءة قيمة الجهد الناتج من الحساس :

  upstate = digitalRead(tup); 
  downstate = digitalRead(tdown); 
  int tvalue = analogRead(tempPin);

ثم نقوم بإختبار ما إذا تم الضغط على المفاتيح. فعند الضغط على مفتاح زيادة درجة الحرارة المطلوبة نقوم بإضافة 1 إلى درجة الحرارة المسجلة في المتغير defC. ويتم العكس عند الضغط على مفتاح خفض درجة الحرارة المطلوبة :

   if (upstate == HIGH) { 
    defC = defC + 1; 
  }
  if (downstate == HIGH) { 
    defC = defC - 1; 
  }

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

   temp = tvalue * 0.48828;

وأخيرا، يتم عرض درجة الحرارة الحالية وأيضا درجة الحرارة المطلوبة على شاشة الـ LCD :

  lcd.setCursor(0, 0);
  lcd.print("Current ");
  lcd.print (temp);  
  lcd.print ('C');
  
  lcd.setCursor (0, 1); 
  lcd.print ("Desired "); 
  lcd.print (defC);
  lcd.print ('C');

  delay(200);

اردوينو – الدرس الثامن عشر – ارسال بريد الكتروني حال استشعار الحركة

في هذا الدرس ستتعلم استخدام مستشعر الحركة ‘Motion PIR sesnor’ وجعل الأردوينو يرسل بريد إلكتروني حالما يستشعر الحركة عبر برنامج كتب بالبايثون Python بكمبيوترك.

يقوم متحكم الأردوينو بإنتظار إشارة من مستشعر الحركة ‘Motion PIR sensor’، وفور حصولة على اشارة من المسشتعر تشير لوجود تحرك ، يقوم متحكم الأردوينو بإرسال الأمر لجهاز الكمبيوتر عبر منفذ USB لإرسال البريد الإلكتروني.

pir email project

القطع المطلوبة

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

PIR sensor

PIR Sensor
مستشعر الحركة

Half-size Breadboard

Half-sized Breadboard

Arduino Uno R3

Arduino Uno R3

Jumper wires

Jumper wires

تصميم لوح التجارب

كما تلاحظ الشي الوحيد الذي تقوم بتوصيله هنا هو مستشعر الحركة ‘PIR sensor’ مع الأردوينو ، فيمكنك ربطه مباشره بالأردوينو  عوضاُ عن استخدام لوح التجارب اذا رغبت ولكن احرص على ثبات اسلاك التوصيل.

PIR sensor breadboard design

الكود البرمجي للأردوينو

متحكم الأردوينو سيقوم بإرسال رسالة عبر الاتصال التسلسلي ‘Serial Connection’ المتصل بالكمبيوتر عبر منفذ USB كلما تم اسشعار حركة .
ولكن هذا يعني انه قد يقوم بإرسال الكثير من الإيميلات الإلكترونية نظراً لتكرار الحركة اما المستشعر. لذلك سيقوم متحكم الإردوينو بإرسال رسالة مختلفة اذا سبق وارسل ايميل الكترونية خلال دقيقه.

int pirPin = 7;
 
int minSecsBetweenEmails = 60; // 1 min
 
long lastSend = -minSecsBetweenEmails * 1000l;
 
void setup()
{
  pinMode(pirPin, INPUT);
  Serial.begin(9600);
}
 
void loop()
{
  long now = millis();
  if (digitalRead(pirPin) == HIGH)
  {
    if (now > (lastSend + minSecsBetweenEmails * 1000l))
    {
      Serial.println("MOVEMENT");
      lastSend = now;
    }
    else
    {
      Serial.println("Too soon");
    }
  }
  delay(500);
}

 

يمكنك تغيير القيمه المسجله في ‘minSecsBetweenEmails’ لأي قيمه تجدها مناسبة.
هنا وضعنا القيمه لتكون 60 ثانية ، حتى لا يتم ارسال الايميلات الالكترونية  لمدة دقيقه .

نستخدم المتغير ‘lastSend’ لننتبع متى تم ارسال آخر ايميل الكتروني.
تم تعريف الرقم “بالسالب” والمأخوذ من متغير ‘minSecsBetweenEmails’ ، وتم فعل ذلك حتى نضمن أن يتم تفعيل مستشعر الحركة بشكل مباشر بعد تشغيل متحكم الأردوينو مباشرة.

داخل دالة loop ، دالة ‘millis()’ استخدمت للحصول على عدد أجزاء الثانية منذ بداية تشغيل الأردوينو حتى يتم المقارنة ببينها وبين المره الأخيرة التي تم تسجيل الايتشعار ، حيث سيتم ارسال رسالة “Movement ” اي “حركة” اذا كانت المده قد تجاوزت أكثر من 60 ثانية ، والا فسوف يتم ارسال الرسالة “Toosoon” اي “من المبكر جداً”

قبل ربط المشروع ببرنامج Python قم بتجربة الكود وذلك عبر فتح شاشة الاتصال التسلسلي Serial Monitor في برنامج الأرديونو ‘Arduino IDE’.

pir sensor serial monitor

تنصيب Python و PySerial

اذا كنت تستخدم نظام تشغيل لينكس أو ماك ، فإن الـPython موجود مسبقاً .واذا كنت تسخدم الويندوز فإنه يتوجب عليك تحميله وتنصيبه .
كما يجب عليك (في كل نظم التشغيل) تحميل وتنصيب مكتبة PySerial للسماح بالتواصل مع الأردوينو.

تحميل وتنصيب Python على الويندوز

لتحميل Python على الويندوز، عليك تحميله من  http://www.python.org/getit/

ننصح استخدام النسخة Python 2 وذلك لتوافقها بشكل أفضل.

python setup

بعد تنصيب البايثون على جهازك ، علينا اجراء التعديلات ليتم السماح بتنفيذ اوامره في شاشة الأوامر ‘Command Prompt’، يهمنا ذلك لنتمكن من تحميل وتنصيب PySerial>

علينا اضافة مترجم اوامر البايثون إلى امتدادات الأوامر – PATH environment variable

Python win setup

لفعل ذلك ، عليك الذهاب للوحة تحكم الويندوز والعثور على ‘System Properties control’.
ثم الضغط على ‘Environment Variables’ ، ثم اختيار ‘Path’ ، باسفل قائمة  (System Variables)  قم بالضغط على ‘Edit’، وبنهاية ‘Variable Value’ وبدون أي عديل على النص الموجود ،قم باضافة النص ‘C:\Python27;’  (أومكان الملف الذي قمت بتحديده للبايثون)

لاتنسى إضافة ‘ ; ‘ قبل اضافة النص.

للتأكد من نجاح العملية ، قم بفتح شاشة الأوامر (Dos Prompt) وادخل الأمر ‘python’ ، من المفترض مشاهدة النتيجة التالية:

py win set

تنصيب PySerial

مهما اختلف نظام التشغيل الموجود على جهازك (لينكس ، ماك ، ويندوز ) ، قم بتحميل باقة  .tar.gz لـPySerial 2.7 من
https://pypi.python.org/pypi/pyserial

هذا سيعطيك ملف اسمه: pyserial-2.7.tar.gz

اذا كنت تستخدم الويندوز ، عليك فك ضغط الملف عبر اداة  (http://www.7-zip.org/) 7-zip

اذا كنت تستخدم لينكس أو مالك ، قم بفتح شاشة terminal ، واذهب لمجلد الملف pyserial-2.7.tar.gz وقم بتنفيذ الأمر التالي للقيام بفك الضغط

$ tar -xzf pyserial-2.6.tar.gz

 

الأمر التالي يتم تنفيذه مهما كان نظام التشغل الذي تستخدمه ، اذهب لمجلد pyserial2.7 ثم نفذ الأمر:

sudo python setup.py install

 

pyserial

كود برنامج  Python

والآن عليك عمل برنامج بلغة البايثون. لفعل ذلك ، قم بنسخ الكود التالي ووضعه بملف نصي وقم بتسميته بـ ‘movement.py’ .
يمكنك فعل ذلك في نظام التشغيل لينكس أو ماك عبر استخدام محرر ‘nano’، اما بالنسبة للويندوز فيفضل استخدام محرر البايثون في ‘IDLE’ والذي ستجده في شاشة ابدأ بعد تنصيبه.

import time
import serial
import smtplib
 
TO = 'email@gmail.com'
GMAIL_USER = 'email@gmail.com'
GMAIL_PASS = 'yourPasswordHere'
 
SUBJECT = 'Intrusion!!'
TEXT = 'Your PIR sensor detected movement'
 
ser = serial.Serial('COM4', 9600)
 
def send_email():
    print("Sending Email")
    smtpserver = smtplib.SMTP("smtp.gmail.com",587)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(GMAIL_USER, GMAIL_PASS)
    header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER
    header = header + '\n' + 'Subject:' + SUBJECT + '\n'
    print header
    msg = header + '\n' + TEXT + ' \n\n'
    smtpserver.sendmail(GMAIL_USER, TO, msg)
    smtpserver.close()
    
while True:
    message = ser.readline()
    print(message)
    if message[0] == 'M' :
        send_email()
    time.sleep(0.5)

 

قبل تجربة البرنامج ، هنالك بعض الاعدادات التي يجب تعديلها .

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

قم بوضع البريد الإلكتروني الذي تغب باستلام الاشعارات عليه في خانة ‘To’.

قم بوضع بريدك(حساب Gmail) في قيمة متغير ‘GMAIL_USER’
قم بوضع كلمة المرور للبريد في قيمة متغير ‘GMAIL_PASS’

كما يمكنك تعديل عنوان البريد ونص الرسالة التي يتم ارسالها.

كما يجب عليك اعداد منفذ الاتصال Serial Port للأردوينو عبر تعديل السطر التالي:

ser = serial.Serial('COM4', 9600)

 

في نظام الويندوز سيكون مثل ‘COM4’ ، وفي نظام لينكس أو ماك ستكون مثل ‘/dev/tty.usbmodem621’. يمكنك معرفة ذلك عبر فتح برنامج Arduino IDE ومشاهدة يمين الجزء الأسفل .

serial comm

بعد تعديل الاعدادات ، يمكنك تنفيذ البرنامج عبر كتابة الأمر التالي في شاشة الأوامر

python movement.py

 

عند استشعار حركة ، يفترض ان تشاهد تتبع كالتالي ، وخلال فترة قصيرة سيصلك ايميل الكتروني للبريد الذي ادخلته .

movement.py

لاحظ رسائل ‘Too Soon’ والتي ترسل اذا تم استشعار حركة خلال 60 ثانية من ارسال الايميل الأخير ( حتى لا يتم ارسال ايميلات الكترونية كثيره )

امور اخرى عليك القيام بها

والآن وقد تعلمت كيفية ارسال الايميل الالكتروني واستخدام مستشعر الحركة ، يمكنك استخدام انواع اخرى من المستشعرات وارسال القراءات عبر البريد الإلكتروني (مثل ارسال درجة الحرارة والرطوبة )

اردوينو – الدرس الثالث عشر – عرض درجة الحرارة والاضاءة على الشاشة (الجزء الثاني)

في هذا الدرس سنقوم بإظهار درجة الحرارة ودرجة سطوع اضاءة الغرفة على الشاشة الكرستالية LCD

LCD Sensing project

سنقوم بقياس درجة سطوع اضاءة الغرفة عبر مستشعر الاضاءة ‘photocell’ الذي قمنا بإستخدامه في الدرس العاشر.

لقياس درجة الحرارة ، سنقوم بإستخدام  مستشعر الحرارة . هذه الاداة تمتلك ثلاث رؤوس ، واحدة للحصول على طاقة 5V وواحدةللمخرج الأرضي GND وواحدة لأجل التوصيل إلى مدخل تناظري analog input بالأردوينو.

القطع المطلوبة

lcd

LCD Display (16×2 characters)

pot

10kΩ variable resistor (pot)
مقاوم متغير

1 kΩ Resistor

1kΩ Resistor

Photocell

Photocell

TMP36 temperature sensor

TMP36 temperature sensor
مستشعر الحرارة

Half-size Breadboard

Half-size Breadboard

Arduino Uno R3

Arduino Uno R3

Jumper wires

Jumper wires

تصميم لوح التجارب

تصميم لوح التجارب يعتمد على تصميم الدرس الثاني عشر

lesson 13

قمنا بتغيير بعض التوصيلات في التصميم كما تلاحظ ، تحديداً التوصيلات التي حول المقاوم المتغير ‘pot’ .

مستشعر الضوء ‘photocell’ والمقاومه  1kΩ و مستشعر الحرارة TMP36  هي الاضافات التي قمنا باضافتها للوح التجارب. الجزء المقوس لمستشعر الحرارة TMP36 يكون بإتجاه الشاشة.

الكود البرمجي للأردوينو

الكود البرمجي لهذا الدرس يعتمد على الكود البرمجي للدرس الثاني عشر، وقمنا باضافة بعض الاسطر لقراءة درجة الحرارة ودرجة سطوع ضوء الغرفة لاظهارها على شاشة LCD

#include <LiquidCrystal.h>
 
int tempPin = 0;
int lightPin = 1;
 
//                BS  E  D4 D5  D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
 
void setup()
{
  lcd.begin(16, 2);
}
 
void loop()
{
  // Display Temperature in C
  int tempReading = analogRead(tempPin);
  float tempVolts = tempReading * 5.0 / 1024.0;
  float tempC = (tempVolts - 0.5) * 100.0;
  float tempF = tempC * 9.0 / 5.0 + 32.0;
  //         ----------------
  lcd.print("Temp         F  ");
  lcd.setCursor(6, 0);
  lcd.print(tempF);
 
  // Display Light on second row
  int lightReading = analogRead(lightPin);
  lcd.setCursor(0, 1);
  //         ----------------
  lcd.print("Light           ");  
  lcd.setCursor(6, 1);
  lcd.print(lightReading);
  delay(500);
}

 

في السطر التالي قمنا بوضع تعليق ‘comment’ لمعرفة التوصيلات مابين منافذ الأردوينو ورؤوس شاشة الـLCD

//                BS  E  D4 D5  D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

 

هذا يسهل عملية التعديل واستخدام منافذ اخرى من اختيارك اذا رغبت لاحقاً.

في دالة setup هنالك امرين علينا القيام بها ، الأول علينا تحويل القيمة التناظرية analog لمستشعر الحرارة إلى مقياس حرارة صحيح ، والثاني هو اظهارها على شاشة الـLCD

أولا لنلقي نظرة على طريقة تحويل واحتساب درجة الحرارة

  int tempReading = analogRead(tempPin);
  float tempVolts = tempReading * 5.0 / 1024.0;
  float tempC = (tempVolts - 0.5) * 100.0;
  float tempF = tempC * 9.0 / 5.0 + 32.0;

 

قمنا بالسطر الأول بقراءة القيمة التناظرية من مستشعر الحرارة وتخزين القيمة في tempReading
السطر الثاني قمنا بضرب قيمة tempReading في 5 ثم القسمة على 1024 وتخزين الناتج في tempVolts وهي قيمة الجهد ( مابين 0 و 5 )
السطر الثالث  قمنا بطرح 0.5 من قيمة tempVolts  (الجهد) ثم ضربها في 100 وتخزين القيمة في tempC وذلك لتحويل الجهد إلى درجة الحرارة C
السطر الرابع قمنا بضرب قيمة tempC (درجة حرارة C) في 9 ثم قسمتها على 5 ثم جمعها+32 وتخزين القيمة في tempF وذلك لتحويل درجة الحرارة C إلى درجة حرارة F

عرض القراءات على شاشة LCD قد تكون صعبة وذلك لاستمرار تغير قيم القراءات وعدد خانات القراءة مما يجعل خانات القراءة القديمة تذهب يسار الشاشة.

لحل هذه المشكلة ، كل ماعليك فعله  هو طباعة السطر كاملاً في كل مره  ، داخل دالة  loop.

  //         ----------------
  lcd.print("Temp         F  ");
  lcd.setCursor(6, 0);
  lcd.print(tempF);

 

سطر التعليق ‘comment’ وضع لاجلك حتى تعرف عدد الخانات 16 التي يمكن اظهارها في شاشة LCD في حال رغبت في بتغيير الجمل التي ترغب وضعها اسفلها.

لملء الفراغات ، قم بتحديد موضع المؤشر حيث بداية الخانة التي ترغب بإظهارها على الشاشة.

قمنا بعمل نفس الطريقة مع مستشعر الاضاءة ‘photocell’ ، لايوجد مقياس لدرجة سطوع الضوء لذلك قمنا بإظهار القراءة التناظرية analogRead التي حصلنا عليها من المستشعر مباشرة على الشاشة.

امور اخرى عليك القيام بها

حاول ان تظهر درجة الحرارة المئوية C بدلاً من الفهرنهايت F

اردوينو – الدرس الحادي عشر – اصدار الأصوات

في هذا الدرس ستتعلم كيفية اصدار الاصوات بمتحكم الأردوينو.
اولاً ستقوم بتشغيل مقطع صوتي ، ثم القيام بالتلاعب بمستوى الصوت عبر المستشعر الضوئي ‘photocell’.

making sounds

القطع المطلوبة

1 kΩ Resistor

1 kΩ Resistor

Piezo sounder

Piezo sounder

سماعة البيزو

photocell

Photocell
المستشعر الضوئي

Half-size Breadboard

Half-size Breadboard

Arduino Uno R3

Arduino Uno R3

Jumper wires

Jumper wires

تشغيل المقطع الصوتي

في هذا الجزء ستجد ان سماعة البيزو ‘piezo buzzer’ موضوعه على لوح التجارب . واحده من ارجل القطعه موصولة بالمجال الأرضي GND والرجل الأخرى مربوطه بالمنفذ الرقمي digital pin 12 .

piezo breadbaord

piezo breadboard2

قم برفع الكود البرمجي التالي على متحكم الأردوينو

int speakerPin = 12;
 
int numTones = 10;
int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};
//            mid C  C#   D    D#   E    F    F#   G    G#   A
 
void setup()
{
  for (int i = 0; i < numTones; i++)
  {
    tone(speakerPin, tones);
    delay(500);
  }
  noTone(speakerPin);
}
 
void loop()
{
}

 

لتشغيل مقطع صوتي ، تقوم بتحديد المجال الترددي . انظر للجزء التالي من الدرس المخصص للصوت .
كل مجال ترددي لكل نوته صوتية تم الاحتفاظ به في مصفوفه ‘array’ . المصفوفه ‘array’ هي مثل القائمة ، وبذلك يتم تشغيل المقطع عبر الانتقال لكل نوته صويته بالقائمه.

في حلقة ‘for’ loop سيبدأ العد من 0 وحتى 9 باستخدام القيمه i . للحصول على المجال الترددي للنوته الصوتية لتشغيلها بكل خطوه نقوم باستخدام ‘tone‘. هذا يعني ان القيمة الموجودة في مصفوفة ‘tones’  في موضع ‘i’
كمثال ، قيمة ‘[0]tones’ هي 261 ، وقمية ‘[1]tones’ هي 277 .. وهكذا ..

الأمر ‘tone’ في الأردوينو  يقوم بأخذ متغيرين اثنين ، الأول هو المنفذ الذي يقوم بتشغيل المقطع الصوتي والثاني هي التردد الصوتي للمقطع لتشغيله.

عند الانتهاء من تشغيل من جميع النوتات الصوتية ، أمر ‘noTone’ يقوم بإيقاف تشغيل الصوت.

كان بإمكاننا  ان نضع الكود البرمجي لتشغيل الاصوات داخل دالة loop عوضاَ عن دالة setup وذلك لأنها ستكرر المقطع الصوتي مره بعد مره دون توقف مما سيتسبب بالإزعاج لذلك تم وضعه داخل دالة setup
لذلك دالة loop فارغة .

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

الصوت

الصوت هو عبارة عن ذبذبة في ضغط الهواء . سرعة الذبذبة (دورات بالثانية أو هيرتز ) هي مايصدر الصوت. كلما زادت قوة الذبذبة كلما زاد علو الصوت.

piezo

المتوسط C عادة يعرف بالتردد 261Hz. وكأنك قمت بتشغيل واطفاء منفذ رقمي ‘digital pin’ لاكثر من 261 مره بالثانية .

لسماع النتيجة ، علينا القيام بتركيب قطعه تقوم بترجمة التردادت الالكترونية إلى صوت . هذا يمكن عن طريق تركيب سماعات كبيره او عبر استخدامنا لسماعة البيزو ‘piezo sounder’.

سماعة piezo تستخدم نوع خاص من الكريستال تتمدد وتنكمش كتردد الكتروني والتي ينتج عنها الصوت.

آلة Pseudo-Theremin الموسيقية

هذه الآلة تقوم بإصدار اصوات غريبة عند تمرير يدك امامها ،
سنقوم بصنع آلة مشابهه في الوظيفة للتحكم والتأثير على مستوى الصوت بمجرد تمرير يدك فوق المستشعر الضوئ ‘photocell’.

سنقوم باضافة المستشعر الضوئي ‘photocell’ و المقاوم resistor للوح التجارب.

piezo breadboard

الكود البرمجي للأردوينو

قم برفع الكود التالي على متحكم الاردوينو

int speakerPin = 12;
int photocellPin = 0;
 
void setup()
{
}
 
void loop()
{
  int reading = analogRead(photocellPin);
  int pitch = 200 + reading / 4;
  tone(speakerPin, pitch);
}

الكود واضح ، نستخدم المنفذ التناظري ‘analog pin’  للقراءة من A0 لقياس الضوء. وستكون القيمة مابين 0 و 700.

اضفنا القيمة 200 لجعل التردد 200Hz كأقل تردد ، وببساطه يتم اضافة القراءه عبر قسمة القيمة على 4 ، لاصدار تردد مابين 200Hz و 370Hz.

امور اخرى عليك القيام بها

حاول تغيير القيمة 4 بالسطر التالي لخفض القيم المرتفعة

int pitch = 200 + reading / 4;

 

تغيير القيمه سيرفع أو يقلل من التردد اعتماداً على الرقم الذي قمت بوضعه.

حاول التلاعب بقيم النوتات الصوتية لترى ماذا سيحدث..

اردوينو – الدرس العاشر– استشعار الاضاءة

ستتعلم في هذا الدرس كيفية قياس قوة الاضاءة باستخدام المدخل التناظري ‘analog input’.
ستستخدم ماتعلمته في الدرس التاسع، واستخدام قوة الاضاءة بالغرفة للتحكم في عدد مصابيح الـLEDs التي يتم اضاءتها.

sensing light

تم استبدال المقاوم المتغير ‘pot’ في الدرس التاسع ووضعنا مكانه المستشعر الضوئي ‘photocell’

القطع المطلوبة

5mm Red LED

5mm red LED

عدد 8

270 Ω Resistors

270 Ω Resistors

عدد 8

1 kΩ Resistor

1 kΩ Resistor

74HC595 Shift Register

74HC595 Shift Register

Photocell

Photocell

المستشعر الضوئي

Half-size Breadboard

Half-size Breadboard

Arduino Uno R3

Arduino Uno R3

Jumper wires

Jumper wires

تصميم لوح التجارب

تصميم الدائرة في هذا الدرس هو نفس التصميم بالدرس التاسع ولكن قمنا باستبدال المقاوم المتغير ‘pot’ بـالمستشعر الضوئي ‘photocell’ و مقاومة 1 kΩ .

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

lesson 9

فقط قم بازالة المقاوم المتغير ‘pot’ واستبداله بالمستشعر الضوئي’photocell’ ومقاوم ..كالتالي

lesson 10

المستشعر الضوئي photocell

المستشعر الضوئي ‘photocell’ يعتبر مقاوم يعتمد على الضوء ويدعى احيانا بـ’LDR’ وذلك اختصار لـ Light Dependent Resistor.

المستشعر الضوئي يملك قوة مقاومه تصل حتى 50kΩ في الظلام الدامس و 500Ω عند وجود الاضاءة . يمكنان بواسطة متحكم الأردوينو أن نقرأ قيمة المقاومه للمستشعر عبر مدخل تناظري ‘Analog input’

أسهل طريقة للقيام بهذا هو ربطها مع مقاوم ثابث

photocell_fixedResistor

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

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

كود أردوينو البرمجي

الكود التالي مشابه للدرس التاسع ولكن نظراً لإستخدامنا للمستشعر الضوئي قمنا ببعض التغيرات البسيطه

int lightPin = 0;
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
 
int leds = 0;
 
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
 
void loop()
{
  int reading  = analogRead(lightPin);
  int numLEDSLit = reading / 57;  //1023 / 9 / 2
  if (numLEDSLit > 8) numLEDSLit = 8;
  leds = 0;   // no LEDs lit to start
  for (int i = 0; i < numLEDSLit; i++)
  {
    leds = leds + (1 << i);  // sets the i'th bit
  }
  updateShiftRegister();
}
 
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

 

أول شيء قمنا بتغييره هو تسيمة المنفذ التناظري ‘analog pin’ من ‘potPin’ إلى ‘lightPin’  وذلك قمنا بتبديل المقاوم المتغير ‘pot’ بالمستعشر الضوئي ‘photocell’ .

التغيير الآخر هو السطر الذي يقوم باحتساب عدد مصابيح الـLEDs لإضاءتها

int numLEDSLit = reading / 57;  // all LEDs lit at 1k

هذه المره قمنا بقسمة القراءة على 57 بدلاً من 114 من الدرس التاسع . بمعنى آخر قمنا بقسمتها على نصف القيمة السابقه  حتى نقوم بتوزيعها على 9 مجموعات، ابتداءاً من (حيث لايتم اضاءة أي من المصابيح الثمانية) وحتى (اضاءة جميع المصابيح الثمانية) ، العامل الاضافي هو حساب قيمة المقاومه الثابته 1kΩ
هذا يعني انه عندما تكون قيمة المستشعر الضوئي ‘photocell’ هي 1kΩ (نفس قيمة المقاوم الثابت ) يتم قراءة الصف 1023 وقسمته على 2 = 511 . بذلك يتم اضاءة جميع المصابيح (numLEDSLit ستكون 9)

امور اخرى عليك القيام بها

لتغيير مقدار حساسية المستشعر للضوء قم بتغيير القيمة 57 التي يتم قسمة القراءه عليها.

زيادة القيمه ستجعل من المستشعر أقل حساسية.