ساخت بازی گل یا پوچ با آردوینو Uno و کلید لمسی
بازی «گل یا پوچ» یکی از سرگرمیهای ساده و خاطرهانگیز ایرانی است. در این آموزش از آرمین کیت، نسخهای الکترونیکی از این بازی را با Arduino Uno، دو LED و دو کلید لمسی TTP223 میسازیم. با لمس کلید ریست، آردوینو بهصورت تصادفی یکی از دو سمت چپ یا راست را بهعنوان محل گل انتخاب میکند، اما LEDها خاموش میمانند. پس از حدس بازیکن، با لمس کلید «نمایش گل» فقط LED سمت برنده روشن میشود.
این پروژه برای آشنایی با ورودی دیجیتال، خروجی دیجیتال، تولید عدد تصادفی، مدیریت وضعیت برنامه و حذف اثر لرزش یا لمس چندباره مناسب است. کد کامل، جدول اتصالات و نکات رفع اشکال نیز در ادامه قرار داده شده.
ایده و نحوه کار پروژه گل یا پوچ
در این نسخه، دو LED نقش «دست چپ» و «دست راست» را دارند. ماژول لمسی اول برای شروع دور جدید و مخفیکردن گل استفاده میشود و ماژول دوم پاسخ را نمایش میدهد. روند بازی به این ترتیب است:
- بازیکن کلید لمسی ریست را لمس میکند.
- آردوینو با تابع
random()یکی از دو سمت را انتخاب میکند. - هر دو LED برای لحظهای با هم چشمک میزنند تا شروع دور جدید تأیید شود؛ این چشمک پاسخ را لو نمیدهد.
- بازیکن سمت چپ یا راست را حدس میزند.
- با لمس کلید نمایش گل، LED سمت انتخابشده روشن میشود.
- برای دور بعد، دوباره کلید ریست لمس میشود.
قطعات مورد نیاز برای ساخت پروژه

| قطعه | تعداد | کاربرد |
|---|---|---|
| برد Arduino Uno | ۱ عدد | کنترل منطق بازی |
| ماژول لمسی TTP223 | ۲ عدد | ریست و نمایش گل |
| LED پنج میلیمتری | ۲ عدد | نمایش سمت چپ و راست |
| مقاومت ۲۲۰ اهم | ۲ عدد | محدودکردن جریان LED |
| بردبورد کوچک | ۱ عدد | مونتاژ بدون لحیمکاری |
| سیم جامپر نری به نری | حدود ۱۲ رشته | اتصال قطعات |
| کابل USB آردوینو | ۱ عدد | آپلود برنامه و تغذیه |
رنگ LEDها اختیاری است. برای جذابیت بیشتر میتوانید از یک LED سبز و یک LED آبی استفاده کنید؛ فقط هر LED باید مقاومت سری مخصوص خود را داشته باشد.
جدول اتصالات و سیمکشی مدار

| پایه قطعه | اتصال به Arduino Uno |
|---|---|
| SIG ماژول ریست | D2 |
| SIG ماژول نمایش گل | D3 |
| VCC هر دو ماژول | 5V |
| GND هر دو ماژول | GND |
| آند LED سمت چپ | D8 از مسیر مقاومت ۲۲۰ اهم |
| آند LED سمت راست | D9 از مسیر مقاومت ۲۲۰ اهم |
| کاتد هر دو LED | GND |
مراحل ساخت بازی گل یا پوچ با Arduino Uno
۱. قراردادن LEDها روی بردبورد
دو LED را با فاصله روی بردبورد قرار دهید تا مشخص باشد کدامیک سمت چپ و کدامیک سمت راست است. پایه بلندتر LED معمولاً آند یا پایه مثبت است. پایه کوتاهتر و سمت تخت بدنه LED، کاتد یا پایه منفی را نشان میدهد.
۲. اتصال مقاومتها
بین پایه D8 و آند LED چپ یک مقاومت ۲۲۰ اهم قرار دهید. همین کار را بین D9 و آند LED راست انجام دهید. کاتد هر دو LED را به خط منفی بردبورد متصل کنید و این خط را به GND آردوینو وصل کنید.
۳. اتصال ماژولهای TTP223
هر ماژول سه پایه اصلی دارد: VCC، GND و SIG یا OUT. پایههای تغذیه هر دو ماژول را به 5V و GND مشترک وصل کنید. خروجی ماژول ریست به D2 و خروجی ماژول نمایش گل به D3 متصل میشود.
۴. بررسی اتصال زمین مشترک
تمام قطعات باید زمین مشترک داشته باشند. نبودن GND مشترک یکی از رایجترین علتهای روشننشدن LED یا عملکرد نامنظم سنسورهای لمسی است.
کد کامل پروژه گل یا پوچ آردوینو
کد زیر را در Arduino IDE قرار دهید، نوع برد را روی Arduino Uno تنظیم کنید، پورت صحیح را انتخاب کنید و سپس برنامه را روی برد آپلود کنید.
const byte RESET_TOUCH_PIN = 2;
const byte REVEAL_TOUCH_PIN = 3;
const byte LEFT_LED_PIN = 8;
const byte RIGHT_LED_PIN = 9;
const unsigned long DEBOUNCE_MS = 50;
enum GameState : byte {
WAITING_FOR_RESET,
FLOWER_HIDDEN,
FLOWER_REVEALED
};
GameState gameState = WAITING_FOR_RESET;
byte flowerSide = 0;
bool lastResetReading = LOW;
bool stableResetState = LOW;
unsigned long resetChangedAt = 0;
bool lastRevealReading = LOW;
bool stableRevealState = LOW;
unsigned long revealChangedAt = 0;
void setLeds(bool leftOn, bool rightOn) {
digitalWrite(LEFT_LED_PIN, leftOn ? HIGH : LOW);
digitalWrite(RIGHT_LED_PIN, rightOn ? HIGH : LOW);
}
void startNewRound() {
flowerSide = random(0, 2);
gameState = FLOWER_HIDDEN;
setLeds(false, false);
setLeds(true, true);
delay(120);
setLeds(false, false);
}
void revealFlower() {
if (gameState != FLOWER_HIDDEN) return;
gameState = FLOWER_REVEALED;
setLeds(flowerSide == 0, flowerSide == 1);
}
bool roseEdge(byte pin, bool &lastReading, bool &stableState,
unsigned long &changedAt) {
const bool reading = digitalRead(pin);
if (reading != lastReading) {
lastReading = reading;
changedAt = millis();
}
if ((millis() - changedAt) >= DEBOUNCE_MS &&
reading != stableState) {
stableState = reading;
return stableState == HIGH;
}
return false;
}
void setup() {
pinMode(RESET_TOUCH_PIN, INPUT);
pinMode(REVEAL_TOUCH_PIN, INPUT);
pinMode(LEFT_LED_PIN, OUTPUT);
pinMode(RIGHT_LED_PIN, OUTPUT);
setLeds(false, false);
randomSeed(analogRead(A0) ^ micros());
}
void loop() {
if (roseEdge(RESET_TOUCH_PIN, lastResetReading,
stableResetState, resetChangedAt)) {
startNewRound();
}
if (roseEdge(REVEAL_TOUCH_PIN, lastRevealReading,
stableRevealState, revealChangedAt)) {
revealFlower();
}
}
نسخه کاملتر همین برنامه با توضیحات و خروجی Serial در فایل gol-ya-pooch-arduino.ino بسته دانلود قرار دارد.
توضیح بخشهای مهم برنامه
تعریف پایهها با نوع byte
شماره پایهها تغییر نمیکند؛ بنابراین بهصورت ثابت تعریف شدهاند. نوع byte نیز برای نگهداری اعداد کوچک مناسب است.
مدیریت وضعیت بازی
سه وضعیت برای بازی در نظر گرفته شده است: انتظار برای شروع، مخفیبودن گل و نمایش پاسخ. این روش مانع میشود کاربر قبل از شروع دور جدید، پاسخ نامعتبری ببیند یا با لمس دوباره کلید نمایش، منطق برنامه بههم بریزد.
انتخاب تصادفی سمت گل
دستور random(0, 2) فقط عدد صفر یا یک تولید میکند. صفر به LED سمت چپ و یک به LED سمت راست اختصاص یافته است. پایه A0 در این پروژه آزاد میماند و نویز کوچک آن برای مقداردهی اولیه مولد عدد شبهتصادفی استفاده میشود.
دیبانس و تشخیص یک لمس
تابع roseEdge() تنها لحظه تبدیل خروجی سنسور از LOW به HIGH را معتبر میداند و ۵۰ میلیثانیه برای پایدارشدن ورودی صبر میکند. در نتیجه نگهداشتن انگشت روی سنسور، فرمان را بارها اجرا نمیکند.
روش اجرا و آزمایش پروژه
- پس از آپلود کد، هر دو LED باید خاموش باشند.
- ماژول ریست را یکبار لمس کنید؛ هر دو LED با هم برای لحظهای چشمک میزنند.
- یکی از دو سمت را حدس بزنید.
- ماژول نمایش گل را لمس کنید؛ فقط یکی از LEDها روشن میشود.
- برای شروع دور جدید، دوباره ریست را لمس کنید.
برای بررسی دقیقتر میتوانید Serial Monitor را با سرعت 9600 باز کنید. نسخه کامل فایل برنامه، شروع دور و سمت انتخابشده را در Serial Monitor نمایش میدهد. این خروجی برای عیبیابی است و در زمان بازی بهتر است فقط سازنده آن را ببیند.
رفع اشکالهای رایج
سنسور لمسی هیچ واکنشی ندارد
ابتدا VCC و GND را بررسی کنید. سپس مطمئن شوید پایه SIG ماژول ریست به D2 و پایه SIG ماژول نمایش به D3 وصل شده است. LED کوچک روی خود ماژول TTP223 معمولاً هنگام لمس روشن میشود؛ این نشانه به تشخیص مشکل کمک میکند.
LED روشن نمیشود
جهت LED را بررسی کنید. آند باید از مسیر مقاومت به پایه دیجیتال و کاتد به GND متصل باشد. همچنین مقاومت نباید بهاشتباه در دو سوراخی قرار گرفته باشد که روی بردبورد به یک ردیف مشترک وصلاند.
LED همیشه روشن است
سیم متصل به D8 یا D9 و ردیفهای بردبورد را بررسی کنید. اگر LED به 5V وصل شده باشد، کنترل آن از طریق برنامه ممکن نیست. در اتصال صحیح، LED فقط از پایه دیجیتال و مقاومت تغذیه میشود.
با یک لمس چند فرمان اجرا میشود
از نسخه کامل کد موجود در بسته استفاده کنید؛ این نسخه تشخیص لبه و دیبانس دارد. همچنین سیمهای سنسور را کوتاه نگه دارید و زمین مشترک را فراموش نکنید.
همیشه یک سمت انتخاب میشود
پایه A0 باید در این مدار آزاد باشد. اگر A0 به ولتاژ ثابتی متصل شده است، آن را جدا کنید. چند بار تکرار یک نتیجه میتواند کاملاً طبیعی باشد؛ نتیجه را در تعداد زیادی دور بررسی کنید.
ایدههایی برای توسعه پروژه
- اضافهکردن بازر برای پخش صدای شروع و اعلام پاسخ
- استفاده از نمایشگر OLED برای نمایش امتیاز دو بازیکن
- افزودن سه یا چهار LED برای ساخت نسخه چندگزینهای
- ساخت قاب با چاپ سهبعدی و نصب سنسورها زیر سطح غیرفلزی نازک
- اضافهکردن LED RGB برای افکت رنگی شروع بازی
- ثبت تعداد بردها در EEPROM تا پس از قطع برق حفظ شوند
سؤالات متداول
آیا میتوان بهجای Arduino Uno از Arduino Nano استفاده کرد؟
بله. منطق برنامه یکسان است و فقط باید همان پایههای دیجیتال یا پایههای جایگزین را طبق کد متصل کنید. Nano برای ساخت نسخه کوچک و قابل نصب داخل جعبه انتخاب مناسبی است.
آیا ماژول TTP223 با 5 ولت کار میکند؟
ماژولهای رایج TTP223 معمولاً در محدوده ولتاژ مناسب Arduino Uno کار میکنند. بااینحال مشخصات نوشتهشده روی برد یا صفحه محصول ماژول خود را بررسی کنید و VCC را اشتباه به پایه سیگنال متصل نکنید.
چرا برای هر LED مقاومت جداگانه لازم است؟
مقاومت جریان LED را محدود و از LED و پایه خروجی آردوینو محافظت میکند. استفاده از یک مقاومت مشترک برای دو LED میتواند باعث تغییر روشنایی و رفتار نامطمئن شود.
آیا تکرار سمت چپ یا راست نشانه ایراد در تصادفیبودن است؟
خیر. در یک انتخاب تصادفی واقعی، تکرار نتیجه امکانپذیر است. برای ارزیابی بهتر باید نتیجه را در تعداد زیادی دور بررسی کرد، نه فقط دو یا سه بار.
جمعبندی
در این آموزش یک پروژه گل یا پوچ با آردوینو ساختیم که با دو کلید لمسی کنترل میشود و پاسخ را روی دو LED نمایش میدهد. با وجود تعداد کم قطعات، این مدار مفاهیم مهمی مانند ورودی و خروجی دیجیتال، عدد تصادفی، مدیریت وضعیت و دیبانس را بهشکل عملی آموزش میدهد. پس از آزمایش نسخه پایه، میتوانید آن را با بازر، نمایشگر و سیستم امتیازدهی کاملتر کنید.
پیشنهاد آرمین کیت: قطعات را ابتدا روی بردبورد آزمایش کنید و پس از اطمینان از عملکرد مدار، برای ساخت نسخه نهایی سراغ برد سوراخدار یا قاب اختصاصی بروید.