روشن‌کردن چند LED به‌صورت پشت‌سرهم + کنترل ماتریس LED با استفاده از مالتی‌پلکسینگ

قسمت 43
آردوینو قسمت 43 روشن کردن چند LED به صورت پشت سرهم و کنترل ماتریس
مشاهده سایر جلسات آموزش
21 بازدید
۱۴۰۴-۰۹-۲۳
8 دقیقه
  • نویسنده: Arduino captain
  • درباره نویسنده: من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!

در قسمت 42 از آموزش آردوینو به بررسی کنترل تعداد زیادی LED رنگی، ترتیب‌دهی چند LED (ایجاد یک نمودار میله‌ای) پرداختیم. در این قسمت قصد داریم درباره روشن کردن چند LED به صورت پشت‌سرهم، کنترل ماتریس LED با استفاده از مالتی‌پلکسینگ و نمایش تصاویر روی ماتریس LED صحبت کنیم.

روشن‌کردن چند LED به‌صورت پشت‌سرهم

فرض کنید می‌خواهید LEDها را به‌صورت یک توالی «چراغ‌های دنباله‌دار» روشن کنید. از این افکت در جلوه‌های ویژهٔ سریال‌های Knight Rider و Battlestar Galactica استفاده شده است؛ هر دو توسط گلن ای. لارسون ساخته شده‌اند. به همین دلیل، این افکت را «اسکنر لارسون» نیز می‌نامند.

برای این کار شما می‌توانید از همان اتصالی استفاده کنید که در شکل 1 نشان داده شده است.

در این کد، پایه‌ها (پین‌ها) در یک ترتیب ثابت روشن و خاموش می‌شوند و وابسته به مقدار سنسور نیستند. دو حلقه‌ی for در برنامه وجود دارد:

  • حلقه‌ی اول الگوی حرکت از چپ به راست را ایجاد می‌کند؛ به این صورت که LEDها را از چپ به راست روشن می‌کند. این حلقه با اولین LED (چپ‌ترین LED) شروع می‌شود و یکی‌یکی به LEDهای مجاور می‌رود تا به آخرین LED در سمت راست برسد و آن را روشن کند.
  • حلقه‌ی دوم LEDها را از راست به چپ روشن می‌کند؛ یعنی از راست‌ترین LED شروع می‌کند و با کم‌کردن یک واحد از شماره‌ LED، یکی‌یکی LEDهای سمت چپ را روشن می‌کند تا دوباره به اولین LED (در سمت چپ) برسد.

مدتِ تأخیر بین روشن‌شدن هر LED با متغیر wait تنظیم می‌شود و می‌توان آن را طوری انتخاب کرد که جلوه‌ی بصری بهتری ایجاد کند.

کنترل ماتریس LED با استفاده از مالتی‌پلکسینگ

فرض کنید یک ماتریس LED دارید و می‌خواهید تعداد پین‌های موردنیاز آردوینو برای روشن و خاموش‌کردن LEDها را به حداقل برسانید.

این اسکچ از یک ماتریس ۶۴تایی LED استفاده می‌کند که آند‌ها در ردیف‌ها و کاتدها در ستون‌ها قرار گرفته‌اند، مانند مدل Jameco 2132349 (شکل 1 نحوه‌ی اتصال‌ها را نشان می‌دهد.)

نمایشگرهای ماتریس LED دو‌رنگه معمولاً راحت‌تر پیدا می‌شوند، و اگر فقط به یک رنگ نیاز دارید، می‌توانید فقط همان رنگ را راه‌اندازی کنید.

✅نکته

این یک راه‌حل نسبتاً پرمصرف است و تنها برای Arduino Uno و دیگر بردهایی که بر اساس ATmega328 ساخته شده‌اند مناسب است. بردهای Uno WiFi Rev2 و Nano Every، همچنین بیشتر بردهای ۳۲ بیتی، قادر به تأمین جریان کافی برای روشن‌کردن همه این LEDها به طور ایمن نیستند.

شاید برای شما مفید باشد:
بررسی بهترین زبان، کامپایلر و محیط‌های برنامه نویسی مختلف برای میکروکنترلر AVR

شکل 1: یک ماتریس LED متصل به ۱۶ پین دیجیتال

شکل 1: یک ماتریس LED متصل به ۱۶ پین دیجیتال

✅نکته

اتصال نشان‌داده‌شده بر اساس شماره قطعه Jameco 2132349 است که نمایانگر یک فرم فاکتور رایج برای این نوع آرایه است. اما نمایشگرهای ماتریس LED پین‌بندی استانداردی ندارند، بنابراین باید برگه مشخصات (Datasheet) نمایشگر خود را بررسی کنید.

ردیف‌های آند و ستون‌های کاتد را همان‌طور که اشاره شد، وصل کنید، اما از شماره پین‌های LED در Datasheet خود استفاده کنید.

شکل 1 نحوه‌ی قرارگیری پین‌ها را نشان می‌دهد و ارتباط آن‌ها با ستون‌ها و ردیف‌ها را توضیح می‌دهد. شماره‌های پین‌ها در نمودار با چیدمان فیزیکی واقعی آن‌ها مطابقت دارند.

به‌طورکلی، شماره‌گذاری پین‌ها الگوی U شکل دارد که از بالا سمت چپ شروع می‌شود:

  • پین‌های ۱ تا ۸ از بالای ستون سمت چپ تا پایین آن شمارش می‌شوند.
  • پین‌های ۹ تا ۱۶ از پایین ستون سمت راست تا بالا شمارش می‌شوند.

نکته مهم، جهت‌دهی صحیح قطعه است به‌طوری‌که پین ۱ در بالای سمت چپ قرار گیرد. برای پیداکردن پین ۱، به دنبال یک فرورفتگی کوچک (معمولاً به شکل یک نقطه کوچک) روی بدنه قطعه باشید که نشان می‌دهد پین ۱ کجاست.

اگر شک داشتید، همیشه Datasheet قطعه را بررسی کنید.

مقدار مقاومت باید به‌گونه‌ای انتخاب شود که جریان حداکثر از هر پین از ۴۰ میلی‌آمپر روی Arduino Uno (و دیگر بردهای مبتنی بر ATmega328) تجاوز نکند. این راه‌حل برای بردهای ۳.۳ ولتی یا هر بردی که نمی‌تواند ۴۰ میلی‌آمپر در هر پین تحمل کند، مناسب نیست.

چون جریان برای حداکثر هشت LED می‌تواند از هر پین ستون عبور کند، حداکثر جریان برای هر LED باید یک‌هشتم ۴۰ میلی‌آمپر باشد، یعنی ۵ میلی‌آمپر. هر LED در یک ماتریس کوچک قرمز معمولی، ولتاژ مستقیم حدود ۱.۸ ولت دارد.

با محاسبه مقاومت موردنیاز برای جریان ۵ میلی‌آمپر و ولتاژ مستقیم ۱.۸ ولت، مقدار مقاومت برابر ۶۸۰ اهم می‌شود. ولتاژ مستقیم ماتریسی که می‌خواهید استفاده کنید را حتماً در Datasheet بررسی کنید.

هر ستون ماتریس از طریق مقاومت سری به یک پین دیجیتال متصل می‌شود. وقتی پین ستون پایین (LOW) و پین ردیف بالا (HIGH) باشد، LED مربوطه روشن می‌شود. برای همه LEDهایی که پین ستون HIGH یا پین ردیف LOW باشد، جریانی از LED عبور نمی‌کند و روشن نمی‌شود.

حلقه for از طریق هر ردیف و ستون عبور می‌کند و LEDها را به ترتیب روشن می‌کند تا زمانی که تمام LEDها روشن شوند. حلقه با ستون و ردیف اول شروع می‌کند و شمارنده ردیف را افزایش می‌دهد تا تمام LEDهای آن ردیف روشن شوند؛ سپس به ستون بعدی می‌رود و به همین ترتیب، با هر بار اجرای حلقه، یک LED دیگر روشن می‌شود تا تمام LEDها روشن شوند.

شما می‌توانید تعداد LEDهای روشن را متناسب با مقدار یک سنسور کنترل کنید.

سه خط زیر را از ابتدای حلقه کامنت کنید یا حذف کنید:

آن‌ها را با خطوط زیر جایگزین کنید تا مقدار سنسوری که به پین ۰ وصل است خوانده شود و این مقدار به تعداد LEDها از ۰ تا ۶۳ تبدیل شود:

می‌توانید این را با یک مقاومت متغیر (پتانسیومتر) که به پین آنالوگ ۰ متصل شده، آزمایش کنید. تعداد LEDهای روشن متناسب با مقدار سنسور خواهد بود.

لازم نیست که یک ردیف کامل را هم‌زمان روشن کنید. اسکچ زیر هر بار یک LED را روشن می‌کند و به ترتیب از طریق توالی حرکت می‌کند:

شاید برای شما مفید باشد:
قسمت اول دوره مفاهیم شبکه و اینترنت در راه‌اندازی ماژول ESP8266

نمایش تصاویر روی ماتریس LED

فرض کنید می‌خواهید یک یا چند تصویر را روی یک ماتریس LED نمایش دهید؛ شاید با تعویض سریع چند تصویر، یک افکت انیمیشنی ایجاد کنید.

این اسکچ (برنامه) افکتی مانند تپش قلب ایجاد می‌کند؛ با روشن‌شدن لحظه‌ای LEDها که به شکل یک قلب چیده شده‌اند. برای هر ضربان قلب، ابتدا یک قلب کوچک و سپس یک قلب بزرگ‌تر چشمک می‌زنند (تصاویر شبیه شکل 2 هستند).

شکل 2: دو تصویر قلبی که در هر ضربان نمایش داده می‌شوند…

شکل 2: دو تصویر قلبی که در هر ضربان نمایش داده می‌شوند…

در اینجا، ستون‌ها و ردیف‌ها مانند بخش ۷.۸ به‌صورت مالتی‌پلکس (به‌نوبت سوئیچ) می‌شوند، اما مقدار اعمال‌شده به هر LED بر اساس تصاویری است که در آرایه‌های bigHeart و smallHeart ذخیره شده‌اند. هر عنصر در آرایه نمایانگر یک پیکسل (یک LED منفرد) است و هر ردیف آرایه نمایانگر یک ردیف در ماتریس است. یک ردیف شامل هشت بیت است که با فرمت باینری نمایش داده می‌شود (که با حرف بزرگ B در ابتدای هر ردیف مشخص شده است). بیت با مقدار 1 نشان می‌دهد که LED مربوطه باید روشن باشد و 0 یعنی خاموش. افکت انیمیشن با سوئیچ سریع بین این آرایه‌ها ایجاد می‌شود.

تابع loop بین هر ضربان مدت کوتاهی (800 میلی‌ثانیه) صبر می‌کند و سپس تابع show را فراخوانی می‌کند؛ ابتدا با آرایه smallHeart و سپس با آرایه bigHeart.

شاید برای شما مفید باشد:
آموزش کامل واچ داگ تایمر (WDT) در میکروکنترلر WCH - قسمت یازدهم آموزش CH32

تابع show هر عنصر در تمام ردیف‌ها و ستون‌ها را بررسی می‌کند و اگر بیت مربوطه 1 باشد، LED را روشن می‌کند. برای تعیین مقدار هر بیت از تابع bitRead استفاده می‌شود.

یک تأخیر کوتاه ۳۰۰ میکروثانیه‌ای بین هر پیکسل، به چشم اجازه می‌دهد LED را به طور واضح ببیند. این زمان‌بندی به‌گونه‌ای انتخاب شده است که هر تصویر سریعاً تکرار شود (۵۰ بار در ثانیه) تا چشم، چشمک‌زدن LED را تشخیص ندهد.

در اینجا یک نسخهٔ تغییریافته وجود دارد که سرعت تپش قلب را بر اساس مقدار دریافتی از یک سنسور تغییر می‌دهد. می‌توانید این را با یک مقاومت متغیر متصل به پایه‌ی آنالوگ ۰ تست کنید. از سیم‌کشی و کد نشان‌داده‌شده قبلی استفاده کنید، با این تفاوت که تابع loop را با این کد جایگزین کنید:

این نسخه زمان تأخیر بین ضربان‌ها را با استفاده از تابع map محاسبه می‌کند تا مقدار دریافتی از سنسور را به ضربان در دقیقه تبدیل کند. این محاسبه زمان لازم برای نمایش قلب را در نظر نمی‌گیرد، اما اگر بخواهید زمان‌بندی دقیق‌تری داشته باشید، می‌توانید ۲۴۰ میلی‌ثانیه (۸۰ میلی‌ثانیه به اضافه ۱۶۰ میلی‌ثانیه برای دو تصویر) را از آن کم کنید.

اطلاعات
21
0
0
اشتراک و حمایت
profile نویسنده: Arduino captain متخصص الکترونیک

من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!


ویراستار: محمد کبیر
مقالات بیشتر

slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله

خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله