اردوينو – الدرس العاشر– المستشعر الضوئي (photocell)

مقدمة

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

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

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

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

arduino-lesson-10-sensing-light

8× (5mm LED)

arduino-lesson-10-sensing-light

(270 Ω Resistors)

arduino-lesson-10-sensing-light

(1 kΩ Resistor)

74HC595 Shift Register

رقاقة مسجل الإزاحة (74HC595 shift register)

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

 1× المستشعر الضوئي (Photocell)

Half-size Breadboard

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

Arduino Uno R3

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

Jumper wire pack

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

arduino-lesson-2

سلك اردوينو

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

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

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

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

photocell_fixedResistor

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

أنشطة أخرى

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

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




مشروع Mood lamp

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

مشروع-mood-lamp-لإضافة-ديكور-مميز-لبيتك

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

arduino uno r3

Arduino Uno

220 Ω resistor

220 Ohm – 330 Ohm Resistors

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

blue led 5mm

Blue LED

green led 5mm

Green LED

led 5mm red

Red LED

white-paper

ورق مقوى خفيف (أي شكل ترغب به، هذه لمستك الجمالية)

توصيل الدارة على لوحة التجارب

mood-lamp

 

mood-lamp

شرح المشروع

نقوم بتوصيل الـثلاثة LEDs على مخارج PWM من الأردوينو وعن طريق التحكم في نسبة الفولت الخارجة للـLED  نستطيع التحكم في شدة الإضاءة.

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

للتحكم في شدة الإضاءة يمكنك أن تكتب كود الأردينو (analogWrite(x  حيث x  تمتد من 0 الى 255 (و هذا نظير 0 الى 100% تقريبًا).

نقوم بفتح نافذة اختيار اللون color picker – والتي توجد غالبًا في برامج الجرافيك مثل الفوتوشوب- لإختيار قيم RGB حتى نقوم بعرض جميع ألوان الطيف فكانت النتيجة كالآتي:

مشروع-mood-lamp-لإضافة-ديكور-مميز-لبيتك

وبالتالي سوف نقوم بعمل دالتين decrease color ودالة أخرى increase color. كلتا الدالتين تأخذ معامل وهو اسم اللون الذي نريد أن نقوم بزيادته من 0 الى 255 او بنقصانه من 255 الى 0.

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

#define LED_RED   11
#define LED_GREEN 10
#define LED_BLUE  9

void setup() {
  // Define the output LEDs
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
}

void loop() {
  increaseColor(LED_BLUE);
  decreaseColor(LED_RED);
  increaseColor(LED_GREEN);
  decreaseColor(LED_BLUE);
  increaseColor(LED_RED);
  decreaseColor(LED_GREEN);
}

void increaseColor(unsigned char colorPin) {
  for(int i=0; i<=255; i++) {
    analogWrite(colorPin, i);
    delay(5);
  }
}

void decreaseColor(unsigned char colorPin) {
  for(int i=255; i>=0; i--) {
    analogWrite(colorPin, i);
    delay(5);
  }
}

شرح الكود :

في البداية نقوم بتسمية مداخل الاردوينو حسب الـ LEDs  الموصلة معها، فالمدخل  9 موصل مع LED  الأزرق، والمدخل 10 موصل مع LED  الأخضر، ومدخل 11 موصل مع الأحمر.
ثم نقوم بتعريف هذه الأطراف كمخرج في دالة ()setup .

#define LED_RED   11
#define LED_GREEN 10
#define LED_BLUE  9

void setup() {
  // Define the output LEDs
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
}

في دالة ()loop نقوم بالتحكم في شدة اضاءة كل LEDs ودمج الألوان الثلاثة معا، وبهذه الطريقة نحصل على مزيج من الألوان تعتمد على شدة تركيز كل لون LED على حدة .
يتم التحكم في شدة إضاء كل LED عن طريق استدعاء الدالة increaseColor والدالة decreaseColor .

void loop() {
  increaseColor(LED_BLUE);
  decreaseColor(LED_RED);
  increaseColor(LED_GREEN);
  decreaseColor(LED_BLUE);
  increaseColor(LED_RED);
  decreaseColor(LED_GREEN);
}

الدالة increaseColor  تعمل على زيادة شدة اضاءة اللون تدريجيا. تقوم هذه الدالة باستخدام الدالة analogWrite(Pin_name,Vlaue) للتحكم في شدة الإضاءة، وبإستخدام for loop تبدأ شدة الاضاءة بالإزدياد تدريجيا من 0 إلى قيمة 255 .

/* هذه الدالة تقوم بعمل تأثير ناعم بزيادة قيمة اللون المطلوب منها من 0 الى 255 */
void increaseColor(unsigned char colorPin) {
  for(int i=0; i<=255; i++) {
    analogWrite(colorPin, i);
    delay(5);
  }
}

تقوم الدالة decreaseColor  بتقليل شدة اضاءة الـ LED  تدريجيا. تعمل هذه الدالة بنفس طريقة الدالة السابقة increaseColor ، ولكن تستخدم الـ for loop لتقليل شدة الإضاءة من 255 إلى 0 .

/*
و هذه الدالة تفعل العكس
*/
void decreaseColor(unsigned char colorPin) {
  for(int i=255; i>=0; i--) {
    analogWrite(colorPin, i);
    delay(5);
  }
}

باستخدام نفس التقنية مع باقي الـ LEDs يمكننا دمج الألوان بصورة رائعة لنحصل على Mood Lamp .