اردوينو – الدرس السادس عشر – التحكم باتجاه وسرعة دوران محرك DC Motor

مقدمة

في هذا الدرس ستتعلم كيفية التحكم بسرعة واتجاه حركة محرك التيار المستمر الصغير DC Motor عن طريق الاردوينو ورقاقة التحكم بالمحرك L293D .

في هذه التجربة استخدمنا المقاوم المتغير ‘pot’ للتحكم بسرعة محرك DC Motor ،كما استخدمنا  زر ‘push button’ للتحكم في اتجاه حركة محرك DC Motor.

DC Motor

 المواد والأدوات

DC Motor

1× محرك التيار المستمر الصغير (6V DC Motor)

74HC595 Shift Register

دائرة التحكم بالمحرك L293D 

arduino-lesson-12-lcd

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

استخدام الازرار

1× ازرار (Tactile push switch)

Half-size Breadboard

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

Arduino Uno R3

 1× اردوينو اونو

Jumper wires

حزمة أسلاك توصيل (ذكر-ذكر)

arduino-lesson-2

سلك اردوينو

توصيل الدائرة

قبل ان تحكم بالمحرك الصغير DC Motor، علينا اجراء التجربة مع رقاقة التحكم بالمحرك L293D للتعرف على طريقة عملها.

كل ماعلينا فعله هو توفير طاقة 5V من الاردوينو للمحرك الصغير DC Motor.

DC Motor

لاحظ اتجاه دوران محرك DC Motor، يمكنك لمس محرك DC Motor بأصابعك لمعرفة اتجها الحركه . يمكنك عكس اتجاه حركة محرك DC Motor عبر عكس توصيلات المحرك (قم بتبديل توصيلة الـ5V بـGND ، كذلك الحال مع التوصيله الأخرى)  بذلك سترى انعكاس لاتجاه حركة الدوران.

وهذا هو دور رقاقة التحكم بالمحرك L293D، تقوم بالتحكم بالمنافذ التي توفر الطاقة والمجال الأرضي GND وبذلك تتحكم باتجاه حركة الدوران.

قم ببناء لوح التجارب كالتالي، لاحظ ان دور متحكم الاردوينو هنا هو توفير الطاقه فقط.

dc motor reverse 2 design

المنافذ التي تهمنا بالنسبة لرقاقة التحكم بالمحرك L293D هي ثلاث منافذ ، منفذ 1 Pin 1 (Enable)، منفذ 2 Pin 2 (In1) ، ومنفذ 7 Pin 7  (In2) .

وهذه تكن موصولة إما بـ5V أو GND باستخدام السلك البنفسجي ، أو الأصفر أو البرتقالي.

اذا قمت بربط Pin 1 (Enable) للـGND سيتوقف المحرك، مهما فعلت بـpin In1  و pin In2 . يقوم  Enable بالتشغيل أو الإطفاء. هذا يجعله مفيد لاستخدام ‘PWM output’ للتحكم في سرعة المحرك. قم بتوصيل Pin 1 إلى 5V لتشغيل المحرك مره أخرى.

والان قم بتغيير In1 (pin 2,أصفر) من 5V إلى GND.
In1 و In2 جميعها مرتبطه بـGND ، وبالتالي سيتوقف المحرك مره أخرى.

تغيير In2 من GND إلى 5V سيعكس حركة دوران المحرك DC Motor (الاتجاه الآخر).

أخيراً ، بتغيير In1 وربطه مره أخرى بـ 5V بالتالي سيكون In1 و In2 مرتبطه بـ5V سيوقف محرك DC Motor .

والآن وبعد ان اعتدت على التحكم بمحرك DC Motor ورحة دورانه ، يمكننا الآن جعل متحكم الاردوينو يتحكم بمنافذ  Enable, In1, In2

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

DC Motor

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

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

int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;
int potPin = 0;
 
void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
}
 
void loop()
{
  int speed = analogRead(potPin) / 4;
  boolean reverse = digitalRead(switchPin);
  setMotor(speed, reverse);
}
 
void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}

داخل دالة setup تم تعريف المنافذ وحالاتها .
داخل دالة loop ، يتم تحديد قيمة السرعة للمحرك DC Motor DC Motor عبر اخذ قراءة القيمة التناظرية ‘analogRead’ من المقاوم المتغير ‘pot’ وقسمته على 4.

السبب وراء القسمة على 4 هي لأن القيمة المستخرجة من القراءة التناظرية ‘analogRead’ تكون مابين 0 و 1023 ولكنها يجب أن تكون القيمة بي 0 و 255.

اذا تم الضغط على الزر ، فإن محرك DC Motor سيتحرك للأمام ، وبالضغط مره أخرى سيتحرك بعكس الاتجاه.
القيمة  لمتغير ‘reverse’ يتم أخذه من متغير ‘switchPin’ ،لذا عند الضغط على الزر ستكون القيمة 0،وعند الضغط مره أخى ستكون القيمة 1 .

قيمة السرعة و الانعكاس ‘reverse’ يتم تمريرها إلى الدالة ‘setMotor’ والتي ستحدد المنافذ لرقاقة التحكم بمحرك للتحكم .

void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}

أولاً ، السرعة تم تحديدها عبر استخدام ‘analogWrite’ لمنفذ enable pin . منفذ enable pin يقوم بتشغيل أو اطفاء المحرك بغض النظر عن قيم منافذ in1 و in2.

للتحكم باتجاه حركة الدوران للمحرك DC Motor علينا عكس قيم منافذ in1 و in2.

اذا كانت قيمة in1 عالية (اي تساوي 1) و قيمة in2 منخفضة (اي تساوي 0)، سيقوم محرك DC Motor بالدوران باتجاه واحد ، واذا تم عكس القيم لمنافذ in1 و in2 فسيقوم محرك DC Motor بالدوران بالاتجاه المعاكس.

الأمر ‘ ! ‘  يعني ‘ ليس – not’  لذلك أول امر ‘digitalWrite’ لـin1 يقوم بعكس القيمة المأخوذه من  ‘reverse’ فمثلاً لو كانت القيمة عالية (تساوي 1) فسيوقم بعكسها إلى قيمة منخفضة (تساوي 0) والعكس صحيح.

الأمر الثاني ‘digitalWrite’ لـin2 يقوم بأخذ القيمة من ‘reverse’ وهذا يعني بأنها ستكون دائما عكس القيمة لـin1 .

أنشطة أخرى

تستطيع تغيير الكود البرمجي بحيث يمكنك التحكم بمحرك DC Motor دون الحاجة للمقاوم المتغير و الزر . بحيث تبدأ حركة المحرك بشكل بطيء باتجاه واحد ، ثم تزداد السرعة بشكل تدريجي ، ثم تبطئ مره أخرى ويتم عكس الاتجاه وهكذا..




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

مقدمة

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

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

pir email project

المواد والأدوات

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

PIR sensor

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

Half-size Breadboard

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

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

سلك اردوينو

تنصيب 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

 

ارسال بريد الكتروني

توصيل الدائرة

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

ارسال بريد الكتروني

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

متحكم الأردوينو سيتمكن من ارسال بريد الكتروني عبر الاتصال التسلسلي ‘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’.

ارسال بريد الكتروني

والآن عليك عمل برنامج بلغة البايثون. لفعل ذلك ، قم بنسخ الكود التالي ووضعه بملف نصي وقم بتسميته بـ ‘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 ومشاهدة يمين الجزء الأسفل .

ارسال بريد الكتروني

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

python movement.py

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

ارسال بريد الكتروني

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

أنشطة أخرى

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