دات ماتریس چیست؟
پیشاز آنکه به مبحث چگونگی راهاندازی ماژول دات ماتریس (Dot matrix) بپردازیم، بهتر است خود دات ماتریس را معرفی کنیم. داتماتریس مجموعهای از LED هایی است که بهصورت منظم در یک قالب چیده شدهاند. این نحوهی چینش بیشتر برای نمایش اعداد و حروف بهکار برده میشود و در ساخت نمایشگرهای LED از آنها استفاده میشود.
در تصویر فوق، یک دات ماتریس 8 در 8 را مشاهده میکنید. منظور از 8 در 8 این است که این داتماتریس از هشت LED در طول و هشت LED در عرض استفاده میکند که در مجموع تشکیل 64 نقطه نورانی (LED) را میدهند. در صنعت، از دات ماتریس برای نمایش حروف، اعداد، کاراکترهای استاندارد دیگر و تصاویر استفاده میشود. تابلوهای روان نیز از دات ماتریس استفاده میکنند. در نمایشگرهای مبتنی بر دات ماتریس بهراحتی و با چینش تعداد دلخواهی از داتماتریس در کنار هم، میتوان نمایشگرهای بزرگتر را به وجود آورد. داتماتریسها علاوه بر ابعاد فیزیکی و تراکم LED در طول و عرض، دارای پارامتر دیگری نیز هستند که مشخص میکند هر یک از LED های تشکیلدهندهی داتماتریس قادر به تولید چه رنگهایی است. معمولاً دات ماتریسهای موجود در بازار تکرنگ هستند. اما داتماتریسهای رنگی نیز وجود دارند که قادرند دو یا حتی سه رنگ اصلی را ایجاد کنند که با ترکیب این رنگها میتوان به تمام طیف رنگی دست پیدا کرد.
در تصویر فوق، یک دات ماتریس دو رنگِ قرمز/سبز را مشاهده میکنید. با ترکیب نور قرمز و سبز میتوان به نور زرد دست پیدا کرد؛ پس با استفاده از این نوع داتماتریس، قادر به تولید 3 رنگ کاملاً مجزا هستیم.
در تصویر بالا، دات ماتریس سه رنگ یعنی RGB (قرمز/سبز/زرد) را میبینید. با ترکیب این سه نور (رنگهای اصلی 4 تا هستند) ما قادر به تولید طیف وسیعی از رنگهای دیگر هستیم. بهاصطلاح این نوع داتماتریسها، تمامرنگ (Full Color) نامیده میشوند و از آنها در ساخت تلویزیونهای شهری استفاده میشود.
داتماتریس چگونه راهاندازی میشود؟
در نگاه اول ممکن است راهاندازی دات ماتریس چندان پیچیده به نظر نرسد؛ اما در نظر بگیرید که برای راهاندازی داتماتریس 8 در 8 باید قادر باشیم که تعداد 64 LED را بهصورت مجزا کنترل کنیم و برای یک دات ماتریس 16 در 16 این تعداد به 256 عدد خواهد رسید. پس اصلاً منطقی نیست که بتوان هر LED را بهصورت مجزا کنترل کرد؛ چراکه هم حجم سیمکشی بهشدت زیاد میشود و هم هیچ میکروکنترلری این تعداد پایه را در اختیار ما نمیگذارد. راهحل این است که LED ها را در دستههای مشخصی قرار دهیم و هر بار یک دسته را کنترل کنیم. با استفاده از این روش، تعداد پایههای موردنیاز به شکل چشمگیری کاهش پیدا میکند. امروزه تمام داتماتریسها با استفاده از این روش ساخته میشوند.
همانطور که مشاهده میکنید LED ها بهصورت سطری و ستونی دستهبندیشدهاند. با استفاده از این تکنیک، تعداد پایههای موردنیاز بهشدت کاهش پیدا کرده است؛ بهنحویکه برای راهاندازی یک ماتریس 8 در 8 به 16 پایه مجزا نیاز داریم. نحوهی کار به این صورت است که دادهها را بهصورت سطر به سطر قرار میدهیم. اول دادههای سطر یک، سپس سطر دوم و الیآخر. اگر این کار را با سرعت انجام دهیم؛ نهایتاً خروجی همان چیزی خواهد بود که قصد نمایش آن را داریم.
معرفی ماژول دات ماتریس
ماژول دات ماتریس موردنظر ما، از آی سی Max7219 جهت راهاندازی داتماتریس استفاده کرده است. این آی سی درواقع یک درایور LED است که علاوه بر دات ماتریس قادر به پشتیبانی سون سگمنت (Seven Segment) نیز هست. مزیت استفاده از این آی سی این است که اسکن دات ماتریس را بهصورت خودکار و مستقل انجام میدهد و نیازی به درگیر شدن CPU جهت اسکن نیست. این آی سی مدار کنترل جریان داخلی دارد که از سوختن LED ها در اثر عبور جریان بالا جلوگیری میکند. خوشبختانه آی سی Max7219 از چند نوع پروتکل سریال ازجمله پروتکل SPI پشتیانی میکند. ما نیز برای برقراری ارتباط با این آی سی از پروتکل SPI استفاده کردهایم.
همانگونه که در تصویر بالا مشاهده میکنید، برای ارسال داده به آی سی Max7219، دادهها باید بهصورت MSB First و در قالب 16 بیتی (دو بایتی) ارسال شوند. 8 بیت کمارزش، دادههای سطر را در بر میگیرد که درون حافظه آی سی ذخیره میشود و 4 بیت کمارزش از 8 بیت پرارزش نیز آدرس ستونی که دادهها مربوط به آن است را در خود ذخیره میکند. به همین سادگی میتوان دادههای دات ماتریس را تغییر داد.
راهاندازی ماژول با استفاده از آردوینو
دقت کنید که همانند تصویر فوق، تغذیه ماژول را به 5 ولت وصل کنید.
#include "Arduino.h" #include "LedControl.h" LedControl led=LedControl(12,11,10); // Pins: DIN,CLK,CS, # of Display connected #define delayTime 200 byte invader1[] = { // First frame of invader #1 0x18,0x3C,0x7E,0xDB,0xFF,0x24,0x5A,0xA5, // Second frame of invader #1 0x18,0x3C,0x7E,0xDB,0xFF,0x24,0x5A,0x42, }; byte invader2[] = { // First frame of invader #2 0x24,0x24,0x7e,0xdb,0xff,0xff,0xa5,0x24, // Second frame of invader #2 0x24,0xa5,0xff,0xdb,0xff,0x7e,0x24,0x42, }; //The setup function is called once at startup of the sketch void setup() { led.shutdown(0,false); // Wake up displays led.setIntensity(0,5); // Set intensity levels led.clearDisplay(0); // Clear Displays } // Take values in Arrays and Display them void sinvader1(uint8_t FrameNumber) { for (int i = 0; i < 8; i++) { led.setRow(0,i,invader1[(FrameNumber*8) + i]); } } void sinvader2(uint8_t FrameNumber) { for (int i = 0; i < 8; i++) { led.setRow(0,i,invader2[(FrameNumber*8) + i]); } } void loop() { /*Show sinvader1 Animation */ for(int i=0;i<20;i++) { sinvader1(i%2); delay(delayTime); } /*Show sinvader2 Animation */ for(int i=0;i<20;i++) { sinvader2(i%2); delay(delayTime); } }
برنامه به کمک ویرایشگر سیسوگ نوشته شده است و هیچ تداخلی با ویرایشگر پیشفرض آردوینو ندارد. میتوانید با کپی کردن کد در ویرایشگر آردوینو نیز از آن استفاده کنید.
LedControl led=LedControl(12,11,10); // Pins: DIN,CLK,CS, # of Display connected
منبع: سیسوگ