راهنمای استفاده از دسته جوی استیک 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 را باز کنید و با فشردن کلیدهای مختلف نتیجه را مشاهده کنید.
#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 مقدار کلیدهای آنالوگ را برمی گرداند که می توانید با توجه به این مقدار برای عملیات خود تصمیم گیری کنید.

یک گام جلوتر

  • سعی کنید یک ماشین کنترلی دو چرخ بسازید که با کلیدهای جهت دار به جهت های محتلف حرکت کند(سرعت ماشین با توجه به میزان فشرده شدن کلیدها تغییر کند)، با فشردن کلید مربع ماشین بوق زده و با فشرده کلید ضربدر چراغ هایش روشن شود.

دسته بیسیم PS2 بخرید

آموزش های مشابه

Comments (12)

  • محمدامین Reply

    سلام خسته نباشید.

    ببخشید اگر بخواهیم ماشین کنترلی بسازیم:

    چگونه باطری را به آردوینو وصل کنیم؟؟؟

    وچگونه موتور هارو به آردوینو وصل کنیم؟؟؟

    ممنون از شما.

    نوامبر 22, 2020 at 8:16 ب.ظ
    • مهران ملکی Reply

      سلام.
      برای تغذیه برد آردینو به وسیله باطری، لازم است یک باطری 7.5 تا 12 ولتی تهیه کرده آن را به پایه vin برد آردوینو یا به کمک یک رابط، آن را به جک آداپتور برد آردوینو متصل کنید.
      و برای وصل کردن موتور به آردوینو، بسته به نوع موتور نیاز است درایور مخصوص آن تهیه شده و از طریق درایور، موتور را به آردوینو متصل کنید. توجه شود که اتصال بدون واسطه آردوینو به موتورها باعث سوختن برد آردینو می شود.

      دسامبر 1, 2020 at 2:32 ب.ظ
  • Mohammad Reply

    ببخشید اسم این چیزه که مربع هست و وقتی میخریم بقل ps2 هست چیه؟

    ژانویه 31, 2021 at 6:52 ب.ظ
    • مهران ملکی Reply

      سلام. می تونید روزهای شنبه تا 4شنبه ساعت 10 تا 12 با بخش پشتیبانی فنی تماس بگیرید. و یک عکس از قطعه ای که مد نظرتونه بفرستید.

      فوریه 2, 2021 at 2:54 ب.ظ
  • Ali.Goalkeeper Reply

    با سلام…لطفا طرز کار با دسته بیسیم پلی دو رو هم یاد بدید…برای بازی با خود پلی دو

    مارس 27, 2021 at 3:36 ب.ظ
    • مهران ملکی Reply

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

      آوریل 3, 2021 at 9:30 ق.ظ
  • صدرا میرعباس زاده Reply

    سلام میشه بگید اگه بخوایم سروو موتور استفاده بکنیم به کجا وصلش میکنیم؟

    فوریه 27, 2022 at 1:52 ب.ظ
  • حسین Reply

    سلام.ببخشید چجوری باید کد های فایل دانلود شده رو تو برنامه بیاریم؟؟

    ژوئن 27, 2022 at 2:25 ب.ظ
  • محمد صادق Reply

    سلام
    اگر من بخواهم چندین موتور DC کنترل کنم،باید موتور های 2 3 4…. را به کدام پایه ها متصل کنم تا بتوانم از همه ی کلید ها استفاده کنم؟

    جولای 3, 2022 at 12:01 ب.ظ
    • مهران ملکی Reply

      سلام.
      فرقی نمیکنه. میتونید موتورهاتون رو به هر کدوم از پایه‌های آردوینو متصل کنید و با دسته جوی استیک و از طریق کدی که مشابه کد این آموزش مینویسید، اون‌هارو کنترل کنید. تنها نکته هم اینه که ترجیحا موتورهارو از طریق درایور و با پایه‌های PWM کنترل کنید تا هم آسیبی به بورد نرسه و همچنین کنترل موتورها بهتر انجام بشه.

      جولای 10, 2022 at 3:25 ب.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.