این مطلب بخش ششم از آموزش جامع آردوینو (مبتدی و پیشرفته) است. در این آموزش قصد داریم به معرفی ماژولهای کیپد و جویاستیک و نحوه راهاندازی آنها با برد آردوینو بپردازیم. کیپد و جویاستیک میتوانند به عنوان ورودیهای آردوینو استفاده شوند. میتوانید کیپد را مثلا برای ورود اطلاعات، رمز یا تعیین سرعت چرخش یک موتور توسط کاربر استفاده کنید. از طرفی بیشترین کاربرد جویاستیک در دسته کنسولهای بازی مانند پلیاستیشن است. با استفاده از آن میتوانید فرمان جهت را به صورت پیوسته ارسال کنید. با جویاستیک تقریبا هر وسیلهای که فکرش را بکنید را میتوانید کنترل کنید. فرض کنید که میخواهید یک بازوی رباتیک بسازید و آن را کنترل کرده و با آن چیزی را از روی زمین بردارید؛ جویاستیک میتواند یک انتخاب بسیار خوب برای این کار باشد. یا مثلا اگر میخواهید یک دوربین مداربسته را کنترل کرده و اطراف را با آن ببینید، جویاستیک میتواند این کار را برای شما انجام دهد. با جویاستیک میتوانید برای خودتان دسته بازی بسازید یا یک پرنده رباتیک را از راه دور کنترل کنید.
قطعات موردنیاز:
معرفی کیپد
انواع مختلفی کیپد یا صفحه کلید وجود دارد که طرز کار همه آنها یکسان است. کیپدها به صورت ماتریسهای ٣×٣، ٣×٤، ٤×٤، ٥×٥ و… وجود دارد.
هر کدام از کلیدهای کیپد مانند یک سوئیچ عمل کرده و از این طریق امکان تشخیص کلید فشرده شده توسط آردوینو ممکن میشود. در کیپد از یک تکنیک ساده و جالب استفاده شده است. هر کدام از کلیدها یک سوئیچ هستند که در حالت عادی قطعاند. یک سر هر سوئیچ در هر سطر به هم وصل است. سر دیگر سوئیچ به کلیدهای هر ستون وصل شده است. بنابراین در یک کیپد ٤×٤، ٤ گره برای سطرها، ٤ گره برای ستونها و مجموعا ٨ گره در کیپد وجود دارد. این هشت گره به ٨ سیم وصل شده و از ماژول خارج شده است. اگر هر کدام از کلیدها فشرده شود، بین یک سطر و یک ستون اتصال برقرار میشود.
آردوینو برای خواندن کلید فشرده شده، ابتدا تمام ستونها را High و تمام سطرها را Low میکند. پس از فشردن یک کلید، ستون مربوطه Low میشود (چون به یک سطر اتصال پیدا میکند) پس ستون کلید مشخص میشود. سپس آردوینو ستونها را Low کرده و تمام سطرها را یکی یکی High میکند؛ سطر کلیدی که فشرده شده High خواهد شد و در نتیجه سطر و ستون کلید مورد نظر مشخص میشود.
راهاندازی کیپد فلت
راهاندازی کیپد فلت ساده است. کافی است که خروجیهای آن (در اینجا ٨ تا) را به پینهای آردوینو وصل کنید. چیدمان و ترتیب سیمهای کیپد معمولا به صورت پشت سر هم (چهار سیم اول سطرها و چهار سیم دوم ستونها) است. برای استفاده از کیپد بهتر است از کتابخانه Keypad استفاده کنید. اگر این کتابخانه در نرمافزار نصب نیست، آن را اضافه کنید.
سیمهای کیپد را به پینهای ٢ تا ٩ دیجیتال آردوینو وصل کنید. برنامه زیر را در آردوینو بارگذاری کنید. کلیدهای مختلف کیپد را امتحان کرده و نتیجه را در سریال مانیتور ببینید. در صورتی که نتیجه درست نیست، تعریف پینها یا کلیدها را تغییر داده و دوباره امتحان کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <Keypad.h>
#define rowNumbers 4
#define columnNumbers 4
byte rowPins[rowNumbers] = {2, 3, 4, 5};
byte colPins[columnNumbers] = {6, 7, 8, 9};
char keys[rowNumbers][columnNumbers] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rowNumbers, columnNumbers);
void setup()
{
Serial.begin(9600);
}
void loop()
{
char pressedKey = keypad.getKey();
if (pressedKey)
Serial.println(pressedKey);
}
در این برنامه ابتدا شماره پینهای کیپد و سپس کاراکتر معادل هر کلید تعریف شده است:
byte rowPins[rowNumbers] = {2, 3, 4, 5};
byte colPins[columnNumbers] = {6, 7, 8, 9};
char keys[rowNumbers][columnNumbers] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}};
پس از آن کیپد تعریف میشود. در تعریف کیپد باید کاراکترها، پینهای سطرها و ستونها و تعداد سطرها و ستونها آورده شود:
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rowNumbers, columnNumbers)
در نهایت با استفاده از دستور ()getKey کلید فشرده شده خوانده میشود و در سریال مانیتور نمایش داده میشود:
void loop()
{
char pressedKey = keypad.getKey();
if (pressedKey)
Serial.println(pressedKey);
}
معرفی جویاستیک
درون جویاستیک یک مدار ساده وجود دارد که حرکت دسته را به سیگنال تبدیل میکند. برای این کار از دو پتانسیومتر درون ماژول استفاده شده است. پتانسیومتر یک مقاومت متغیر است که با جابجا کردن محل اتصال درون آن، مقاومت و در نتیجه ولتاژ آن تغییر کرده و از این طریق میتوان جابجایی را به داده تبدیل کرد.
نحوه عملکرد و ساختار پتانسیومتر در قسمت چهارم آموزش آردوینو شرح داده شده است. هر کدام از دو جهت جویاستیک به یک پتانسیومتر متصل شده است و یک سیگنال آنالوگ تولید کرده که از آنجایی که مبدل آنالوگ به دیجیتال آردوینو UNO ١٠ بیتی است، در قالب عددی بین ٠ تا ١٠٢٣ خوانده میشود. همچنین برای هر پتانسیومتر یک فنر قرار داده شده است تا در صورت رها کردن جویاستیک، به محل وسط برگردد. این باعث میشود تا مقدار پیشفرض جویاستیک بدون چرخاندن آن، مقدار میانگین (یعنی ٢.٥ ولت اگر که به ولتاژ ٥ ولت متصل باشد) باشد.
بعضی از ماژولهای جویاستیک دارای یک کلید فشاری در زیر خود هستند که معمولا با نام Switch) SW) مشخص شده است و هنگامی که جویاستیک را به سمت پائین فشار دهید میتوانید این کلید را احساس کنید.
برای استفاده از این کلید باید آنرا به یک پین دیجیتال متصل کنید. کلید فشاری دارای دو پایه است که یکی خروجی آن و دیگری به زمین متصل شده است. بین این دو پایه یک اتصال وجود دارد که در حالت عادی باز است (Normally Open) و با فشردن کلید بسته میشود. واضح است که با فشردن کلید، خروجی آن به زمین متصل شده و ولتاژ آن صفر میشود. پس اگر خروجی کلید به پین دیجیتال متصل باشد، با فشردن کلید مقدار Low خوانده خواهد شد.
راهاندازی ماژول جویاستیک
برای استفاده از ماژول جویاستیک به همراه آردوینو باید خروجیهای محورهای X و Y ماژول که همان اتصالهای میانی پتانسیومترها هستند را به دو پین آنالوگ آردوینو (پین A0 و A1) وصل کنید. نامگذاری این دو پایه در ماژولهای مختلف، متفاوت است و معمولا به صورت X و Y یا Ver و Hor (افقی و عمودی) قابل تشخیص است. پایههای 5V+ و GND ماژول را به 5V و GND آردوینو وصل کنید. دقت کنید که بعضی از ماژولهای جویاستیک با ولتاژ 3.3V کار میکنند. این موضوع را میتوانید در دفترچه راهنمای محصول پیدا کنید. اگر از ماژول 3.3V استفاده میکنید پایه مثبت آنرا به 3.3V آردوینو وصل کنید. اگر ماژول شما کلید فشاری دارد، باید خروجی آن را به یک پین دیجیتال آردوینو (پین ٧ دیجیتال) متصل کنید. نکته مهمی در نحوه اتصال کلید فشاری جویاستیک وجود دارد و و آن اصطلاحا Normally Open بودن آن است. این یعنی چه؟ همان طور که اشاره شد، سمت دیگر این کلید در خود ماژول به زمین متصل شده است. این باعث میشود تا زمان فشردن کلید، مقدار Low به پایه دیجیتال ارسال شود. برای اینکه باز و بسته بودن این کلید قابل تشخیص باشد، از یک مقاومت Pullup استفاده کنید؛ یعنی خروجی کلید را با یک مقاومت 10kΩ به 5V وصل کنید. در این صورت در حالتی که کلید فشرده نشده باشد، مقدار High به پین دیجیتال ارسال میشود و دو حالت کلید برای آردوینو قابل تفکیک میشود (حالت عادی مقدار High و حالت فشرده مقدار Low را دریافت میکند).
از آنجا که ورودی محورهای جویاستیک عددی بین ٠ تا ١٠٢٣ است، با استفاده از دستور ()map که قبلا توضیح داده شده است، استفاده کنید تا مقدار آنالوگ را به عددی بین ٠ تا ١٨٠ تبدیل کنید. البته این کار الزامی نیست و صرفا جهت ملموستر شدن نحوه حرکت جویاستیک است. مورد مهم دیگری که در این برنامه استفاده شده است نفی منطقی یا Logical Not است. این کار در آردوینو (و البته در ++C/C) با عملگر ! انجام میشود. این عملگر بر روی متغیرهایی بولین (Boolean) عمل کرده و مقدار True را به False و برعکس تغییر میدهد. متغیر بولین، متغیری است که یکی از دو حالت ممکن (True یا False) را میپذیرد. این عملگر بر روی متغیرهای دیجیتال نیز عمل کرده و High را به Low و برعکس تبدیل میکند. از این عملگر در حلقههای شرطی نیز استفاده میشود. علت استفاده از ! در اینجا این است که مقدار پیشفرض پایه دیجیتال متصل به کلید جویاستیک High و مقدار آن پس از فشرده شدن، Low است. با این تبدیل، مقدار پیشفرض کلید Low و پس از فشرده شدن، مقدار High به LED ارسال میشود. پین ١٣ دیجیتال آردوینو UNO که دارای LED است برای خروجی این دستور در نظر گرفته شده است؛ بنابراین با فشردن کلید جویاستیک، LED پین ١٣ روشن خواهد شد. علاوه بر آن مقدار جابجایی محورهای X و Y جویاستیک نیز در سریال مانیتور نمایش دهید. با توجه به مطالب گفته شده، سعی کنید خودتان برنامهای بنویسید که مقادیر خوانده شده از جویاستیک را در سریال مانیتور نمایش داده و همچنین با فشار کلید آن، LED آردوینو را روشن کند. برنامه خودتان را با کد زیر مقایسه کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#define XJoystick A0
#define YJoystick A1
#define pushJoystick 7 // Use 10K Pullup resistor
#define LED 13
void setup()
{
pinMode(pushJoystick, INPUT);
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop()
{
int AngleX = map(analogRead(XJoystick), 0, 1023, -90, 90);
int AngleY = map(analogRead(YJoystick), 0, 1023, -90, 90);
digitalWrite(LED, !digitalRead(pushJoystick));
Serial.print("Angle of X is= ");
Serial.println(AngleX);
Serial.print("Angle of Y is= ");
Serial.println(AngleY);
Serial.println("");
delay(200);
}
سریال مانیتور را باز کنید. جویاستیک را حرکت داده و مقدار آن را بررسی کنید. به وضعیت LED پین ١٣ هم توجه کنید.
کنترل سروو موتور با استفاده از جویاستیک
یکی از کاربردهای اصلی جویاستیک کنترل وسایل مختلف است. به همین منظور در این قسمت به کنترل یک سروو موتور با استفاده از جویاستیک میپردازیم. در آموزش قسمت چهارم آردوینو نحوه راهاندازی سروو موتور توضیح داده شده است. جویاستیک دو محور دارد بنابراین میتوانیم حرکت دو موتور را با آن کنترل کنیم.
سروو موتورها را به پینهای ٥ و ٦ دیجیتال آردوینو متصل کنید. همچنین پایههای X و Y جویاستیک را به پینهای A0 و A1 و پایه SW را به پین ٧ دیجیتال و یک سر مقاومت 10kΩ وصل کنید. سر دیگر مقاومت را به 5V وصل کنید. پینهای مثبت و منفی سروو موتورها و جویاستیک را نیز به ترتیب به 5V و GND متصل کنید.
برای استفاده از سروو موتورها، از کتابخانه Servo آردوینو استفاده میکنیم. چون میخواهیم دو موتور را کنترل کنیم باید دو موتور را در برنامه تعریف کنیم و در بخش setup موتورها را به پینهای مربوطه وصل کنیم. سایر بخشهای کد مانند حالت قبل است. برنامه زیر را در نرمافزار آردوینو بارگذاری کرده و اجرا کنید. جویاستیک را حرکت دهید و نحوه حرکت موتورها را مشاهده کنید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <Servo.h>
Servo servo1;
Servo servo2;
#define servo1Pin 5
#define servo2Pin 6
#define XJoystick A0
#define YJoystick A1
#define pushJoystick 7 // Use 10K Pullup resistor
#define LED 13
void setup()
{
servo1.attach(servo1Pin);
servo2.attach(servo2Pin);
pinMode(pushJoystick, INPUT);
pinMode(LED, OUTPUT);
}
void loop()
{
int AngleX = map(analogRead(XJoystick), 0, 1023, 0, 180);
int AngleY = map(analogRead(YJoystick), 0, 1023, 0, 180);
servo1.write(AngleX);
servo2.write(AngleY);
digitalWrite(LED, !digitalRead(pushJoystick));
}
نتیجهگیری
در این آموزش با ماژولهای کیپد و جویاستیک آشنا شدید و نحوه کار با آن را یاد گرفتید. شاید کار کردن با یک سنسور یا ماژول به تنهایی چندان جذاب نباشد. چیزی که باعث میشود کار با ماژولها هیجانانگیز شود، ترکیب کردن آنها و انجام پروژههای کاربردی است. در این آموزش، این کار را با ترکیب جویاستیک و سروو موتور انجام دادیم.
در آموزش بعدی، نحوه تولید صوت به کمک بازر و آردوینو را خواهید آموخت. نظرات شما باعث بهبود محتوای آموزشی ما میشود. اگر این آموزش را دوست داشتید، همینطور اگر سوالی در مورد آن دارید، از شنیدن نظراتتان خوشحال خواهیم شد.