Go Down

Topic: 幫我!!沒有找到控制器,檢查接線 (Read 149 times) previous topic - next topic

jian

我現在正在學習使用PS2控制器,但是,我嘗試了很多,但我仍然沒有使用它。
你能給我一些提示嗎?

我不知道我沒有按順序連接電線。因為我可以點亮PS2控制器的LED。
2.我還測試不同工作的PS2控制器和引腳的連接。

錯誤信息是"找不到控制器,檢查接線..."。

Code: [Select]
/*
此程式庫不支援熱插拔,亦即,你必須在連接控制器後重新啟動Arduino,
或者在連接控制器之後再次呼叫config_gamepad()函數。
*/
#include <PS2X_lib.h>    // 匯入PS2函式庫

// L298N 馬達驅動板
// 宣告 MotorA 為右邊
// 宣告 MotorB 為左邊

// L298N 馬達驅動板
#define MotorA_I1     8  //定義 I1 接腳
#define MotorA_I2     9  //定義 I2 接腳
#define MotorB_I3    10  //定義 I3 接腳
#define MotorB_I4    11  //定義 I4 接腳
#define MotorA_PWMA    5  //定義 ENA (PWM調速) 接腳
#define MotorB_PWMB    6  //定義 ENB (PWM調速) 接腳

// PS2 搖桿
#define PS2_DAT       A3  // 定義 DATA 接腳
#define PS2_CMD       A4  // 定義 COMMAND 接腳
#define PS2_ATT        7  // 定義 ATTENTION 接腳
#define PS2_CLK        4  // 定義 CLOCK 接腳

PS2X ps2x;    // 建立PS2控制器的類別實體

unsigned long ps2x_tick = 0;  // 宣告計時參數
int ps2x_error = 0;           // 宣告錯誤碼參數

void setup()
{
  Serial.begin(9600);  // 開啟 Serial port, 通訊速率為 9600 bps
 
  // 設定馬達控制接腳模式
  pinMode(MotorA_I1,OUTPUT);
  pinMode(MotorA_I2,OUTPUT);
  pinMode(MotorB_I3,OUTPUT);
  pinMode(MotorB_I4,OUTPUT);
  pinMode(MotorA_PWMA,OUTPUT);
  pinMode(MotorB_PWMB,OUTPUT);
 
  // PS2控制器接腳設置; config_gamepad(時脈腳位, 命令腳位, 選取腳位, 資料腳位, 是否支援類比按鍵, 是否支援震動)
  ps2x_error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_ATT, PS2_DAT, false, false);
 
  switch(ps2x_error)
  {
    case 0:  // 如果控制器連接沒有問題,就顯示底下的訊息。
      Serial.print("Found Controller, configured successful");
      break;
    case 1:  // 找不到控制器,顯示底下的錯誤訊息。
      Serial.print("No controller found, check wiring, see readme.txt to enable debug.");
      break;
    case 2:  // 發現控制器,但不接受命令,請參閱程式作者網站的除錯說明。
      Serial.print("Controller found but not accepting commands. see readme.txt to enable debug.");
      break;
    case 3:  // 控制器拒絕進入類比感測壓力模式,或許是此控制器不支援的緣故。
      Serial.print("Controller refusing to enter Pressures mode, may not support it. ");
      break;
  }
 
  analogWrite(MotorA_PWMA,200);    // 設定馬達 (右) 轉速
  analogWrite(MotorB_PWMB,200);    // 設定馬達 (左) 轉速
}

void loop()
{
  if(ps2x_error == 1) return; // 如果沒發現任何控制器,則返回。
 
  if(millis() - ps2x_tick > 50)  // 每隔50ms讀取一次按鍵
  {
    ps2x_tick = millis();  // 紀錄目前時間
 
    ps2x.read_gamepad();  // 讀取控制器

    //--------------------------------------------------------------
    //  按鍵操控 : 「上」前進、「下」後退、「左」左轉、「右」右轉
    //--------------------------------------------------------------
    if(ps2x.ButtonPressed(PSB_PAD_UP))  // 若「上」按鍵被按下
    {
      Serial.print("\r\nPS2 button [UP] pressed");
      Car_Advance(0);
      return;
    }
   
    if(ps2x.ButtonReleased(PSB_PAD_UP))  // 若「上」按鍵被放開
    {
      delay(1);  // 延遲1ms防止誤判
     
      ps2x.read_gamepad();  // 再次讀取控制器
     
      if(ps2x.Button(PSB_PAD_UP) == false)  // 確認「上」按鍵被放開
      {
        Serial.print("\r\nPS2 button [UP] released");
        Car_Stop(0);
      }     
      return;
    }
   
    if(ps2x.ButtonPressed(PSB_PAD_DOWN))  // 若「下」按鍵被按下
    {
      Serial.print("\r\nPS2 button [DOWN] pressed");
      Car_Back(0);
      return;
    }
   
    if(ps2x.ButtonReleased(PSB_PAD_DOWN))  // 若「下」按鍵被放開
    {
      delay(1);   // 延遲1ms防止誤判
     
      ps2x.read_gamepad();  // 再次讀取控制器
     
      if(ps2x.Button(PSB_PAD_DOWN) == false)  // 確認「下」按鍵被放開
      {
        Serial.print("\r\nPS2 button [DOWN] released");
        Car_Stop(0);
      }
      return;
    }
   
    if(ps2x.ButtonPressed(PSB_PAD_LEFT))  // 若「左」按鍵被按下
    {
      Serial.print("\r\nPS2 button [LEFT] pressed");
      Car_turnL(0);
      return;
    }
   
    if(ps2x.ButtonReleased(PSB_PAD_LEFT))  // 若「左」按鍵被放開
    {
      delay(1);   // 延遲1ms防止誤判
     
      ps2x.read_gamepad();  // 再次讀取控制器
     
      if(ps2x.Button(PSB_PAD_LEFT) == false)  // 確認「左」按鍵被放開
      {
        Serial.print("\r\nPS2 button [LEFT] released");
        Car_Stop(0);
      }
      return;
    }
   
    if(ps2x.ButtonPressed(PSB_PAD_RIGHT))  // 若「右」按鍵被按下
    {
      Serial.print("\r\nPS2 button [RIGHT] pressed");
      Car_turnR(0);
      return;
    }
   
    if(ps2x.ButtonReleased(PSB_PAD_RIGHT))  // 若「右」按鍵被放開
    {
      delay(1);   // 延遲1ms防止誤判
     
      ps2x.read_gamepad();  // 再次讀取控制器
     
      if(ps2x.Button(PSB_PAD_RIGHT) == false)  // 確認「右」按鍵被放開
      {
        Serial.print("\r\nPS2 button [RIGHT] released");
        Car_Stop(0);
      }
      return;
    }
   
    //-------------------------------------------------------
    //  搖桿操控 : 左右搖桿各別控制左右馬達
    //-------------------------------------------------------
    if(ps2x.Button(0xFFFF) == false)  // 如沒有按鍵, 則偵測搖桿
    {
      static byte stick_ly = 128;  // 左搖桿 Y 軸數值變數
      static byte stick_ry = 128;  // 右搖桿 Y 軸數值變數
     
      if(stick_ly != ps2x.Analog(PSS_LY))  // 若左搖桿 Y 軸有變化
      {
        if((ps2x.Analog(PSS_LY) < 10) || (ps2x.Analog(PSS_LY) > 250))
        {
          delay(1);   // 延遲1ms防止誤判
          ps2x.read_gamepad();  // 再次讀取控制器
        }
       
        if(stick_ly != ps2x.Analog(PSS_LY))  // 確認左搖桿 Y 軸有變化
        {         
          stick_ly = ps2x.Analog(PSS_LY);  // 紀錄左搖桿 Y 軸數值
         
          Serial.print("PS2 [LEFT] stick Y value : ");
          Serial.println(stick_ly, DEC);
         
          if(stick_ly < 126)  // 左搖桿往前推
          {
            anticlockwiseL();
          }
          else if(stick_ly > 128)  // 左搖桿往後推
          {
            clockwiseL();
          }
          else  // 左搖桿置中
          {
            stopL();
          }
        }
      }
     
      if(stick_ry != ps2x.Analog(PSS_RY))  // 若右搖桿 Y 軸有變化
      {
        if((ps2x.Analog(PSS_RY) < 10) || (ps2x.Analog(PSS_RY) > 250))
        {
          delay(1);   // 延遲1ms防止誤判
          ps2x.read_gamepad();  // 再次讀取控制器
        }
       
        if(stick_ry != ps2x.Analog(PSS_RY))  // 確認右搖桿 Y 軸有變化
        {       
          stick_ry = ps2x.Analog(PSS_RY);  // 紀錄右搖桿 Y 軸數值
         
          Serial.print("PS2 [RIGHT] stick Y value : ");
          Serial.println(stick_ry, DEC);
         
          if(stick_ry < 126)  // 右搖桿往前推
          {
            clockwiseR();
          }
          else if(stick_ry > 128)  // 右搖桿往後推
          {
            anticlockwiseR();
          }
          else  // 右搖桿置中
          {
            stopR();
          }
        }
      }
    }
  }
}

// 小車前進
void Car_Advance(int t)
{
  clockwiseR();
  anticlockwiseL();
  delay(t * 100);
}

// 小車後退
void Car_Back(int t)
{
  anticlockwiseR();
  clockwiseL();
  delay(t * 100); 
}

// 小車左旋轉
void Car_turnL(int t)
{
  clockwiseR();
  clockwiseL();
  delay(t * 100);
}

// 小車右旋轉
void Car_turnR(int t)
{
  anticlockwiseR();
  anticlockwiseL();
  delay(t * 100);
}

// 小車停止
void Car_Stop(int t)
{
  stopR();
  stopL();
  delay(t * 100);
}

void clockwiseR()  // 右馬達順時針轉動
{
  digitalWrite(MotorA_I1,HIGH);
  digitalWrite(MotorA_I2,LOW);
}

void anticlockwiseR()  // 右馬達逆時針轉動
{
  digitalWrite(MotorA_I1,LOW);
  digitalWrite(MotorA_I2,HIGH);
}

void stopR()  //右馬達停止
{
    digitalWrite(MotorA_I1,HIGH);
    digitalWrite(MotorA_I2,HIGH);
}

void clockwiseL()  // 左馬達順時針轉動
{
  digitalWrite(MotorB_I3,LOW);
  digitalWrite(MotorB_I4,HIGH);
}

void anticlockwiseL()  // 左馬達逆時針轉動
{
  digitalWrite(MotorB_I3,HIGH);
  digitalWrite(MotorB_I4,LOW);
}

void stopL()  //左馬達停止
{
  digitalWrite(MotorB_I3,HIGH);
  digitalWrite(MotorB_I4,HIGH);
}




Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy