آموزش آردوینو جلسه دهم
در جلسه هشتم در مورد راه اندازی سروو موتور با خواندن مقادیر آنالوگ بحث کردیم؛ در این جلسه به وسیله پین های آنالوگ مقادیر ماژول جوی استیک را میخوانیم.

اگر به دسته های بازی دقت کرده باشید متوجه یک یا دو عدد جوی استیک بر روی دسته ها شده اید که اکثر افراد آن را با عنوان شوک یا آنالوگ میشناسند!
با وجود اینکه این اسامی تقریبا اشتباه هستند اما جوی استیک ها از دو عدد پوتانسیومتر استفاده میکنند و این بدین معناست که به وسیله اندازه گیری مقادیر آنالوگ میتوان جهت حرکت آن را اندازه گیری کرد.
در دو تصویر زیر یک نمونه جوی استیک بر روی دسته بازی (گیم پد) و ماژول جوی استیک را مشاهده میکنید. ما از این ماژول برای اتصال به آردوینو استفاده میکنیم:
درک ساختار جوی استیک
اگر بخواهیم ساختار جوی استیک ها را بررسی کنیم میتوان گفت جوی استیک از دو هعدد پوتانسیومتر تشکیل شده است که با تغییر موقعیت جوی استیک مقدار مقاومت آنها تغییر میکند؛ در نتیجه میتوان مقدار آنها را به وسیله پین آنالوگ آردوینو خواند!
در تصویر زیر نمایی از ساختار جوی استیک را مشاهده میکنید:
همانطور که میبینید یک جوی استیک دارای دو عدد پوتانسیومتر است که دو سیم برای تغذیه – و + و دو سیم برای خروجی x و y است. همچنین در بیشتر از ماژول های جوی استیک یک عدد کلید موجود است که با فشار دادن جوی استیک میتوان بر روی آن کلیک کرد.
راه اندازی
با توجه به اینکه جوی استیک دارای دو محور است، میتوان آن را در جهت های چپ، راست، بالا و پایین قرار داد و مقادیر را بخوانیم.
در تصویر بالا مقادیر جوی استیک را مشاهده میکنید. اگر تغذیه ماژول را به درستی متصل کنید، با تغییر جهت اهرم مقدار مقاومت خروجی در پین های VRX و VRY ماژول تغییر میکند.
اگر مقدار Y برابر با 1023 باشد یعنی جوی استیک در موقعیت بالا و اگر مقدار Y برابر با 0 باشد یعنی در موقعیت پایین است.
اگر مقدار X برابر با 1023 باشد یعنی جوی استیک در موقعیت چپ و اگر مقدار X برابر با 0 باشد یعنی در موقعیت راست است.
مقدار خروجی X و Y ماژول در حالت عادی به طوری که به هیچ جهتی مایل نباشد برابر با 512 است (صرف نظر از خطا و نویز)
خواندن مقادیر
برای خواندن مقدار جوی استیک از تکه کد زیر استفاده کنید. به جای XPIN و YPIN به ترتیب پین VRX و پین VRY ماژول را بنویسید و توجه کنید که تنها از پین آنالوگ برای این این کار استفاده کنید (مثلا A0 و A1)
Serial.print("X: " + (String)analogRead(XPIN) + " | ");
Serial.println("Y: " + (String)analogRead(YPIN));
نکته: با استفاده از (String) قبل از متغیر ها میتوانید آنها را به رشته تبدیل کنید. مثال:
int number = 2020;
String year = (String)number; // Convert 'int' to 'String'
سورس کد
const int XPIN = A0;
const int YPIN = A1;
const int SWPIN = 2;
void setup(){
Serial.begin(9600);
pinMode(SWPIN, INPUT_PULLUP);
}
void loop(){
int valy = analogRead(YPIN);
int valx = analogRead(XPIN);
if(valx == 1023){
Serial.println("Left");
}
if(valx == 0){
Serial.println("Right");
}
if(valy == 1023){
Serial.println("Up");
}
if(valy == 0){
Serial.println("Down");
}
if(digitalRead(SWPIN) == LOW)
Serial.println("Button pressed");
}
}
توضیحات
در سه خط اول چندین ثابت تعریف کرده ایم و شماره پین های مورد نظر را نوشته ایم. همچنین میتوانید از کد زیر برای این کار استفاده کنید:
#define XPIN A0
#define YPIN A1
#define SWPIN 2
// به جای
const int XPIN = A0;
const int YPIN = A1;
const int SWPIN = 2;
در خط 9 پین SWPIN را به عنوان پول آپ در نظر گرفته ایم. پول آپ یکی از اصطلاحاتی است که مربوط به سخت افزار میشود. با این کار مقاومت پول آپ آردوینو را فعال میکنیم که باعث میشود مقدار پیشفرض پین مورد نظر HIGH قرار بگیرد.
فعلا در همین حد بدانید که با این کار پین SWPIN در حالت HIGH قرار میگیرد و با تغییر حالت به LOW مقدار آن را میخوانم.
pinMode(SWPIN, INPUT_PULLUP);
در خط 15 و 16 دو متغیر تعریف کرده ایم و مقدار آنالوگ پین های XPIN و YPIN را در آنها ذخیره کرده ایم. توجه داشته باشید این دو متغیر در تابع loop تعریف شده اند و در تابع دیگری در دسترس نیستند. همچنین مقدار آن ها پس از هربار شروع این تابع تغییر میکند.
int valy = analogRead(YPIN);
int valx = analogRead(XPIN);
در خطوط 18 تا 29 با قرار دادن چند شرط مقادیر را تفکیک کرده ایم؛ به اینصورت که اگر مقدار x برابر با 1023 بود جهت چپ و اگر مقدار x برابر با 0 بود جهت راست را در سریال چاپ کند. این روند برای y هم همینطور است.
if(valx == 1023){
Serial.println("Left");
}
if(valx == 0){
Serial.println("Right");
}
if(valy == 1023){
Serial.println("Up");
}
if(valy == 0){
Serial.println("Down");
}
و در آخر مقدار کلید را بررسی میکنیم و درصورت LOWf بودن آن متنی را در سریال چاپ کند:
if(digitalRead(SWPIN) == LOW)
Serial.println("Button pressed");
}
با تشکر از شما که در جلسه دهم با ما همراه بودید. این جلسه آخرین جلسه از دوره مقدماتی آموزش آردوینو است. اگر مایل به ادامه دوره هستید میتوانید دوره مبتدی را مشاهده کنید. لیست دوره ها
درصورت داشتن هرگونه سوال، نظر، انتقاد و پیشنهاد در بخش نظرات با ما در ارتباط باشید.

درباره admin_hb
حسین بذرافکن هستم، برنامه نویس، فریلنسر و عاشق الکترونیک...
نوشته های بیشتر از admin_hb
دیدگاهتان را بنویسید