این مطلب بخش نهم از آموزش جامع آردوینو (مبتدی و پیشرفته) است. در این آموزش قصد داریم شما را با انواع LED و نحوه کار با آن آشنا کنیم. LED ها انواع مختلفی دارند و همچنین روشهای متفاوتی برای کار با آنها وجود دارد. شما میتوانید با چند LED وضعیت دما و رطوبت هوا را نشان دهید یا اینکه در صورتی که یک شیء توسط سنسور آلتراسونیک در فاصله نزدیک تشخیص داده شد، یک LED روشن شود. با تعداد بیشتر LED حتی میتوانید یک صفحه نمایشگر مانند نمایشگرهای تبلیغاتی درست کنید. برای این کار نیاز به قطعهای به نام شیفت رجیستر خواهید داشت که در این آموزش به آن نیز میپردازیم. LEDهای رنگی یا RGB از دیگر مواردی است که در این آموزش روش کار با آن را خواهید آموخت.
در پایان این آموزش خواهید توانست LED ها را به روشهای مختلف به کار ببرید. در کنار این موارد، چند موضوع جذاب دیگر که به کار با LED کمک میکند نیز مطرح خواهد شد. پس با ما همراه باشید.
قطعات مورد نیاز:
معرفی LED
LED نوع خاصی از دیود است که در اثر عبور جریان، از خود نور ساطع میکند. مانند سایر انواع دیود، LED نیز جریان الکتریکی را تنها در یک جهت عبور میدهد. بنابراین اگر آنرا در جهت مخالف به مدار وصل کنید روشن نخواهد شد. LED ها در رنگهای مختلف در بازار موجود هستند و قیمت بسیار ناچیزی هم دارند. برخی از LED ها به صورت نواری به هم متصل شدهاند و برای کارهای تزئینی بسیار مناسب هستند.
به طور کلی دو نوع LED وجود دارد: DIP و SMD. نمونه DIP که نوع معمولی آن است دارای دو یا چند پایه بلند و یک سر شیشهای است. در مقابل، انواع SMD پایه بلندی ندارند. چند مورد از نوع SMD را میتوانید بر روی برد آردوینو (LED نمایشگر روشن و خاموش بودن، LED پایه ١٣ و …) مشاهده کنید. LED های نواری از نوع SMD هستند. سادهترین نوع LED ، نوعی است که تکرنگ بوده و دارای 2 پایه است. کار با LED ساده است هرچند که میتوان با آن پروژههای بسیار پیچیدهای انجام داد.
راهاندازی اولیه LED
به LED میتوان مانند یک مقاومت نگاه کرد که با افزایش ولتاژ دو سر آن نور بیشتری تولید میکند. سادهترین روش تولید نور با LED استفاده از داده دیجیتال است. در حالت برقراری ولتاژ (حالت High یا ١) با تمام توان روشن شده و در صورت عدم برقراری ولتاژ (حالت Low یا ٠) خاموش میشود.
در این قسمت میخواهیم با LED پیام SOS را مخابره کنیم. SOS یک پیام تعریف شده بینالمللی است که برای درخواست کمک به کار میرود. پیام SOS به روشهای مختلف از جمله با نور قابل ارسال است. برای انجام این کار باید پایه منفی LED را با یک مقاومت به GND و پایه مثبت (پایه بلند) را به پین ١٢ آردوینو متصل کنید. این مقاومت برای محدود کردن جریان عبوری از LED استفاده شده است. در صورتی که LED را بدون مقاومت به مدار وصل کنید، جریان زیاد میتواند باعث سوختن آن شود. البته با توجه به اینکه پایههای آردوینو جریان کمی تولید میکنند، معمولا این اتفاق نمیافتد. هرچه مقدار این مقاومت بیشتر باشد، شدت نور LED کمتر خواهد شد.
آشنایی با مقاومت الکتریکی
پیش از ادامه خوب است با یکی از اجزای پایه الکترونیک یعنی مقاومت کمی بیشتر آشنا شویم. مقاومت قطعهای است که بر اساس اختلاف ولتاژ دو سر آن، جریان عبوری از خود را محدود میکند. میزان جریان عبوری از یک مقاومت از قانون اهم به دست میآید:
البته این محدود به قطعه مقاومت نیست و هر شیء دیگری نیز یک مقدار مشخص مقاومت الکتریکی دارد. واحد اندازهگیری مقاومت اهم است. اهم واحد کوچکی است و به همین دلیل مقاومتهای تا ظرفیت چند مگااهم هم وجود دارند. مقاومت نیز مانند بسیاری قطعات الکترونیکی دیگر در نوع DIP و SMD وجود دارد. ظرفیت مقاومت SMD را فقط با مولتیمتر میتوان به دست آورد ولی برای مقاومتهای DIP روشی وجود دارد. ظاهر تمام مقاومتهای DIP تقریبا یکسان است و ظرفیت آنها را میتوان از روی خطوط رنگی که بر روی مقاومت وجود دارد فهمید. استانداردهای مختلفی برای رنگهای روی مقاومت وجود دارد. تعداد خطوط موجود بر روی مقاومت بین ٤ تا ٦ نوار متغیر است. در این سیستم هر رنگ نشانگر یک عدد خاص است که در جدول زیر آمده است. برای محاسبه مقدار مقاومت ٤ نواری به این صورت عمل میکنیم: از سمت چپ اولین نوار رقم اول، دومین نوار رقم دوم و سومین نوار تعداد صفرهای جلوی عدد است. رقم چهارم نیز میزان خطا بر حسب درصد است. مقاومت ٥ نواری هم مانند مقاومت ٤ نوار است با این تفاوت که سه نوار اول ارقام و نوار چهارم تعداد صفرها را نشان میدهد. همچنین مقاومت ٦ نواری مانند مقاومت ٥ نواری است با این تفاوت که رقم ششم نشانگر ضریب دمایی مقاومت است.
پیام SOS با استفاده از نور به صورت سه چشمک کوتاه، سه چشمک بلند و سپس سه چشمک کوتاه است. برنامه زیر را بر روی آردوینو آپلود و اجرا کنید. در این برنامه از دستور()sizeofاستفاده شده است. این دستور میزان حجم اشغال شده توسط یک متغیر یا یک نوع متغیر را بر حسب بایت میدهد. برای مثال دستور زیر تعداد بایت اشغال شده توسط متغیر Variable را محاسبه میکند:
sizeof(Variable)
و دستور زیر تعداد بایت اشغال شده توسط نوع متغیر int را میدهد:
sizeof(int)
برنامه SOS برای LED:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
int LED = 12;
const int SOS[] = {100, 100, 100, 300, 300, 300, 100, 100, 100};
const int rest[] = {100, 100, 500, 300, 300, 500, 100, 100, 100};
const int blinks = sizeof(SOS) / sizeof(const int);
void setup()
{
pinMode(LED, OUTPUT);
}
void loop()
{
for (int i = 0; i < blinks; i++)
{
digitalWrite(LED, HIGH);
delay(SOS[i]);
digitalWrite(LED, LOW);
delay(rest[i]);
}
digitalWrite(LED, LOW);
delay(2000);
}
تنظیم شدت نور LED
همان طور که پیشتر هم گفتیم، با تغییر ولتاژ دو سر LED میتوان شدت نور آن را تنظیم کرد. این کار به راحتی با استفاده از خروجی آنالوگ یا همان PWM قابل انجام است. همان گونه که میدانید خروجی PWM برای اکثر آردوینوها به صورت ٨ بیتی یا یک عدد از ٠ تا ٢٥٥ است. بنابراین میتوانید میزان نور LED را به ٢٥٦ حالت تقسیم کنید. این مقدار برای اینکه تغییرات نور آن پیوسته به نظر برسد کاملا کفایت میکند. برای نمونه برنامه زیر مقدار نور LED را از ٠ تا مقدار حداکثر به آرامی افزایش داده و سپس نور را کم کرده تا دوباره به مقدار ٠ برسد.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
int LED = 11;
float sweepTime = 2.0; // in seconds
float stepTime = sweepTime * 1000000 / 512; // in miliseconds
void setup()
{
pinMode(LED, OUTPUT);
}
void loop()
{
for (int i = 0; i < 255; i++)
{
analogWrite(LED, i);
delayMicroseconds(stepTime);
}
for (int i = 255; i > 0; i--)
{
analogWrite(LED, i);
delayMicroseconds(stepTime);
}
digitalWrite(LED, LOW);
delay(2000);
}
کار با آرایههای LED
تا اینجا نحوه کار با یک LED معمولی را آموختید. اما کاربرد اصلی LED وقتی است که تعدادی از آنها را به صورت یک آرایه کنار هم استفاده کنید. مثلا میتوانید با چند LED میزان شارژ باقیمانده پاوربانکتان را نشان دهید یا با تعداد بیشتری از آنها رقص نور ایجاد کنید. چالشی که در این موارد به وجود میآید این است که هر LED به یک پایه ولتاژ نیاز دارد و این در حالی است که تعداد پینهای آردوینو محدود است. اگر از قطعه دیگری در پروژهتان استفاده نکنید احتمالا به مشکلی برنخواهید خورد؛ اما معمولا کلید، موتور، سنسور یا قطعات دیگری دارید که نیاز به اتصال به پینهای آردوینو دارند. در چنین مواردی نیاز به یک قطعه دیگر به نام شیفت رجیستر (Shift Register) داریم.
معرفی شیفت رجیستر
شیفت رجیستر از مجموعهای از مدارات دیجیتال تشکیل شده که این توانایی را دارد که دادههای بیتی درون خود را به سمت چپ یا راست جابجا کند. این موضوع باعث میشود تا بتوان از شیفت رجیستر برای تبدیل داده سری به موازی یا برعکس استفاده کرد. شیفت رجیسترها انواع مختلفی دارند. نوعی که در اینجا مورد استفاده قرار میگیرد، شیفت رجیستر سری به موازی به نام 74HC595 است که یک تراشه بسیار معروف و پرکاربرد است. این تراشه ١٦ پایه دارد و برای تبدیل دادههای سری ٨ بیتی به داده موازی استفاده میشود.
برای استفاده از شیفت رجیستر باید پایههای آن را بشناسید. سه پایه مهم در شیفت رجیستر 74HC595 پایههای ١١، ١٢ و ١٤ هستند. پایه ١١ یا SH_CP یا Shift register clock زمانبندی (کلاک) بیتهای عبوری را کنترل میکند. پایه ١٢ یا ST_CP یا همان Latch pin دادههای موجود در رجیستر را به خروجی انتقال میدهد. پایه ١٤ یا Data pin داده سری ورودی را دریافت میکند. در جدول زیر مشخصات تمام پینهای شیفت رجیستر 74HC595 آمده است. توجه کنید که پایههای رجیسترهای مختلف متفاوت است و در صورتی که از شیفت رجیستر دیگری استفاده میکنید، حتما دفترچه راهنمای آن را مطالعه کنید.
برای اینکه پایههای رجیستر را به درستی پیدا کنید، قسمت U شکل آنرا به سمت بالا بگیرید، سپس شماره پایهها را مطابق شکل فوق پیدا کنید. حالا وقت آن است که مدار شیفت رجیستر را ببندیم. بهتر است که رجیستر را در وسط برد بورد وصل کنید تا بتوانید از دو سمت آن استفاده کنید. هر کدام از پایههای ١ تا ٧ و ١٥ را با یک مقاومت 220kΩ به یک LED از نوع f5 وصل کنید. پایههای ١١، ١٢ و ١٤ را به ترتیب به پین ٥، ٦ و ٧ دیجیتال آردوینو وصل کنید. همچنین پایه ١٠ و ١٦ را به 5V+ و پایه ٨ و ١٣ را به GND وصل کنید.
برنامه زیر با استفاده از ٨ LED و آردوینو رقص نور ایجاد میکند. پس برنامه را روی آردوینو بارگذاری کرده و حرکت LED ها را ببینید!
قبل از اجرای برنامه چند نکته مهم در مورد آن وجود دارد که نیاز به توضیح دارد. اولا دستور(bitSet(LED, iدر متغیر LED، بیت i ام را به مقدار ١ تغییر میدهد. در صورتی که این بیت ١ باشد، تغییری ایجاد نمیشود. دستور(bitClear(LED, iمانند دستور قبل کار میکند با این تفاوت که مقدار بیت را به ٠ تغییر میدهد.
در این برنامه یک تابع به نامdoShiftRegisterتعریف شده است که یک عدد ٨ بیتی را به عنوان ورودی گرفته و آنرا به شیفت رجیستر میفرستد. برای ارسال دادهها به شیفت رجیستر در آردوینو از دستورshiftOutاستفاده میشود. این تابع چهار ورودی دارد که ورودی اول شماره پین داده سریال، ورودی دوم شماره پین کلاک، ورودی سوم ترتیب ارسال بیتها و ورودی چهارم دادهای است که میخواهید به رجیستر بفرستید. ترتیب ارسال دادهها در الکترونیک به دو صورت MSBFIRST یا LSBFIRST وجود دارد. در حالت اول، ابتدا بزرگترین رقم ( باارزشترین رقم، رقم سمت چپ) فرستاده میشود و در حالت دوم برعکس این حالت اتفاق میافتد. در ارسال دادههای سریال این موضوع بسیار اهمیت دارد که دادهها از کدام سمت خوانده شوند. مثل این است که ندانید که یک متن فارسی را از چپ یا از راست بخوانید!
مورد مهم دیگر اینکه پایه Latch حساس به لبه بالارونده سیگنال است. این چه معنی دارد؟ در کل دو نوع حساسیت به سیگنال وجود دارد: حساسیت به مقدار و حساسیت به تغییرات. در نوع اول، مقدار ٠ یا ١ بودن یک سیگنال در فعالسازی یک فرایند تاثیر دارد اما در نوع دوم تغییر سیگنال از ٠ به ١ (لبه بالارونده) یا از ١ به ٠ (لبه پائینرونده) تاثیرگذار است. به همین دلیل لازم است قبل از ارسال اطلاعات پایه Latch در حالت ٠ باشد و بعد از آن به حالت ١ برود تا یک لبه بالارونده ایجاد شود. همچنین برای اطمینان از ٠ بودن پایه کلاک، در ابتدای تابع آنرا ٠ میکنیم.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
int dataPin = 7;
int latchPin = 6;
int clockPin = 5;
void doShiftRegister(int LED)
{
digitalWrite(clockPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, LED);
digitalWrite(latchPin, HIGH);
}
void setup()
{
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
byte LED;
for (int i = 0; i < 8; i++)
{
bitSet(LED, i);
doShiftRegister(LED);
delay(40);
}
for (int i = 0; i < 8; i++)
{
bitClear(LED, i);
doShiftRegister(LED);
delay(40);
}
}
ایجاد نور رنگی با LED RGB
تا اینجا در مورد LED های ساده صحبت کردیم. اما نوعی از LED به نام RGB هم وجود دارد که میتواند رنگهای مختلف را ایجاد کند. ظاهر این LED با سایر انواع تفاوت چندانی ندارد بجز اینکه بجای دو پایه دارای ٤ پایه است. درون این این قطعه در واقع سه LED مجزا وجود دارد که هر کدام وظیفه تولید یکی از رنگهای قرمز (Red)، سبز (Green) و آبی (Blue) را بر عهده دارد.
RGB یک استاندارد جهانی برای تولید رنگ است. با ترکیب این رنگها و تغییر شدت هر کدام میتوان تمام رنگهای قابل تشخیص توسط چشم انسان را به وجود آورد. برای مثال از ترکیب رنگ قرمز و سبز، رنگ زرد و از ترکیب رنگ هر سه رنگ به میزان مساوی، رنگ سفید به وجود میآید. استانداردهای دیگری نیز برای تولید رنگ مانند CMYK وجود دارند اما استاندارد RGB اصلیترین روش تولید رنگ به خصوص در تجهیزات دیجیتال مانند کامپیوتر و تلویزیون است.
جالب است بدانید که با ترکیب این سه رنگ میتوان بینهایت رنگ مختلف به وجود آورد اما معمولترین روش تعریف رنگ در کامپیوتر، استفاده از یک عدد ٨ بیتی (٠ تا ٢٥٥) برای هر رنگ است که با ترکیب تمام حالات ممکن میتوان در مجموع حدود ١٦ میلیون (٢٨×٢٨×٢٨) رنگ به وجود آورد. این مقدار برای چشم انسان کفایت میکند، هرچند که در عکسبرداریهای پیشرفته از تعداد بسیار بیشتری رنگ نیز استفاده میشود. برای نمایش عدد رنگ در کامپیوتر (سه عدد ٨ بیتی) معمولا از دو روش استفاده میشود: مبنای ١٠ یا مبنای ١٦. مثلا رنگ طلایی را میتوان به صورت (٢٥٥,٢١٥,٠) یا 0xFFD700 نمایش داد. اگر بخواهید در برنامهتان از مبنای ١٦ استفاده کنید باید کد رنگ را به صورت 0xFFD700 وارد کنید. این کد از سه جفت عدد دو رقمی تشکیل شده است، جفت اول رنگ قرمز، جفت دوم عدد سبز و جفت سوم عدد آبی را نشان میدهد.
هرچه LED های رنگی به یکدیگر نزدیک باشند، مانند مانیتور یا تلویزیونهای LED، رنگی که در نهایت به وجود میآید واقعیتر خواهد بود. فاصله دیودهای نوع ارزان قیمت LED RGB به اندازهای هست که با کمی دقت بتوانید سه رنگ آنرا از هم تشخیص دهید. با این وجود اگر در فاصله مناسبی از آن قرار بگیرید، نتیجه رضایتبخش خواهد بود.
نحوه کار با LED RGB
LED های RGB در دو نوع Common cathode (یا منفی مشترک) و Common anode (یا مثبت مشترک) هستند. LED های رنگی دارای ٤ پایه هستند؛ یک پایه (بلندترین پایه) سر مشترک دیودها و سه پایه دیگر سر دیگر هر کدام از دیودهای رنگی هستند. اگر LED از نوع منفی مشترک باشد، باید پایه مشترک را به منفی مدار وصل کنید و برعکس.
در اینجا میخواهیم با استفاده از یک LED RGB رنگهای مختلفی تولید کنیم. برای این کار ما از یک LED کاتد مشترک استفاده کردهایم. پایه مشترک LED را به GND آردوینو و هر کدام از پایههای قرمز، سبز و آبی را با یک مقاومت 220kΩ به ترتیب به پینهای ٣، ٥ و ٦ دیجیتال وصل کنید. برای این برنامه به دلیل استفاده ازanalogWriteلازم داریم پایهها PWM باشند اما اگر فقط قصد خاموش و روشن کردن LED را دارید، میتوانید از پایههای دیجیتال معمولی استفاده کنید.
برنامه زیر شدت نور هر کدام از دیودهای LED را افزایش میدهد؛ به این ترتیب ترکیب رنگهای مختلفی به دست میآید و در نهایت رنگ سفید تولید میشود. در این برنامه برای کاهش حجم کد، از یک تابع استفاده شده است که مقادیر مطلوب هر رنگ را به پایه مورد نظر تخصیص میدهد.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#define bluePin 5
#define greenPin 6
#define redPin 7
void RGB(int blue, int green, int red)
{
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop()
{
RGB(0, 0, 0);
delay(1000);
for (int i = 0; i < 255; i++)
{
RGB(i, 0, 0);
delay(10);
}
for (int i = 0; i < 255; i++)
{
RGB(255, i, 0);
delay(10);
}
for (int i = 0; i < 255; i++)
{
RGB(255, 255, i);
delay(10);
}
delay(1000);
}
نتیجهگیری
در این آموزش انواع LED را شناختید و نحوه کار با آنها را یادگرفتید. همچنین با مقاومتها و رنگشناسی در کامپیوتر آشنا شدید. علاوه بر آن نحوه کار با شیفت رجیستر را آموختید که البته کاربرد آن منحصر به LED نیست و کارهای بیشماری میتوانید با آن انجام دهید. یکی از کارهای جالبی که با استفاده از LED میتوانید انجام دهید ساختن لباسها و گجتهای پوشیدنی نورانی با LED است؛ حتما در این مورد جستجو کنید!
در آموزش بعدی، نحوه راهاندازی و کار با نمایشگر لمسی را خواهید آموخت. نظرات شما باعث بهبود محتوای آموزشی ما میشود. اگر این آموزش را دوست داشتید، همینطور اگر سوالی در مورد آن دارید، از شنیدن نظراتتان خوشحال خواهیم شد.