Go Down

Topic: 幫我!!沒有找到控制器,檢查接線 (Read 805 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