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

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

برمجة وحدة البلوتوث

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

X1  وحدة البلوتوث (HC-06)

led-5mm-red

X1 الثنائي المشع للضوء 

220 Ω resistor

X1 مقاومة 220 اوم

small size breadboard 170 colors

X1 لوحة تجارب صغيرة

اردوينو

X1 أردوينو أونو 

us-sanitizer-without-touch

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

أسلاك توصيل

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

نظرة عامة

يقوم النظام بارسال أوامر التحكم في ايقاف وتشغيل الإضاءة من تطبيق الجوال إلى لوحة التحكم (الاردوينو) عبر وحدة البلوتوث، يعمل البلوتوث HC-06 على الاتصال التسلسلي , من خلاله يمكنك ارسال و استقبال البيانات. يحتوي البلوتوث على منفذين للطاقة ,ومنفذ Tx لإرسال البيانات ,ومنفذ RX لاستقبال البيانات المرسله للبلوتوث.

remote-lighting-control

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

remote-lighting-control

البرمجة

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);
  }
}

شرح البرمجة: 

  • في الكود البرمجي سنقوم بمراجعة البيانات الواردة وتنفيذ عملية المقارنة ، إذا كانت البيانات المستقبلة من الهاتف الذكي 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



اردوينو – الدرس الخامس – إضاءة 8LEDs بإستخدام رقاقة shift register

مقدمة

في هذا الدرس ستتعلم طريقة تشغيل  8LEDs حمراء بدون إستعمال 8 منافذ مخارج رقمية باستخدام رقاقة shift register.

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

ستقوم هذه الرقاقة في إبطاء سرعة الـ LEDs:
(من 8000000 إلى 500000 تحويله في الثانية  ولكنها تبقى سريعة جدا ولن نلاحظ الفرق)

shift register

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

arduino-lesson-5

(5mm Red LED)

arduino-lesson-5

(270 Ω Resistor)

74HC595 shift register

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

Half-size Breadboard

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

Arduino Uno R3

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

Jumper wire pack

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

Arduino cable

سلك اردوينو

74HC595 shift register

من الافضل فهم طريقة عمل رقاقة مسجل الإزاحة shift register حتى تفهم الكود جيدًا.

الرقاقة Shift register: هي عبارة عن مسجل للإزاحة.

shift register

تحمل 8 أماكن تعتبر مثل الذاكرة الصغيرة، يمكن لكل واحدة فيها أن تسجل 1 أو 0 كقيمm>

لنسجل كل من هذه الخانات بالقيمة المراد وضعها، ندخل كل من المعلومات عبر منفذ “Data” ومنفذ “Clock”.

على منفذ الـ”Clock”  أن يستقبل 8 ذبذبات، إذا كان منفذ “Data” عالي فسيتم إدخال القيمة “1” إلى داخل مسجل الإزاحة.

بعد إستقبال الذبذبات الثمانية تعطى الإشارة لمنفذ “Latch” لتخرج الإشارة لجميع الـ LEDs الثمانية دفعة واحدة.

تمتلك الرقاقة منفذ “OE” (إختصار لـ output enable) وهي التي تتحكم في كل المخرجات معًا.  يمكن لنا التحكم في البريق الكلي للـLED إذا قمنا بربط منفذ “OE” بمنفذ إستخراج “MWP” من الاردوينو وقمنا بإستخدام الدالة ” analogWrite” بالكود فسوف يعمل الـ LEDعلى مستوى منخفض، لذلك سنربطها بالأرضي.

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

بما ان لديك 8LEDs اربط مع 8 مقومات يجب وضع العديد من الأسلاك.

shift register

من الأسهل ان تبدأ بوضع رقاقة مسجل الإزاحة  74HC595 في لوح التجارب ،كل شيء مربوط به، ضع الرقاقة shift register حيث يكون السن الذي يشبه شكل U متجه إلى أعلى لوح التجارب.

المنفذ رقم 1 للرقاقة على اليسار.

تربط منفذ الديجيتال 4 من الأردوينو بالمنفذ 14 من مسجل الإزاحة.

تربط منفذ الديجيتال 5 من الأردوينو بالمنفذ 12 من مسجل الإزاحة.

تربط منفذ الديجيتال 6 من الأردوينو بالمنفذ 11 من مسجل الإزاحة.

أغلب منافذ الإستخراج من الرقاقة توجد على اليسار، حتى يسهل ربط الـ LEDs.

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

ضع الـ LED في لوح التجارب

يجب على المنافذ الطويلة للـ LED أن تواجه الرقاقة shift register مباشرة.

المرحلة الأخيرة هي إضافة الأسلاك كما في الصورة لا تنسى أن تربط المنفذ 8 من الرقاقة إلى خانة الأرض أو GND.

حمل الكود وجربه على كل LED أن يعمل مرة واحدة ثم الكل معًا وأخيرًا ينطفئ الكل معًا قبل أن يعيد الاردوينو الدورة.

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

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
 
byte leds = 0;
 
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
 
void loop()
{
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
}
 
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

تمتلك مكتبة الاردوينو “دالة” مميزة تسمى “ShiftOut” وهي مصممة خصيصًا لإرسال البيانات لرقاقة مسجل الإزاحة shift register.

أول ما عليك فعله هو التعريف بالمنافذ الثلاث التي ستستعملها. هذه هي منافذ الاردوينو التي ستستعملها للتحكم في “Latch”، “Clock” ومنفذ “Data” من الرقاقة 74HC595.

Int latchPin=5;
Int clockPin=6;
Int dataPin=4;

ثم يأتي التعريف بالمتغير المسمى Leds ستستعمل هذا المتغير لإحتواء نمط تغيير (تشغيل أو اطفاء) الـ LED.
تمثل البيانات من نوع ” – Byteبايت” أرقام تكتب بإستعمال 8 أجزاء.  يمكن أن يحمل كل جزء قيمة 1 أو 0
وهذا سيمكنك من تتبع قيمة كل LED.

byte leds = 0;

تقوم دالة التنصيب  “Setup” هذه بإعداد المنافذ الثلاث التي ستستخدمها كمخرجات للـ LEDs.

void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);  
pinMode(clockPin, OUTPUT);
}

تقوم دالة “Loop” بإطفاء كل LED وذلك بإعطاء قيمة ‘0’ كقيمة للـ LEDs ثم تقوم بمناداة دالة “updateShiftRegister” التي سترسل نمط Leds إلى رقاقة مسجل الإزاحة حتى تنطفئ كل LED. سوف تتعلم كيفية عمل “updateShiftRegister” لاحقًا.

تقف دالة “Loop” لنصف ثانية ثم تبدء بالعد من 0 إلى 7 عبر دورة “For” والمتغير “I” وفي كل مرة تستعمل وظيفة “bitSet” لتثبيت الجزء المتحكم في الـLED داخل متغير Leds . ثم تنادي دالة  “updateShiftRegister” حتى يتم تحديث حالة الـLED التي تعكس قيمة المتغير”leds”.

هنالك فترة إنتظار نصف ثانية في كل تكرار للدورة “For”.

void loop()
{
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}

تقوم دالة UpdateShiftRegister بوضع منفذ “Latch” إلى الوضع المنخفض ثم تنادي دالة shiftOut قبل أن تعيد منفذ “Latch” إلى الوضع العالي مره أخرى، تأخذ هذه الدالة أربع متغيرات، تحدد المتغيرتان الأولى المنافذ المستعملة لنقل البيانات عبر “Data” و”Clock”.

تحدد المتغيرة الثالثة جهة البدء بقراءة البايت سوف نقرأ البايت من اليمين إلى اليسار.

المتغير الأخير يمثل القيمة الفعلية التي سترسل إلى رقاقة مسجل الإزاحة shift register.

void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}

إذا كنت تود تغيير قيم أحد الـ LEDs، كل ماعليك هو أن تنادي دالة مشابهة اسمها (bitClear) لتغير قيمتها إلى 0
هكذا ستطفئ واحدة من الـLEDs وكل ما يتبقى عليك فعله هو مناداة دالة “updateShiftRegister” لتحديث حالة الـLED.

التحكم في البريق:

لم نتحدث كثيرًا في رقاقة الـ 74HC595 عن منفذ “OE” أو “OutputEnable” ، رقم هذا الـ LED هو 13, وفي لوح التجارب مربوط دومًا بالأرض.  يعمل هذه المنفذ كالمحول، هو الذي  يمكن له ان يطفئ ويشغل المخرجات الـ (LEds)
ولكن عليك أن تحذر لأنها تعمل في الوضع المنخفض. ذلك يعني، إن كانت كلها مربوطة بطاقة5V ستطفئ جميعها. وإن كانت مربوطة بالمنفذ الأرضي ستعمل جميعها حسب ما يأتيها من بيانات.

يمكن لك أن تستعمل هذه المنفذ والإستعانة بدالة “analogWrite” للتحكم في بريق إضاءة الـ LED معًا.

كل ما عليك فعله هو تغيير المنفذ 13 من الأرض إلى المنفذ 3 في الأردوينو.

سيجعل الكود التالي كل الـLEDs تعمل ببطء ثم تنطفئ ببطء.

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
int outputEnablePin = 3;
 
byte leds = 0;
 
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  pinMode(outputEnablePin, OUTPUT);
}
 
void loop()
{
  setBrightness(255);
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)
  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
  for (byte b = 255; b > 0; b--)
  {
    setBrightness(b);
    delay(50);
  }
}
 
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}
 
void setBrightness(byte brightness) // 0 to 255
{
  analogWrite(outputEnablePin, 255-brightness);
}

أنشطة أخرى

عندما  تتمكن من فهم رقاقة مسجل الإزاحة shift register  ستجد العديد من التطبيقات التي يمكن لك فعلها بإستعمال عدد كبير من الـLEDs.

واحدة من الأشياء الرائعة في رقاقة 74HC595 أنه يمكن وضعها بجانب بعضها والتحكم في عدد أكبر من الـLEDs بإستعمال نفس منافذ المخارج من الأردوينو.