بخشی از مقاله
آموزش گام به گام ساخت تابلو روان
در این مجموعه مقالات تصمیم به آموزش اصول و ساخت تابلوهای روان (دیجیتال) را دارم. شما گام به گام با اصول کار تابلوهای دیجیتالی آشنا شده و در پایان یک نمونه عملی آن را بررسی و خواهید ساخت.
لازم به ذکر است که مطالب موجود حاصل تجربیات این جانب در این زمینه بوده. و تمامی مطالب و حتی تصاویر و نقشهها مربوط به تجارب خودم است. دوست عزیز هر گونه کپی برداری از مطالب در صورت ذکر منبع بلامانع است.
مطالبی که طی این دوره خواهید آموخت عبارتند از :
- سیستم تابلوهای نمایشگر دیجیتالی
- اجزاء تصویر
- جاروب ساده
- اثر فلیکر
- جاروب یک در میان
- جدول گلایف
- بررسی یک مدار عملی
- نرم افزارهای تبدیل متن و طراحی فونت جهت تابلو روان
بلوک دیاگرام یک تابلو دیجیتال
همانطور که در تصویر مشاهده میکنید، این تابلوها از بلوکهای :
- ماتریس LED
- درایورهای سطر و ستون
- پردازنده
- تجهیزات ورود اطلاعات
- حافظه
تشکیل شدهاند.
در واقع یک تابلوی نمایشگر دیجیتالی، متن مورد نظر خود را از طریق تجهیزات ورودی همچون کیبورد و یا پورت سریال دریافت میکند. و این اطلاعات را در اختیار پردازنده قرار میدهد. سپس پردازنده پس از آنالیز اطلاعات آن را در حافظه تابلو ذخیره نموده. علاوه بر آن حافظه موجود در تابلو میتواند کدهای برنامه را در خود نگهداری نماید. از طرفی پردازنده با توجه به اطلاعات ذخیره شده، سیگنالهای لازم را جهت نمایش تولید کرده و در اختیار درایورها قرار میدهد. با توجه به اینکه نحوه چیدمان LED ها در نمایشگر بنا به دلایلی که بعدا توضیح داده خواهد شد به صورت ماتریسی می باشد، لذا دو دسته درایور برای راه اندازی ماتریس نیاز است که شامل داریورهای سطر و داریورهای ستون مییاشند. این درایورها با توجه به فرامین دریافتی از سوی پردازنده، با روشن و خاموش نگاه داشتن LED های موجود در ماتریس، باعث به نمایش در آمدن مطالب (اعم از متن و یا تصویر) بر روی ماتریس خواهند شد.
اجزای تصویر
به این تصویر نگاه کنید، تصویر صورتک خندان !
در نگاه اول تصویر فوق به صورت یک تصویر کامل و یکپارچه به نظر میرسد. اما اگر کمی با دقت بیشتر به آن دقت کنید و تا حد امکان آنرا بزرگ نمایید متوجه خواهید شد که در واقع آن تصویر از نقاط ( pixel ) متعددی تشکیل شده. پس تصویر فوق را میتوان مجموعه نقاطی دانست که دارای رنگهای متفاوتیاند. هر یک از این نقاط را یک جزء تصویر (Picture Element) و این خاصیت را خاصیت موزائیکی تصویر مینامند. من جهت کمک به درک مطلب تصویر فوق را با بزرگ نمایی بیشتر در زیر قرار دادهام. به آن دقت کنید.
هرچه تعداد اجزاء تصویر در واحد سطح بیشتر باشد، وضوح تصویر بیشتر میباشد. به عبارت دیگر تصویر به واقعیت نزدیکتر بوده، جزئیات آن بهتر دیده میشود. در تابلوهای دیجیتالی نیز خاصیت موزائیکی وجود دارد. تصویر تابلو توسط ماتریسی از LED ها ایجاد میگردد. در اینجا ابعاد یک جزء تصویر به اندازه قطر یک LED است. که از یک فاصله معین چشم بیننده قادر به تمایز نقاط تصویر ایجاد شده نبوده و یک تصویر را یکپارچه احساس میکند.
جاروب ساده
جهت تشکیل تصویر بر روی پانل تابلو، نیاز به روشن و خاموش نگه داشتن LED های موجود بر روی تابلو متناسب با تصویر مورد نظر است. بنابراین نیاز به کنترل تک تک LED
های موجود در تابلو میباشد. از طرفی هر LED دارای دو پایه است ( با فرض تک رنگ بودن ) و در صورتی که ما یک پانل LED با ماتریس 10x10 داشته باشیم، دویست پایه و یا دویست سیم جهت کنترل داریم. مسلما استفاده از این تعداد سیم مقرون به صرفه نخواهد و باعث پیچیدگی مدار خواهد شد. جهت بر طرف کردن مشکل فوق میتوان پایه های یکسان در LED ها را به صورت سطری و ستونی به یکدیگر متصل نمود. به تصویر زیر دقت کنید :
همانطور که در تصویر مشاهده نمودید، در این آرایش آند تمامی LED های موجود در یک سطر یکسان به هم متصل شدند، همچنین کاتد LED های موجود در یک ستون نیز به هم اتصال داده شدهاند.
حال ببینیم نحوه عملکرد این روش چگونه است. شما در این حالت جهت روشن کردن هر LED کافیست که سطری که آن LED در آنجا قرار دارد را به سطح ولتاز مثبت اتصال داده و سپس ستون مربوط به همان LED را به زمین مدار وصل کنید.
با این روش ما توانستیم از تعداد سیمهای مورد نیاز جهت کنترل LED ها بکاهیم ولی در مقابل امکان کنترل همزمان تمامی سطرها را از دست دادیم و در هر لحظه فقط و فقط میتوان LED های موجود در یک سطر و یا یک ستون را کنترل نمود.
نگران نباشید، در ادامه همین بحث خواهید دید که جهت نمایش نیازی هم به تمامی LED ها نبوده و میتوان توسط جاروب نمودن سطرها و یا ستونها نیز به نمایش تصویر در تابلو روان پرداخت.
به هر حال در صورت عدم استفاده از روش فوق شما مدار پیچیدهای خواهید داشت، مثلا برای کنترل LED ها موجود در تصویر روبرو شما حداقل باید از طریق 41 سیم ماتریس را کنترل میکردید. در حالی که با استفاده از روش ماتریسی شما فقط به 13 سیم نیاز دارید. فقط در این حالت برنامه شما کمی پیچیده خواهد شد. که البته به نظر من شما یک بار برنامه مینویسید از آن تا ابد استفاده میکنید ولی سخت افزار را باید تا ابد مونتاژ کنید و هزینه آن را پرداخت کنید.
جاروب ساده
روش جاروب ساده به دو صورت بکار برده میشود :
- جاروب سطرها
- جاروب ستونها
در جاروب سطرها شما LED های موجود در سطر اول را روشن میکنید، سپس LED های سطر دوم و . . . تا به سطر آخر برسیم. دوباره همین کار را دوباره انجام میدهیم.
در جاروب ستونها شما LED های موجود در ستون اول را روشن میکنید، سپس LED های ستون دوم و . . . تا به ستون آخر برسیم. دوباره همین کار را دوباره انجام میدهیم.
به یکبار جاروب کامل (خواه سطرها و خواه ستونها) تازه سازی (Refresh) میگویند.
جهت کمک به درک مطلب، به انیمیشنی از جاروب سطری که در زیر آورده شده نگاه کنید.
انیمیشن فوق جهت ساخت تصویر زیر است.
توجه داشته باشین که جاروب کردن علاوه بر کاهش سیم بندی و کم شدن پیچیدگی آن میشود، باعث خواهد شد که شما در هر لحظه تعداد کمتری از LED های تابلو را روشن کنید و در نتیجه میزان مصرف جریان الکتریکی تابلو به میزان قابل توجهای کاهش پیدا خواهد نمود
اثر فلیکر
اثر نور در چشم انسان برای مدت کوتاهی باقی میماند. این خاصیت را اثر پس ماند نور (Flicker) مینامند. برمبنای همین خاصیت است که در سینما و تلویزیون احساس پیوستگی تصویر بوجود میآید.
چنانچه تصاویری که از یک حرکت مثلا راه رفتن انسان عکس برداری شود و سپس با سرعت 16 بار در ثانیه به نمایش درآید، چشم انسان منقطع بودن تصاویر را احساس نکرده و تصاویر را بطور پیوسته حس میکند. بر مبنای این خاصیت بود که صنعت سینما بوجود آمد.
ترتیب کار به این صورت است که توسط یک دوربین فیلمبرداری مخصوص که قادر است در هر ثانیه 16 تصویر از یک صحنه عکس برداری نماید، تصاویر تهیه شده سپس با همان سرعت به نمایش در میآیند. البته به علت اینکه با 16 تصویر در ثانیه حرکات نرم و طبیعی نداریم، فرکانس مزبور بعدا به 24 تصویر در ثانیه افزایش داده شد. در این فرکانس برای بیش از 90 درصد حرکات، پیوستگی طبیعی بوجود میآید. به همین علت به فرکانس مزبور حد پیوستگی گفته میشود. مشکل دیگر مسئله چشمک زدن تصویر است.
در فرکانس 24 تصویر در ثانیه اگر چه مسئله پیوستگی تصاویر حل میشود اما تصاویر چشمک میزنند و این بخاطر این است که چشم اگرچه در این فرکانس، تصاویر را پیوسته میبیند و حرکات را طبیعی احساس میکند اما خاموش شدن صحنه در حین تعویض یک تصویر به تصویر بعدی بوجود میآید را بصورت چشمک زدن تصویر احساس میکند. این پدیده بخصوص برای تصاویری با نور بیشتر محسوستر است.
برای رفع این مشکل باید حداقل 48 تصویر در ثانیه به نمایش درآید تا اثر چشمک زدن از بین رود. در سینما چون نمایش 48 تصویر در ثانیه، اشکالات عملی بوجود میآورد، مسئله را به طریق دیگری حل نمودهاند. به این ترتیب که سرعت حرکت نوار فیلم از مقابل لامپ پروژکتور همان 24 تصویر در ثانیه است منتهی به کمک یک دیافراگم گردان به هنگام تعویض یک فریم به فریم بعدی و همچنین در زمان نمایش فریم و درست در وسط زمان مزبور نور لامپ پروژکتور به فیلم قطع میشود. با اینکار هر فریم دو بار روشن و خاموش میشود.
با این تدبیر که هر تصویر دو بار روشن میشود و سرعت حرکت نوار 24 تصویر در هر ثانیه است، از نظر چشم 48 تصویر در ثانیه احساس میشود و مشکل چشمک زدن از بین میرود. در تابلوهای روان هم مسائل پیوستگی تصاویر و همچنین چشمک زدن، عوامل تعیین کننده سیستم جاروب و زمانهای مربوطه هستند.
جاروب یک در میان
همانطور که گفته شد، جهت نمایش مناسب تصاویر متحرک باید حداقل 24 تصویر در ثانیه نمایش داده شود. حال فرض کنید شما یک تابلو با 32 سطر میخواهید طراحی کنید و از جاروب سطری هم استفاده میکنید در این حالت زمان نمایش هر فریم تصویر برابر با 41.6 میلی ثانیه خواهد بود و در هر فریم 32 سطر جهت جاروب داریم پس زمان روشن بودن هر سطر برابر با 1.3 میلی ثانیه خواهد بود.
خوب شما مدار را طراحی و میسازید اما در پایان متوجه میشوید که نور LED ها بسیار کم تر از حالت معمولی است و حسابی متعجب خواهید شد که چرا با وجود استفاده از LED های مرغوب نور تابلو روان تا این حد کم است؟!
نکته اینجاست که شما هر LED را فقط به مدت 1.3 میلی ثانیه روشن نگاه میدارید و سپس به مدت 31 برابر این مدت خاموش نگاه میدارید( به خاطر جاروب 31 سطر بعدی ) یعنی 1.3 میلی ثانیه روشن و 40.3 میلی ثانیه خاموش است. ودر واقع اثر نور LED در چشم به میزان قابل توجهای کاهش مییابد.
جهت کم کردن این اثر و افزایش نور تابلو روان چند کار را میتوان انجام داد :
1- افزایش ولتاژ اعمالی به LED ها که معمولا این کار خطر سوختن LED ها در اثر هنگ کردن تابلو افزایش داده و همچنین از عمر مفید آن نیز خواهد کاست.
2- تقسیم تابلو به سگمنت های جداگانه مثلا برای مثال فوق تقسیم تابلو به 4 سگمنت 8 سطری. این روش مناسبی است ولی به پیچدگی نرمافزار و سختافزار خواهد افزود و در تابلو های کوچک توصیه نمیشود.
3- جاروب یک در میان، این روش راه حل مناسبی در بر طرف نمودن مشکل فوق است. در عین حال که به پیچیدگی مدار منجر نخواهد شد و همچنین با تغییر سادهای در الگوریتم برنامه میتوان از آن بهره برد.
ترتیب کار به این صورت است که ما هر فریم کامل را که در مثال فوق برابر با 32 سطر است به دو نیم فریم تقسیم میکنیم. فریم اول شامل سطرهای فرد (1،3،5،7،9،11،13،15،17،19،21،23،25،27،29،31) و فریم دوم شامل سطرهای زوج (2،4،6،8،10،12،14،16،18،20،22،24،26،28،30،32) است. حال در هر
جاروب فقط یکی از دو نیم فریم زوج ویا فرد را جاروب میکنیم. بدین ترتیب که یکبار نیم فریم فرد و بار بعد نیم فریم زوج و دوباره نیم فریم فرد و ... در این حالت چون در هر بار فقط 16 سطر جاروب میشوند لذا زمان روشن بودن هر LED بیشتر خواهد شد. البته حتما شما خواننده تیز بین این مقاله متوجه شدید که در این حالت در ثانیه فقط ما 12 تصویر (فریم کامل) نمایش دادهایم پس احتمالا بخاطر این کاهش مجددا مشکل لرزش تصویر را داشته باشیم!
البته شما کاملا حق دارید ولی نکته ظریفی هم این بین وجود دارد و آن هم این است که تعداد نیم فریم های نمایش داده شده در یک ثانیه همان 24 عدد است. در نتیجه لرزش تصویر منتفی خواهد بود.
جهت کمک به درک بهتر این مطلب نحوه جاروب در یک تابلو روان 8 سری بصورت انیمیشن در زیر نمایش داده شده است.
انیمیشن فوق با سرعت بالاتر :
متن مورد نمایش :
بررسی اولین مدار عملی تابلو روان - برنامه نویسی
حال نوبت به توضیح برنامه هست. من برنامه این میکرو را به زبان بیسیک نوشتم و از نرم افزار BASCOM-AVR استفاده کردم.
$regfile = "m8def.dat"
$crystal = 8000000
همانطور که میدانید، دستوراتی که با علامت "$" در BASCOM آغاز میشوند، جزو دستورات کمپایلر به حساب میآیند. و در زمان کمپایل کدی را تولید نمیکنند. دو دستور فوق نیز همینگونه هستند. در دستور اول نوع میکرو برای کمپایلر تعریف میشود که در اینجا ATmega8 میباشد و در دستور بعدی فرکانس کریستال بر حسب هرتز مشخص میشود.در این برنامه مقدار فرکانس تعریفی هشت مگاهرتز است. توجه داشته باشید که من در مدار تابلو روان خود، از کریستال خارجی استفاده نکردم. لذا این دستور تعیین کننده فرکانس اسیلاتور داخلی میکروکنترلر میباشد.
Config Portb = Output
Config Portd = Output
در دو دستور فوق پورت های B,D بعنوان خروجی پیکربندی گشتهاند. من در این مدار تابلو روان از پورت B برای راه اندازی و کنترل سطرها و از پورت D جهت راهاندازی ستونها استفاده کردهام.
Dim Row As Byte
Dim Scan As Byte
در این دو دستور من دو متغییر از نوع بایت تعریف کردم. متغییر Row جهت شمارش سطرها و متغییر Scan جهت تهیه سیگنال جاروب در سطرها استفاده میشود.
بعد از موارد فوق در برنامه، به حلقه اصلی برنامه میرسیم. جهت ساخت این حلقه از دستور Do-Loop استفاده شده و بدلیل عدم ذکر هیچگونه شرطی در این دستور، دستورات موجود در بدنه این حلقه به تعداد بینهایت بار اجرا میگردند.
Scan = &B11111110
در ابتدای حلقه Do-Loop متغییر Scan، مقدار دهی اولیه میشود تا سیگنال مورد نیاز جهت فعال نمودن سطر نخست تولید گردد. با توجه به ساختار ماتریس LED مورد استفاده در این تابلو روان ( اتصال کاتد LED های موجود در یک سطر به یکدیگر ) جهت فعال سازی یک سطر باید پین مربوط به آن سطر در میکرو صفر شود و سایر پین های مربوط به دیگر سطرها، یک شوند. همانطور نیز که مشاهده کردید در دستور فوق نیز بیت نخست متغییر Scan نیز صفر شده که مربوط به سطر اول ماتریس است و سایر بیتها نیز یک شدهاند. در نتیجه فقط سطر اول فعال خواهد شد و سایر سطرها غیر فعال هستند.
در ادامه برنامه به حلقه For-Next میرسیم. متغییر Row در این حلقه با صفر مقدار دهی اولیه میشود و اجرای دستورات حلقه تا رسیدن این متغییر به عدد 6 تعریف شده. لذا تعداد دفعات اجرای دستورات درون حلقه 7 بار خواهد بود. درواقع ما در درون این حلقه یک بار کامل کل سطرهای ماتریس را که هفت عدد میباشد جاروب میکنیم.
For Row = 0 To 6
Portb = Scan
Rotate Scan , Left
Portd = Lookup(row , Gelayof)
Waitus 20
Portd = 0
Next Row
در اولین دستور در حلقه For-Next مقدار متغییر Scan در پورت B میکروکنترلر قرار میگیرد. تا سطر مورد نظر در ماتریس فعال شود. در دستور بعدی متغییر Scan به اندازه یک بیت به سمت چپ شیفت چرخشی داده میشود. با این شیفت صفر موجود در این متغییر به سمت چپ منتقل شده و جای آنرا یک بیت یک پر میکند. بعنوان مثال در نخستین بار اجرای این دستور متغییر Scan از مقدار 11111110 به مقدار 11111101 تغییر میکند و در شیفت بعدی به 11111011 تا اینکه بعد از هفتمین شیفت بصورت 10111111 در میآید. که در هفتمین مرحله در واقع بیت هفتم، صفر شده است که باعث فعال گشتن سطر هفتم ماتریس خواهد شد.
در این برنامه من قصد نمایش حرف A را داشتم، لذا جدولی با نام Gelayof در برنامه تعریف کردم .همانطور نیز که در زیر مشاهده میکنید، جهت ذخیره اطلاعات مربوط به حرف A من از هفت بایت استفاده نمودم و اطلاعات مربوط به هر سطر را در یک بایت قرار دادهام. از طرفی چون در این مدار پهنای ماتریس LED، پنج است فقط از پنج بیت اول هر بایت استفاده شده و سه بیت با ارزش آن صفر شدهاند. شما بنابر نیاز خود میتوانید با تغییر دادن وضعیت بیتها به نمایش هر شکل و یا کاراکتری بپردازید.
Gelayof:
Data &B00000100
Data &B00001010
Data &B00010001
Data &B00010001
Data &B00011111
Data &B00010001
Data &B00010001
حال اطلاعات این جدول مرحله به مرحله و سطر به سطر خوانده شده و در پورت D قرار میگیرد.این عمل توسط دستور Lookup در برنامه صورت میگیرد. در این دستور بایت مورد نظر ( اطلاعات سطر مورد نظر ) توسط متغییر Row تعیین میشود. بعد از قرار دادن اطلاعات مربوط هر سطر در پورت D به اندازه 20 میکرو ثانیه این اطلاعات در پورت نگاه داشته میشود تا LED های موجود در آن سطر روشن بمانند و اثر آن در چشم بیننده باقی بماند. سپس پورت D صفر میشود و اعمال فوق مجددا جهت سطر بعدی تکرار میگردد.
بعد از هر بار جاروب کامل تمامی سطرها، کنترل برنامه از حلقه For-Next خارج شده و مجددا متغییر Scan مقدار دهی اولیه شده تا برای جاروب مجدد آماده گردد. بله به همین سادگی شما یک نمونه ساده از تابلو روان را ساختید!