آموزش آردوینو پروژه چهارم
خیلی معقول نیست که توی عصر ارتباطات و دهکده جهانی و پیتزا، شما توی فضای یک وجبی برد بورد، خودتون رو حبس کنید! منزوی و درونگرا نباشید و سعی کنید ارتباطات تازه برای خودتون دست و پا کنید.
چجوری؟ یکم اطرافتون رو نگاه کنید تا ببینید چه چیز جدیدی برای ارتباط میشه پیدا کرد. نه اون نه! منظورم اون نیست! بله همون کامپیوتر یا لپتاپی که بورد تون رو بهش متصل کردید دیگه. در واقع از همون روز اول بهش متصل بودیم اما مثل انگل ازش فقط بهعنوان منبع تغذیه استفاده کردیم. حالا وقتشه کمی باهاش صحبت کنیم!
شاید برای شما مفید باشد: پروژه های آردوینو
مدار:
امیدوارم مداری که اینجا طراحی کردیم رو خیلی در به داغون نکرده باشید؛ چون میتونیم فقط با یکم تغییر، پروژه چهارم آموزش آردوینو رو باهاش انجام بدیم.
اون میکرو سوئیچ و سیم های اضافه رو بردارید و مدار رو شکل زیر کنید. از این ساده تر هم میشه؟ خوب بله احتمالاً میشه اما همینم خوبه دیگه!
اگه توی DeviceManager سیستمتون دقت کرده باشید، سیستم شما رو بهعنوان یک پورت com میشناسه. پس میتونید از طریق سریال با سیستمتون ارتباط داشته باشید.
هدف پروژه:
قراره همون ۳ تا LED پروژه سوم رو به همون شیوه، روشن و خاموش کنیم؛ اما این بار بهجای دکمه، از کامپیوتر بهش دستور میدیم.
من کدهای اضافی رو حذف کردم و به این کد تبدیلش کردم:
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 | int incomingByte = 0; int buttonStatus=1; void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); Serial.begin(9600); Serial.print("Hello"); } void loop() { if (Serial.available() > 0) { incomingByte = Serial.read(); Serial.print("I received: "); Serial.println(incomingByte, DEC); } for(int i=2;i<5;i++) { if(i==buttonStatus || buttonStatus==6) digitalWrite(i, 10); else digitalWrite(i, LOW); } } |
توی Setup گفتم که قراره با نرخ 9600 با پورت سریال ارتباط برقرار کنم و برای شروع، بهترین کار سلام کردنه!
نوشتن توی سریال به همین سادگی که دیدید هست. خوندنش هم اونقدرها مشکل نیست. اگه دقت کرده باشید توی Loop هربار بررسی میکنیم که دیتایی برای خوندن وجود داره یا نه و اگه وجود داره اون رو چاپ می کنیم.
برنامه رو اجرا کنید. برای دیدن اطلاعاتی که دارید روی سریال ارسال می کنید نیازی به چشم بصیرت نیست! از منوی Tools گزینه SerialMonitor رو انتخاب کنید. یک پنجره باز میشه که باید کلمه Hello رو توش ببینید.
از اون بهتر اینکه میتونید همونجا، تو همون پنجره برای دستگاهتون پیام ارسال کنید؛ مثلا ۲ رو بنویسید و دکمه Send رو بزنید.
همونطور که میبینید نرمافزار میگه: “من 50 رو دریافت کردم.” دلیل اینکه شما اونجا ۲ نوشتید و اینجا ۵۰ اومده تورم نیست! دلیلش اینه که اطلاعات بهصورت اسکی منتقل میشه و کاراکتر ۲ کد اسکی ۵۰ رو داره.
پس اگه ۴۸ تا ازش کم کنیم میشه همون عدد واقعی خودمون. یه خط ساده توی شرط اضافه میکنم تا برنامه کامل بشه.
1 | buttonStatus=incomingByte-48; |
اگه خط بالا رو به برنامه اضافه کنید، کار تمومه. حالا برنامه رو اجرا کنید و عدد ۲ رو وارد کنید (دقت کنید که کیبوردتون فارسی نباشه) و لذت روشن کردن LED از راه دور رو بچشید!
مثل قبل هم با فرستادن عدد ۶ تمام LED ها روشن میشن،خوب بود نه؟ یکم ساده بود. چطوره ارتباط دوم رو هم تو همین پروژه بگیریم؟
ارتباط با شیلدها:
ارتباط بعدی چیه؟ درسته بورد های آردوینو فوقالعاده هستند اما انتظار ندارید که تمام عمرمون رو با همین فسقلیها تلف کنیم؟! بوردهای آردوینو، بوردهای جانبی رو هم پشتیبانی میکنن که اصلاحاً بهشون Shield میگن. یعنی شما یه بورد دیگه که امکان خاصی بهتون میده رو بر میدارید و پیوندش میدید به همین آردوینوها تا ببینیم چی از توش در میاد!
فعلا من توی خنزر پنزرهام فقط یه جوی استیک مخصوص آردوینو دارم. پس چاره ای نداریم جز اینکه از همون استفاده کنیم!
میخواهیم باهاش یکم بازی کنیم. به نظر کلا جوی استیک فقط برای بازیه!
این دسته جوی استیک رو چهار هزار تومان تهیه کردیم. همینطور که می بینید پایههاش طوری هستند که نمیشه توی برد فرو کرد و باید سیمهای یک سر مادگی و یک سر نری داشته باشید. من چندتاشون که به هم چسبیده رو دارم.
این ماژول تقریبا پایههای مشخصی داره اما اگه براتون ناآشنا بود میتونید از روی اینترنت دیتاشیتش رو پیدا کنید و یکم دربارهاش اطلاع پیدا کنید.
ماژول ما یک پایهی زمین، یک پایهی تغذیه ،دوتا پایه مربوط به حرکت جوی استیک توی دو سمت و یک پایه مربوط به فشار دادن بهصورت دکمه داره.
سیمها رو متصل می کنیم. طبیعتاً اون دوتا پایه که مقدار حرکت جوی استیک رو نشون میدن باید آنالوگ باشن؛ چون فقط صفر و یک نیست. اون پایه مربوط به فشار دادن دکمه هم باید دیجیتال باشه.
معرفی پین آنالوگ به برنامه:
خوب اولین باره که داریم از پینهای آنالوگ استفاده می کنیم. چطور معرفیشون کنیم؟ این خطها رو توی setup اضافه میکنیم:
1 2 3 | pinMode(A1, INPUT); pinMode(A2, INPUT); pinMode(7, INPUT); |
خیلی هم ساده بود! ماژول توی هر جهت، عددی بین 0 تا 1023 به شما میده. (اگه نمیدونستید هم با یه خوندن از پایه و چاپ توی سریال، میتونستید متوجه بشید.)
ما میتونیم یک مقداری مثلا 250 و 750 رو برای حد قرار بدیم و وقتی مقدار از اون حد رد شد، Led اون سمت رو روشن کنیم. یا بیاید یه کار باحالتر کنیم! مقدار رو توی رنج 0-255 قرار بدیم و به همون مقدار نور Led رو از زیاد به کم تغییر بدیم!
صورتمسئلهی نهایی:
اگه دکمه جوی استیک زده شد، کنترل از دست سریال خارج بشه و با جوی استیک Led ها رو روشن خاموش کنیم.
اگه به سمت راست حرکت کرد Led سمت راست رو روشن میکنیم. برای چپ هم همینطور. بالا و پایین رو هم نور Led وسط رو کم و زیاد میکنیم.
اول متغیرهایی که فکر میکنیم لازمه رو معرفی میکنیم و یک سری متغیر هم برای استاندارد شدن کد استفاده میکنیم:
1 2 3 4 5 6 7 8 9 10 | int joyleftRight; int joyUpDown; bool joySelected=false; // int leftLed=4; int centerLed=3; int rightLed=2; int buttonPin=7; // |
برای خوندن از پایه آنالوگ که قبلا آموزش دیدیم و مشکلی نداریم. تنها بحث قبل از ارائه کد نهایی اینه که درسته که پایههای بردهای آردوینو همه مثل هم هستن اما در باطن مثل پنج انگشت دست هستن! یعنی برای این پروژه شما باید دقت داشته باشید که اون Led که قراره نورش کم و زیاد بشه به چه پایهای از برد متصل شده؛ چون همهی پایههای دیجیتال برد قابلیت AnalogWrite رو بهصورت دقیق پیادهسازی نمیکنند. این قابلیت که بهش PWM میگن (و به ما هم فعلا هیچ ربطی نداره که چطور کار میکنه!) فقط توی پایههای 3-5-7-9 و 11 پیاده سازی شده. ما تو این مثال Led وسطی رو به پایه 3 وصل کردیم.
نمونه کد بعد از تغییرات:
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 56 57 58 59 60 61 62 | //by Sissog //آموزش آردوینو قسمت چهارم int incomingByte = 0; int buttonStatus=1; int joyleftRight; int joyUpDown; bool joySelected=false; // int leftLed=4; int centerLed=3; int rightLed=2; int buttonPin=7; // // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(rightLed, OUTPUT); pinMode(centerLed, OUTPUT); pinMode(leftLed, OUTPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); pinMode(buttonPin, INPUT); digitalWrite(buttonPin, HIGH); Serial.begin(9600); Serial.print("Hello"); } // the loop function runs over and over again forever void loop() { if (Serial.available() > 0) { incomingByte = Serial.read(); buttonStatus=incomingByte-48; Serial.print("I received: "); Serial.println(incomingByte, DEC); } joyleftRight= analogRead(A2); joyUpDown= analogRead(A1); joySelected= (digitalRead(buttonPin) == 0 ? !joySelected: joySelected); for(int i=2;i<5;i++) { if((!joySelected) && (i==buttonStatus || buttonStatus==6)) digitalWrite(i, 10); else if(joySelected) { analogWrite(centerLed,joyUpDown/4); if(0<=joyleftRight && joyleftRight<450) digitalWrite(rightLed,HIGH); else if(550<joyleftRight ) digitalWrite(leftLed,HIGH); else digitalWrite(i, LOW); } else digitalWrite(i, LOW); } delay(200); } |
خطاهای احتمالی و نکات:
آیا من بدون خطا تونستم به این کد برسم؟ معلومه که نه! تا خطا نباشه اشتباه هم نیست!
اولین مشکل که کلی وقت من رو تلف کرد و حتی تهمت ناروای خراب بودن به جوی استیک هم زدم همون بحث شیرین پول آپ بود که اینجا توی قسمت سوم از آموزش آردوینو دربارهاش صحبت کردیم و فراموش کرده بودم توی کد قرار بدم که باعث میشد دیتای نامعتبر روی خروجی بیاد و مرتب صفر و یک بشه.
نکته: جوی استیک رو باید به حد کافی به سمت پایین فشار بدید و صدای فشرده شدن دکمه رو بشنوید تا پایه تحریک بشه.
خروجی نهایی:
عالی بود عالی
سلام.من تا شماره چهار مطالب آردویینو رو خوندم ولی فقط یه مشکلی که داشت این بود که کد هایی که نوشته شده بود راه حلی برای نوشتنش یا جاهایی که باید نوشته میشد گفته نشده بود و فقط کد ها نوشته شده بود و کسی که میخوند فقط باید کپی میکرد.
ببخشید منظورتون رو درست متوجه نمیشم ! ، توی پست اول آموزش نحوه اینه که ادیتور رو چطور و از کجا دانلود کنید و چطور استفاده کنید.
اگر هم منظور شما نحوه کار با توابع هست که می تونید به رفرنس های آردوینو که توسط سیسوگ ترجمه شده اند مراجعه کنید.
داره جالب میشه این داستان آردینوی شما
ممنون، به زودی وارد دنیایی دیگری از آردوینو می شویم که خودمان هم شب ها از هیجانش خواب نداریم!