استشعار الاهتزاز باستخدام Piezo Element

خلال هذا المشروع، سنتعلم كيفية استخدام عنصر الـ piezo مع الاردوينو لإستشعار الإهتزازات.

استشعار الاهتزاز باستخدام Piezo مع الاردوينو

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

arduino uno r3

Arduino Uno

piezo-element-murata-electronics-7bb

Piezo Element

LED 5mm

220 Ω resistor

مقاومة 220 اوم

 

 

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

Piezo Element

يستخدم عنصر البيزو للكشف عن الأصوات. يمتلك هذا العنصر مواد لها القدرة على توليد فرق جهد كهربائي عندما تتعرض لإجهاد ميكانيكي مثل الطرق عليه أو تعرضه للإهتزاز. فهو بعمل بشكل معاكس لفكرة عمل الـ Buzzer الذي يتكون من piezo crystal ويصدر النغمات عند تعرضه إلى جهد كهربائي.

استشعار الاهتزاز باستخدام Piezo مع الاردوينو
piezo-element-murata-electronics-7bb

توصيل الدارة

قم بتوصيل الدارة كما هو مبين بالشكل التالي :

piezo_element

 

يولد عنصر الـ Piezo اشارة تناظرية (analog) ، اي يتم توصيله على احد منافذ الاردوينو التناظرية من A0 إلى A5 ، والطرف الأخر يتم توصيله إلى الـ GND.

الطرف التوصيل
1 A0
2 Ground

سنقوم بكتابه برنامج بحيث يقوم الـ LED بعمل فلاش عند تعرض عنصر الـ piezo للإهتزاز. طالما مصدر الإهتزاز موجود يظل الفلاش يعمل حتى يتوقف الإهتزاز.

استشعار الاهتزاز باستخدام Piezo مع الاردوينو

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

 

#define ledPin  13
#define knockSensor  A0

int threshold = 100;
int sensorReading = 0;
int ledState = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  sensorReading = analogRead(knockSensor);
  if (sensorReading >= threshold) {
    ledState = !ledState;
    digitalWrite(ledPin, ledState);
    Serial.println("Knock!"); 
  }
  delay(500);
}

شرح الكود :

في البداية، نقوم بتعريف متغيرات لمنافذ الاردوينو التي تم استخدامها في المشروع. وتعريف متغيرات اخرى لإستخدامها في البرمجة. سيتم استخدام متغير threshold لحفظ القيمة التي تستخدم للدلاله على حدوث اهتزاز عند وصول قراءة عنصر البيزو إلى هذه القيمة. ومتغير sensorReading لحفظ قيمة قراءة العنصر. والمتغير ledState لحفظ حالة الـ LED .

#define ledPin  13
#define knockSensor  A0

int threshold = 100;
int sensorReading = 0;
int ledState = LOW;

في الدالة ()setup، نقوم بضبط الـ LED كمخرج، وتشغيل الشاشة التسلسلية Serial Monitor .

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

في الدالة ()loop ، نقوم بقراءة قيمة عنصر البيزو ومقارنتها بالقيمة المحفوظة داخل المتغير threshold. عندما تكون قيمة العنصر اكبر، اي ان العنصر قد اهتز، نقوم بعمل فلاش على الـ LED وكتابة “knock!” على الشاشة التسلسلية.

void loop() {
  sensorReading = analogRead(knockSensor);
  if (sensorReading >= threshold) {
    ledState = !ledState;
    digitalWrite(ledPin, ledState);
    Serial.println("Knock!"); 
  }
  delay(500);
}

ملاحظة

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




لعبة نرد باستخدام الاردوينو

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

Led Dice: لعبة نرد بسيطة باستخدام الاردوينو

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

arduino uno r3

Arduino Uno

 

blue led 5mm

LED

220 Ω resistor

220 Ohm Resistor

Push Button

10K Ohm Resistor

 

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

 

توصيل الدارة

نقوم بتوصيل الدارة كما هو مبين بالشكل التالي :

Led Dice: لعبة نرد بسيطة باستخدام الاردوينو

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

Led Dice: لعبة نرد بسيطة باستخدام الاردوينو

 

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

#define LED1 10 
#define LED2 9 
#define LED3 7 
#define LED4 8  
#define BUTTON 6

int buttonState;
long ran;
int time = 2000;

void setup ()
{
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (BUTTON, INPUT);
  randomSeed(analogRead(0));
}

void loop()
{
  buttonState = digitalRead(BUTTON);
  if (buttonState == HIGH){
    ran = random(1, 7);
    if (ran == 1){
      digitalWrite (LED4, HIGH);
      delay (time);
    }
    if (ran == 2){
      digitalWrite (LED1, HIGH);
      delay (time);
    }
    if (ran == 3){
      digitalWrite (LED3, HIGH);
      digitalWrite (LED4, HIGH);
      delay (time);
    }
    if (ran == 4){
      digitalWrite (LED1, HIGH);
      digitalWrite (LED3, HIGH);
      delay (time);
    }
    if (ran == 5){
      digitalWrite (LED1, HIGH);
      digitalWrite (LED3, HIGH);
      digitalWrite (LED4, HIGH);
      delay (time);
   }
   if (ran == 6){
      digitalWrite (LED1, HIGH);
      digitalWrite (LED2, HIGH);
      digitalWrite (LED3, HIGH);
      delay (time);
   }
  }
  digitalWrite (LED1, LOW);
  digitalWrite (LED2, LOW);
  digitalWrite (LED3, LOW);
  digitalWrite (LED4, LOW);
}

شرح الكود :

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

#define LED1 10
#define LED2 9
#define LED3 7
#define LED4 8
#define BUTTON 6

int buttonState;
long ran;
int time = 2000;

 سيتم استخدام المتغير buttonState لتسجيل حالة المفتاح إذا كان مضغوطا أو لا. والمتغير ran لتسجيل رقم يتم توليده عشوائيا بين رقم 1 و 6 . والمتغير time لتسجيل مدة التأخير الزمني الذي تحتفظ به الـ LEDs بالإضاءة قبل ان تنطفئ.

بعد ذلك في الدالة ()setup، نقوم بضبط الـ LEDs كمخرج والمفتاح كمدخل.

void setup () { 
    pinMode (LED1, OUTPUT);  
    pinMode (LED2, OUTPUT); 
    pinMode (LED3, OUTPUT); 
    pinMode (LED4, OUTPUT); 
    pinMode (BUTTON, INPUT); 

    randomSeed(analogRead(0)); 
}

لاحقا سيتم استخدام دالة random لتوليد الأرقام العشوائية، ولكن هذه الدالة تحتاج إلى ما سيمى بالـ seed وهو عبارة عن رقم تستخدمه الدالة random في حساباتها لتوليد الرقم العشوائي.

randomSeed(analogRead(0));

وأخيرا، في الدالة ()loop نقوم بقراءة حالة المفتاح، إذا كان مضغوط نستخدم الدالة (random (1,7 للحصول على رقم عشوائي بين 1و 6. ثم نقوم بإضاءة الـ LEDs اعتمادا على هذا الرقم العشوائي. يتم إضاءة مجموعة الـ LEDs بشكل معين كما لو كان نردا حقيقيا ثم ننتظر لمدة ثانيتين ونطفئ الـ LEDs لإنتظار ضغطة جديدة على المفتاح ليتم عرض رقم جديد.

void loop()
{
  buttonState = digitalRead(BUTTON);
  if (buttonState == HIGH){
    ran = random(1, 7);
    if (ran == 1){
      digitalWrite (LED4, HIGH);
      delay (time);
    }
    if (ran == 2){
      digitalWrite (LED1, HIGH);
      delay (time);
    }
    if (ran == 3){
      digitalWrite (LED3, HIGH);
      digitalWrite (LED4, HIGH);
      delay (time);
    }
    if (ran == 4){
      digitalWrite (LED1, HIGH);
      digitalWrite (LED3, HIGH);
      delay (time);
    }
    if (ran == 5){
      digitalWrite (LED1, HIGH);
      digitalWrite (LED3, HIGH);
      digitalWrite (LED4, HIGH);
      delay (time);
   }
   if (ran == 6){
      digitalWrite (LED1, HIGH);
      digitalWrite (LED2, HIGH);
      digitalWrite (LED3, HIGH);
      delay (time);
   }
  }
  digitalWrite (LED1, LOW);
  digitalWrite (LED2, LOW);
  digitalWrite (LED3, LOW);
  digitalWrite (LED4, LOW);
}



الوميض – اردوينو Nano

في هذا المشروع سنتعلم كيف نستخدم بوردة اردينو نانو Arduino Nano لعمل Led Blinking

ليد فلاش باستخدام اردوينو نانو

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

Arduino Nano

 

220 Ω resistor

220 Ohm Resistors

 

LED 5mm

 

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

اردوينو نانو Arduino Nano

هي عبارة عن لوحة تحكم تشبه لوحة التحكم Arduino UNO، ولكن الاختلاف يكمن في نوع المتحكم المصغر المستخدم في تصنيعها. كما ان هناك اختلاف في حجم اللوحة وعدد المخارج والمداخل المتاحة بالمقارنة مع لوحة Arduino UNO .

ليد فلاش باستخدام اردوينو نانو

تتم برمجتها بنفس الطريقة المستخدمة في برمجة لوحة Arduino UNO، أي أننا يمكننا استخدام اي نوع من لوحات الأردوينو لتنفيذ نفس المشاريع. ولكن ما يميز لوحة Nano هو صغر حجمها، ووجود مدخليين تناظريين اضافيين، وإمكانية توصيلها مباشرة على لوحة التجارب.

توصيل الدارة

نقوم بتوصيل الدارة كما هو مبين بالشكل التالي :

ليد فلاش باستخدام اردوينو نانو

سنقوم ببرمجة اللوحة لإضاءة الـ LED لمدة ثانية واحدة ثم إطفاءه لمدة ثانية.

ليد فلاش باستخدام اردوينو نانو

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

#define LED 13

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(LED, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

شرح الكود

في البداية، نقوم بتعريف ثابت بإسم LED على المخرج رقم 13. في الدالة setup() نقوم بتعريفه كمخرج :

#define LED 13

void setup() {
  pinMode(LED, OUTPUT);
}

في الدالة loop() ، نقوم بتشغيل الـ LED لمدة ثانية واحدة ثم اطفاؤه لمدة ثانية أخرى وهكذا … .

void loop() {
  digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(LED, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

 




الروبوت المضيء

مقدمة:

سنقوم في هذا المشروع ببناء روبوت يشع الضوء لزاوية مقدارها 90 درجة.

light-emitting-robot

الأدوات:

light-emitting-robot

Mbot V1.1

light-emitting-robot

mBot Servo Pack

طريقة التركيب :

أولا : قم بإعادة تركيب mBot  .

light-emitting-robot

أولا، يجب ضبط محرك السيرفو بإستخدام البرمجة إلا زاوية 90 درجة. وبعد ذلك، نقوم بتثبيت محرك الـ Servo :

light-emitting-robot

ثم نقوم بتثبيت قطعة الـ RGB LED على محرك السيرفو بإستخدام قطعة الـ Bracket :

light-emitting-robot

ثم نقوم بتثبيت القطعة على الروبوت :

light-emitting-robot

وأخيرا نقوم بتثبيت قمعة الـ RJ25 Adapter بإستخدام قطعة Plate l1 :

light-emitting-robot

الآن قمت بالإنتهاء من بناء الروبوت المضيء، يمكنك التحكم به بإستخدامالتعليمات البرمجية

light-emitting-robot

التوصيل بلوحة التحكم :

نقوم بتوصيل 9g servo pack  بـ Slot 1 في 25 Adapter  RJ ونوصله بمدخل رقم 1. بعدها نوصل RGB LED  بمدخل رقم 2.

light-emitting-robot

طريقة البرمجة:

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

سنبدأ الأوامر البرمجية باستخدام الأمر التالي  لبدء عمل الروبوت بشكل تلقائي

light-emitting-robot

ثم نقوم بتحديد القيم البدائية لكلا من Servo Motor & RGB LED

light-emitting-robot

بعدها نقوم بإدراج دالة التكرار

light-emitting-robot

 ونكتب بداخلها أوامر برمجية بإضاءة اللون الأزرق عندما يدور المحرك بزاوية 90 درجة ثم يضيئ إلى اللون الأحمر عندما يدور المحرك بزاوية 180 درجة حيث أن الزاوية الكلية للدوران تساوي 90 درجة.

light-emitting-robot

ملاحظة يجب تكرار الأمر ليكمل دورة كاملة داخل دالة التكرار.

الشكل النهائي للأوامر البرمجية:

light-emitting-robot



روبوت يلقي التحية

مقدمة:

في هذا المشروع سنقوم بإنشاء روبوت يلقي التحية عند الاقتراب منه مسافة معينة.

waving-robot

الأدوات المستخدمة:

waving-robot

Mbot V1.1

waving-robot

mBot Servo Pack

نبدأ بتركيب الروبوت. ومن ثم نقوم بتشكيل الروبوت بإضافة Servo Motor & Ultrasonic Sensor كالتالي :

طريقة التركيب :

أولا : قم بإعادة تركيب mBot  .

waving-robot

ثم نقوم بتثبيت مستشعر الموجات فوق الصوتية

waving-robot
waving-robot

وبعد ذلك، قم بتثبيت محرك الـ Servo :

waving-robot

ثم نقوم بتثبيت قطعة الـ cuttable linkage :

waving-robot

وأخيرا، قم بتجميع القطع :

waving-robot

التوصيل بلوحة التحكم :

ثم نقوم بتوصيل Servo Motor بمدخل رقم 1 و نوصل Ultrasonic Sensor بمدخل رقم 2

waving-robot

برمجة المشروع:

أولا: نبدأ بتهيئة محرك الـسيرفو، و الـ LED عن طريق وضع القيم الإبتدائية كالتالي:

waving-robot

بعدها نقوم بإدراج دالة التكرار

waving-robot

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

waving-robot

سوف نقوم بإستخدام الحالات الآتية في الدوال الشرطية :

الحالة الأولى إذاكانت المسافة أكبرمن30 سم.

waving-robot

الحالة الثانية إذاكانت المسافة تساوي30 سم.

waving-robot

الحالة الثالثة إذاكانت المسافة أصغر من30 سم.

waving-robot

في الحالة الأولى، فإن الروبوت لن يكون بإلقاء التحية ويعود إلى حالته الإبتدائية وسيتم إضائة الـ LED باللون الأحمر كما هو موضح :

waving-robot

ثم نقوم بإستخدام الحالة الثانية والثالثة، لجعل الروبوت يلقي التحية ويضيء باللون الأزرق والوردي كالتالي :

waving-robot

الشكل النهائي للأوامر البرمجية:

waving-robot

لمعرفة أساسيات البرمجة المستخدمة الرجاء مراجعة درس جولة حول الأوامر البرمجية.




تخطيط نبض القلب

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

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

measure-heart-rate

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

في هذا المشروع سنقوم بإستخدام القطع التالية :

Heart Rate Sensor Module

مستشعر لقياس معدل نبضات القلب

arduino uno r3

Arduino Uno R3

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

مستشعر نبض القلب :

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

measure-heart-rate

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

measure-heart-rate

يضئ الـ LED في الإصبع أو شحمة الأذن، أو غيرها من الأنسجة الشعرية، ويقوم جهاز الاستشعار بقراءة الضوء الذي يرتد مرة أخرى.

measure-heart-rate

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

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

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

measure-heart-rate

البرمجة :

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

//  Variables
int PulseSensorPurplePin = 0;        // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 0
int LED13 = 13;   //  The on-board Arduion LED


int Signal;               // holds the incoming raw data. Signal value can range from 0-1024
int Threshold = 510;      // Determine which Signal to "count as a beat", and which to ingore. 


// The SetUp Function:
void setup() {
  pinMode(LED13,OUTPUT);       // pin that will blink to your heartbeat!
   Serial.begin(9600);         // Set's up Serial Communication at certain speed. 
   
}

// The Main Loop Function
void loop() {
  Signal = analogRead(PulseSensorPurplePin);  // Read the PulseSensor's value. 
                                              // Assign this value to the "Signal" variable.
   Serial.println(Signal);                    // Send the Signal value to Serial Plotter.   
   if(Signal > Threshold){                    // If the signal is above "510", then "turn-on" Arduino's on-Board LED.  
     digitalWrite(LED13,HIGH);          
   } else {
     digitalWrite(LED13,LOW);    //  Else, the sigal must be below "510", so "turn-off" this LED.
   }

delay(10);
}
لمحة عن الكود :

أولا نقوم بتعريف المتغيرPulseSensorPurplePin إعتمادا على ما تم توصيله بين المستشعر والأردوينو، ومتغير LED13  وهو الضوء الموجود على لوحة الأردوينو

int PulseSensorPurplePin = 0;
int LED13 = 13;

ومن ثم تعريف المتغير Signal الذي سيتم استخدامه لقراءة المستشعر، ومتغير Threshold لحديد حد للإشارات التي سيتم احتسابها كنبضة، والإشارات التي سيتم تجاهلها.

int Signal;               
int Threshold = 510;    

في دالة ()setup ،  نقوم بتهيئة المتغيرات كمخرج أو مدخل.

void setup() {
  pinMode(LED13,OUTPUT);       
   Serial.begin(9600);     
   
}

في دالة ()loop، نقوم بقراءة المستشعر ومن ثم طباعة القيمة.

  Signal = analogRead(PulseSensorPurplePin);  
                                             
   Serial.println(Signal);  

ثم نقوم بمقارنة قيمة المستشعر بالحد Thresholdالذي تم تعريفه مسبقا، إذا كانت القيمة أكبر من Threshold يتم إضاءة الـ LED 13 على لوحة الأردوينو، وإذا كانت أقل يتم إطفاءه.

 if(Signal > Threshold){                    
     digitalWrite(LED13,HIGH);          
   } else {
     digitalWrite(LED13,LOW);    
   }

وأخيرا قم بفتح نافذة Serial Plotter وراقب نبضك.




مستكشف سقوط الأمطار

توفير المياه واستخدامها السليم أمر مهم جدا. لذا في هذا المشروع سنقوم بستكشاف ما إذا كان هناك أمطار، حتى نتمكن من اتخاذ بعض الإجراءات وحفظ مياه الأمطار. يمكن استخدام كاشف مياه الأمطار في العديد من المجالات منها مجال الري، والتشغيل الآلي للمنزل، والاتصالات، والسيارات… الخ.

arduino-rain-sensor-module

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

في هذا المشروع سنقوم بإستخدام القطع التالية :

arduino-rain-sensor-module

حساس كاشف الأمطار

arduino uno r3

Arduino Uno R3

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

حساس كاشف الأمطار :

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

arduino-rain-sensor-module

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

مداخل ومخارج وحدة استشعار الأمطار :

توضح الصورة والجدول أدناه موقع ووصف للمخارج والمداخل والضوابط والمؤشرات.

arduino-rain-sensor-module
المخرج/ المدخل/ الضابط الوصف
Vcc مصدر الطاقة 5 فولت
GND مصدر الطاقة الأرضي أو السالب
المخرج الرقمي (DO) المخرج الرقمي: تكون القيمة LOW عندما تتجاوز الرطوبة قيمة معينة.
المخرج التناظري (AO) المخرج التناظري: من صفر إلى 5 فولت. يتم انخفاض الجهد عند زيادة الرطوبة.
ضبط الحساسية مع إتجاه عقارب الساعة يكون أكثر حساسية. وعكس إتجاه عقارب الساعة تقل الحساسية.

يتم استخدام المخرج التناظري للكشف عن كمية هطول الأمطار. فعند تجمع قطرات الأمطار على اللوح المطبوع، فإنها تخلق مسارات مقاومة موازية. لذلك، عند زيادة الأمطار (إنخفاض المقاومة)، سيؤدي إلى إنخاض الجهد الناتج على المخرج (أي قيمة LOW  على المخرج الرقمي). على العكس تماما، فعند إنخفاض كمية الأمطار سيؤدي ذلك إلى زيادة الجهد الناتج على المخرج التناظري والرقمي. على سبيل المثال، إذا كانت اللوحة جافة تماما سيسبب ذلك إلى وصول وحدة الإخراج إلى 5 فولت.

توصيل المستشعر بالأردوينو :

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

arduino-rain-sensor-module

البرمجة :

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

int nRainIn = A1;
int nRainDigitalIn = 2;
int nRainVal;
boolean bIsRaining = false;
String strRaining;

void setup() {
  Serial.begin(9600);
  pinMode(2,INPUT);
}
void loop() {
  nRainVal = analogRead(nRainIn);
  bIsRaining = !(digitalRead(nRainDigitalIn));
  
  if(bIsRaining){
    strRaining = "YES";
  }
  else{
    strRaining = "NO";
  }
  
  Serial.print("Raining?: ");
  Serial.print(strRaining);  
  Serial.print("\t Moisture Level: ");
  Serial.println(nRainVal);
  
  delay(200);

}

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

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

int nRainIn = A1; 
int nRainDigitalIn = 2; 
int nRainVal; 
boolean bIsRaining = false; 
String strRaining;

في دله ()setup، نقوم بتهيئة شاشة الإتصال التسلسلي، وتعريف المنفذ رقم 2 كمدخل :

void setup() {

Serial.begin(9600);

pinMode(2,INPUT);

}

في دلة ()loop، نقوم بقراءة القيمة التناظرية والرقمية،

nRainVal = analogRead(nRainIn); 
bIsRaining = !(digitalRead(nRainDigitalIn));

والتحقق ما إذا كان هناك سقوط أمطار أم لا.

if(bIsRaining){ 
  strRaining = "YES";
 } 
else{ 
strRaining = "NO"; 
}

بعد ذلك، تتم طباعة النتائج على شاشة الإتصال التسلسلي.

Serial.print("Raining?: "); 
Serial.print(strRaining); 
Serial.print("\t Moisture Level: "); 
Serial.println(nRainVal);



نظام الدخول الآمن بإستخدام RFID

في السنوات الأخيرة، أصبحت إجراءات التعرف الآلي  (Auto-ID)منتشرة فى العدید من القطاعات مثل الصناعات، الخدمات، ومجال الشراء والتوزيع وأنظمة الحماية. حيث تستخدم هذه التقنية لتأمين معلومات كافية ومستمرة عن المنتجات الصناعية أو هوية الأشخاص.

في هذا المشروع، سيتم التعرف على هذه التكنولوجيا والتي تعتمد على تقنية بدأت بالإنتشار تسمى RFID. فما هذه التقنية، وماهو مبدأ عملها، وكيف يتم استخدامها ؟

security-access-using-rfid-reader

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

الأدوات التي سيتم استخدامها لهذا المشروع :

security-access-using-rfid-reader

MFID-RC522 module

Half-size Breadboard

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

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

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

تقنية RFID :

هي إختصار لمصطلح radio frequency identification وهو تعبيرعام للتقنيات التي تستخدام ترددات الراديو لأغراض تحديد وتتبع الهوية . حيث أنها تستخدم المجالات الكهرومغناطيسية لتحديد وتتبع العلامات (tags) المرفقة بالأشياء تلقائيا. حيث تحتوي هذه العلامات على معلومات مخزنة إلكترونيا.

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

في هذا المشروع سيتم استخدام نظام RFID   لفتح الباب. على سبيل المثال، السماح لأشخاص معينين بالدخول.

يستخدم نظام RFID :

العلامات (Tags) التي يتم تعليقها بالكائنات أو الأشياء . في هذا المثال، لدينا سلسلة المفاتيح والبطاقة الكهرومغناطيسية. كل علامة tag له هوية خاصه به (UID).

security-access-using-rfid-reader

القارئ، جهاز ارسال وإستقبال، فهو يقوم بإرسال إشارات إلى الـ tag  ثم يقوم بقراءة ردها.

security-access-using-rfid-reader

 

المواصفات الأساسية للقارئ و بطاقات الـ tag :

مدخل الجهد :3.3v
التردد : 13.56MHz

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

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

security-access-using-rfid-reader

تم توصيل القارئ بالأردوينو كما يلي :

قارئ RFID الأردوينو
SDA منفذ 10
SCK منفذ 13
MOSI منفذ 11
MISO منفذ 12
IRQ لا يتم توصيله
GND GND
 RST منفذ 9
 3.3v 3.3v (لاتقم بتوصيله إلى 5v)

قراءة البيانات من RFID tag :

قبل كتابة التعليمات البرمجية اللازمة، تحتاج إلى تحميل المكتبة الازمة لهذا المستشعر من هنـا.

ثم قم بفك الضغط عن المجلد المضغوط “rfid-master” وإضافة هذه المكتبة إلى المكتبات الموجودة ببرنامج الاردوينو. بعد القيام بذلك، قم بإعادة تشغيل برنامج الاردوينو الخاص بك.

بعد أن تم توصيل الدائرة، انتقل إلى ملف (File) >  أمثلة (DumpInfo < MFRC522 < (Examples ثم قم بتحميل التعليمات البرمجية.  هذا الكود سوف يكون متاح في واجهة الاردوينو (بعد تثبيت مكتبة RFID).

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

security-access-using-rfid-reader

قم بتقريب بطاقة أو سلسلة المفاتيح RFID إلى القارئ. قم بجعلها أقرب حتى يتم عرض كافة المعلومات.

security-access-using-rfid-reader

كما هو موضح بالصورة السابقة، هذه المعلومات التي يمكنك قراءتها من البطاقة، بما في ذلك UID الخاص بالبطاقة والذي تم تمييزه باللون الأصفر. حيث يتم تخزين المعلومات في الذاكرة التي يتم تقسيمها إلى segments  و blocks . لديك 1024 بايت من تخزين البيانات مقسمة إلى 16sectors.

قم بكتابة UID الخاص ببطاقتك لأنك ستحتاج إليه لاحقا.

البرمجة

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

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

#include <SPI.h> 
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 
void setup() 
{
  Serial.begin(9600);   // Initiate a serial communication
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  Serial.println("Approximate your card to the reader...");
  Serial.println();

}
void loop() 
{
  
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
 
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  
  Serial.print("UID tag :");
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "1A 3A 3F D5") 
  {
    Serial.println("Authorized access");
    Serial.println();
    delay(3000);
  }
 
 else   {
    Serial.println("Access denied");
    delay(3000);
  }
} 

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

اولا يتم تعريف منافذ الأردوينو اعتمادا على ما تم توصيله بالقارئ، ثم يتم إنشاء كائن MFRC522 :

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

في دالة ()setup ، يتم تهيئة شاشة الإتصال التسلسلي، والبروتوكول SPI المستخدم لنقل البيانات وتبادلها مع المتحكمات.

void setup() 
{
  Serial.begin(9600);   
  SPI.begin();      
  mfrc522.PCD_Init();   
  Serial.println("Approximate your card to the reader...");
  Serial.println();

}

في دالة ()loop، نقوم بقراءة قيمة الـ UID تدريجيا بإستخدام For loop، وطباعة القيمة بنظام الست عشر (Hex)، ويتم في كل مرة تحويل هذه القيمة إلى string وتخزينها في متغير concat لإستخدامه لاحقا في عملية المقارنة.

 for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }

ثم نقوم بعملية التحقق ما إذا كانت قيمة الـ UDI  التي تم قراءتها تساوي قيمة الـ UID المسموح لها بالدخول أو لا .
يجب تغيير الـ UID في الشرط (if (content.substring(1) == “Your UID” حسب ما تم كتابته سابقا في مرحلة قراءة البيانات.

if (content.substring(1) == "1A 3A 3F D5")
  {
    Serial.println("Authorized access");
    Serial.println();
    delay(3000);
  }
 
 else   {
    Serial.println("Access denied");
    delay(3000);
  }

وأخيرا، تم إنشاء نظام يتحكم بنظام الدخول من البوابة الإلكترونية حسب صلاحيات البطاقة الممنوحة للمستخدم بإستخدام تقنية الـ RFID .




التحكم في محرك التيار المستمر بإستخدام L298

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

التحكم-فى-محرك-تيار-مستمر-باستخدام-l298

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

arduino uno r3

Arduino Uno

L298 Motor driver

L298 Motor Driver

9V DC Motor

DC Motor

9VDC 1000mA regulated switching power adapter

DC Power Supply

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

H-Bridge :

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

فكرة عمله :

الصورة التالية توضح كيف يتركب الـ H-Bridge:

hbridge-arduino

عند تشغيل كلا الترانزستور 1 و 4 يعمل المحرك نحو الإتجاه الأول وعند تشغيل الترانزستور 2 و 3 يعمل المحرك في الإتجاه المعاكس للإتجاه السابق.

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

التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب
التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب

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

L298 Motor Driver

هو عبارة عن H-Bridge تم تجميعها ووضعها معا في IC ، ليتم استخدامها بسهولة.  يمكن إستخدام واحد من IC للتحكم في محركين في نفس الوقت. لكل محرك مخرج خاص به وأطراف تحكم خاصة.

l298-motor-driver

الاطراف المستخدمة

Output A طرفى المحرك
VCC طرف البطارية الموجب
5v 5v فى الاردوينو
GND gnd فى الاردوينو
IN1 12 فى الاردوينو
IN2 13 فى الاردوينو

شرح الدارة

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

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

التحكم-فى-محرك-تيار-مستمر-باستخدام-l298

 

ولنتمكن من تشغيل المحرك في إتجاهين، يتم تشغيل الطرف الأول من الـ L298 للأردوينو في المحرك، فيدور المحرك في الإتجاه الأول. وعند تشغيل الطرف الثاني سيدور بالإتجاه المعاكس.

 

التحكم-فى-محرك-تيار-مستمر-باستخدام-l298

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

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

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

#define MOTOR_IN1 12
#define MOTOR_IN2 13  

void motor_forward(void);  // a function that will be called to rotate it clockwise
void motor_reverse(void);  // a function that will be called to totate it counter-clockwise
void motor_stop(void);     // a function that will be called to stop the rotation

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);  // set the first pin of the relay as output
  pinMode(MOTOR_IN2, OUTPUT);  // set the 2nd pin of the relay as output
}

void loop() {
  motor_forward();             // move forward/clockwise
  delay(3000);                 // keep rotating cw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
  motor_reverse();             // reverse the rotation direction/ccw
  delay(3000);                 // keep rotating ccw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
}

void motor_forward(void)       // the function that will cause the motor to rotate cw
{
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

void motor_reverse(void)       // the function that will cause the motor to rotate ccw
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

void motor_stop(void)          // the function that will cause the motor to stop rotating
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}

 شرح الكود :

قمنا سابقا بتوصيل طرفى كلا من الترانزستور (IN1,IN2) بمنفذ 12 و 13 للأردوينو . لذلك قمنا بتسمية كلا المنفذين للأردونو تبعا لما تم توصيله بالدارة.

نقوم بتعرف المتغيرات IN1 و IN2 ( أطراف الـ H-bridge الموصله بالاردوينو) كمخرج.

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);  // set the first pin of the relay as output
  pinMode(MOTOR_IN2, OUTPUT);  // set the 2nd pin of the relay as output
}

في دالة ()loop، نقوم أولا بإستدعاء الدالة ()motor_forward . تقوم هذه الدالة بتشغيل المحرك مع اتجاه عقارب الساعة لمدة 3 ثوان ((delay(3000) . ثم نقوم باستخدام الدالة ()motor_stop ، لإيقاف المحرك عن العمل لمدة 3 ثوان. ثم يتم عكس اتجاه حركة المحرك باستخدام الدالة ()motor_reverse لمدة 3 ثوان. ومن ثم يعود ليكرر نفس هذه المهمة من البداية مرة أخرى.

void loop() {
  motor_forward();             // move forward/clockwise
  delay(3000);                 // keep rotating cw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
  motor_reverse();             // reverse the rotation direction/ccw
  delay(3000);                 // keep rotating ccw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
}

الدلة ()motor_forward، تقوم بتحريك المحرك بإتجاه عقارب الساعة. تتم هذه العملية عن طريق جعل قيمة IN1 للمرحل HIGH والطرف الآخر LOW .

void motor_forward(void)       // the function that will cause the motor to rotate cw
{
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

تعمل هذه الدالة ()motor_reverse بشكل مشابه للدالة السابقة، إلا أنها تعكس اتجاه دوران المحرك. تتم هذه العملية عن طريق جعل قيمة IN2 للمرحل HIGH، وIN1 قيمة LOW .

void motor_reverse(void)       // the function that will cause the motor to rotate ccw
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

دالة ()motor_stop، تقوم بإيقاف المحرك تماما عن الحركة، عن طريق جعل قيمة كلا الطرفين LOW فلا يصل التيار للمحرك فيتوقف.

void motor_stop(void)          // the function that will cause the motor to stop rotating
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}



روبوت تتبع المسار

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

line-follower-robot

 

الأدوات المطلوبة

line-follower-robot

mBot Kit

أو

line-follower-robot

mBot Ranger Kit

مستشعر تتبع المسار Line Follower

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

falling-avoiding-robot

 

الأمر البرمجي لقراءة وحدة تتبع المسار

falling-avoiding-robot

يعطي قيم بين 0 – 3 بناء على الحالات التالية

الحالات قيمة القراءة المستشعر الأيمن المستشعر الأيسر
كلا المستشعرين على اللون الأسود 0
المستشعر الأيسر فقط على اللون الأسود 1
المستشعر الأيمن فقط على اللون الأسود 2
كلا المستشعرين على اللون الأبيض 3

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

لبرمجة روبوت mBot  نستخدم الأمر البرمجي لكتابة الكود على لوحة mCore

line-follower-robot

نستخدم الجملة الشرطية if.. then.. else

بحيث إذا كان مستشعر تتبع المسار على اللون الأسود (أي القيمة تساوي 0 ) يتحرك الروبوت للأمام  بسرعة تساوي 100، وإذا كانت المستشعر الأيمن على الخط الأسود والمستشعر الأيسر على الخط الأبيض يتحرك الروبوت إلى اليمين، والعكس… .

line-follower-robot

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

استخدام التطبيق

يمكن كذلك استخدام روبوت Ranger كروبوت متتبع للمسار عبر تطبيق MakeBlock

بعد فتح التتطبيق وربطه بالروبوت  قم باختيار Ranger ثم Line following

line-follower-robot



التحكم في محرك تيار مستمر باستخدام H-Bridge

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

التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب

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

arduino uno r3

Arduino Uno

1k Ω Resistor

1K Resistor

NPN Transistor 2N2222

2n2222 NPN Transistor

9V DC Motor

DC Motor

9VDC 1000mA regulated switching power adapter

DC Power Supply

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

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

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

فكرة عمله :

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

التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب

H-Bridge :

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

فكرة عمله :

الصورة التالية توضح كيف يتركب الـ H-Bridge:

hbridge-arduino

عند تشغيل كلا الترانزستور 1 و 4 يعمل المحرك نحو الإتجاه الأول وعند تشغيل الترانزستور 2 و 3 يعمل المحرك في الإتجاه المعاكس للإتجاه السابق.

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

التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب
التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب

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

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

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

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

التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب
ولنتمكن من تشغيل المحرك في إتجاهين، يتم تشغيل الطرف الأول من الـ H-Bridge للأردوينو في المحرك، فيدور المحرك في الإتجاه الأول. وعند تشغيل الطرف الثاني سيدور بالإتجاه المعاكس.
التحكم-فى-اتجاه-دوران-محرك-تيار-مستمر-ب

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

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

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

#define MOTOR_IN1 12
#define MOTOR_IN2 13  

void motor_forward(void);  // a function that will be called to rotate it clockwise
void motor_reverse(void);  // a function that will be called to totate it counter-clockwise
void motor_stop(void);     // a function that will be called to stop the rotation

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);  // set the first pin of the relay as output
  pinMode(MOTOR_IN2, OUTPUT);  // set the 2nd pin of the relay as output
}

void loop() {
  motor_forward();             // move forward/clockwise
  delay(3000);                 // keep rotating cw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
  motor_reverse();             // reverse the rotation direction/ccw
  delay(3000);                 // keep rotating ccw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
}

void motor_forward(void)       // the function that will cause the motor to rotate cw
{
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

void motor_reverse(void)       // the function that will cause the motor to rotate ccw
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

void motor_stop(void)          // the function that will cause the motor to stop rotating
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}

شرح الكود :

قمنا سابقا بتوصيل طرفى كلا من الترانزستور (IN1,IN2) بمنفذ 12 و 13 للأردوينو . لذلك قمنا بتسمية كلا المنفذين للأردونو تبعا لما تم توصيله بالدارة.

#define MOTOR_IN1 12
#define MOTOR_IN2 13

نقوم بتعرف المتغيرات IN1 و IN2 ( أطراف الـ H-bridge الموصله بالاردوينو) كمخرج.

void setup() {
  pinMode(MOTOR_IN1, OUTPUT);  // set the first pin of the relay as output
  pinMode(MOTOR_IN2, OUTPUT);  // set the 2nd pin of the relay as output
}

في دالة ()loop، نقوم أولا بإستدعاء الدالة ()motor_forward . تقوم هذه الدالة بتشغيل المحرك مع اتجاه عقارب الساعة لمدة 3 ثوان ((delay(3000)  . ثم نقوم باستخدام الدالة ()motor_stop ، لإيقاف المحرك عن العمل لمدة 3 ثوان. ثم يتم عكس اتجاه حركة المحرك باستخدام الدالة ()motor_reverse لمدة 3 ثوان. ومن ثم يعود ليكرر نفس هذه المهمة من البداية مرة أخرى.

void loop() {
  motor_forward();             // move forward/clockwise
  delay(3000);                 // keep rotating cw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
  motor_reverse();             // reverse the rotation direction/ccw
  delay(3000);                 // keep rotating ccw for 3 seconds
  motor_stop();                // stop rotating
  delay(3000);                 // stand still for 3 seconds
}

الدلة ()motor_forward، تقوم بتحريك المحرك بإتجاه عقارب الساعة. تتم هذه العملية عن طريق جعل قيمة IN1  للمرحل HIGH والطرف الآخر LOW .

void motor_forward(void)       // the function that will cause the motor to rotate cw
{
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
}

تعمل هذه الدالة ()motor_reverse بشكل مشابه للدالة السابقة، إلا أنها تعكس اتجاه دوران المحرك. تتم هذه العملية عن طريق جعل قيمة IN2 للمرحل HIGH، وIN1 قيمة LOW .

void motor_reverse(void)       // the function that will cause the motor to rotate ccw
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
}

دالة ()motor_stop، تقوم بإيقاف المحرك تماما عن الحركة، عن طريق جعل قيمة كلا الطرفين LOW فلا يصل التيار للمحرك فيتوقف.

void motor_stop(void)          // the function that will cause the motor to stop rotating
{
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}



نظام إنذار باستخدام الأشعة تحت الحمراء

في هذا الدرس سوف نتعلم كيفية عمل نظام إنذار بسيط جدًا باستعمال Infrared LED و برمجة كود الأدروينو الخاص بها. هذا الدرس رائع جدا للتدريب على استعمال الأدروينو للمبتدئين.

نظام-إنذار-بسيط-بإستعمال-الأردوينو-و-ا

المكونات

arduino uno r3

Arduino Uno

IR LED Emitter 5mm

IR LED Emitter

photodiode 5mm

Photo Diode (Receiver)

100k ohm

100 K Ohm Resistor

220 Ω resistor

220 Ohm Resistor

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

Piezo sounder

Piezo Sounder

ملحوظة :

في هذا الدرس، قمنا بإستعمال TCRT5000 module، والذي يحتوي على ترانزيستور للأشعة الحمراء بالإضافة إلى Infrared LED. وقمنا بإضافة Infrared LED خارجية لتقوية انبعاث الأشعة تحت الحمراء.

نظام-إنذار-بسيط-بإستعمال-الأردوينو-و-ا

كما يمكنك أن تستعمل دايود أشعة تحت الحمراء / ترانزيستور و لكن تأكد من وضع لاصق (أسود) حول الدايود أو الترانزيستور حتى لا يتأثر بالجوانب كما بالصورة.

نظام-إنذار-بسيط-بإستعمال-الأردوينو-و-ا

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

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

alert-system

 

alert-system

شرح الدارة

تقوم الدارة ببعث ضوء IR من خلال الـ LEDs الموضوعه، وعندما يتواجد سطح عاكس (تقريبا أي سطح عدا الاسطح السوداء فهي تمتص الضوء و لا تنعكس الا بجزء صغير)  تنعكس الأشعة تحت الحمراء لتقوم بالتأثير على الدايود أو الترانيستور وعندما يعمل الدايود يقوم بخفض الجهد نتيجة أن انخفاض مقاومته بشكل ملحوظ و يمكن من خلال الأردوينو قياس قيمة الفولت عن طريق استعمال Analog Read .

alert-system

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

قم بكتابة الكود كما هو موضح أدناه :

#define SENSOR A0
#define BUZZER 12

void setup() {
  pinMode(SENSOR, INPUT);
  pinMode(BUZZER,OUTPUT);
}

void loop() {
  if(readIR(600) == true)
    beep();
  // else
    // doNothing
}

void beep(void) {
  tone(BUZZER, 1000);
  delay(200);
  noTone(BUZZER);
  delay(200);
}

bool readIR(int refernceValue) {
  int x = analogRead(SENSOR);
  if(refernceValue > x)
    return true;
  else
    return false;
}

شرح الكود:

في البداية، نقوم بتسمية المدخل A0 بإسم SENSOR ، والمنفذ رقم 12 بإسم BUZZER . وهكذا يصبح الكود أسهل وأفضل في الفهم والتعامل.

داخل الدالة ()setup، نقوم بتعريف الـ SENSOR كمدخل، والـ BUZZER كمخرج.

#define SENSOR A0
#define BUZZER 12

void setup() {
  pinMode(SENSOR, INPUT);
  pinMode(BUZZER,OUTPUT);
}

في دالة ()loop، نقوم بالتحقق ما إذا كانت القراءة أقل من 600، فإذا تحقق الشرط نقوم بإصدار إنذار.

void loop() {
  if(readIR(600) == true)
    beep();
}

نقوم بإنشاء الدالة ()beep، لتوليد الإنذار. حيث تقوم الدالة بإصدار نغمة ذو تردد 1000 هيرتز، وتتوقف لمدة 200 ميلي ثانية بين النغمات.

void beep(void) {
  tone(BUZZER, 1000);
  delay(200);
  noTone(BUZZER);
  delay(200);
}

نقوم بإنشاء الدالة readIR، والتي تقوم بقراءة قيمة الحساس وإذا كانت القيمة أصغر من القيمة refernce value فإن الدالة تقوم بإرجاع قيمة صحيحة true وإلا تقوم بإرجاع قيمة خاطئ false .

bool readIR(int refernceValue) {
  int x = analogRead(SENSOR);
  if(refernceValue > x)
    return true;
  else
    return false;
}