مقدمه
دسته های کنترلی سابقه طولانی در زندگی روزمره ما دارند، از کنترل ماشین های کنترلی و کوادکوپترها گرفته تا کنسول های بازی و … همگی از دسته های کنترلی بیسیم یا سیم استفاده می کنند. در این آموزش نحوه اتصالات و استفاده از دسته بیسیم کنسول بازی PS2 را با آردوینو خواهید آموخت.
آنچه در این آموزش یاد می گیرید
- اطلاعات کلی راجع به دسته کنترلر PS2
- نحوه اتصال دسته بیسیم PS2 به آردوینو
- نحوه استفاده از دسته بیسیم PS2 با آردوینو
ویژگی های دسته بازی PS2
کنسول های بازی سونی یا همان Play station برای همه آشنا هستند و احتمالا حداقل یک بار دسته بازی این کنسول ها را در دستتان گرفتید. دسته های بازی کنسول های سونی بصورت استاندارد دارای 12 کلید انالوگ حساس به میزان فشار(چهار کلید انتخاب جهت، چهار کلید عملیاتی ضربدر، مثلث، دایره و مربع و L1,L2,R1,R2)، پنج کلید دیجیتال (L3,R3,SELECT,START,MODE) و دوجوی استیک آنالوگ می باشند.
در داخل دسته دو عدد موتور تعبیه شده که بعلت عدم بالانس بودن موتورها قابلیت ایجاد لرزش را ایجاد می کنند.
مدل بیسیم این دسته ها با فرکانس 2.4 گیگاهرتز کار می کند و فاصله ای حدود 10 متر را پوشش می دهد و یک نشانگر نوری برای دریافت و ارسال اطلاعات دارد، همچنین این دسته برای تغذیه تنها به سه عدد باتری AAA (در بعضی مدل ها دو عدد باتری AAA) نیاز دارد.
اما از دسته PS2 در چه پروژه هایی می توانید استفاده کنید؟
- کنترل ربات های چرخدار و ماشین های کنترلی
- کنترل بازوهای رباتیک
- کنترل دوربین
- کنترل ربات های پرنده
- و …
نحوه اتصال دسته PS2 به آردوینو
گیرنده دسته بیسیم PS2 دارای 9 پایه می باشد:
- Data: خط مستر برای ارسال دیتا به اسلیو، معادل MOSI
- Command: خط اسلیو برای ارسال دیتا به مستر، معادل MISO
- Vibration: تغذیه موتورهای لرزاننده (vibration motors) 7.2 تا 9 ولت
- Ground: زمین مدار
- Vcc: تغذیه مثبت مدار، اتصال به +3.3 ولت
- Attention: معادل پایه CS یا Chip Select برای صدا زدن اسلیو و اماده سازی برقراری ارتباط
- Clock: تامین کننده کلاک ارتباط و معادل با SCK
- No Connection: بدون استفاده
- Acknowledge: سیگنال
- Acknowledge از کنترلر به PS2
نحوه استفاده از دسته بیسیم PS2 با آردوینو
برای استفاده از دسته بیسیم PS2 در پروژه های آردوینو کافیست کلیدهای دسته را به آردوینو بشناسانید و بعد از آن با توجه به پروژه ی خود، عملیات مناسب را برای هر کلید انتخاب کنید.
سیم بندی
کد
شما به کتابخانه PS2X-lib نیاز دارید.
بعد از اضافه کردن کتابخانه به آردوینو، کد زیر را روی بورد خود آپلود کرده، Serial monitor را باز کنید و با فشردن کلیدهای مختلف نتیجه را مشاهده کنید.
PS2 Library
1 file(s) 9.82 KB
#include <PS2X_lib.h>
PS2X ps2x;
//right now, the library does NOT support hot-pluggable controllers, meaning
//you must always either restart your Arduino after you connect the controller,
//or call config_gamepad(pins) again after connecting the controller.
int error = 0;
byte type = 0;
byte vibrate = 0;
void setup(){
Serial.begin(57600);
error = ps2x.config_gamepad(13,11,10,12, true, true); //GamePad(clock, command, attention, data, Pressures?, Rumble?)
if(error == 0){
Serial.println("Found Controller, configured successful");
Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
Serial.println("holding L1 or R1 will print out the analog stick values.");
Serial.println("Go to www.billporter.info for updates and to report bugs.");
}
else if(error == 1)
Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");
else if(error == 2)
Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");
else if(error == 3)
Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
type = ps2x.readType();
switch(type) {
case 0:
Serial.println("Unknown Controller type");
break;
case 1:
Serial.println("DualShock Controller Found");
break;
case 2:
Serial.println("GuitarHero Controller Found");
break;
}
}
void loop(){
/* You must Read Gamepad to get new values
Read GamePad and set vibration values
ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
if you don't enable the rumble, use ps2x.read_gamepad(); with no values
you should call this at least once a second
*/
if(error == 1)
return;
if(type == 2){
ps2x.read_gamepad(); //read controller
if(ps2x.ButtonPressed(GREEN_FRET))
Serial.println("Green Fret Pressed");
if(ps2x.ButtonPressed(RED_FRET))
Serial.println("Red Fret Pressed");
if(ps2x.ButtonPressed(YELLOW_FRET))
Serial.println("Yellow Fret Pressed");
if(ps2x.ButtonPressed(BLUE_FRET))
Serial.println("Blue Fret Pressed");
if(ps2x.ButtonPressed(ORANGE_FRET))
Serial.println("Orange Fret Pressed");
if(ps2x.ButtonPressed(STAR_POWER))
Serial.println("Star Power Command");
if(ps2x.Button(UP_STRUM)) //will be TRUE as long as button is pressed
Serial.println("Up Strum");
if(ps2x.Button(DOWN_STRUM))
Serial.println("DOWN Strum");
if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");
if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE
{
Serial.print("Wammy Bar Position:");
Serial.println(ps2x.Analog(WHAMMY_BAR), DEC);
}
}
else { //DualShock Controller
ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT))
Serial.println("Select is being held");
if(ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed
Serial.print("Up held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
}
if(ps2x.Button(PSB_PAD_RIGHT)){
Serial.print("Right held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
}
if(ps2x.Button(PSB_PAD_LEFT)){
Serial.print("LEFT held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
}
if(ps2x.Button(PSB_PAD_DOWN)){
Serial.print("DOWN held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
}
vibrate = ps2x.Analog(PSAB_BLUE); //this will set the large motor vibrate speed based on
//how hard you press the blue (X) button
if (ps2x.NewButtonState()) //will be TRUE if any button changes state (on to off, or off to on)
{
if(ps2x.Button(PSB_L3))
Serial.println("L3 pressed");
if(ps2x.Button(PSB_R3))
Serial.println("R3 pressed");
if(ps2x.Button(PSB_L2))
Serial.println("L2 pressed");
if(ps2x.Button(PSB_R2))
Serial.println("R2 pressed");
if(ps2x.Button(PSB_GREEN))
Serial.println("Triangle pressed");
}
if(ps2x.ButtonPressed(PSB_RED)) //will be TRUE if button was JUST pressed
Serial.println("Circle just pressed");
if(ps2x.ButtonReleased(PSB_PINK)) //will be TRUE if button was JUST released
Serial.println("Square just released");
if(ps2x.NewButtonState(PSB_BLUE)) //will be TRUE if button was JUST pressed OR released
Serial.println("X just changed");
if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE
{
Serial.print("Stick Values:");
Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX
Serial.print(",");
Serial.print(ps2x.Analog(PSS_LX), DEC);
Serial.print(",");
Serial.print(ps2x.Analog(PSS_RY), DEC);
Serial.print(",");
Serial.println(ps2x.Analog(PSS_RX), DEC);
}
}
delay(50);
}
مهم ترین توابع این کتابخانه به شرح زیر است:
ps2x.config_gamepad(clock, command, attention, data, Pressures? Rumble?);
پایه های دسته و وضعیت حاسیت به فشار و ویبره موتورها را تعیین می کند، اگر می خواهید دکمه ها به میزان فشرده شدن حساس نباشند و یا موتورها ویبره نداشته باشند برای Pressures و Rumble مقدار False قرار دهید. این تابع مقداری برای بررسی error بر می گرداند.
ready();
نوع دسته شناسایی شده را مشخص می کند، در صورت 0 بودن یعنی دسته کنترلر به درستی شناسایی نشده، 1 بودن به معنای شناسایی دسته نوع DualShock (نوع مرسوم) و 2 بودن به معنی شناخته شدن دسته نوع GuitarHero می باشد.
read_gamepad(boolean motor1, byte motor2);
شروع به خواندن وضعیت کلیدها با تعیین وضعیت ویبره موتورها می کند، موتور 2 موتور بزرگتر می باشد.
Button (but type);
در صورت فشرده شدن کلید مشخص شده در آرگومان تابع، مقدار 1 را بر می گرداند. در دسته DualShock کلیدها بصورت زیر در کتابخانه نامگذاری شده اند: Key | Function | Digital/Analog |
---|---|---|
PSB_SELECT | OK | Digital |
PSB_START | OK | Digital |
PSB_PAD_UP | UP | Analog |
PSB_PAD_DOWN | DOWN | Analog |
PSB_PAD_LEFT | LEFT | Analog |
PSB_PAD_RIGHT | RIGHT | Analog |
PSB_BLUE | X | Analog |
PSB_GREEN | Triangle | Analog |
PSB_PINK | Square | Analog |
PSB_RED | Circle | Analog |
PSB_L3 | L3 | Digital |
PSB_R3 | R3 | Digital |
PSB_L2 | L2 | Analog |
PSB_R2 | R2 | Analog |
PSB_L1 | L1 | Analog |
PSB_R1 | R1 | Analog |
PSB_RX | Joystick right x | Analog |
PSB_RY | Joystick right y | Analog |
PSB_LX | Joystick left x | Analog |
PSB_LY | Joystick left y | Analog |
تابع Analog but type مقدار کلیدهای آنالوگ را برمی گرداند که می توانید با توجه به این مقدار برای عملیات خود تصمیم گیری کنید.
یک گام جلوتر
- سعی کنید یک ماشین کنترلی دو چرخ بسازید که با کلیدهای جهت دار به جهت های محتلف حرکت کند(سرعت ماشین با توجه به میزان فشرده شدن کلیدها تغییر کند)، با فشردن کلید مربع ماشین بوق زده و با فشرده کلید ضربدر چراغ هایش روشن شود.
Comments (12)
سلام خسته نباشید.
ببخشید اگر بخواهیم ماشین کنترلی بسازیم:
چگونه باطری را به آردوینو وصل کنیم؟؟؟
وچگونه موتور هارو به آردوینو وصل کنیم؟؟؟
ممنون از شما.
سلام.
برای تغذیه برد آردینو به وسیله باطری، لازم است یک باطری 7.5 تا 12 ولتی تهیه کرده آن را به پایه vin برد آردوینو یا به کمک یک رابط، آن را به جک آداپتور برد آردوینو متصل کنید.
و برای وصل کردن موتور به آردوینو، بسته به نوع موتور نیاز است درایور مخصوص آن تهیه شده و از طریق درایور، موتور را به آردوینو متصل کنید. توجه شود که اتصال بدون واسطه آردوینو به موتورها باعث سوختن برد آردینو می شود.
ببخشید اسم این چیزه که مربع هست و وقتی میخریم بقل ps2 هست چیه؟
سلام. می تونید روزهای شنبه تا 4شنبه ساعت 10 تا 12 با بخش پشتیبانی فنی تماس بگیرید. و یک عکس از قطعه ای که مد نظرتونه بفرستید.
با سلام…لطفا طرز کار با دسته بیسیم پلی دو رو هم یاد بدید…برای بازی با خود پلی دو
سلام. بخش آموزشهای سایت رو چک کنید. در صورت انجام آموزش، در اون قسمت قرار میگیره.
سلام میشه بگید اگه بخوایم سروو موتور استفاده بکنیم به کجا وصلش میکنیم؟
سلام.
یعنی قصدتون این هست که یک سروو موتور هم به برد آردوینو متصل کنید و با دسته جوی استیک کنترلش کنید؟ برای این کار میتونید سروو موتور رو به هر کدوم از پایههای آردوینو که مدنظرتونه وصل کنید. فقط کافیه تو کدتون حالتهایی که میخواید سروو موتور با دستورات جوی استیک کنترل بشه رو اضافه کنید. نحوه اضافه کردن سروو موتور و نوشتن کد اون هم بستگی به نوع سروو موتور داره. برای یادگیری نحوه استفاده از برخی سروو موتورها و اضافه کردنشون به مدارتون میتونید به آموزشهای زیر مراجعه کنید.
https://thecaferobot.com/learn/l293d-control-drive-stepper-servo-dc-motors-by-arduino/
https://thecaferobot.com/learn/interfacing-towerpro-mg995-55g-metal-gear-servo-with-arduino/
https://thecaferobot.com/learn/interfacing-pca9685-16-channel-12-bit-pwm-servo-driver-with-arduino/
سلام.ببخشید چجوری باید کد های فایل دانلود شده رو تو برنامه بیاریم؟؟
سلام.
اگر منظورتون نصب کتابخونه دانلود شده است میتونید از آموزش زیر استفاده کنید:
https://thecaferobot.com/learn/how-to-install-an-arduino-library/
سلام
اگر من بخواهم چندین موتور DC کنترل کنم،باید موتور های 2 3 4…. را به کدام پایه ها متصل کنم تا بتوانم از همه ی کلید ها استفاده کنم؟
سلام.
فرقی نمیکنه. میتونید موتورهاتون رو به هر کدوم از پایههای آردوینو متصل کنید و با دسته جوی استیک و از طریق کدی که مشابه کد این آموزش مینویسید، اونهارو کنترل کنید. تنها نکته هم اینه که ترجیحا موتورهارو از طریق درایور و با پایههای PWM کنترل کنید تا هم آسیبی به بورد نرسه و همچنین کنترل موتورها بهتر انجام بشه.