الخميس، 4 أبريل، 2013

الدارة المتكاملة Max7219


الدارة المتكاملة  Max7219



Max7219 هي عبارة عن دارة متكاملة تستحدم لقيادة 64 باعثاً ضوئياً منفرداً , أو كحد أقصى 8 خانات من المقطعات 7segment و هو يستخدم طريقة نقل البيانات التسلسلي SPI .





يمكن التحكم بهذه الدارة بواسطة متحكم أصغريMCU , و في حالتنا هنا سنستخدم بطاقة اردوينو للتحكم بهذه الدارة باستخدام 3 خطوط فقط من أردوينو !


أولاً : المخطط و التوصيلات :



هذا المخطط يوضح  التوصيل بين أردوينو و هذه الدارة بكل مكوناتها .


كما نلاحظ هناك فقط 3 عناصر خارجية نحتاجها فقط لربطها مع هذه الدارة هي Iset  ,  C1, C2

وظيفة C1,C2 هي لتخفيض الضجيج القادم من مصدر التغذية , و يجب وضعهما أقرب ما يمكن بين مصدر التغذية و الأرضي للدارة " الأرجل 4 و 9 ".

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

قيمة المقاومات هنا بالكيلو أوم .

القصود ب VLED هو الجهد الأمامي للباعث الضوئي المعطى في نشرته الفنية , و هي بالغالب 2 – 3,2 فولت حسب نوع الباعث" Diffused ,Ultra ,clear Ultra…etc " و Iseg هو التيار المار في كل منبع جهد Current source من الدارة .



لنأخذ مثال عليه : لو كان الجهد الأمامي للبواعث الضوئية المربوطة مع هذه الدارة 2.5 فولت , و التيار الأعظمي لها 25ملي أمبير , نقوم أولاً بأخذ قيمة للتيار أقل من قيمة التيار الأعظمي للباعث حتى نبقى في أمان من أن لا يتلف الباعث و لتكن 20 ملي امبير , من الجدول نأخذ قيمة المقاومة و هي 25.9كيلو أوم , و لعدم توافر هذه القيمة عملياً نأخذ قيمة أعلى منها و لتكن 27كيلو أوم أو 30 كيلو أوم J .

·      ربط أكثر من max7219 معاً :


يمكن ربط أكثر من جهاز على التسلسل بسهولة عبر توصيل المخرج D out  مع مدخل Din  للجهاز التالي , و يمكن بهذه الطريقة ربط حتى 8 أجهزة من max7219 باستخدام 3 مخارج من أردوينو .


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

بقي الأمر الأخير لنا قبل أن ندخل في تفاصيل برمجته ألا وهو مشاكل مصدر الطاقة .!
هنا يجب الإنتباه لهذا الموضوع لأنه مهم جداً , كما نعلم فإن البواعث الضوئية تستهلك تيار كبير إذا تم وصلها كاملة "64 باعث ضوئي" فإن هذا التيار الكبير قد يتلف الأردوينو أو حتى لا يتحمله مصدر الجهد خصوصاً لو كان من خلال USB الحاسوب و قد يؤدي لتلفه أحياناً .
أختيار Rset مهم جداً لمعرفة التيار المُغذى للدارة وحيث يمكننا معرفة التيار الكلي المار بالدارة من خلاله زائد ونضيف عليه 10ملي امبير استهلاك ال max7219
عدد البواعث الضوئية المضاءة يحدد التيار المسحوب من مصدر الجهد .
تعطى معادلة التيار المسحوب بالعلاقة التالية :
PeakCurrent=(8 x LedCurrent) + MAX72XX-Supply
حيث :
LedCurrent: عبارة عن التيار المار في كل باعث ضوئي و وهو معطى بالنشرة الفنية .
MAX72XX-Supply : تيار الذي تستهلكه الدارة و مقداره 10 ملي امبير .
الرقم المضروب ب LedCurrent هو عدد البواعث الضوئية المربوطة بكل segment .
لو ربطنا مصفوفة ليدّات 8*8 يكون لدينا 8 بواعث ضوئية يكون العدد المضروب 8 "بعدد البواعث الضوئية "
لو تعدى التيار الكلي المستهلك 500 ملي امبير فعندها سيكون خطراً استخدام كيبل USB الخاص بالحاسوب أو من مصدر الجهد الموجود في الأردوينو من تغذية الدارة و يتوجب عندها استخدام مصدر جهد خارجي لتغذية الدارة , عكس ذلك ستتلف مدخل الusb
سيكون لديك  ثلاث خيارات  :
1) أن تستخدم مصدر جهد خارجي بتيار أعظمي أكبر من التيار المطلوب .
2) أن تستخدم البطاريات , و يمكنك أن تستخدم البطاريات بعمر أطول مع هذه الدارة لو تم تفّعيل خيار توفير الطاقة " سيوضح لاحقاً "و أستخدام Rset عالية لتقليل التيار و بذلك تقليل التيار المسحوب من مصدر الجهد 
3).و يمكن أيضاً تعديل السطوع بواسطة البرمجة أيضاً حيث نتمكن من التحكم بشدة الإضاءة Intensity  و هي طريقة فعّالة جداً في التحكم بمصفوفة البواعث الضوئية LED Matrix .
---------------------------------------------------------------
البرمجة و استخدام مكتبة LED Control
قبل أن تبدأ بالبرمجة عليك قراءة النشرة الفنية لهذه القطعة جيداً حتى تعرف أمكانياتها الكبيرة .

المكتبة التي سنشرحها هنا تمتلك إمكانيات كبيرة تمكنك من قيادة مصفوفة ليدّات لغاية 8*8  و أيضاً 7SEG لغاية 8 خانات و حتى قيادة بواعث ضوئية بصورة فردية .

سنبدأ باستدعاء المكتبة ...
يتم استدعاء هذه المكتبة بسهولة و تعريف المرابط التي سنستعملها من الأردوينو و عدد ال
MAX7219 التي سنربطها مع الأردوينو .
الأمر يكتب كالآتي
LedControl(int dataPin, int clkPin, int csPin, int numDevices);

   حيث: 
int dataPin    The pin on the Arduino where data gets shifted out
 * int clockPin   The pin for the clock
 * int csPin      The pin for selecting the device when data is to be sent
* int numDevices The maximum number of devices that can be controled

نقوم بتوصيل الأرجل كالآتي 
dataPin .... With D12
clockPin ... With D11
csPin ...... With D10


اساسيات تعريف المكتبة , يجب في البداية تحميل مكتبة LedControl 



حيث n هو عدد الأجهزة المربوطة .
لتفعيل وضع الShutdown  نضع true بدلأ من false و نستطيع ضبط شدة الإضاءة من 0 إلى 15 .

و لمسح او إعادة تصفير المخرجات نضع الأمر



أوامر التعريف سهلة , أليس كذلك ؟


سأبدأ بأول تطبيق عليه ألا و هو ال  7Segment المقطعات السباعية .

المقطعات السباعية 7Segment  تستخدم لإظهار الأرقام عليها , و يمكن للدارة المتكاملة Max7219 قيادة حتى 8خانات من ال7Segment "رقم كبير "


ستحتاج لتنفيذ هذه التجربة إلى :

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

2) اسلاك
3) مقاومة 33كيلو أوم 
4) مكثفين 100nF,10uF
5)الدارة المتكاملة Max7219
6) Bread Board .
7)اسلاك توصيل Solderless Jumper



لتقوم بتوصيل ال7Segment مع الMax7219  يمكنك توصيله كما في الشكل :




لبرمجة ال7Segment هناك عدة أوامر تساعدنا على اظهار الارقم و الرموز عليها .



 lc.setDigit(Device#,Digit#,data,Dot select);

Device#: تحدد الموقع الذي نريد أن نبعث الرقم عليه من (0-7)
Digit#: نحدد الخانة التي نريد اظهار الرقم عليها (0-7) 
data: الرقم أو الرمز الذي نريد كتابته 
Dot select(True,false): اذا كان مفعلاً تكون الفاصلة العشرية مضيئة , و تكون مطفئة اذا كانت غير مفعله

يمكن اظهار بعض الرموز على ال7Segment  و هي قليلة و منها :

'0','1','2','3','4','5','6','7','8','9',

'0','*'A','b','c','d','E','F','H','L','P

', ,'.','-','_',' ' 

و يكتب الكود على الصيغة التالية :
lc.setChar(0,0,'a',false);
بنفس خصائص الامر الخاص بالأرقام .

هنا أعرض مثال بسيط للتحكم بعداد يقوم بالعد من 0-9999 كل ثانية يزيد قيمة العد بمقدار واحد .

و يمكنك توصيل LED مع المربط D2 حيث سيضيء و يطفئ لمدة ثانية واحدة .

 by Mohannad Rawashdeh

//http://genotronex.blogspot.com/
//...................................

#include "LedControl.h"
LedControl lc=LedControl(12,11,10,1);
int t=500;
long previousMillis = 0;
long interval = 100;    
float Ones;
int Tens;
int Hundred;
int Thousands;
float factor=0;
int Integer=0;
int counter=0;
boolean state=false;
#include <avr/io.h>
#include <avr/interrupt.h>
#define LEDPIN 2
ISR(TIMER1_COMPA_vect)
{
   digitalWrite(LEDPIN, !digitalRead(LEDPIN));
}
void setup(){
  Serial.begin(9600);
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
    pinMode(LEDPIN, OUTPUT);
 
    // initialize Timer1
    cli();          // disable global interrupts
    TCCR1A = 0;     // set entire TCCR1A register to 0
    TCCR1B = 0;     // same for TCCR1B
 
    // set compare match register to desired timer count:
    OCR1A = 7811;
    // turn on CTC mode:
    TCCR1B |= (1 << WGM12);
    // Set CS10 and CS12 bits for 1024 prescaler:
    TCCR1B |= (1 << CS10);
    TCCR1B |= (1 << CS12);
    // enable timer compare interrupt:
    TIMSK1 |= (1 << OCIE1A);
    // enable global interrupts:
    sei();
  for (int i=0;i<4;i++){
    lc.setDigit(0,i,8,true);
    lc.setDigit(0,i+1,8,true);
    lc.setDigit(0,i+2,8,true);  
    lc.setDigit(0,i+3,8,true);
    delay(t);
  }
}
void calculate(){
    counter+=1;
    Ones=counter;
    if(Ones==10){
      counter=0;
      Ones=0;
      Tens+=1;
    }
    if(Tens==10){
      Hundred+=1;
      Tens=0;
    }
    if(Hundred==10){
      Thousands+=1;
      Hundred=0;
    }
  if(Thousands==10){
      Thousands=0;
      Hundred=0;
      Tens=0;
      Ones=0;
    }
    lc.setDigit(0,3,Ones,false);
    lc.setDigit(0,2,Tens,false);
    lc.setDigit(0,1,Hundred,state);
    lc.setDigit(0,0,Thousands,false);
  
}

void loop(){
  unsigned long currentMillis = millis();
  
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    state=!state;
    currentMillis-=1;
      previousMillis = currentMillis; 
    Serial.println(currentMillis);
    calculate();
  } 
  }



و الفيديو أدناه يوضح نتائج تطبيق البرنامج.



6 التعليقات :

  1. السلام انت قلت
    ""
    · ربط أكثر من max7219 معاً :


    يمكن ربط أكثر من جهاز على التسلسل بسهولة عبر توصيل المخرج D out مع مدخل Din للجهاز التالي , و يمكن بهذه الطريقة ربط حتى 8 أجهزة من max7219 باستخدام 3 مخارج من أردوينو .

    لو احتجنا ربط اكثر من 8 أجهزة مع الأردوينو , يتوجب علينا عندها تعريف الجهاز التاسع مع 3 أرجل جديدة من أردوينو
    ========================================
    سؤالي لماذا فقطط 8 أجهزه
    وماهو تفسيرك لهذا مخطط
    https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/all

    وكذلك
    http://www.electrodragon.com/w/File:Wiring_Method_2.png
    http://www.electrodragon.com/w/File:Wiring_Method_1.png

    مع الشكر والتقدير على مجهودك الكبير

    ردحذف
    الردود
    1. لماذا 8 هذا ما يحدده المصنع الذي صنع القطعة , لاعتبارات كثيرة يصعب شحها كلها هنا .

      الرابط الأول , أي مخطط تقصد ؟ هل الخاص بال spi ؟ هناك عدد محدد يمكنك ان تصله باستخدام هذا البروتوكول "في الأردوينو تحتاج ل CS الذي يمكنك من توصيل جهازي SPI فقط مع الأردوينو , أي تختار اي جهاز تتواصل معه عن طريق تفعيل هذا المدخل .

      هنا الفرق بين هذه القطعة MAX7219 هي انها تدعم الأزاحة داخلياً Drift out .

      حذف
    2. هناك انواع من ال MCU, MPU تدعم حتى توصيل 3 اجهزة بالبروتوكول SPI مباشرة و منها ما اوردته في الرابطتين في تعليقك .

      حذف
  2. السلام عليكم
    اخي كريم اذا أستخدمت طريقه ارسال بيانات دفعه واحده اي أستخدام طرف واحد من CS
    اي مثل
    http://www.electrodragon.com/w/File:Wiring_Method_1.png
    فهل هناك عدد محدد من اجهزه وخصوصا بيانات ترسل من اخر بايت الى اول بايت بدفعه واحده يعني اقصد ترسل بايت اخير وبعدها قبل اخير وهكذا تنازليا (( لانك تعرف سوف يتم تشفيت وبتالي يتم ترتيب بياتات من اول الى اخير ))
    خصوصا هذه طريقه تستخدم CS واحده لكل اجهزه
    مع الشكر والتقدير

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

      حذف
  3. السلام عليكم
    اخي كريم عندي دائئرة تحكم تعمل بالدارة المتكاملة max7221 تقوم بتشغيل 4 سيجمانت تأ خذ بيانتها من microcontroller P89C51RD2HBB ولكن الدارة لا تضيء نهائيا مع التأكد من وصلات الباور ودخول وخروج microcontroller P89C51RD2HBB ودخل الكريستالة والمكثفات المحيطة والمقاومات وعن لمس طرف max7221 بمفك او سلك الافو تقوم السيجمنت بالاضاءة ولكن تعطي 8888 بصفة مستمرة فارجو مساعدتي في تحديد سبب المشكلة برمجة ام عطل في اي المتكاملتين

    ردحذف

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.