الأربعاء، 26 ديسمبر 2012

RGB LED controlled By arduino part 2


أهلاً بكم مجدداً .

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


اليوم سأعرض الطريقة الثانية في التحكم بهذا الباعث الضوئي مستفيداً من الأوامر التناظرية Analog Write و تقنية التعديل النبضي PWM

الفرق بين الطريقة الرقمية و التناظرية , أن الرقمية محصورة بثمانية الألوان فقط , أما هذه الطريقة"التناظرية" فتعطي مجالأ واسعاً من الألوان أكبر من الرقمي .

لنبدأ بالتعرف عليها أكثر :

 البرمجة باستخدام أوامر الإخراج التناظرية analog Write:
و هي الطريقة الأكثر شيوعاً للتحكم بالRGB نظراً للكم الهائل من الألوان الممكن الحصول عليها " فعلياً حسب تجربتي 216 لون "

كيفية البرمجة :
هنا سنستخدم أقطاب الأردوينو ك PWM Pin و هنا يمكننا التحكم بفولتية الخرج 0-5 فولت بحيث تكون الحساسية 19.53 ملي فولت \وحدة " مدى التحكم من 0 -255 وحده "

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

مثلاً : اللون الأزرق يعبر عن( 0,0,255) و هكذا ....
لنبدأ بكتابة الألوان التي نريد إظهارها و بموازاتها القيم التناظرية لها " أو يطلق عليها الرمز العشري Decimal code :
هذا رابط لموقع إلكتروني يحتوي على كل الألوان بالإضافة للرموز العشريه لها

الآن وقت كتابة الكود .....


بالنسبة للتوصيل فهو مشابه لطريقة التوصيل التي أتبعناها في المرة السابقة .


الأمر سهل أليس كذلك ؟
هكذا نكون قد أمتلكنا المهارات الكافيه للتعامل مع الrgb .

و يمكن تحميل هذا الكود على برنامج البروتوس و عمل محاكاة للنظام ككل .



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

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

الاثنين، 24 ديسمبر 2012

RGB LED controlled By arduino part 1

RGB LED Digital control 



اليوم سنتكلم عن موضوع جديد و ممتع في عالم الإضاءة ألا و هو ال RGB و سنتكلم عن ماهيته , و أنواعه و كيف يعمل ؟



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

أولاً : ما هو ال RGB ؟


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

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

يتكون ال  RGB من 4 أرجل , رجل مشترك "مصعد أو مهبط" و رجل لكل لون رئيسي " أحمر ,أخضر , أزرق " كما في الصورة .


ال RGB يمكن أن يكون ذا مصعد مشترك أو مهبط مشترك , و لكل نوع طريقة مختلفة قليلاً في التحكم "أي في كود البرمجة"

لنبدأ العمل J :

لنبدأ الآن العمل و لنحضر المكونات الرئيسية لبداية تعاملنا مع ال RGB :
1) RGB LED  5mm
أنا استخدمت الباعث ذو المهبط المشترك     
2)مقاومة 470 أوم .
3)أسلاك
4) لوحة تعليمية مثقوبة BreadBoard
5) أفوميتر
6) بطاقة أردوينو .



أولاً كيف نتحقق من نوعية ال RGB الذي بين يدينا ؟ هل هو مصعد مشترك أم مهبط مشترك ؟

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

إذا لم يضيئ ال LED  فأعلم أن هناك عطل بالديود أو خطأ بضبط الجهاز 

2) بإستخدام طريقة توصيل الدارة بمصدر تغذية :
فقط تقوم بإيصال التغذية للأقطاب بشكل صحيح " ولا تنسى المقاومة لكي لا يتلف ال
led .

ممتاز لقد أنتهينا من الجزء الأول من العمل .

السؤال التالي الآن ... ما هي النسبة التي يجب أن نخلط بها الألوان لنحصل على ألون المطلوب ؟ و كيف يتم ذلك بالبرمجة ؟

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


  

كيفية توصيله :

يتم توصيل الدارة مع بطاقة الأردوينو على الشكل التالي :


يمكن أيضاً توصيل فقط مقاومة واحدة على المدخل المشترك " 150- 220 أوم " .
معلومة مهمة ايضاً حول برمجة ال RGB , حيث يمكننا عمل جدول يسمى جدول الحقيقة Truth table يمكننا معرفة ما هو اللون الذي سينتج عند كل عملية إدخال و هذا ما سنراه بعد قليل :
الآن لندخل للبرمجة ..

برمجة ال RGB  باستخدام الأردوينو :

سنسنخدم طريقتين  للبرمجة :
1) البرمجة باستخدام أوامر الإخراج الرقمية digital Write .
2) البرمجة باستخدام أوامر الإخراج التناظرية analog Write
 و سنرى الفرق بين الطريقتين كما يلي :

1) البرمجة باستخدام أوامر الإخراج الرقمية digital Write:
يستحدم الأمر digital Write  لتفعيل أو عدم تفعيل الخرج , و محددات استخدام هذه الطريقة هي محدودية الألوان التي يمكن الحصول عليها " عددها 23 و يساوي 8 ألوان فقط ! ."
سنقوم بعمل جدول حقيقة و استخدام طريقة برمجية الPaint  لمعرفة الألوان التي ستظهر :

هذا ما سنستخدمه في كتابة برنامج الأردوينو الآن
أولاً  جدول الحقيقة Truth Table هو جدول يتم  وضع جميع الأحتمالات التي ستظهر عند تطبيق الأمر و إخراجه لمداخل المتحكم , أي بمعنى أخر هو جدول يوضح العلاقة بين المدخلات و المخرجات .

لنرى الجدول التالي و الذي يوضح جدول الحقيقة لمشروعنا :



جدول الحقيقة للRGB 

 و للتوضيح أكثر , لو اردنا إظهار اللون الأحمر RED يجب أن تكون المداخل المربوطة مع مدخلي اللون الأزرق و الأخضر في وضع منخفضLOW و مدخل اللون الأحمر في وضع مرتفع HIGH و هكذا .
توصيلة الدارة كما في الصورة أدناه .



توضيح بسيط للبرنامج ... قمت هنا بكتابة الأوامر في جملة استدعاء لوحدها و وضعت كل تعليمات الخرج فيها ثم قمت باستدعائها داخل جملة التكرار , مثال
Void setup(){
…….
}
Void Red(){
Write your code for red color ….
}
Void loop(){
// need to blink red color….
Red();….. call statement , here the prog. Will return  to void Red and execute it then return to loop statement .
}




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


التدوينة القادمة ستتحدث عن التحكم  باستخدام أوامر الإخراج التناظرية analog Write 

إلى ذلك الوقت , إلى اللقاء 



السبت، 8 ديسمبر 2012

مسجل الإزاحة Shift Register 74595 الجزء الثاني


  مسجل الإزاحة Shift Register 74595 الجزء الثاني 




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

الجواب نعم ! هناك مدخل لم نقم بتوصيله , هو المدخل رقم 9 في مسجل الإزاحة , يقوم هذا المدخل بنقل" Shifting " للبيانات الموجودة في المسجل إذا تم تحميل بايت لمسجل الإزاحة , و يحمل البايت الذي تم استبداله للمسجل الإزاحة الآخر المربوط معه.


هذه الطريقة مفيد جداً لو أردنا التحكم بالبواعث الضوئية , المقطّعات السباعية Seven segment , مصفوفات البواعث الضوئية  LED Matrix , الشاشات البلورية الكريستالية LCD , و غيرها الكثير .


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


سنحتاج لنفس المعدات التي استخدمناها في التجربة السابقة , لكن سنضيف مسجل إزاحة آخر .


مخطط الدارة يكون كما يلي :




  لم يختلف توصيلها عن التوصيل الماضي سوى توصيل المدخل # 9 من مسجل الإزاحة الأول إلى المدخل رقم 14 من مسجل الإزاحة الثاني , و هكذا ....









  يمكن أيضاً كتابة البرنامج بطريقة أخرى , يمكن الإطلاع عليه , ستجده في المرفقات في نهاية المقال .

  في الختام , كم يمكن لنا أن نصل مسجل إزاحة مع بعض ؟
  حقيقة لا املك عدد معين يمكن وصله من مسجلات الإزاحة معاً , لكن أنا جربت أن أصل 4 مسجلات إزاحة معاً .

يمكنك تحميل البرنامج ل 4 مسجلات ازاحه من هنا
Four shit register Code here

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

الخميس، 29 نوفمبر 2012

مسجل الإزاحة Shift Register 74595


أهلاً و سهلاً بكم مجدداً

اليوم سنتحدث سنسلط الضوء على فكرة على درجة كبيرة من الأهمية تساعدنا على قيادة عدد كبير من البواعث الضوئية LED  ألا و هو مسجلات الإزاحة Shift Register.





ما هو مسجل الإزاحة Shift Register ؟


هو مجموعة متسلسلة من القلابات flip flop التي لها نفس دور الساعة CLK , و خرجها متصل بقلاب آخر , هذا يعمل على نقل البيانات بين المسجلات بتسلسل , و تنتقل البيانات عندما يتغير دور الساعة صعوداً أو هبوطاً .


تنقسم مسجلات الإزاحة إلى عدة أنواع و هي 




1.   Serial in , serial out " SISO "
2.   Serial in ,parallel out "SIPO"
3.   Parallel in ,serial out "PISO"
Our shift register used as  " SISO " or "SIPO"
سنستخدم مسجل الإزاحة 74HC595  و الذي سيكون له 

استخدامات كثيرة في الدروس القادمة , نظراً لسهولة برمجته .

توزيع الأرجل لهذه الدارة المتكاملة :



سنشرح كل وظيفة كل مدخل من مداخل مسجل الإزاحة .
 الرجل # 14:
الرجل المسؤولة عن إدخال البيانات تسلسلياً . يتم إزاحة 

البيانات على هذا المدخل
الرجل رقم 13 "تمكين الخرج ":
هذا المدخل مسؤول عن إظهار البيانات على المخرج  ، يجب 

أن تكون هذا الرجل في وضعية منخفض  LOW   حتى 

   يظهر الخرج.

الرجل # 12 :

  Storage latch input  تقوم هذه الرجل بوظيفة إمساك 

البيانات و تخزينها عند تتحول حالتها إلى وضع مرتفع HIGH .
الرجل # 11 :

دخل الساعة , عندما تكون في وضع مرتفع HIGH تسمح 

للبيانات على الدخل التسلسلي" مدخل #14 " بإزاحة بيانات 

بمقدار 8 بت .

الرجل # 10 :

مدخل التصفير RESET 

إذا كان هذا المدخل بوضع منخفض LOW فإن الخرج يكون 

قيمته صفر .

لذلك نضع هذا المربط على الوضع المرتفع HIGH إذا أردنا 

ظهور نتائج المسجل .

الرجل# 9:
تسمى Serial Data Output  تعمل على إزاحة بيانات الخرج 

"8بت" التي تظهر باتجاه مسجل إزاحة آخر , أي بأختصار لو 

أردنا شبك أكثر من مسجل إزاحة واحد يمكننا ذلك بوصل هذه 

الرجل مع الرجل #14 في المسجل الآخر .

الأرجل 15 , 1-7 :


أرجل الخرج " 8 بت " .

يمكنك العودة إلى النشرة الفنية  الحصول على مزيد من 

المعلومات.

باستخدام مسجل الإزاحة , نحتاج فقط ل 3-4 أرجل ففقط من 

المتحكم للتحكم ب 8 بت و هذا يعتبر مفيد جداً لو أردنا 

   استخدام المتحكم في تطبيقات متعددة .




لنبدأ الآن بتجهيز معداتنا , لنبدأ استعمال هذه الدارة المتكاملة .



سنحتاج لهذه التجربة المكونات التالية : 

1) بطاقة أردوينو .

2)LED عدد 8 


3) مسجل إزاحة من النوعShift register 74HC595

4)بعض الأسلاك Some wires

5)مقاومة   100Ohm عدد 8

6)مكثق 100nF

7) لوحة تعليمية مثقوبة BreadBoard 




الشكل أدناه يبين توصيل الدارة كهربائيا .

صورة تبين التوصيل , مع الأنتباه إلى أن المكثق مربوط مع المدخل رقم 12 و الأرضي


 و هذا مخطط الدارة لمن يستصعب من فهم المخطط أعلاه 




الآن و قبل البدء بالبرمجة , سأوضح امر مهم جديد , ألا وهو أمر shiftOut

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

بطريقة التخاطب  الشهيرة SPI  و هي اختصار Serial 

Peripheral Interface    و هو طريقة 


لنقل البيانات تزامنياً , يمكن بداية الإطلاع على مكتبتها على 

الرابط هنا 

نعود للأمر shiftOut , هذا الأمر هو الذي سنقوم من خلاله 

بنقل البيانات من المتحكم إلى مسجل الإزاحة .

الطريقة سهلة , يكتب الكود الخاص بمقل البيانات على الصيغة 

التالية 

    shiftOut(datapin,clockpin,bitorder,value);
حيث :

datapin: هو المدخل المسؤول عن إخراج البيانات بت بت .
clockpin: المدخل المسؤؤل عن دخل الساعة المنظم للمتحكم , و يتغير الخرج عندما يقدح المسجل باستخدام هذا المدخل .
bitorder: هو خيار يحدد طريقة نقل المعلومات إلى المسجل 
إما أن تكون MSBFIRST أي ابتداءاً من البت ذو القيمة الأعلى اهمية للأقل أهمية "من اليسار لليمين "
أو أن تكون  LSBFIRST  أي من البت الأقل أهمية للأعلى أهمية " من اليمين  لليسار"

الوضع الإفتراضي يكون نقل البيانات MSBFIRST 

value: هي القيمة التي ننوي إظهارها على الخرج .




----------------------------------------------------------------------------
// انسخ البرنامج من هنا 
//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/

//****************************************************
//Name :Mohannad Rawashdeh .
//Date "30/6/2012 3:00pm
// Description: This  Code for using a 74HC595 Shift Register           //
// to count from 0 to 255  , Using arduino pin # 8,10,11,12
// Programmed for http://genotronex.blogspot.com/
                
//****************************************************************
//define the Pins
//Pin connected to latch clock  of 74HC595 ""pin 12""
int latchPin = 8;
//Pin connected to shift clock of 74HC595 ""PIN 11 "
int clockPin = 12;
////Pin connected to serial Data A of 74HC595 "pin 14 "
int dataPin = 11;
///Output pin controller of 74HC595""pin 13""
int output_pin=10;
//___________________________________________________

void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(output_pin, OUTPUT);
  digitalWrite(output_pin,HIGH); // this instruction to disable Output pins
}

void loop() {
  // count from 0 to 255 and display the number 
  // on the LEDs
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    digitalWrite(output_pin,LOW);// enable OUTPUT Pins
    // pause before next value:
    delay(250);
    
    digitalWrite(output_pin,HIGH); // this instruction to disable Output pins again .
  }
}
   //----------------------------------------------------------------------


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

    الآن و بعد أن تمكنا من الإلمام بطريقة استخدام مسجل إزاحة واحد , ننتقل لسؤال مهم , هل بإمكاننا التحكم بمسجلي أزاحة باستخدام نفس عدد المداخل التي استخدمناها للتحكم بمسجل إزاحة واحد ؟ 

سأُجيب عن هذا التساؤل في البوست القادم , إلى ذلك الوقت إلى اللقاء .
 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.