ایجاد بازی تاس دو نفره در آردوینو

Ratings
(0)

تبدیل تاس مبتدی ما به یک بازی تمام عیار، به این نیاز دارد که یک دکمه ی فشاری دیگر نیز اضافه کنیم تا دو نفره شود. با استفاده از دکمه ی اول می توانیم تاس را بیندازیم و با دکمه ی دوم می توانیم یک حدس بزنیم. وقتی که ما تاس را دوباره می اندازیم و مقدار فعلی به دست آمده، با حدس ما برابری می کند، هرسه ال ای دی ما شروع به چشمک زدن می کنند؛ در غیر این صورت خاموش باقی می مانند. برای وارد کردن مقدار حدسی، باید ایندکمه را به تعداد مورد نظر فشار دهیم. بنابراین اگر فکر می کنید که با انداختن تاس بعدی، مقدار 3 به دست می آید، این دکمه را سه بار فشار دهید و سپس دکمه ی شروع را فشار دهید.

برای اضافه کردن یک دکمه ی دیگر به مدار، همان کاری که برای دکمه ی اول انجام دادیم را تکرار می کنیم. به تصویر 13 توجه کنید؛ طبق این تصویر، تاس باینری ما اکنون یک دکمه ی حدس دارد. در صفحه ی 56، نشان داده شده است که ما یک دکمه ی دیگر را به مدار خود بر روی برد برد اضافه کرده ایم. این دفع ما این دکمه ی جدید را به پین شماره 5 متصل کرده ایم. اکنون به کمی کدنویسی احتیاج داریم تا دکمه ی جدید خود را کنترل کنیم. ممکن است شما وسوسه شوید تا کدهای قبلی برنامه را کپی کنید، گذشته از این، ما طراحی سخت افزار را کپی کردیم درست است؟ یعنی یک دکمه را به دو دکمه تبدیل کردیم؛ یعنی به نوعی کپی کاری کردیم.

در جهان واقعی، برخی از افزونگی ها(redundancy) یا همان کپی برداری ها کاملا قابل قبول هستند؛ زیرا ما در طراحی خود واقعاً به دو دکمه ی فیزیکی نیاز داشتیم حتی اگر این دو دکمه در اصل مانند یکدیگر باشند. در جهان نرم افزار، افزونگی یا کپی کاری ممنوع است، زیرا به سرعت منجر به هرج و مرج می شود. ما همواره باید اطمینان حاصل کنیم که هر بخش مهمی از کدها یا اطلاعات تنها یک بار در برنامه ی حضور پیدا کنند. مثلا به جای کپی کردن عدد های تکراری، ما باید از ثابت ها(constants) استفاده کنیم. و به جای کپی کردن کدها، ما باید از تابع ها یا کلاس ها استفاده کنیم. به این طریق، کدهای ما فشرده و خوانا تر خواهند شد. با استفاده از تابع ها یا کلاس ها، ما خیلی ساده تر می توانیم کدهای خود را تغییر دهیم، زیرا وقتی که ما کدهای خود را در جاهای مختلف کپی می کنیم، باید وقتی که می خواهیم تغییری در کدها ایجاد کنیم، تمام مکان هایی که این کدها را را کپی کرده ایم به یاد بیاوریم. اما اگر ما کدهای خود را تنها در یک مکان، یعنی در تابع ها یا کلاس ها نگهداری کنیم، وقتی که بخواهیم در آنها تغییری انجام دهیم، آسان خواهد بود. بنابراین ما قصد نداریم منطق کدهای پرش زدایی(debounce) را دوباره کپی کنیم، بلکه می خواهیم از کتابخانه ی Bounce2 که برای این هدف ایجاد شده است استفاده کنیم. بنابراین بر روی این لینک کلیک کنید، تا این کتابخانه دانلود شود، سپس محتوای آن را از فایل زیپ بیرون آورده و برای سیستم عامل ویندوز در آدرس زیر قرار دهید:

 My Documents\Arduino\libraries

و برای سیستم عامل مک در آدرس زیر قرار دهید:

~/Documents/Arduino/libraries

معمولاً تمام کاری که باید انجام دهیم همین است، اما هرگز مشکلی پیش نمی آید که مستندات و دستورالعمل های این کتابخانه را در وب سایت آن و در گیتهاب مورد مطالعه قرار دهیم. اکنون، بازی تاس ما کامل شده است. و در زیر، نسخه ی نهایی کدهای آن را مشاهده می کنید:

(تصویر 13، تاس باینری ما اکنون یک دکمه ی حدس زدن دارد)

 

#include <Bounce2.h>
const unsigned int LED_BIT0 = 12;
const unsigned int LED_BIT1 = 11;
const unsigned int LED_BIT2 = 10;
const unsigned int GUESS_BUTTON_PIN = 5;
const unsigned int START_BUTTON_PIN = 7;
const unsigned int BAUD_RATE = 9600;
const unsigned int DEBOUNCE_DELAY = 20;

int guess = 0;
Bounce start_button; 
Bounce guess_button; 

void setup() {
  pinMode(LED_BIT0, OUTPUT);
  pinMode(LED_BIT1, OUTPUT);
  pinMode(LED_BIT2, OUTPUT);  
  pinMode(START_BUTTON_PIN, INPUT);
  pinMode(GUESS_BUTTON_PIN, INPUT);
  start_button.attach(START_BUTTON_PIN); 
  start_button.interval(DEBOUNCE_DELAY);
  guess_button.attach(GUESS_BUTTON_PIN);
  guess_button.interval(DEBOUNCE_DELAY); 
  randomSeed(analogRead(A0));
  Serial.begin(BAUD_RATE);
}

void loop() {
  handle_guess_button();
  handle_start_button();
}

void handle_guess_button() {
  if (guess_button.update()) {
    if (guess_button.read() == HIGH) {
      guess = (guess % 6) + 1; 
      output_result(guess);
      Serial.print("Guess: ");
      Serial.println(guess);
    }
  }
}

void handle_start_button() {
  if (start_button.update()) {
    if (start_button.read() == HIGH) {
      const int result = random(1, 7);
      output_result(result);
      Serial.print("Result: ");
      Serial.println(result);
      if (guess > 0) {
        if (result == guess) {
          Serial.println("You win!");
          hooray();
        } else {
          Serial.println("You lose!");
        }
      }
      delay(2000);
      guess = 0;
    }
  }
}
void output_result(const long result) {
  digitalWrite(LED_BIT0, result & B001);
  digitalWrite(LED_BIT1, result & B010);
  digitalWrite(LED_BIT2, result & B100);
}

void hooray() {
  for (unsigned int i = 0; i < 3; i++) {
    output_result(7);
    delay(500);
    output_result(0);
    delay(500);
  }
}

مسلماً کدهای بالا کمی زیاد است، اما شما با بیشتر آنها از قبل آشنا هستید و کدهایی که جدید باشند، نسبتاً در آن کم هستند. در خط اول، ما کتابخانه ی Bounce2 را اضافه(include) کرده ایم، که قصد داریم از آن برای پرش زدایی در دو دکمه ی خود استفاده کنیم. سپس ما ثابت هایی را برای پین هایی که مورد استفاده قرار می دهیم تعریف کردیم، و یک متغیر نیز به نام guess برای نگهداری حدس فعلی فرد بازی کننده تعریف کردیم. در کتابخانه ی Bounce2 یک کلاس به نام Bounce وجود دارد، و ما باید برای هر دکمه ای که می خواهیم پرش زدایی کنیم، از این کلاس یک آبجکت ایجاد کنیم. این کار را در خط های 11 و 12 انجام داده ایم. در متد setup، ما تمام پین ها را مقدار دهی اولیه(initialize) کردیم و یک seed تصادفی را برای آنها تنظیم کردیم. ما همچنین یک پورت سریال را در خط 25، مقدار دهی اولیه کردیم، زیرا می خواهیم در خروجی برخی پیغام های دیباگ را نمایش دهیم. در خط های 20 تا 23، ما دو آبجکت Bounce را مقدار دهی اولیه کردیم. متد attach باعث می شود که یک آبجت Bounce به یک پین خاص متصل شود. با استفاده از متد interval ما می توانیم برای یک دکمه عمل پرش زدایی را انجام دهیم و میزان تاخیر(delay) را به میلی ثانیه مشخص کنیم.

در تابع loop، تعداد فراخوانی های تابع ها، به دو مورد کاهش یافته است. در بازی تاس دو نفره ی ما، یک نفر مسئول فشار دادن دکمه ی حدس(guess) است، و دیگری مسئول فشار دادن دکمه ی استارت است.در تابع handle_guess_button برای اوین بار ما از کلاس Bounce استفاده می کنیم. برای مشخص کردن حالت فعلی آبجکت guess_button ،ما باید متد update آن را فراخوانی کنیم. پس از آن، ما با استفاده از متد read، حالت فعلی آن را می خوانیم. اگر دکمه ی حدس ما فشار داده شده باشد، حالت آن به HIGH تنظیم می شود و ما به متغیر guess یک واحد اضافه می کنیم. برای اینکه مطمئن شویم که مقدار حدس(guess) ما همواره در محدوده ی 1 و 6 باقی می ماند، از عملگر پیمانه ی نظریه ی اعداد(modulus operator) یعنی علامت % در خط 36 استفاده می کنیم؛ این عملگر، دو مقدار را بر هم تقسیم می کند و باقی مانده ی صحیح(اعداد صحیح) آن را برمی گرداند. وقتی که در جلوی عملگر پیمانه، مقدار 6 را بنویسیم، مقادیری که برمی گرداند بین 0 و 5 خواهد بود، زیرا وقتی که ما هر عددی را بر 6 تقسیم کنیم، باقی مانده ی آن همواره بین 0 و 5 خواهد بود. و اگر کدها در خط شماره 36 مشاهده کنید، ما به این مقادیر عدد 1 را اضافه کرده ایم تا همواره مقادیری بین 1 و 6 داشته باشیم. در نهایت، ما حدس فعلی را با استفاده از سه ال ای دی در خروجی نشان می دهیم و این خروجی را در پورت سریال نیز نشان می دهیم. کاربرد دکمه ی استارت در handle_start_button دقیقا مانند کاربرد دکمه ی حدس(guess) است. وقتی که دکمه ی استارت(start) فشار داده می شود، ما نتیجه ی جدیدی را محاسبه می کنیم و آن را در پورت سریال(serial port) بعنوان خروجی نشان می دهیم.

سپس بررسی می کنیم که آیا کاربر یک حدس را وارد کرده است یا نه(حدس یا guess در این مورد باید بزرگتر از 0 باشد) و اینکه آیا کاربر نتیجه ی صحیحی را حدس زده است یا نه. در هر صورت، ما یک پیغام را در پورت سریال چاپ می کنیم و اگر کاربر، مقدار را درست حدس زده باشد، ما یک پیغام خوشحال کننده را به او نشان می دهیم. سپ متدhooray اجرا می شود. با اجرای این متد، هر سه ال ای دی چندین بار چشمک می زنند. سپس در خط 59، برای دو ثانیه به وسیله ی متد delay صبر می کنیم تا بازی دوباره شروع شود و سپس در خط 60 حدس فعلی را صفر می کنیم.

پس از اینکه ما این کدها را در آردوینو آپلود کردیم، سریال مانیتور IDE استارت خواهد شد؛ و وقتی که ما دکمه ی حدس را فشار دهیم، مقدار فعلی متغیر guess یا حدس را چاپ می کند. اکنون دکمه ی استارت را فشار دهید، خواهید دید که یک نتیجه ی جدید نشان داده می شود.در تصویر زیر، می توانید یک خروجی معمولی از تاس باینری را مشاهده کنید:

در این فصل، ما اولین پروژه ی پیچیده ی آردوینوی خود را به اتمام رساندیم. ما از یک بردبرد استفاده کردیم، از ال دی ها و دکمه ها استفاده کردیم، از مقاومت ها و سیم ها استفاده کردیم، و یک نرم افزار مهم و قابل توجه نوشتیم تا تمام این سخت افزارها با یکدیگر کار کنند.


استفاده از ال ای دی ها، و تاس مکعبی

ایجاد تاس باینری جذاب است، و یک پروژه ی آسان برای تازه کارها به حساب می آید. اما چرا یک تاس واقعی ایجاد نکنیم. آقای Steve Hoefera با استفاده از آردوینو یک خواننده ی تاس ایجاد کرده است که مفید و موثر است. او از پنج جفت فرستنده و گیرنده ی فروسرخ برای اسکن محیط یک تاس استفاده کرده است. این یک پروژه ی نسبتاً پیشرفته است و ما می توانیم چیزهای زیادی از آن بیاموزیم. مکعب ال ای دی ها، یک پروژه ی جالب دیگر است، یعنی ایجاد یک مکعب که از ال ای دی ها تشکیل شده است. برای دانلود فایل آموزشی این مکعب، اینجا کلیک کنید.برای مشاهده ی وب سایت سازنده به این آدرس مراجعه کنید.

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


در فصل بعد، یک برنامه ی پیچیده تر برای تولید کدهای مورس استفاده می کنیم. شما همچنین خواهید آموخت که چگونه کتابخانه های(libraries) آردوینوی خود را ایجاد کنید. با انجام این کار، می توانید این کتابخانه ها را با دیگران به اشتراک بگذارید.


 اگر پروژه به درستی کار نکرد چه کنیم؟

نترسید! وقتی که شما برای اولین بار با برد بردها کار می کنید، احتمالا برخی اشتباهات پیش می آیند. معمولاً مشکل اصلی این است که ما قطعات را به درستی متصل نکرده ایم. کمی زمان می برد تا تکنیک وصل کردن ال ای دی ها، مقاومت ها و دکمه ها را به بردبرد پیدا کنید. شما باید قطعات را محکم اما نه خیلی زیاد فشار دهید. ممکن است شما پایه های قطعات را خم کنید و آنها به درستی سر جای خود قرار نگیرند. معمولاً آسان تر است که ابتدا پایه های قطعات را کوتاه تر کنیم، سپس آنها را سر جای خود قرار دهیم.

وقتی که دارید پایه ها را کوتاه می کنید، برای محافظت از چشمان خود، عینک ایمنی بپوشید. وقتی که دارید قطعات را نصب می کنید، سعی کنید برخی را از قلم نیندازید. همچنین به این نکته توجه کنید که بعنوان مثال ال ای دی ها به یک جهت خاص برای نصب نیاز دارند. همچنین دکمه های فشاری نیز ممکن است با مشکل مواجه شوند. در صفحه ی 48، نگاه دقیقی به دکمه ی فشاری بیندازید و مطمئن شود که آنها را در جهت درست نصب کرده باشید.  حتی چیز های ساده ای مانند سیم های معمولی، می توانند باعث ایجاد مشکل شوند، به خصوص اگر آنها طول مناسبی نداشته باشند. اگر یک سیم بسیار کوتاه باشد و امکان داشته باشد که از سوکت خود خارج شود، بلافاصله آن را با یک سیم دیگر جایگزین کنید. چون سیم ها قیمت کمی دارند، نبایند باعث شوند وقت با ارزش ما به هدر برود و ما را درگیر دیباگ کردن یا اشکال زدایی مدار کنند. با اینکه این نادر است، اما ممکن است یکی از ال ای دی های ما خراب باشد. اگر هیچ یک از ترفندهای ذکر شده جواب نمی دهد، سعی کنید از ال ای دی های دیگری استفاده کنید.


 تمرین های آخر فصل

1. تاس باینری که ساختیم، وقتی به کار می آید که داریم با دوستان خود بازی می کنیم اما اکثر مردم ترجیح می دهند از تاس هایی که بیشتر مشهور هستند استفاده کنند. سعی کنید تاس باینری را به تاس دسیمال(ده دهی) با هفت ال ای دی تبدیل کنید. ال ای دی ها را مانند نقطه های روی تاس معمولی مرتب کنید.

 2.مقدار مقاومتی   که ما از آن برای محافظت از ال ای دی ها در این فصل استفاده کردیم، نسبتاً بزرگ است. در صفحه ی 241، بخش مقاومت ها را مطالعه کنید، و سپس از مقاومت هایی استفاده کنید که کوچکتر هستند، بعنوان مثال از مقاومت های 470Ω استفاده کنید. حالا آیا تغییری در نور ال ای دی ها مشاهده می کنید؟

3. از ال ای دی ها می توانیم برای کارهایی متفاوت با نمایش تاس باینری استفاده کنیم. در صورتی که شما به اندازه ی کافی ال ای دی دارید، به سادگی می توانید چیزهای دیگری نیز مثل یک ساعت باینری ایجاد کنید. شما از قبل به اندازه ی کافی در مورد الکترونیک و برنامه نویسی آردوینو می دانید پس می توانید ساعت باینری خود را ایجاد کنید. برای دانلود دستورالعمل ساعت باینری اینجا کلیک کنید. برای مشاهده ی سایت سازنده به این لینک مراجعه کنید. در این مورد یا در مورد چیزهای دیگری که می توانید با چند ال ای دی نمایش دهید فکر کنید.

 

 

 

 {module کمک نقدی به نویسنده}

  • بازدید: 762

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال