image_pdfimage_print

عرض درجة الحرارة والرطوبة

في هذا المشروع سوف نتعلم كيفية استخدام DHT11 أو جهاز الاستشعار DHT22  مع لوحة الاردوينو لقياس درجة الحرارة و الرطوبة . وسيتم طباعة درجة حرارة الغرفة والرطوبة على شاشة الـ LCD .

temp-humidity-display

الرسم على شاشة LCD

يمكن عرض جميع الرسائل المكونة من الحروف الانجليزية والأرقام ورموز خاصة مثل ( علامات الترقيم، الرموز الرياضية) وكذلك بعض الاحرف اليابانية و اليونانية على شاشة الـ LCD . ولكن كيف يمكننا عرض الحروف العربية أو رموز الخاصة بك على الشاشة ؟!

في هذا المشروع سنقوم بكتابة كلمات باللغة العربية و رسم رموز مخصصة عن طريق الرسم على شاشة LCD.

custom-characters-on-lcd

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

الأدوات التي تحتاجها لهذا المشروع :

HD44780

LCD 16×2 شاشة

potentiometer 10k

Potentiometer 10K Ω

220 Ω resistor

مقاومة 220 اوم

Half-size Breadboard

لوح تجارب حجم متوسط (Half size breadboard )

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

طباعة الحروف العربية او الرموز الخاصة بك على شاشة العرض LCD ليس من الصعب جدا، يتطلب ذلك معرفة CG-RAM لشاشة LCD .

 ذاكرة CG-RAM

CG-RAM هي العنصر الأساسي لإنشاء الرسومات و الاحرف الخاصة بك . حيث تقوم بتخزين الرسومات التي تم إنشاءها بمجرد اعلانها بالكود .
– حجم ذاكرة CG-RAM هو 64 بايت(64-byte) . ولذلك يمكنك تشكيل 8 احرف في وقت واحد، وكل حرف يتكون من  8 بايت (8-Byte)  . ثمانية احرف كل منها 8بايت (8-characters* 8-byte) تساوي 64-Byte .
– يبدأ عنوان الذاكرة CG-RAM من (0x40 Hex (64 decimal.

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

في الجدول التالي يتم توضيح عناوين الاحرف و الرسومات التي سيتم إنشاءها  وأوامر الطباعة الخاصة بهم:

custom-characters-on-lcd

في الجدول اعلاه ستلاحظ العنوان الذي سيبدأ به كل رمز خاصة بك مع امر الطباعة الخاص به. مثلا اول حرف يتم انشاؤه وتخزينة على الموقع من 0x40 الى 0x47 في الذاكرة،  ثم يتم طباعته على شاشة الـ LCD  بواسطة ارسال الامر 0 الى شاشة الـ LCD. والحرف الثاني تبدأ تخزينة من الموقع 0x48 الى 0x4F ويتم طباعتة من خلال ارسل الامر 1 الى الشاشة.

custom-characters-on-lcd

كيف يتم إنشاء أحرف مخصصة في  CG-RAM

يتم تشكيل كل حرف او رمز على الشاشة في مصفوفة تكون ابعادها 8×5. حيث ان 5 تمثل عدد الاعمدة و 8 تمثل عدد الصفوف.

custom-characters-on-lcd

اولا: قم برسم مصفوفة 8*5 بكسل، ثم قم برسم الرمز او الحرف الخاص بك في داخل المصفوفة، ثم قم بوضع على كل خلية ملون قيمة 1 , و قيمة صفر على الباقي.

custom-characters-on-lcd

ثانيا: قم بتحويل تلك المصفوفة الى 8-Bytes.

custom-characters-on-lcd

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

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

custom-characters-on-lcd

توصيل  شاشة الـ LCD :

ArduinoLCD
Pin 12RS pin
Pin 11Enable pin
Pin 5D4 pin
Pin 4D5 pin
Pin 3D6 pin
Pin 2D7 pin

يمكنك العودة إلى الدرس الثاني عشر للإطلاع على طريقة توصيل شاشة الـ LCD .

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

قم برفع البرنامج التالي على الاردوينو:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte M[8] = {
0b00000,
0b00000,
0b00110,
0b01001,
0b11001,
0b00110,
0b00000,
0b00000
};
byte R[8] = {
0b00000,
0b00000,
0b00010,
0b00010,
0b00011,
0b00100,
0b01000,
0b10000
};
byte H[8] = {
0b00000,
0b01100,
0b10010,
0b00001,
0b11111,
0b00000,
0b00000,
0b00000
};
byte BA[8] = {
0b10000,
0b10000,
0b10000,
0b10010,
0b11111,
0b00000,
0b00100,
0b00000
};
byte logo[8] = {
0b11111,
0b10101,
0b11111,
0b11111,
0b01110,
0b01010,
0b11011,
0b00000
};

void Word1()
{
lcd.setCursor(12,0);
lcd.write(byte(0));
lcd.write(1);
lcd.write(2);
lcd.write(3);
}
void Logo1()
{
lcd.setCursor(10,0);
lcd.write(4);
}

void setup() {
lcd.createChar(0, BA); // char (با)
lcd.createChar(1, H); //char ( ح )
lcd.createChar(2, R); //char (ـر)
lcd.createChar(3, M); //char (مـ)
lcd.createChar(4, logo);
lcd.begin(16, 2);
}

void loop() {
Word1();
Logo1();
}

شرح الكود :

تم رسم الأحرف داخل مصفوفة و تحويلها الى 8-byte :

custom-characters-on-lcd
byte M[8] = {
0b00000,
0b00000,
0b00110,
0b01001,
0b11001,
0b00110,
0b00000,
0b00000
};
byte R[8] = {
0b00000,
0b00000,
0b00010,
0b00010,
0b00011,
0b00100,
0b01000,
0b10000
};
byte H[8] = {
0b00000,
0b01100,
0b10010,
0b00001,
0b11111,
0b00000,
0b00000,
0b00000
};
byte BA[8] = {
0b10000,
0b10000,
0b10000,
0b10010,
0b11111,
0b00000,
0b00100,
0b00000
};

يتم استخدام createChar لتشكيل رمز يمكن طباعته على شاشة LCD و تكون ابعادة 8×5 بكسل.

lcd.createChar(0, BA); // char (با)
lcd.createChar(1, H); //char ( ح )
lcd.createChar(2, R); //char (ـر)
lcd.createChar(3, M); //char (مـ)

وليتم رسمه على شاشة الـ LCD  يتم استخدام الامر write

lcd.write(byte(0));
lcd.write(1);
lcd.write(2);
lcd.write(3);

بعد رفع الكود البرمجي على لوحة الأردوينو سيتم عرض كلمة مرحبا و رمز على شاشة الـ LCD .

custom-characters-on-lcd

مشروع الرادار الالكتروني

سنقوم في هذا المشروع بعمل نظام بسيط لرصد إحداثيات موقع الأجسام عن طريق صناعة رادار رقمي بإستخدام جهاز مستشعر الموجات فوق الصوتية HC-SR04، ولوحة الأردوينو كمتحكم للنظام . ويتم استخدام جهاز الحاسوب لعرض الواجهة الرسومية.

arduino-radar-project

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

الأدوات التي تحتاجها لهذا المشروع :

 مستشعر الموجات فوق الصوتية (Ultrasonic sensor HC- SR04).

tower pro sg90

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

arduino uno r3

Arduino Uno R3

Half-size Breadboard

 لوح تجارب حجم متوسط (Half size breadboard)

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

Female-Male Jumper Wires

 اسلاك توصيل أنثى/ذكر (Jumper Wires Female/male)

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

يقوم الاردوينو بالتحكم بزاوية دوران محرك السيرفو(Servo motor) ، لذلك يتم تثبيت حساس الموجات فوق الصوتية على المحرك ليتم قياس المسافة عند تلك الزاوية.

قم بتوصيل الدائرة الكهربائية على لوحة التجارب كما هو موضح بالصورة.

arduino-radar-project

يتحتوي مستشعر الموجات فوق الصوتية على اربع منافذ، منفذ الطاقة  Vcc و منفذ GND و منفذ Trig الذي يتم من خلاله ارسال النبضة, و منفذ Echo الذي يتم من خلاله استقبال صدى النبضة المرسلة من قبل Trig.
يتم توصيل مستشعر الموجات فوق الصوتية بالاردوينو كالتالي:

حساس الموجات فوق الصوتيةلوحة الاردوينو
Vcc5v
GNDGND
TrigPin 10
EchoPin 11

و توصيل محرك السيرفو كالتالي:

لوحة الاردوينومحرك السيرفو
5vالسلك الأحمر
GND السلك الأسود/البني
 Pin 9 السلك الاصفر/البرتقالي

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

واجهة المستخدم:

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

arduino-radar-project

الان نحن بحتاج لعمل برنامج يتم رفعه على الاردوينو الذي من شأنه تمكين التفاعل بين    Arduino IDE  و  IDE Processing.

*يمكنك تنزيل برنامج Processing من هنـا.

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

قم برفع البرنامج التالي على الاردوينو:

#include <Servo.h>

Servo leftRightServo; // set a variable to map the servo
int leftRightPos = 0; // set a variable to store the servo position
const int numReadings = 10; // set a variable for the number of readings to take
int index = 0; // the index of the current reading
int total = 0; // the total of all readings
int average = 0; // the average
int echoPin = 11; // the SRF05's echo pin
int initPin = 10; // the SRF05's init pin
unsigned long pulseTime = 0; // variable for reading the pulse
unsigned long distance = 0; // variable for storing distance

/* setup the pins, servo and serial port */
void setup() {
  leftRightServo.attach(9); 
// make the init pin an output:
  pinMode(initPin, OUTPUT); 
// make the echo pin an input:
  pinMode(echoPin, INPUT); 
// initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  for(leftRightPos = 0; leftRightPos < 180; leftRightPos++) { // going left to right.
    leftRightServo.write(leftRightPos);
    average=Avg();
    Serial.print("X"); // print leading X to mark the following value as degrees
    Serial.print(leftRightPos); // current servo position
    Serial.print("V"); // preceeding character to separate values
    Serial.println(average); // average of sensor readings
  }
/*
start going right to left after we got to 180 degrees
*/
  for(leftRightPos = 180; leftRightPos > 0; leftRightPos--) { // going right to left
    leftRightServo.write(leftRightPos);
    average=Avg();
    Serial.print("X");
    Serial.print(leftRightPos);
    Serial.print("V");
    Serial.println(average);
  }
}

long Avg()
{
  for (index = 0; index<=numReadings;index++) {
  digitalWrite(initPin, LOW);
  delayMicroseconds(50);
  digitalWrite(initPin, HIGH);
  delayMicroseconds(50);
  digitalWrite(initPin, LOW);
  pulseTime = pulseIn(echoPin, HIGH);
  distance = pulseTime/58;
  total = total + distance;
  delay(10);
}
average = total/numReadings; // create average reading

if (index >= numReadings) { // reset the counts when at the last item of the array
index = 0;
total = 0;
}
return average;
}

لمحة عن الكود :

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

دالة for  تقوم بتغير قيمة زاوية الدوران للمحرك :

for(leftRightPos = 0; leftRightPos < 180; leftRightPos++) {
}
for(leftRightPos = 180; leftRightPos > 0; leftRightPos--){
}

تقوم الدالة ()AVG اعتمادا على القيم التي يتلقاها حساس الموجات فوق الصوتية بحساب المسافة التي يبعد عنها الجسم عن الحساس :

long Avg()
{
  for (index = 0; index<=numReadings;index++) {
  digitalWrite(initPin, LOW);
  delayMicroseconds(50);
  digitalWrite(initPin, HIGH);
  delayMicroseconds(50);
  digitalWrite(initPin, LOW);
  pulseTime = pulseIn(echoPin, HIGH);
  distance = pulseTime/58;
  total = total + distance;
  delay(10);
}
average = total/numReadings; // create average reading

if (index >= numReadings) { // reset the counts when at the last item of the array
index = 0;
total = 0;
}
return average;
}

* يمكنك الاطلاع على مشروع نظام الحسّاسات لاصطفاف السيارة لفهم الكود المتعلق بحساس الموجات فوق الصوتية و حساب المسافة , و الدرس الخامس عشر للاطلاع على شرح الكود المتعلق بمحرك السيرفو.

يتم ارسال قيمة المسافة و الزاوية عند هذة القيمة إلى الحاسوب فيقوم البرنامج  (Processing IDE)  برسم خطوط الرادار باستعمال الدوال المثلثة طبقا للمعلومات المستقبله.

Serial.print("X"); 
Serial.print(leftRightPos);
Serial.print("V"); 
Serial.println(average);

برمجة الواجهة الرسومية

 الحاسوب بعد ارسال قيم الزاوية و المسافة من الاردوينو الى (processing IDE) ، يتم استقبالها بإستخدام دالة ()SerialEvent  .
تقوم ()SerialEvent بقراءة البيانات من المنفذ التسلسلي (serial port) ثم نقوم بوضع قيم الزاوية و المسافة في متغيرات (degree, value). هذة المتغيرات سيتم استخدامها لرسم الرادار، و الخطوط، و الكشف عن الأجسام ، وتغير النصوص .

لعرض البيانات على الشاشة يتم انشاء Arrays  لتخزين القيم الحديثة على newValue Array و عمل تحديث للقيم القديمة على oldValue Array . لأن الموقع اتباعا لحركة  محرك السيرفو يتغير بإستمرار ، فسنفقد البيانات القديمة التي سيتم عرضها على الشاشة.

int[] newValue = new int[181];
int[] oldValue = new int[181];
arduino-radar-project

لرسم الرادار سيتم كتابة الداله ()drawRadar التي تتكون من دوال ()arc و ()line.

void drawRadar() {

 for (int i = 0; i <=6; i++){
  noFill();
  strokeWeight(1);
  stroke(0, 255-(30*i), 0);
  arc(radius, radius, (100*i), (100*i),PI,TWO_PI); 
  fill(250, 103, 0);
  noStroke();
  text(Integer.toString(radarDist+50), 380, (305-radarDist), 50, 50);
  radarDist+=50;
 }

 radarDist = 0; 
 for (int i = 0; i <= 6; i++) {
   strokeWeight(1);
   stroke(0, 55, 0);
   line(radius, radius, radius + cos(radians(180+(30*i)))*w, radius + sin(radians(180+(30*i)))*w);
   fill(153, 153, 153);
   noStroke();
   if (180+(30*i) >= 300) {
    text(Integer.toString(180+(30*i)), (radius+10) + cos(radians(180+(30*i)))*(w+10), (radius+10) + sin(radians(180+(30*i)))*(w+10), 25,50);
   } 
  else {
   text(Integer.toString(180+(30*i)), radius + cos(radians(180+(30*i)))*w, radius + sin(radians(180+(30*i)))*w, 60,40);
  }
 }
}
arduino-radar-project

ليتم عمل مسح للرادار يتم رسم الخط الذي يتحرك جنب إلى جنب اتباعا لحركة محرك السيرفو بإستخدام الدالة  ()setupSweep  .

تستخدم الدالة  ()setupSweep الدالة ()line التي تستخدم المتغير degree لإعادة رسم الخط لكل درجة.

void setupSweep(){
 strokeWeight(7); 
 if (motion == 0) { 
 for (int i = 0; i <= 20; i++) { 
 stroke(0, (10*i), 0); 
 line(radius, radius, radius + cos(radians(degree+(180+i)))*w, radius + sin(radians(degree+(180+i)))*w); 
 }
 } else { // if going right to left
 for (int i = 20; i >= 0; i--) { 
 stroke(0,200-(10*i), 0);
 line(radius, radius, radius + cos(radians(degree+(180+i)))*w, radius + sin(radians(degree+(180+i)))*w);
 }
 } 
}

لإعداد تحديث الأشكال يتم عمل الدالة ()SetupShapes . سنقوم بإستخدام الدالة  For loop للتحرك بين القيم التي تم تخزينها بالـ (Arrays  (newValue, oldValue

void SetupShapes(){
  noStroke();                           
  
  fill(0,50,0);                         
  beginShape();                         
  for (int i = 0; i < 180; i++) {     
  x = radius + cos(radians((180+i)))*((oldValue)); 
  y = radius + sin(radians((180+i)))*((oldValue)); 
  vertex(x, y);                     
  }
  endShape();                           
  
  fill(0,110,0);
  beginShape();
  for (int i = 0; i < 180; i++) {
  x = radius + cos(radians((180+i)))*(newValue);
  y = radius + sin(radians((180+i)))*(newValue);
  vertex(x, y);
  }
  endShape();
  
  fill(0,170,0);
  beginShape();
  for (int i = 0; i < 180; i++) {
  x = radius + cos(radians((180+i)))*((newValue+oldValue)/2); 
  y = radius + sin(radians((180+i)))*((newValue+oldValue)/2);
  vertex(x, y);
  }
  endShape();
}

لرسم موقع الاجسام التي تم رصدها  ، نقوم بعمل الدالة ()drawObject .التي تستخدم المسافة الملتقطة من مستشعر الموجات فوق الصوتية و بالاشتراك مع الزاوية لرسم الجسم على الرادار.

void drawObject() {
  if (firstRun >= 360) {
  stroke(250,103,0);
  strokeWeight(1);
  noFill();
  for (int i = 0; i < 180; i++) { if (oldValue - newValue > 35 || newValue - oldValue > 35) {
  x = radius + cos(radians((180+i)))*(newValue);
  y = radius + sin(radians((180+i)))*(newValue);
  ellipse(x, y, 10, 10); 
  }
  }
  } 
}

وللإطلاع على القيم التي تم استقبالها و النصوص تم إنشاء الدالة ()drawText  .

arduino-radar-project

يمكنك تنزيل كود  الـ (Processing) المتعلق بالواجهة الرسومية للرادار من هنـا.

التحكم بإضاءة RGB LED من خلال واجهة رسومية عبر Matlab

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

في هذا المشروع ستتعلم كيفية انشاء واجهة المستخدم الرسومية بإستخدام الماتلاب ، للتحكم في RGB LED المتصل بالاردوينو.

matlab-gui

الماتلاب Matlab

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

سنقوم بإنشاء واجهة للمستخدم باستخدام برنامج الماتلاب (Matlab) للتحكم بالاجهزة المرتبطة بالاردوينو, ليتم ارسال الأوامر من جهاز الحاسوب (Matlab) للأردوينو عبر المنفذ التسلسلي (Serial port).

matlab-gui

تجهيز الأردوينو و إعداد الماتلاب:
1- قم بتحميل برنامج الماتلاب من الرابط هنـا.
2-  قم بتحميل حزمة الدعم للأردوينو من الرابط هنـا : لقراءة, وكتابة, وتحليل بيانات الأجهزة المربوطة مع الاردوينو .

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

الأدوات التي تحتاجها لهذا المشروع :

Diffused RGB 5mm LED

RGB 5mm LED

220 Ω resistor

مقاومة 220 اوم

small size breadboard 170 colors

  لوح تجارب صغير (small size breadboard)

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر  (Jumper Wires Male Male)

 

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

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

matlab-gui

يمكنك العودة للـدرس الرابع للاطلاع على شرح و تفاصيل اكثر حول RGB LED .

إنشاء الواجهة الرسومية

واجهات المستخدم الرسومية GUI’s في الماتلاب يتم إنشاؤها بواسطة أداة تدعى :
GUIDE : Graphical User Interface Development Environment
هذه الأداة تسمح للمبرمج أن يقوم بتحرير الواجهة الرسومية GUI ،وتنسيقها وإضافة العناصر التي يريدها إلى الواجهة،كما يمكنه  تغيير الخصائص لكل كائن في الواجهة: الإسم،اللون،الحجم،نوع الخط,وغيرها من الخصائص .

على شاشة الاوامر للماتلاب قم بكتابة الأمر : guide

matlab-gui

 

matlab-gui

قم بالضغط على (Blank GUI(Default  الموجودة في علامة التويب (Create New GUI) كما هو مبين بالصورة اعلاه.
ثم  OK ليظهر محرر التخطيط الرسومي للواجهات.

matlab-gui

 

سنقوم بإنشاء ثلاثة Sliders لتتحكم بـ RGB LED عن طريق الواجهة الرسومية.
قم بالضغط على  Slider, ثم قم برسم الشكل على نافذة العمل , كما هو مبين بالشكل التالي :

matlab-gui

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

matlab-gui

في الاردوينو, الجهد على المداخل التناظرية يكون محدود بين 0v-5v .

يمكنك اضافة نص من خلال Static text، و تغير الخصائص المتعلقة بالخط ,و تغير لون خلفية الواجهة.

matlab-gui

قم بحفظ save الشكل  figure كملف،عندما تقوم بحفظه سيتم تقائيا توليد ملفين لهما نفس الإسم لكن ذو لاحقة مختلفة.
Fig file: يحتوي على الواجهة الرسومية  GUI التي قمت بإنشائها.
M-File : يحتوي code التعليمات البرمجية التي تتحكم بتنفيذ وسلوك الواجهة.

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

بعد بحفظ الواجهة الرسومية التي بنيتها بإستخدام الأداة GUIDE ،GUIDE سيقوم بتوليد الكود البرمجي لتعمل الواجهة، يتضمن التوابع الهيكلية التي يمكن للمبرمج أن يُعدّل عليها ويتحكم بتنفيذ وسلوك الواجهة الرسومية.

نقوم بفتح والتعديل على الكود البرمجي للواجهة (rgb.m) كما يلي :

function varargout = rgb(varargin)

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @rgb_OpeningFcn, ...
                   'gui_OutputFcn',  @rgb_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before rgb is made visible.
function rgb_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for rgb
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.
function varargout = rgb_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output;
clear all;
global a;
a=arduino;


% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
b=get(hObject,'Value');
global a;
writePWMVoltage( a , 'D9' , 5-b );

% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end


% --- Executes on slider movement.
function slider2_Callback(hObject, eventdata, handles)
c=get(hObject,'Value');
global a;
writePWMVoltage( a , 'D10' , 5-c );

% --- Executes during object creation, after setting all properties.
function slider2_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end


% --- Executes on slider movement.
function slider3_Callback(hObject, eventdata, handles)
d=get(hObject,'Value');
global a;
writePWMVoltage( a , 'D11' , 5-d );

function slider3_CreateFcn(hObject, eventdata, handles)

if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end

لمحة عن الكود : 

  إنشاء الاتصال

لإنشاء الاتصال بين الماتلاب ولوحة الاردوينو :

a = arduino;

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

a = arduino('COM5', 'uno');

الكتابة على المنافذ :

لتعيين القيمة المتغيرة لكل منفذ( PWM pin) نستخدم الامر:

writePWMDutyCycle(a, pin, dutyCycle);

في هذا المشروع يتم تغير القيمة لكل منفذ اعتمادا على حركة ال Slider ، فتم اضافة الكود التالي لكل Slider كما يلي :

b=get(hObject,'Value');
global a;
writePWMVoltage( a , 'Pin' , 5-b );

يتم تغير الـ Pin لكل Slider اعتمادا على المدخل المرتبط به على لوحة الاردوينو

قم بحفظ و تشغيل الملف للتحكم بالـ RGB LED .

*يمكنك تنزيل واجهة المستخدم و الكود لهذا المشروع من هنـا.

التحكم التلقائي للضوء

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

في هذا المشروع ستكون قادر على جعل المصابيح او المراوح اوغيرها من الأجهزة تتفعل تلقائيا عند المشي في الممرات او الغرف. عن طريق إستخدام حساس الحركة (PIR Sensor) للكشف عن اي حركة على مدار قطره و إستخدام المحول (Relay) للتحكم بكهرباء.

automatic-room-lights

في المشاريع او التطبيقات العملية قد نود أن نتحكم بأحمال ذات قدرات عالية High Power باستخدام المتحكم الاصغر Microcontroller . فمثلاً أن نتحكم بإنارة مصباح يعمل على تيار متردد (AC) او تشغيل محركات كهربائية حثية مثل مضخات المياه.

من خلال الاردوينو ,لا يمكننا تشغيل اي حمل ذو استهلاك كبير للطاقة (220v,110v) لأن اقصى جهد يمكن توليده من الاردوينو هو 5 فولت فقط. احد الاجهزة التي لا يمكن للاكترونيات الاستغناء عنها والتي تلعب دور كبير في التحكم بالدرات الكهربائية هو المرحٌل -الريلي-(Relay) .

المرحٌلRelay

الوظيفة الأولية للمرحل هي فصل دوائر التحكم عن دوائر القدرة، لقيادة تيار مرتفع انطلاقا من إشارة تحكم ضعيفة نسبيا. وبالتالي عن طريق تطبيق تيار صغير يمكننا تشغيل المرحل للسماح بتدفق التيار الأكبر.

فالمرحل يعمل كعنصر وصل/فصل (ON-OFF switch) لتوصيل التيار الكهربائي للأحمال او فصلها.

automatic-room-lights

في هذا المشروع ,سنقوم باستخدام HL-52S  ريلي , يحتوي على ثلاث اقطاب يتم وصلها بمصدر الطاقة ذات الفولتية العالية. القطب الاوسط  يشير الحرف C الى كلمة Common  والتي تعني مشترك, يشير ان هذا القطب اما ان يكون موصولاً بالقطب (NC) تشير الى Normally Closed  والتي تعني مغلق عادةً او (NO) تشير الى  Normally Open والتي تعني مفتوح عادةً ،فلذلك سمي بالقطب المشترك.

automatic-room-lights

وعلى الجانب الآخر لدينا مجموعتين من الدبابيس، اول مجموعة تحتوي على 4 دبابيس، دبوس GND الأرض و دبوس الـ Vcc لتزويد الريلي بالطاقة ومدخلين IN1 ,IN2 . والمجموعة الثانية عبارة عن 3 دبابيس، Jumper  بين الـ JD-Vccو VCC  و دبوس الارض GND

automatic-room-lights

تحذير: يجب وضع الـ Relay على لوح عازل وعدم لمسه من اسفل اللوح الملحوم عليه لأنها قد تكون موصله للتيار الكهربائي بعد وصله بالجهد العالي.

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

الأدوات التي تحتاجها لهذا المشروع :

المرحل (5V Relay Module)

pir motion sensor

حساس الحركة (pir motion sensor)

small size breadboard 170 colors

  لوح تجارب صغير (small size breadboard)

arduino uno r3

Arduino Uno R3

Female-Male Jumper Wires

 اسلاك توصيل أنثى/ذكر (Jumper Wires Female/male)

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

automatic-room-lights

Light Bulb Socket

 

انتبه:

قبل ان نبدأ بتوصيل الدائرة، ينبغي تحذيرك ، أن هذا المشروع يتطلب توصيل تيار متردد (AC – 220V) ،هذا التيار خطير و يجب التعامل معه بحذر شديد. لا تقم بالتوصيل مالم تكن على دراية كاملة بما تفعل او اطلب مساعدة من شخص ذو خبرة في هذا المجال.
اذا استخدم بطريقة غير صحيحة  او غير سليمة يمكن ان يؤدي إلى إصابات خطيرة أو وفاة. لذلك يجب الحذر جدا من ما تقومون به لأننا لا نتحمل اي مسؤولية من اي اجراءات تقوم به.

automatic-room-lights

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

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

automatic-room-lights

قم بتوصيل سلك الطاقة الموجبة الخاص بالريلي بمنفذ ال 5v على لوحة التجارب،  وسلك الطاقة السالبة بمنفذ ال Gnd المتواجد على لوحة التجارب. قم بتوصيل سلك الاشارة (IN1) بمنفذ رقم 10 على لوحة الاردوينو.
يمكنك العودة الى الدرس الثامن عشر لمعرفة  طريقة التوصيل المتعلق في مستشعر الحركة (PIR Sensor) ،  قم بتوصيل سلك الاشارة  (Signal) للمستشعر بمنفذ رقم 9 على لوحة الاردوينو.

تنبيه :
– قد تختلف طرق توصيل مستشعر الحركة بلوحة الارديونو بناءً على نوع المستشعر، الرجاء تفقد أستمارة البينات لمستشعرك قبل توصيله.
– قد تختلف طرق توصيل الريلي بلوحة الاردوينو بناءً على نوع الريلي، الرجاء تفقد وصف البينات للريلي الخاص بك قبل توصيله.
– اذا كنت تملك نوع اخر من انواع الريلي الذي لا يكون ملحوم على دارة، فاللأسف لا يمكنك توصيله بشكل مباشر بالارديونو.
– اي توصيل  خاطئ قد يؤدي الى تلف المتحكم الدقيق للوحة الاردوينو.

البرمجة:

يقوم الاردوينو بإنتظار إشارة من مستشعر الحركةMotion PIR sensor ، وفور حصولة على اشارة من المسشتعر تشير لوجود تحرك، يقوم بتفعيل الـ Relay  لفتح الإضاءة.

قم بتوصيل الاردوينو بالكمبيوتر، وقم بتحميل البرمجة التالي على الاردوينو:

int Relay=10;
int inputPin = 9; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status
 
void setup() {
 pinMode(inputPin, INPUT); // declare sensor as input
 pinMode(Relay,OUTPUT);
 
 Serial.begin(9600);
}
 
void loop(){
 val = digitalRead(inputPin); // read input value
 // Serial.println(val);
 if (val == HIGH) { 
 digitalWrite(Relay,LOW); 
 Serial.println(val);// check if the input is HIGH
 if (pirState == LOW) {
 Serial.println("Motion detected!");
 pirState = HIGH;
 }
 delay(2000);
 } else {
 digitalWrite(Relay,HIGH);
 if (pirState == HIGH){
 Serial.println("Motion ended!");
 pirState = LOW;
 }
 delay(2000);
 }
}

لمحة سريعة عن الكود:

لفتح و اغلاق انارة AC يجب تفعيل الـ Relayعن طريق مدخل IN1 . يعمل مدخل IN1 في الـ Relay عكسيا، فيتم تفعيل المرحل (Relay) عند ادخال قيمة (LOW) الى مدخل (IN1)( حسب طريقة صنع الدارة على اللوحة الصغيرة التي يلحم عليها الريلي) .

 digitalWrite(Relay,LOW);

يمكنك العودة الى الدرس الثامن عشر لمعرفة شرح الكود المتعلق بحساس الحركة (Motion Sensor).

نظام الحسّاسات لاصطفاف السيارة

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

يقوم متحكم الاردوينو بتحسس الأجسام القريبة ،مستخدماً حساس الموجات فوق الصوتية (Ultrasonic sensor)  لحساب المسافة بين المستشعر والجسم ، وكلما اقترب الحساس من جسم ما، يقوم الاردوينو بإصدار تنبيه صوتي أو وميض ضوئي إلى الإقتراب واحتمالية الإصطدام.

parking-sensor

حساس الموجات فوق الصوتية (Ultrasonic sensor)

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

parking-sensor

يحتوي حساس الموجات الفوق صوتية على اربع دبابيس  (Vcc,Trig, Echo, GND) .
– Vcc و GND  لتزويد الحساس بالطاقة.
– Trig  لإرسال الموجات فوق الصوتية.
–   Echo  لتلقي  الموجة.

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

سنقوم باستعمال الطنان (Buzzer) و الـ LEDs وحساس الموجات الفوق صوتي (Ultrasonic sensor) معا لتقدير قرب أو بعد مسافة الأشياء عن الحساس الفوق صوتي.

الأدوات التي تحتاجها لهذا المشروع :

-حساس الموجات الفوق صوتي (Ultrasonic)

parking-sensor

LEDs

العدد: 8 ( 3×احمر , 3× أصفر , 2× أخضر).

74HC595 Shift Register

74HC595 Shift Register

Piezo sounder

Buzzer

220 Ω resistor

مقاومة 220 اوم

العدد: 9

arduino uno r3

لوحة الاردوينو (Arduino)

Full size breadboard 830

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

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

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

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

parking-sensor
توصيل    74HC595 8 Bit Shift Register:
Shift RegisterArduino/LEDs
IC Pin 8 , Pin 13GND
IC Pin 10 , Pin 16Vcc
IC Pin 11Pin 11
IC Pin 12Pin 12
IC Pin 14Pin 13
IC Pin 151st LED
IC Pin 1 -IC Pin 82nd – 8th LEDs

ملاحظة : يتم توصيل shift register بالجزء الموجب (Anod) للـ LEDs.

توصيل حساس الموجات فوق الصوتية (Ultrasonic Sensor) :
Ultrasonic SensorArduino
VCC+5V
TrigPin 10
EchoPin 9
GroundGND
توصيل Buzzer:
BuzzerArduino
Shorter leadGND
Longer leadPin 4
توصيل LEDs :

يتم توصيل الجزء السالب (Cathod) للـ LEDs  بمقاومة 220 اوم لكل LED ثم يتم توصيلهم بالـ GND .

 *يمكنك الإطلاع على الدرس الخامس لمعرفة المزيد عن  الـ Shift Register.

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

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

int tonePin = 4;    //Tone - Red Jumper
int trigPin = 10;    //Trig - violet Jumper
int echoPin = 9;   //Echo - yellow Jumper
int clockPin = 11;  //IC Pin 11 - white Jumper
int latchPin = 12;  //IC Pin 12 - Blue Jumper
int dataPin = 13;   //IC Pin 14 - Green Jumper

byte possible_patterns[9] = {
  B00000000,
  B00000001,
  B00000011,
  B00000111,
  B00001111,
  B00011111,
  B00111111,
  B01111111,
  B11111111,
};
int proximity=0;
int duration;
int distance;

void setup() {
  //Serial Port
  Serial.begin (9600);
 
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(tonePin, OUTPUT);
}

void loop() {
  digitalWrite(latchPin, LOW);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
 
  proximity=map(distance, 0, 45, 8, 0);
  //Serial.println(proximity);
 
 if (proximity <= 0){
      proximity=0; 
    } 
 else if (proximity >= 3 && proximity <= 4){ 
     tone(tonePin, 200000, 200);
      } 
 else if (proximity >= 5 && proximity <= 6){ 
     tone(tonePin,5000, 200); 
      } 
 else if (proximity >= 7 && proximity <= 8){
    tone(tonePin, 1000, 200);
     }
  shiftOut(dataPin, clockPin, MSBFIRST, possible_patterns[proximity]);
  digitalWrite(latchPin, HIGH);
 
  delay(600);
  noTone(tonePin);
}

لمحة سريعة عن الكود:

لإستخدام الحساس يتم ارسال نبضة (HIGH Level)على Trig Pin لمدة تزيد عن 10 Microseconds,ثم بعد ذلك LOW, وهذه تمثل الموجه فوق الصوتية المرسلة .

digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);

إذا تم الكشف عن جسم ما أمام جهاز الاستشعار(ستصبح قيمة Echo Pin =HIGH Level)، يتم حساب مدة بقاء الإشارةHIGH   المستقبلة عن Echo pin .

duration = pulseIn(echoPin, HIGH);

و بعد ذلك يتم حساب المسافة التي يبعد عنها الجسم عن حساس الأمواج فوق الصوتية ويتم تحولها الى رقم  بوحدة السنتيميتر

distance = (duration/2) / 29.1;

حساب المسافة :

المسافة الكلية = الزمن x السرعة

ومن المعروف ان سرعة الصوت  في الهواء ثابت و يساوي 343 م/ث

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

بعد الجسم عن مصدر الأمواج الفوق صوتية =( الزمن x السرعة)/2

نظام التحكم في الإضاءة عبر البلوتوث

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

  في هذا المشروع , سنقوم بعمل نظام التحكم في إضاءة المنزل باستخدام الهاتف الذكي(Android). تم تصميم هذا النظام لتجعل من حياتك أكثر متعة وراحة  ولتقديم الدعم لكبار السن و ذوي الاحتياجات الخاصة في المنزل

remote-lighting-control

نظرة عامة

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

remote-lighting-control

يعمل البلوتوث HC-06 على الاتصال التسلسلي , من خلاله يمكنك إرسال و استقبال البيانات. لذا يمكنك استخدام ال serial terminal او جهاز مجهز بتقنية البلوتوث مثل الاندرويد للتحكم بالمشروع.

يحتوي البلوتوث على  منفذين للطاقة ,ومنفذ  TX يتم من خلاله ارسال البيانات عبر البلوتوث ,ومنفذRX   يتم من خلاله استقبال البيانات المرسله للبلوتوث.

12

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

الأدوات التي تحتاجها لهذا المشروع :

(Bluetooth Module(HC-06

5mm Red LED

220 Ω resistor

مقاومة 220 اوم

small size breadboard 170 colors

small size breadboard  لوح تجارب صغير

arduino uno r3

Arduino Uno R3

Female-Male Jumper Wires

 اسلاك توصيل أنثى/ذكر (Jumper Wires Female/male)

Jumper Wires Male/Male

سلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

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

يتم توصيل البلوتوث بالاردوينو كالتالي:

remote-lighting-control
Arduino PinsBluetooth Pins
RX -Pin 0TX
TX -Pin 1RX
5vVcc
GNDGND

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

تنبيه : لن يتم استقبال البيانات اذا تم توصيل RX  الى RX  و TX الى TX  .

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

في الكود البرمجي سنقوم بمراجعة البيانات الواردة وتنفيذ عملية المقارنة ، اذا كانت البيانات المستقبلة من الهاتف الذكي 1 يتم اضاءة الـ LED ويتم اطفاءه اذا كانت البيانات المستقبلة 0 .

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

char data = 0;
void setup()
{
   Serial.begin(9600);
   pinMode(13, OUTPUT);
}
void loop()
{
  if(Serial.available() > 0)
  {
    data = Serial.read();
    Serial.print(data);
    Serial.print("\n");
    if(data == '1')
      digitalWrite(13, HIGH);
    else if(data == '0')
            digitalWrite(13, LOW);
  }
}

لذلك نحن بحاجة لبناء تطبيق Android  و الذي سوف يرسل تلك الاحرف “1” و”0″ عندما يتم الضغط على زر معين .

لمحة سريعة عن الكود:

الـ boud rate الافتراضي لوحدة البلوتوث (HC-06)هي 9600

Serial.begin(9600);

لقراءة البيانات الواردة وتخزينها في متغير data

data = Serial.read();

يمكنك العودة إلى الدرس الثالث لمعرفة شرح الكود المتعلق بالتحكم في الـLEDs.

ملاحظة : يجب فصل الاسلاك الموصولة بالاردوينو بمنافذ الTX والRX عند تحميل اي نص جديد الى الاردوينو، لتفادي اي نوع من انواع تداخل الاشارات بين الاردوينو وHC-06 .

بعد رفع الكود على الاردوينو يمكنك فتح شاشة الإتصال التسلسلي(Serial Monitor)   ومراقب البيانات المرسلة.

remote-lighting-control

تطبيق الاندرويد

في هذا المشروع لن يتم تغطية طريقة برمجة تطبيق الاندرويد , يمكنك تحميل البرنامج من هنا

كيف يمكن استخدام التطبيق؟
1- قم بتنزيل البرنامج من هنا
2- قم بإقتران جهازك مع البلوتوث   HC-06:
– تشغيل البلوتوث HC-06.
– تفحص الجهاز المتوفر .
-يتم الاقتران الى البلوتوث عن طريق ادخال كلمة المرور الافتراضية  1234 او   0000.
3- قم بفتح التطبيق , ثم قم بالضغط على زر الاجهزة المقترنة  ثم قم بإختيار وحدة البلوتوث الخاصة بك (HC-06) .

remote-lighting-control

قم بالغلط على زر تشغيل لتشغيل الـ LED  و ايقاف لإطفاءه.

remote-lighting-control

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

في هذا الدرس ستتعلم استخدام مستشعر الحركة ‘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 protected]'
GMAIL_USER = '[email protected]'
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 ثانية من ارسال الايميل الأخير ( حتى لا يتم ارسال ايميلات الكترونية كثيره )

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

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

اردوينو – الدرس السابع عشر – التحكم بالمحرك الخطوي Stepper Motor

محرك Stepper motor ويدعى بالعربية المحرك الخطوي ( اي محرك خطوة بخطوة) وهو محرك كهربائي يستخدم في الآلات الصغيرة التي تحتاج لدقة في التحكم مثل الطابعة وقاطع الليزر .. الخ

من أهم مميزات هذا المحرك هو انه يمكنه التحكم في عدد وسرعة جوراته وزاوية التوقف بدقة.

في هذا الدرس ستتعلم كيفية التحكم بمحرك stepper motor عبر الأردوينو ورقاقة التحكم L293D والتي استخدمناها بالدرس 16.

stepper motor project

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

لبناء هذه التجربة عليك توفير القطع التالية

stepper motor

5V Stepper Motor

L293D IC

L293D IC

Half-size Breadboard

Half-size Breadboard

Arduino Uno R3

Arduino Uno R3

Jumper wires

Jumper wires

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

محرك stepper motor لديه 5 اسلاك ، كما سنقوم باستخدام رقاقة L293D كاملة هذه المرة .

لاستخدام المحرك بالمشروع يمكن استخدام اسلاك jumper wires وربطها بالمحرك عبر المقبس الموجود بنهاية اسلاكه الخمسة حتى تتمكن مر توصيله بلوح التجارب.

stepper motor board design

لاحظ أن السلك الأحمر للمحرك لايتم ربطه بأي شيء.

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

الكود التالي يستخدم شاشة الاتصال التسلسلي serial monitor ، لذلك بعد رفع الكود على الأردوينو وتشغيله ، قم بفتح شاشة الاتصال التسلسلي Serial Monitor وقم بإدخال رقم الخطوات ‘steps’.
جرب ادخال القيمة 500 ، هذا سيجعل المحرك يدور حتى درجة 360 درجة. قم بإدخال القيمة -500 وسيقوم المحرك بالدوران بشكل عكسي.

#include <Stepper.h>
 
int in1Pin = 12;
int in2Pin = 11;
int in3Pin = 10;
int in4Pin = 9;
 
Stepper motor(512, in1Pin, in2Pin, in3Pin, in4Pin);  
 
void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(in3Pin, OUTPUT);
  pinMode(in4Pin, OUTPUT);

  while (!Serial);
 
  Serial.begin(9600);
  motor.setSpeed(20);
}
 
void loop()
{
  if (Serial.available())
  {
    int steps = Serial.parseInt();
    motor.step(steps);
  }
}

 

كما تلاحظ يوجد مكتبة برمجية خاصة لدعم محرك stepper motor مما يجعل استخدام المحرك سهل جداً.

بعد اضافة مكتبة ‘stepper’ البرمجية ، يتم تعريف المنافذ  ‘in1’ – ‘in4’.

Stepper motor(768, in1Pin, in2Pin, in3Pin, in4Pin);

 

العامل المدخل الأول هو عبار عن عدد الخطوات ‘steps’ التي سينفذها المحرك.

بعد ذلك يقوم متحكم الأردوينو بإنتظار الأرقام المقترحة للادخال من خلال الاتصال التسلسلي Serial Monitor.

أخيراً ، الأمر التالي يقوم بتحديد السرعة للمحرك.

motor.setSpeed(10);

 

دالة loop واضحة ، حيث ينتظر الرقم المدخل (كنص) من خلال الاتصال التسلسلي Serial Monitor  ويتم تحويل النص لرقم عبر استخدام ‘parseint’. بعد ذلك يتم توجيه المحرك بعدد خطوات الحركة.

المحرك الخطوي  Stepper Motor

المحرك الخطوي  Stepper motor يستخدم تروس والمغناطيس الكهربائي لدفع التروس خطوه بخطوه.

stepper motor design

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

حاول تغيير الأمر الذي يقوم بتحديد سرعة المحرك.

 motor.setSpeed(20);

 

قم بالتلاعب بالقيم والأسلاك للتتعرف على تأثير التغيرات التي قمت بها بالتجربة.

 

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

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

dc omtor reverse

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

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

لتنفيذ هذه التجربة عليك توفير القطع التالية

dc motor

Small 6V DC Motor

L293D IC

L293D IC

pot

10kΩ variable resistor (pot)

Tactile push switch

Tactile push switch

Half-size Breadboard

Half-size Breadboard

Arduino Uno R3

Arduino Uno R3

Jumper wires

Jumper wires

التجربة

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

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

dc motor reverse 1 design

لاحظ اتجاه دوران المحرك ، يمكنك لمس المحرك بأصابعك لمعرفة اتجها الحركه . يمكنك عكس اتجاه حركة المحرك عبر عكس توصيلات المحرك (قم بتبديل توصيلة الـ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 سيعكس حركة دوران المحرك ( الاتجاه الآخر ).

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

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

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

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

dc motor reverse 3 design

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

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

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 ، يتم تحديد قيمة السرعة للمحرك عبر اخذ قراءة القيمة التناظرية ‘analogRead’ من المقاوم المتغير ‘pot’ وقسمته على 4.

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

اذا تم الضغط على الزر ، فإن المحرك سيتحرك للأمام ، وبالضغط مره أخرى سيتحرك بعكس الاتجاه.
القيمة  لمتغير ‘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.

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

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

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

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

رقاقة التحكم بالمحرك L293D

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

l293d

المحرك الثاني يمكن ربطه بين OUT3 و OUT4. كما يجب توفير ثلاث منافذ تحكم .

EN2 متصل بـ’PWM enabled output’ بالأردوينو.
IN3 متصل بالمخارج الرقمية ‘digital outpus’ بالأردوينو

الرقاقة L293D تمتلك منفي طاقة +V ( منفذ 8 و منفذ 16). منفذ 8 يوفر الطاقة للمحركات ، ومنفذ 16 يوفر الطاقة للرقاقة. قمنا بربطها جميعاً بمنفذ 5V بالأردوينو.
عمواماً اذا كان لديك محرك يحتاج طاقة أعلى من ذلك فعليك توفير الطاقة بشكل منفصل للمحرك باستخدام المنفذ 8 .

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

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

أردوينو – الدرس الخامس عشر – محرك السيرفو Servo Motor

في هذا الدرس ستتعلم كيفية التحكم بمحرك السيرفو ‘servo motor’

أولاً ، ستقوم بتعلم كيفية تحريك المحرك بمختلف الاتجاهات  ، ومن ثم ستقوم باضافة مقاوم متغير ‘pot’ للتحكم بوضعيته.

Servo motor project

القطع

لبناء المشروع عليك توفير القطع التالية

Servo Motor

Servo Motor
محرك سيرفو

10kΩ variable resistor

10kΩ variable resistor’pot’

Half-size Breadboard

Half-size Breadboard

Arduino Uno R3

Arduino Uno R3

Jumper wires

100µF capacitor

100µF capacitor
اختياري

تصميم لوح التجارب لحركة محرك السيرفو

في هذه التجربة ، سنقوم بربط محرك السيرفو ‘servo motor’ بالاردوينو.

lesson 15 project design

محرك السيرفو ‘servo motor’ لديه ثلاثة رؤوس ، اللون الأحمر لطاقة 5V ، اللون الأسود/أو البني للمخرج الأرضي GND ، واللون الأخير عادة مايكون برتقالي/أو أصفر يتم ربطه بالمنفذ الرقمي 9 ‘digital pin’.

يوجد مقبس بنهاة اسلاك محرك السيرفو ‘servo motor’ تسمح بوضع وربط اسلاك الـ jumper wires بها للربط مع لوح التجارب والأردوينو.

lesson 15 project servo

في حال حدوث خلل

قد يحدث خلل أثناء عمل السيرفو ‘servo motor’. وقد يحصل هذا عندما يكون متحكم الأردوينو مرتبط “ببعض” منافذ الـUSB . هذا لأن المحرك يوجه الكثير من الطاقه، خصوصاً عند بدء عمل المحرك،مما قد يخفض الجهد Voltage بالأردوينو،فيتم اعادة تشغيله

يتم حل هذه المشكلة عبر اضافة مكثف عالي ‘capacitor’  (470uF أو أعلى) يتم وضعه مابين 5V و GND.

capacitor breadboard design

المكثف ‘capacitor’ يعمل كخزان للتيار الكهربائي حيث يسمح للمحرك عند بدء تشغيله بأخذ التيار المخزن بالمكثف اضافة للتيار الذي يقوم بأخذه من الأردوينو.

النهاية الأطول للمكثف ‘capacitor’ هي النهاية الموجبة والتي يجب ربطها بـ5V. النهاية السالبة عادة يكون علامة ‘ – ‘ عليها.

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

قم برفع الكود التالي على متحكم الأردوينو وستجد أن محرك السيرفو ‘servo motor’ يبدأ بالحركة مباشرة باتجاه واحد ثم العوده للاتجاه الآخر.

الكود يعتمد على المثال البرمجي ‘sweep’  الموجود بمكتبة أمثلة الأردوينو
File> Examples> Servo> Sweep

#include <Servo.h>
 
int servoPin = 9;
 
Servo servo;  
 
int angle = 0;   // servo position in degrees
 
void setup()
{
  servo.attach(servoPin);
}
 
 
void loop()
{
  // scan from 0 to 180 degrees
  for(angle = 0; angle < 180; angle++)  
  {                                  
    servo.write(angle);               
    delay(15);                   
  }
  // now scan back from 180 to 0 degrees
  for(angle = 180; angle > 0; angle--)    
  {                                
    servo.write(angle);           
    delay(15);       
  }
}

 

يتم التحكم بمحرك السيرفو ‘servo motor’ عبر سلسلة من الذبذبات ، ولجعل العملية سهله  تم توفير مكتبة كود للاردوينو  ليسهل عليك عملية توجيه محرك السيرفو ‘servo motor’ للتوجيه لزاوية معينة.

الاوامر البرمجية للتحكم بمحرك السيرفو تماماً كالاوامر الأخرى في برنامج الأردوينو ولكن لأننا لانستخدمها بشكل دائم في كل المشاريع ، لذلك عليك استدعاء مكتبة اوامر التحكم بمحرك السيرفو ‘servo motor’ وذلك عبر الأمر التالي

#include <Servo.h>

 

وكالعادة نقوم بتحديد وتعريف المنفذ الذي يتم ربطه بمحرك السيرفو عبر المتغير ‘servoPin’ .

Servo servo;

 

لنقم برمجياً بتعريف محرك سيرفو من نوع سيرفو . المكتبة البرمجية وفرت لنا نوع للتعريف وهو ‘servo’ تماماً كالتعريفات الاخرى مثل ‘int’ و ‘float’ ..الخ

لذلك باستخدام تعريف النوع ‘servo’ يمكنك من أن تعرف حتى 8 محركات سيرفو مرتبطه بالأردوينو . التعريف يتم كالتالي

Servo servo1;
Servo servo2;

 

في دالة setup علينا ربط متغير ‘servo’ بالمنفذ الذي سيتحكم بمحرك السيرفو ، وذلك عبر الأمر التالي

  servo.attach(servoPin);

 

المتغير ‘angle’ يستخدم لتحديد الزاوية الحالية لمحرك السيرفو . بداخل دالة loop استخدمنا حلقتين ‘for loop’ وذلك لزيادة الزاوية في اتجاه واحد حتى 180 درجة ثم العودة والذهاب للجهة الأخرى.

الأمر

   servo.write(angle);

 

يطلب من السيرفو لتحديث موضعه من الزاوية التي تم تحديدها له.

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

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

كل ماعلينا فعله هو وضع المقاوم المتغير ‘pot’ وربطه بالمنفذ A0 بالأردوينو.

lesson 15 pot

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

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

#include <Servo.h>
 
int potPin = 0;  
int servoPin = 9;
Servo servo;
 
void setup()
{
  servo.attach(servoPin);  
}
 
void loop()
{
  int reading = analogRead(potPin);     // 0 to 1023
  int angle = reading / 6;              // 0 to 180
  servo.write(angle);  
}

 

هنالك متغير آخر يدعى ‘potPin’ .

لتحديد موضع السيرفو ، علينا تحويل القراءة التناظرية ‘analogRead’ من المنفذ A0. هذا سيعطينا قيمة مابين 0 و 1023 . وبما أن السيرفو يستطيع التحرك حتى زاوية 180 درجة كحد أقصى لذا علينا خفض الحد الأقصى من القيمة المقروءة. وذلك عبر قسمة الرقم على 6 وذلك سيعطينا قيمة مابين 0 و 170 والتي ستكون مناسبة.

محركات السيرفو ‘servo motors’

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

servo motors

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

حاول تقليل معدل التأخير ‘delay’ من 15 جزء من الثانية إلى 5 جزء من الثانية .
لاحظ اختلاف سرعة السيرفو.

حاول التحكم بمحرك السيرفو عن طريق شاشة الاتصال التسلسلي عوضاً عن المقاوم المتغير.

ملاحظة: لتتمكن من قراءة الرقم من شاشة الاتصال التسلسلي serial monitor تستطيع استخدام دالة Serial.parseInt() لقراءة الأرقام من شاشة الاتصال التسلسلي serial monitor

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

في هذا الدرس ستتعلم كيف تتحكم بمحرك التيار المستمر الصغير DC Motor بإستخدام الأردوينو

DC MOTOR

ستقوم بإستخدام خاصية تغيير المخرج التناظري ‘Pulse Width Modulation – pwm’ بالأردوينو وذلك للتحكم في سرعة المحرك عبر ارسال رقم مابين 0 و 255 من شاشة الاتصال التسلسلي Serial Monitor.

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

small dc motor

6V DC Motor
محرك صغير بقوة 6V

PN2222 Transistor

PN2222 Transistor

1N4001 diode

1N4001 diode
صمام ثنائي

270Ω Resistor

270Ω Resistor

Half-size Breadboard

Half-size Breadboard

Arduino Uno R3

Arduino Uno R3

Jumper wires

Jumper wires

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

عند وضع القطع على لوح التجارب عليك ان تحرص على صحة اتجاه  وموضع الترانزستور والصمام الثنائي ‘diode’  كما في الصورة.

dc motor breadboard design

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

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

int motorPin = 3;
 
void setup()
{
  pinMode(motorPin, OUTPUT);
  Serial.begin(9600);
  while (! Serial);
  Serial.println("Speed 0 to 255");
}
 
 
void loop()
{
  if (Serial.available())
  {
    int speed = Serial.parseInt();
    if (speed >= 0 && speed <= 255)
    {
      analogWrite(motorPin, speed);
    }
  }
}

 

يؤدي الترانزستور هنا وظيفة المحول ‘switch’ وذلك عبر التحكم بطاقة المحرك.  نقوم بإستخدام منفذ 3 للأردوينو لتشغيل وإطفاء الترانزستور تحت اسم ‘motorPin’.

عند بدء البرنامج  ستظهر شاشة الاتصال التسلسلي Serial Monitor تطلب منك ادخال قيمة طاقة المحرك ( مابين 0 و 255 ).

dc motor serial monitor

في دالة loop الأمر ‘Serial.parseInt’ يستخدم لقراءة الرقم المدخل  عبر شاشة الاتصال التسلسلي Serial Monitor وتحويله لقيمة رقمية ‘int’.

بإمكنك ادخال أي رقم ، جملة if الشرطية في السطر الذي يليه تقوم بكتابة تناظرية ‘analogWrite’ عند وجود رقم بين 0 و 255 فقط..

الترانزستور Transistor

يمكن للمحرك الصغير أن يستهلك طاقة أكبر مما قد ينتجه المخرج الرقي digital output للأردوينو لذلك هناك احتمال كبير أن يتم اتلاف متحكم الأردوينو اذا قمت بربطها بالمحرك مباشرة.

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

Transistor1

للترانزستور 3 رؤوس . معظم التيار الكهربائي يذهب من ‘collector’ إلى ‘Emitter’، ولكن هذا يحدث فقط إذا تم تمرير تيار قليل عبر ‘Base connection’. هذا التيار القليل يتم توفير ه من الأردوينو.

الرسم التالي يسمى  رسم تخطيطي ‘schematic diagram’. مثل تصميم لوح التجارب ، وظيفته اظهار كيفية ارتباط القطع الالكترونية ببعضها.

DC MOTOR design

المنفذ 3 من الأردوينو مرتبط بالمقاومه . مما يقلل من التيار الموجه إلى الترانزستور.

يوجد صمام ثنائي ‘Diode’ موصول والذي يسمح بنقل التيار بإتجاه واحد فقط.

عند فصل الطاقة عن المحرك ، يحصل ارتداد جهد عكسي  مما قد يتلف الأردوينو ، وظيفة الصمام الثنائي ‘Diode’ هي الحماية من هذه الامور.

حاول تجربة ادخال مختلفه في كل مره لمشاهدة التأثير على المحرك الصغير .