در این مقاله قصد داریم در مورد ساخت بازی با آردوینو صحبت کنیم. آردوینو به عنوان یک پلتفرم سختافزاری و نرمافزاری متنباز، امکان ساخت بازیهای ساده و خلاقانه را فراهم میکند. با استفاده از بردهای آردوینو، نمایشگرهای LCD، دکمهها، جویاستیکها و سایر قطعات الکترونیکی، میتوان بازیهایی مانند پینگپنگ، حدس اعداد و بازیهای مبتنی بر متن را طراحی و پیادهسازی کرد. این فرآیند شامل برنامهنویسی با زبان ++C در محیط آردوینو IDE، اتصال قطعات به برد آردوینو و تست و رفع اشکالات است. برای آموزشهای بیشتر در این زمینه میتوانید به مجله پیاستور مراجعه کنید.
آردوینو چیست؟
آردوینو یک پلتفرم متنباز سختافزاری و نرمافزاری است که بهخصوص برای توسعه پروژههای الکترونیکی و برنامهنویسی طراحی شده است. این پلتفرم معمولاً شامل یک بورد میکروکنترلر و یک محیط برنامهنویسی (IDE) است که به کاربران این امکان را میدهد تا به راحتی طرحهای خود را برنامهریزی و آزمایش کنند. آردوینو به خاطر سادگی و قابلیت دسترسیاش، به شدت در بین مهندسان و علاقهمندان به الکترونیک محبوب است و در پروژههای متنوعی به کار میرود.
کاربردهای آردوینو در بازیسازی
آردوینو میتواند به شیوههای مختلفی در بازیسازی مورد استفاده قرار گیرد. در زیر به برخی از این کاربردها اشاره میشود:
- ساخت کنترلرها و دستههای بازی: آردوینو میتواند به عنوان یک کنترلر بازی سفارشی عمل کند. با اتصال دکمهها، پیچها و حسگرها به آردوینو، میتوان دستههایی ساخت که کارکردهای خاصی دارند و بازیکن میتواند از آنها در بازیها استفاده کند.
- بازیهای تعاملی با استفاده از سنسورها: آردوینو این امکان را فراهم میکند که با استفاده از حسگرهای حرکتی، نور، صدا و دیگر حسگرها بازیهایی بسازید که با حرکت یا شرایط محیطی بازیکن واکنش نشان دهند. برای مثال، یک بازی میتواند به تغییرات نور پاسخ دهد و یا حرکات بازیکن را تشخیص دهد و بر اساس آن عمل کند.
- ایجاد محیطهای بازی الکترونیکی: با استفاده از آردوینو، میتوانید محیطهای بازی الکترونیکی طراحی کنید. به عنوان مثال، میتوانید یک بازی رومیزی الکترونیکی بسازید که دارای LEDهای نشانهگذاری، صدا و حسگرهای پاسخدهنده به حرکات بازیکن باشد.
- بازیهای آموزشی: آردوینو میتواند برای ساخت بازیهای آموزشی موثر استفاده شود. با ایجاد بازیهایی که به یادگیری مهارتهای خاص کمک میکنند، ذهن جوانان را تشویق به یادگیری مفاهیم علمی و ریاضی میکند.
- بازیهای واقعیت مجازی (VR) و واقعیت افزوده (AR): آردوینو میتواند در ترکیب با تکنولوژیهای VR و AR به کار رود. به عنوان مثال، میتوان حسگرهایی را به کار گرفت که تعاملات فیزیکی با محیطهای مجازی را فراهم میکند.
- مدلسازی و شبیهسازی: آردوینو میتواند برای ساخت شبیهسازهای واقعی برای بازیها یا برنامههای آموزشی استفاده شود. این شبیهسازها میتوانند شامل تعاملات فیزیکی و سنسورهایی باشند که تجسم بصری و صوتی را به تجربه بازی اضافه میکنند.
ساخت بازی با آردوینو چگونه است؟
ساخت بازی با آردوینو فرآیندی جذاب و خلاقانه است که شامل مراحل زیر میشود:
برنامهریزی و ایدهپردازی
- انتخاب نوع بازی: تصمیم بگیرید چه نوع بازی میخواهید بسازید. بازیهای سادهای مانند حدس عدد، پینگپنگ، یا بازیهای مبتنی بر متن گزینههای خوبی برای شروع هستند.
- تعیین قوانین بازی: قوانین بازی را مشخص کنید. چه مراحلی دارد؟ چگونه امتیازدهی میشود؟ چه زمانی بازی تمام میشود؟
- طراحی رابط کاربری: چطور میخواهید بازی را نمایش دهید؟ از چه نمایشگری استفاده میکنید؟ چگونه بازیکن با بازی تعامل میکند (دکمه، جویاستیک، سنسور)؟
تهیه سختافزار
- برد آردوینو: یک برد آردوینو مناسب (مانند Arduino Uno، Nano یا Mega) انتخاب کنید.
نمایشگر: یک نمایشگر برای نمایش اطلاعات بازی (LCD، LED Matrix، OLED).
ورودیها: دکمهها، جویاستیکها یا سنسورها برای تعامل بازیکن با بازی.
سایر قطعات: مقاومتها، سیمهای جامپر، بازر (برای صدا) و …
اتصال قطعات
قطعات الکترونیکی را طبق شماتیک مناسب به برد آردوینو متصل کنید. شماتیکها معمولاً در آموزشها و پروژههای آنلاین یافت میشوند.
برنامهنویسی
- نصب Arduino IDE: نرمافزار Arduino IDE را روی کامپیوتر خود نصب کنید.
- نوشتن کد: با استفاده از زبان ++C کد بازی را بنویسید. کد باید شامل موارد زیر باشد:
- تعریف متغیرها: متغیرهایی برای ذخیره امتیازات، موقعیت اشیاء، زمان و سایر اطلاعات بازی.
- خواندن ورودی: خواندن ورودی از دکمهها، جویاستیک یا سنسورها.
- پردازش منطق بازی: پیادهسازی قوانین بازی.
- نمایش خروجی: نمایش اطلاعات بازی روی نمایشگر.
- کنترل زمان: استفاده از تابع ()delay یا توابع پیشرفتهتر برای کنترل سرعت بازی و ایجاد تاخیرها.
تست و عیبیابی
کد را روی برد آردوینو آپلود کنید.
بازی را تست کنید و اشکالات را برطرف کنید. ممکن است لازم باشد کد خود را تغییر دهید یا اتصالات سختافزاری را بررسی کنید.
بهبود و توسعه
پس از اینکه بازی به درستی کار کرد، میتوانید آن را بهبود دهید و ویژگیهای جدیدی اضافه کنید. مثلاً:
- افزایش سطح دشواری
- اضافه کردن صدا
- بهبود گرافیک
- ذخیره امتیازات
مزایا و معایب استفاده از آردوینو در ساخت بازی
استفاده از آردوینو در ساخت بازیها دارای مزایا و معایب خاصی است. در ادامه به بررسی این موارد میپردازیم:
مزایا:
- سادگی و دسترسی: آردوینو یک میکروکنترلر ساده و کاربرپسند است که به راحتی میتوان با آن کار کرد و برای مبتدیان مناسب است.
- پشتیبانی از کتابخانهها: آردوینو دارای مجموعهای از کتابخانههای آماده است که به شما امکان میدهد به سرعت امکانات سختافزاری را پیادهسازی کنید.
- هزینه پایین: در مقایسه با سایر میکروکنترلرها و سیستمهای توسعه بازی، آردوینو هزینهبر نیست و میتواند به عنوان یک گزینه اقتصادی برای پروژههای کوچک مورد استفاده قرار گیرد.
- تنوع در سختافزار: آردوینو از سنسورها و ماژولهای مختلف پشتیبانی میکند، بنابراین میتوانید امکانات متنوعی را در بازیهای خود بگنجانید.
- جامعه بزرگ: داشتن یک جامعه بزرگ از کاربران و توسعهدهندگان میتواند به شما در حل مشکلات و پیدا کردن راهحلها کمک کند، زیرا بسیاری از سوالات و مسائل قبلاً حل شدهاند.
معایب:
- محدودیت در پردازش: آردوینو به طور کلی دارای قدرت پردازش پایینتری نسبت به دیگر پلتفرمهای توسعه بازی (مثل Raspberry Pi) است، که میتواند محدودیتهایی در پیادهسازی بازیها با گرافیک سنگین یا پردازشهای پیچیده ایجاد کند.
- عدم پشتیبانی از گرافیک پیشرفته: آردوینو به طور ذاتی به نمایشگرهای پایه و گرافیک ساده محدود است و نمیتواند به راحتی بازیهای 3D یا گرافیک پیشرفته را پیادهسازی کند.
- محدودیت در حافظه: آردوینو دارای حافظه محدود است که میتواند در مواردی که به ذخیرهسازی زیادی نیاز دارید، مشکلساز باشد.
- زمان پاسخگویی: ممکن است زمان پاسخگویی در تعاملات با سنسورها و ورودیها به دلیل محدودیت در پردازش کاهش یابد.
- نیاز به برنامهنویسی: ساخت بازیها با آردوینو نیازمند دانش برنامهنویسی است و ممکن است برای برخی افراد چالشبرانگیز باشد.
نصب نرمافزار Arduino IDE (نسخه ویندوز)
دانلود نرمافزار Arduino IDE:
جدیدترین نسخه را از این لینک [+] دانلود کنید. توصیه میشود از فایل نصب کننده (exe.) استفاده کنید؛ زیرا بهطور خودکار همه چیز لازم برای استفاده از Arduino IDE، از جمله درایورها را نصب میکند. اگر از فایل فشرده (Zip) استفاده کنید، باید درایورها را بهصورت دستی نصب کنید. فایل فشرده (Zip) در صورتی مفید است که بخواهید نصب قابل حمل داشته باشید.
وقتی دانلود تمام شد، نصب را شروع کنید و در صورت دریافت هشدار از سیستم عامل، لطفا اجازه دهید فرآیند نصب درایورها انجام شود. اجزای مورد نظر برای نصب را انتخاب کنید.
دایرکتوری نصب را انتخاب کنید.
نصب در حال انجام است.
نصب آردوینو با موفقیت به پابان رسید و حال میتوانیم از آردوینو استفاده کنیم.
ساخت بازی با آردوینو و پردازش
بازی را با پردازش بسازید و کنترلر آن را با استفاده از شتابسنج و یک دکمه طراحی کنید.
قطعات و لوازم مورد نیاز
- مدول شتابسنج و ژیروسکوپ ۳ محوره GY-521 MPU-6050 برای آردوینو
- برد آردوینو UNO
- کلید دکمهای ۱۲ میلیمتری
نرمافزارها و پلتفرمها:
- پردازش
- نرمافزار آرنینو IDE
شرح پروژه:
ابتدا کنترلر بازی را با استفاده از یک دکمه و یک شتابسنج میسازیم. من از مدول GY-521 استفاده کردهام، بنابراین اگر از شتابسنج دیگری استفاده میکنید، باید قسمتی از کد را تغییر دهید.
اتصالات شتابسنج و دکمه:
- VCC به ۵ ولت
- GND به زمین
- SCL به پین A5
- SDA به پین A4
- دکمه را به پین دیجیتال ۷ و از طریق یک مقاومت ۱۰ کیلو اهم به زمین وصل کنید. سپس منبع تغذیه را به ۵ ولت وصل کنید.
برای ایجاد بازی از پردازش استفاده میکنیم، که میتوانید آن را از این لینک [+] دانلودکنید ابتدا کد آردوینو را اجرا کنید. سپس کد پردازش را اجرا نمایید.
منتظر بمانید تا شتابسنج تثبیت شود. سپس دکمه را فشار دهید تا بازی شروع شود. با حرکت دادن شتابسنج در محور X، پدل حرکت خواهد کرد.
به پورت توجه کنید:
کد پردازش را بررسی کنید. ممکن است لازم باشد دستور زیر را تغییر دهید:
arduinoPort=new Serial(this, "COM3", 19200);
کد بازی آردوینو:
#include <Bounce.h> #include <Wire.h> const unsigned int Button_Pin=7; const int MPU=0x68; int16_t AcX,AcY,AcZ; const int NUM_AXES=3; const int BUFFER_SIZE=16; int buffer[NUM_AXES][BUFFER_SIZE]; int buffer_pos[NUM_AXES]={0}; Bounce button(Button_Pin, 20); void setup(){ Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(19200); pinMode(Button_Pin, INPUT); } int get_axis(const int axis){ delay(1); buffer[axis][buffer_pos[axis]]=Wire.read()<<8|Wire.read(); buffer_pos[axis]=(buffer_pos[axis]+1)%BUFFER_SIZE; long sum=0; for(int i=0; i<BUFFER_SIZE; i++) sum+= buffer[axis][i]; return round(sum/BUFFER_SIZE); } int get_x(){return get_axis(0);} int get_y(){return get_axis(1);} int get_z(){return get_axis(2);} void loop(){ Wire.beginTransmission(MPU); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU,6,true); Serial.print(get_x()); Serial.print(" "); Serial.print(get_y()); Serial.print(" "); Serial.print(get_z()); Serial.print(" "); if(button.update()) Serial.println(button.read()==HIGH ? "1" : "0"); else Serial.println("0"); delay(50); }
کد پردازش:
import processing.serial.*; Serial arduinoPort; final int COLUMNS=7; final int ROWS=4; final int BALL_RADIUS=8; final int BALL_DIAMETER=BALL_RADIUS*2; final int MAX_VELOCITY=8; final int MARGIN=10; final int PADDLE_WIDTH=60; final int PADDLE_HEIGHT=15; final int BRICK_WIDTH=40; final int BRICK_HEIGHT=20; final int HEIGHT=300; final int LINE_FEED=10; int px, py; int vx, vy; int xpos=150; int[][] bricks= new int[COLUMNS][ROWS]; boolean buttonPressed=false; boolean paused=true; boolean done=true; void setup(){ size(300, 300); noCursor(); textFont(loadFont("Verdana-Bold-36.vlw")); initGame(); println(Arduino.list()); arduinoPort=new Serial(this, "COM3", 19200); arduinoPort.bufferUntil(10); } void initGame(){ initBricks(); initBall(); } void initBricks(){ for(int x=0; x<COLUMNS; x++) for(int y=0; y<ROWS; y++) bricks[x][y]=1; } void initBall(){ px=width/2; py=height/2; vx=int(random(-MAX_VELOCITY, MAX_VELOCITY)); vy=-2; } void draw(){ background(0); stroke(255); strokeWeight(3); done=drawBricks(); if(done){ paused=true; printWinMessage(); } if(paused) printPauseMessage(); else updateGame(); drawBall(); drawPaddle(); } boolean drawBricks(){ boolean allEmpty=true; for(int x=0; x<COLUMNS; x++){ for(int y=0; y<ROWS; y++){ if(bricks[x][y]>0){ allEmpty=false; fill(0, 0, 100+y*8); rect( MARGIN+x*BRICK_WIDTH, MARGIN+y*BRICK_HEIGHT, BRICK_WIDTH, BRICK_HEIGHT ); } } } return allEmpty; } void drawBall(){ strokeWeight(1); fill(128, 0, 0); ellipse(px, py, BALL_DIAMETER, BALL_DIAMETER); } void drawPaddle(){ int x=xpos - PADDLE_WIDTH/2; int y=height - 25; strokeWeight(1); fill(128); rect(x, y, 60, 15); } void printWinMessage(){ fill(225); textSize(36); textAlign(CENTER); text("YOU WIN", width/2, height*2/3); } void printPauseMessage(){ fill(128); textSize(16); textAlign(CENTER); text("Press button to continue", width/2, height*5/6); } void updateGame(){ if(ballDropped()){ initBall(); paused=true; } else{ checkBrickCollision(); checkWallCollision(); checkPaddleCollision(); px+=vx; py+=vy; } } boolean ballDropped(){ return py+vy> height - BALL_RADIUS; } boolean inXRange(final int row, final int v){ return px + v > row*BRICK_WIDTH&& px+v < (row+1)*BRICK_WIDTH+BALL_DIAMETER; } boolean inYRange(final int col, final int v){ return py+v> col*BRICK_HEIGHT&& py+v< (col+1)*BRICK_HEIGHT+BALL_DIAMETER; } void checkBrickCollision(){ for(int x=0; x<COLUMNS; x++){ for(int y=0; y<ROWS; y++){ if(bricks[x][y]>0){ if(inXRange(x, vx)&& inYRange(y, vy)){ bricks[x][y]=0; if(inXRange(x, 0)) vy=-vy; if(inYRange(y, 0)) vx=-vx; } } } } } void checkWallCollision(){ if(px+vx < BALL_RADIUS || px+vx > width - BALL_RADIUS) vx=-vx; if(py+vy < BALL_RADIUS || py+vy > height - BALL_RADIUS) vy=-vy; } void checkPaddleCollision(){ final int cx=xpos; if(py+vy >=height - (PADDLE_HEIGHT + MARGIN + 6)&& px >= cx - PADDLE_WIDTH/2 && px <= cx + PADDLE_WIDTH/2) { vy=-vy; vx=int( map( px - cx, -(PADDLE_WIDTH/2), PADDLE_WIDTH/2, -MAX_VELOCITY, MAX_VELOCITY ) ); } } void serialEvent(Serial port){ final String arduinoData=port.readStringUntil(LINE_FEED); if(arduinoData!=null){ println(arduinoData); final int[] data=int(split(trim(arduinoData), ' ')); if(data.length==4){ buttonPressed=(data[3]==1); if(buttonPressed){ paused= !paused; if(done){ done=false; initGame(); } } if(!paused) xpos=int(map(data[0]-2000, 252, 443, 0, 300)); } } }
پروژه ۱: ساخت بازی حدس عدد
در این بازی، آردوینو یک عدد تصادفی بین ۱ تا ۱۰۰ را تولید میکند و کاربر باید آن عدد را حدس بزند. بعد از هر حدس، آردوینو به کاربر میگوید که حدس او بالا (بیشتر) یا پایین (کمتر) از عدد تصادفی است.
سختافزار مورد نیاز:
- آردوینو UNO
- نمایشگر LCD (یا استفاده از Serial Monitor)
- چند دکمه فشاری (برای دریافت حدسها)
کد برنامه:
#include <LCD.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // تنظیمات نمایشگر LCD int randomNumber; int userGuess; int attempts = 0; void setup() { lcd.begin(); randomNumber = random(1, 101); // عدد تصادفی بین ۱ تا ۱۰۰ lcd.print("Guess the number!"); } void loop() { if (Serial.available()) { userGuess = Serial.parseInt(); // خواندن حدس کاربر attempts++; // بررسی جواب کاربر if (userGuess == randomNumber) { lcd.clear(); lcd.print("Correct! Attempts: "); lcd.print(attempts); delay(2000); attempts = 0; randomNumber = random(1, 101); // تولید عدد جدید lcd.clear(); lcd.print("Guess the number!"); } else if (userGuess < randomNumber) { lcd.print("Too Low!"); } else { lcd.print("Too High!"); } delay(1000); lcd.clear(); lcd.print("Guess the number!"); } }
پروژه ۲: ساخت بازی دودویی
این پروژه شامل یک بازی دودویی است که با استفاده از یک joystick و LEDها پیادهسازی شده است. کاربر باید با استفاده از joystick مسیر را پیدا کند تا به LED متصل شده حرکت کند.
سختافزار مورد نیاز:
- آردوینو UNO
- Joystick Module
- چند عدد LED
- مقاومتها
#include <Joystick.h> Joystick joystick(A0, A1); // پینهای مربوط به joystick int ledPin = 9; // پین LED void setup() { pinMode(ledPin, OUTPUT); joystick.begin(); } void loop() { int xValue = joystick.getX(); // مقدار x از joystick int yValue = joystick.getY(); // مقدار y از joystick // حرکت LED با توجه به مقدار x و y if (xValue > 512) { digitalWrite(ledPin, HIGH); delay(100); digitalWrite(ledPin, LOW); } }
سخن آخر
ساخت بازی با آردوینو، با وجود محدودیتهای سختافزاری، میتواند تجربهای هیجانانگیز و آموزنده باشد. از طراحی الگوریتم بازی گرفته تا کد نویسی و اتصال به سخت افزار، فرایند کامل ساخت یک بازی، درک عمیقی از مباحث الکترونیک، برنامهنویسی و طراحی بازی به شما میبخشد. با تمرین و خلاقیت، میتوانید از آردوینو به عنوان ابزاری قدرتمند برای خلق پروژههای خلاقانه و تعاملی استفاده کنید. این فرایند به خصوص برای علاقهمندان به الکترونیک و بازیهای تعاملی، تجربهای ارزشمند و پرکاربرد خواهد بود.