پروژه چراغ راهنمایی، یک پروژه سرگرم کننده و کوچک است که می توانید در مدت کوتاهی آن را بسازید.
لیست قطعات مورد نیاز پروژه ساخت چراغ راهنمایی
آردوینو uno : 1 عددLED سبز : 1 عدد
LED قرمز : 1 عدد
LED زرد : 1 عدد
برد بورد : 1 عدد
مقاومت ۲۲0Ω : 6 عدد
مقاومت 10KΩ : 1 عدد
سوئیچ : 1 عدد
شماتیک پروژه ساخت چراغ راهنمایی با آردوینو
اتصالات چراغ راهنمایی
- پایه آند ( بزرگتر ) LED سبز را به کمک یک مقاومت ۲۲۰Ω به پین شماره ۸ آردوینو متصل کنید.
- پایه آند ( بزرگتر ) LED زرد را به کمک یک مقاومت ۲۲۰Ω به پین شماره ۹ آردوینو متصل کنید.
- پایه آند ( بزرگتر ) LED قرمز را به کمک یک مقاومت ۲۲۰Ω به پین شماره ۱۰ آردوینو متصل کنید.
- پایه کاتد هر سه LED را به پایه GND آردوینو متصل کنید.
برنامه نویسی پروژه چراغ راهنمایی
به منظور انعطاف پذیری و مفهوم تر بودن کد، سه متغیر تعریف و مقدار متناظر با رنگ هر LED را به آنها منتسب می کنیم.
1 2 3 | int red = 10; int yellow = 9; int green = 8; |
در تابع setup آدوینو لازم است این سه پین را به عنوان خروجی تعریف کنیم. با توجه به اینکه برای هر پین نام مناسبی انتخاب کردیم می توانیم به جای استفاده از شماره پین از نام متغیر آن استفاده کنیم.
1 2 3 4 5 | void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); } |
برای منطق اصلی چراغ راهنمایی یک تابع جدا می سازیم. اگر چه امکان کد نویسی مستقیم در تابع loop آردوینو نیز وجود دارد اما بهتر است برای منظم تر شدن کد و آمادگی برای انجام پروژه های بزرگتر، به خوبی از توابع استفاده کنید.
ادامه کد برنامه به این شکل می شود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | void loop(){ changeLights(); delay(15000); } void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000); } |
در واقع کد کامل برنامه به صورت زیر می شود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | int red = 10; int yellow = 9; int green = 8; void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); } void loop(){ changeLights(); delay(15000); } void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000); } |
اکنون برنامه را بر روی آردوینو آپلود کنید. اگر نیاز به راهنمایی بیشتری برای این کار دارید پیشنهاد می کنیم آموزش کار با نرم افزار آردوینو را دنبال کنید.
پس آپلود موفقیت آمیز برنامه خروجی ای مشابه تصویر زیر خواهید داشت :
اضافه کردن یک سوئیچ به پروژه چراغ راهنمایی
اکنون قصد اضافه کردنم سوئیچ
- یک پایه از سوئیچ به پایه ۵ ولت آردوینو متصل کنید.
- پایه دیگر را مطابق تصویر به کمک یک مقاومت ۱۰KΩ به GND متصل کنید.
سوئیچ در دو وضعیت مختلف اجازه عبور جریان را می دهد یا نمی دهد، اما در منطق مدار ما به دو حالت HIGH و LOW نیاز داریم. شاید سوئیچ در حالت قطع را به عنوان حالت LOW تصور کنید، اما در واقع سوئیچ قطع به عنوان حالت شناور در نظر گرفته می شود چرا که هیچ جریانی جذب نشده است.
در حالت شناور، یک نوسان یا تداخل الکتریکی ممکن است باعث ایجاد اشتباه شود. به عبارت دیگر یک سوئیچ در حالت شناور ممکن است حالت HIGH یا LOW خوانده شود. با کمک یک مقاومت pull down مقدار کمی جریان در حلت قطع برای اطمینان از خوانده شدن مقدار دقیق سوئیچ عبور داده می شود.
در مدارات دیگر ممکن است از مقاومت pull up استفاده کنیم. این مقاومت دقیقا با همین منطیق اما برخلاف حالت قبل در وضعیت پیش فرض HIGH می باشد.
اکنون در تابع loop به جای تغییر وضعیت LED در هر ۱۵ ثانیه، با خواندن مقدار سوئیچ فقط در زمان فعال بودن سوئیچ وضعیت LED ها را تغییر خواهیم داد.
از آنجا که پین شماره ۱۲ را به سوئیچ اختصاص دادیم، بهتر است مثل قبل یک متغیر با نام معنا دار برای آن انتخاب کنیم:
1 | int button = 12; // switch is on pin 12 |
در تابع setup می بایست پین سوئیچ را به عنوان ورودی تعریف کنیم. علاوه بر این می توانیم به صورت پیش فرض LED سبز رنگ را روشن کنیم:
1 2 | pinMode(button, INPUT); digitalWrite(green, HIGH); |
تابع loop جدید به این شکل می شود :
1 2 3 4 5 6 7 8 9 10 | void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } } } |
شاید تعجب کنید که چرا دوبار digitalRead(button) چک شده است. نام این عمل نویزگیری است. مشابه عملکرد مقاومت pull down این تکرار بررسی جلوی تداخلات و تشخیص اشتباه وضعیت سوئیچ را می گیرد. البته این بررسی ضرروی نیست اما بهتر است با این روش آشنا باشید.
در مدت زمان انتظار ۱۵ ثانیه وضعیت چراغ ها تغییر نخواهد کرد. پس از پایان ۱۵ ثانیه حلقه مجدد عمل خواهد کرد و در صورت فشار داده شدن سوئیچ وضعیت چراغ ها تغییر خواهد کرد.
توسعه پروژه چراغ راهنمایی و ایجاد دو چراغ راهنمایی
مدار را مطابق شکل زیر تغییر دهید :
اتصالات :
پین های چراغ های جدید را مانند تصویر بالا به پایه های ۱۱، ۱۲ و ۱۳ متصل کنید.
کد را به صورت زیر تغییر دهید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | // light one int red1 = 10; int yellow1 = 9; int green1 = 8; // light two int red2 = 13; int yellow2 = 12; int green2 = 11; void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT); } void loop(){ changeLights(); delay(15000); } void changeLights(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000); } |
خروچی برنامه باید به این صورت باشد :