خیلی معقول نیست که توی عصر ارتباطاتو دهکده جهانی و پیتزا، شما توی فضای یکوجبی برد بورد، خودتون رو حبس کنید!
منزوی و درونگرا نباشید و سعیکنید ارتباطات تازه برای خودتون دستوپا کنید. چجوری؟ یکم اطرافتون رو نگاه کنید تا ببینید چهچیزجدیدی برای ارتباط میشه پیداکرد.منظورم همون کامپیوتر یا لپتاپی که بوردتون رو بهش متصلکردید بود. درواقع از همون روزاول بهش متصلبودیم اما مثل انگل ازش فقط بهعنوان منبع تغذیه استفاده کردیم. حالا وقتشه کمی باهاش صحبت کنیم!
مدار:
امیدوارم مداری که اینجا طراحی کردیم رو خیلی دربهداغون نکرده باشید؛ چون میتونیم فقط با یکم تغییر، پروژه چهارم آموزش آردوینو رو باهاش انجام بدیم. اون میکرو سوئیچ و سیمهای اضافه رو بردارید و مدار رو شکل زیر کنید. از این سادهتر هم میشه؟ خوب بله احتمالاً میشه اما همینم خوبه دیگه!
اگه توی DeviceManager سیستمتون دقت کردهباشید، سیستم شما رو بهعنوان یک پورت com میشناسه. پس میتونید ازطریق سریال با سیستمتون ارتباط داشته باشید.
هدف پروژه
قراره همون ۳ تا LED پروژه سوم رو بههمون شیوه، روشنوخاموش کنیم؛ اما اینبار بهجای دکمه، از کامپیوتر بهش دستور میدیم. من کدهای اضافی رو حذف کردم و به این کد تبدیلش کردم:
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 گفتم که قراره با نرخ ۹۶۰۰ با پورت سریال ارتباط برقرار کنم و برای شروع، بهترین کار سلام کردنه! نوشتن توی سریال بههمینسادگی که دیدید هست. خوندنش هم اونقدرها مشکل نیست. اگه دقت کردهباشید توی Loop هربار بررسی میکنیم که دیتایی برای خوندن وجود داره یا نه و اگه وجود داره اون رو چاپ میکنیم. برنامه رو اجرا کنید. برای دیدن اطلاعاتی که دارید روی سریال ارسال میکنید نیازی به چشم بصیرت نیست! از منوی Tools گزینه SerialMonitor رو انتخاب کنید. یک پنجره باز میشه که باید کلمه Hello رو توش ببینید. از اون بهتر اینکه میتونید همونجا، تو همون پنجره برای دستگاهتون پیام ارسال کنید؛ مثلا ۲ رو بنویسید و دکمه Send رو بزنید. همونطور که میبینید نرمافزار میگه: “من 50 رو دریافت کردم.” دلیلاینکه شما اونجا ۲ نوشتید و اینجا ۵۰ اومده تورم نیست! دلیلش اینهکه اطلاعات بهصورت اسکی منتقل میشه و کاراکتر ۲ کد اسکی ۵۰ رو داره. پس اگه ۴۸ تا ازش کم کنیم میشه همون عدد واقعی خودمون. یه خط ساده توی شرط اضافه میکنم تا برنامه کامل بشه.
buttonStatus=incomingByte-48;
اگه خط بالا رو به برنامه اضافهکنید، کار تمومه. حالا برنامه رو اجرا کنید و عدد ۲ رو وارد کنید (دقت کنید که کیبوردتون فارسی نباشه) و لذت روشنکردن LED از راه دور رو بچشید! مثل قبل هم با فرستادن عدد ۶ تمام LED ها روشن میشن.
خوب بود نه؟ یکم ساده بود. چطوره ارتباط دوم رو هم تو همین پروژه بگیریم؟
ارتباط با شیلدها
ارتباط بعدی چیه؟ درسته بوردهای آردوینو فوقالعاده هستند اما انتظار ندارید که تمام عمرمون رو باهمین فسقلیها تلف کنیم؟! بوردهای آردوینو، بوردهای جانبی رو هم پشتیبانی میکنن که اصلاحاً بهشون Shield میگن. یعنی شما یه بورد دیگه که امکان خاصی بهتون میده رو برمیدارید و پیوندش میدید به همین آردوینوها تا ببینیم چی از توش در میاد! فعلا من توی خنزر پنزرهام فقط یه جوی استیک مخصوص آردوینو دارم. پس چارهای نداریم جزاینکه از همون استفاده کنیم! میخواهیم باهاش یکم بازی کنیم. بنظر کلا جوی استیک فقط برای بازیه! این دسته جوی استیک رو چهارهزارتومان تهیه کردیم. همینطور که میبینید پایههاش طوری هستند که نمیشه توی برد فرو کرد و باید سیمهای یکسر مادگی و یکسر نری داشته باشید. من چندتاشون که بههم چسبیده رو دارم.
این ماژول تقریبا پایههای مشخصی داره اما اگه براتون ناآشنا بود میتونید از روی اینترنت دیتاشیتش رو پیدا کنید و یکم دربارهاش اطلاع پیدا کنید. ماژول ما یک پایهی زمین، یک پایهی تغذیه ،دوتا پایه مربوطبه حرکت جوی استیک توی دو سمت و یک پایه مربوط به فشار دادن بهصورت دکمه داره. سیمها رو متصل می کنیم. طبیعتاً اون دوتا پایه که مقدار حرکت جوی استیک رو نشون میدن باید آنالوگ باشن؛ چون فقط صفرویک نیست. اون پایه مربوط به فشار دادن دکمه هم باید دیجیتال باشه.
معرفی پین آنالوگ به برنامه
خوب اولینباره که داریم از پینهای آنالوگ استفاده میکنیم. چطور معرفیشون کنیم؟ این خطها رو توی setup اضافه میکنیم:
pinMode(A1, INPUT); pinMode(A2, INPUT); pinMode(7, INPUT);
خیلی هم ساده بود! ماژول توی هرجهت، عددی بین ۰ تا ۱۰۲۳ به شما میده. (اگه نمیدونستید هم با یه خوندن از پایه و چاپ توی سریال، میتونستید متوجه بشید.) ما میتونیم یکمقداری مثلا ۲۵۰ و ۷۵۰ رو برای حد قرار بدیم و وقتی مقدار از اون حد رد شد، Led اون سمت رو روشن کنیم. یا بیاید یه کار باحالتر کنیم! مقدار رو توی رنج ۰- تا ۲۵۵ قرار بدیم و بههمون مقدار نور Led رو از زیاد به کم تغییر بدیم!
صورتمسئلهی نهایی
اگه دکمه جوی استیک زدهشد، کنترل از دست سریال خارج بشه و با جوی استیک Led ها رو روشن خاموش کنیم. اگه به سمتراست حرکت کرد Led سمتراست رو روشن میکنیم. برای چپ هم همینطور. بالا و پایین رو هم نور Led وسط رو کمو زیاد میکنیم. اول متغیرهایی که فکر میکنیم لازمه رو معرفی میکنیم و یکسری متغیر هم برای استانداردشدن کد استفاده میکنیم:
int joyleftRight; int joyUpDown; bool joySelected=false; // int leftLed=4; int centerLed=3; int rightLed=2; int buttonPin=7; //
برای خوندن از پایه آنالوگ که قبلا آموزش دیدیم و مشکلی نداریم. تنها بحث قبلاز ارائه کدنهایی اینهکه درسته که پایههای بردهای آردوینو همه مثلهم هستن اما در باطن مثل پنج انگشت دست هستن! یعنی برای این پروژه شما باید دقت داشتهباشید که اون Led که قراره نورش کمو زیاد بشه به چه پایهای از برد متصل شده؛ چون همهی پایههای دیجیتال برد قابلیت AnalogWrite رو بهصورت دقیق پیادهسازی نمیکنند. این قابلیت که بهش PWM میگن (وبه ماهم فعلا هیچ ربطینداره که چطور کارمیکنه!) فقط توی پایههای ۳-۵-۷-۹ و ۱۱ پیادهسازی شده. ما تو این مثال Led وسطی رو به پایه ۳ وصل کردیم.
نمونه کد بعد از تغییرات
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); }
منبع: سیسوگ