Interface 为什么在Arduino中的PS2控制器通信后需要重新启动Arduino?如何通过编码实现这一点?

Interface 为什么在Arduino中的PS2控制器通信后需要重新启动Arduino?如何通过编码实现这一点?,interface,arduino,playstation,Interface,Arduino,Playstation,当我运行动力传动系统的代码并打开串行监视器时,它正在工作,但当我通过dc插孔接通Arduino电源并运行代码时。它不工作,因为连接后需要重新启动代码。我想知道如何解决PS2通信问题,在不重新启动或启动串行监视器的情况下运行传动系统 我上传的代码在这个可指示的文档中给出 我通过大量实验得到了答案。首先,在ps2连接到arduino后,您必须重新启动arduino或配置pin。这可以通过两种方式完成: 1) 通过代码或连接后重新启动arduino 2) 连接后重新配置 1选项您很清楚,我正在讨论第二

当我运行动力传动系统的代码并打开串行监视器时,它正在工作,但当我通过dc插孔接通Arduino电源并运行代码时。它不工作,因为连接后需要重新启动代码。我想知道如何解决PS2通信问题,在不重新启动或启动串行监视器的情况下运行传动系统

我上传的代码在这个可指示的文档中给出
我通过大量实验得到了答案。首先,在ps2连接到arduino后,您必须重新启动arduino或配置pin。这可以通过两种方式完成: 1) 通过代码或连接后重新启动arduino 2) 连接后重新配置

1选项您很清楚,我正在讨论第二个选项,即配置:

正如您所知,您已经通过函数ps2x.configu gamepad()配置了管脚; 现在您必须在ps2连接到arduino后重新配置它,您可以使用一个名为reconfig_gamepad()的函数;在阅读完游戏后,请使用游戏板();在无效循环中

我的完整传动系代码如下查找注释//代码中总共有四行注释。祝你好运希望这也能解决你的问题

#include <PS2X_lib.h>  //for v1.6
int dir1=13;
int dir2=11;
int dir3=9;
int dir4=7;


int pwm1=12;
int pwm2=10;
int pwm3=8;
int pwm4=6;

int value_mapped;
/******************************************************************
 * set pins connected to PS2 controller:
 *   - 1e column: original 
 *   - 2e colmun: Stef?
 * replace pin numbers by the ones you use
 ******************************************************************/
#define PS2_DAT        44  //14    
#define PS2_CMD        46  //15
#define PS2_SEL        48  //16
#define PS2_CLK        50  //17

/******************************************************************
 * select modes of PS2 controller:
 *   - pressures = analog reading of push-butttons 
 *   - rumble    = motor rumbling
 * uncomment 1 of the lines for each mode selection
 ******************************************************************/
//#define pressures   true
#define pressures   false
//#define rumble      true
#define rumble      false

PS2X ps2x; // create PS2 Controller Class

//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);
  pinMode(dir1,OUTPUT);
  pinMode(dir2,OUTPUT);
  pinMode(dir3,OUTPUT);
  pinMode(dir4,OUTPUT);

  pinMode(pwm1,OUTPUT);
  pinMode(pwm2,OUTPUT);
  pinMode(pwm3,OUTPUT);
  pinMode(pwm4,OUTPUT);
  delay(1000);  //added delay to give wireless ps2 module some time to startup, before configuring it

  //CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
  if_error_is_found:                                                                                               //      <!---- changed here --->
  //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);

  if(error == 0){
    Serial.print("Found Controller, configured successful ");
    Serial.print("pressures = ");
  if (pressures)
    Serial.println("true ");
  else
    Serial.println("false");
  Serial.print("rumble = ");
  if (rumble)
    Serial.println("true)");
  else
    Serial.println("false");
    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("Note: 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");
    goto if_error_is_found;                                       //      <!---- changed here --->
  }
  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. ");

//  Serial.print(ps2x.Analog(1), HEX);

  type = ps2x.readType(); 

  switch(type) {
    case 0:
      Serial.print("Unknown Controller type found ");
      break;
    case 1:
      Serial.print("DualShock Controller found ");
      break;
    case 2:
      Serial.print("GuitarHero Controller found ");
      break;
  case 3:
      Serial.print("Wireless Sony DualShock Controller found ");
      break;
   }
}

void loop() {

  /* You must Read Gamepad to get new values 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) //skip loop if no controller found
    return; 

  if(type == 2){ //Guitar Hero Controller
    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(); //read controller and set large motor to spin at 'vibrate' speed
    ps2x.reconfig_gamepad();                                                                       //      <!---- changed here --->
    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_CROSS);  //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_TRIANGLE))
        Serial.println("Triangle pressed");        
    }

    if(ps2x.ButtonPressed(PSB_CIRCLE))               //will be TRUE if button was JUST pressed
      Serial.println("Circle just pressed");
    if(ps2x.NewButtonState(PSB_CROSS))               //will be TRUE if button was JUST pressed OR released
      Serial.println("X just changed");
    if(ps2x.ButtonReleased(PSB_SQUARE))              //will be TRUE if button was JUST released
      Serial.println("Square just released");     

  //  if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //print stick values if either is TRUE
      Serial.println("Stick Values:");
      Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  
//Forward Direction And BAckward Diretion  

if(ps2x.Button(PSB_R1)){ 
 if(ps2x.Analog(PSS_RY)>=0)
   {

//Forward Direction
     if(ps2x.Analog(PSS_RY)<127)
     {
      Serial.println("All MOtor Running Forward");
      digitalWrite(dir1,LOW);
      digitalWrite(dir2,HIGH);
      digitalWrite(dir3,HIGH);
      digitalWrite(dir4,LOW);
      value_mapped=map(ps2x.Analog(PSS_RY),127,0,0,80);
      analogWrite(pwm1,value_mapped);
      analogWrite(pwm2,value_mapped);
      analogWrite(pwm3,value_mapped);
      analogWrite(pwm4,value_mapped);
      }
//BAckward Direction
      if(ps2x.Analog(PSS_RY)>=127)
      { 
        Serial.println("All MOtor Running Backward");
      digitalWrite(dir1,HIGH);
      digitalWrite(dir2,LOW);
      digitalWrite(dir3,LOW);
      digitalWrite(dir4,HIGH);
      value_mapped=map(ps2x.Analog(PSS_RY),127,255,0,80);
      analogWrite(pwm1,value_mapped);
      analogWrite(pwm2,value_mapped);
      analogWrite(pwm3,value_mapped);
      analogWrite(pwm4,value_mapped);
      } 
  }


// LEft OR Right Direction
   if(ps2x.Analog(PSS_RX)>=0)
   {

      //Left diretion
      if(ps2x.Analog(PSS_RX)<128)
      {
      Serial.println("All MOtor Running Left");
      digitalWrite(dir1,HIGH);
      digitalWrite(dir2,HIGH);
      digitalWrite(dir3,LOW);
      digitalWrite(dir4,LOW);
      value_mapped=map(ps2x.Analog(PSS_RX),128,0,0,80);
      analogWrite(pwm1,value_mapped);
      analogWrite(pwm2,value_mapped);
      analogWrite(pwm3,value_mapped);
      analogWrite(pwm4,value_mapped);
      }
      //Right Direction
      if(ps2x.Analog(PSS_RX)>128)
      {
      Serial.println("All MOtor Running Right");
      digitalWrite(dir1,LOW);
      digitalWrite(dir2,LOW);
      digitalWrite(dir3,HIGH);
      digitalWrite(dir4,HIGH);
      value_mapped=map(ps2x.Analog(PSS_RX),128,255,0,80);
      analogWrite(pwm1,value_mapped);
      analogWrite(pwm2,value_mapped);
      analogWrite(pwm3,value_mapped);
      analogWrite(pwm4,value_mapped);
      }
    }

//All MOtors Clock

      if( (ps2x.Analog(PSS_LX)<128)  )
      {
      Serial.println("CLOCKWISE RUNNING ALL MOTORS");
      digitalWrite(dir1,LOW);
      digitalWrite(dir2,LOW);
      digitalWrite(dir3,LOW);
      digitalWrite(dir4,LOW);
      value_mapped=map(ps2x.Analog(PSS_LX),128,0,0,80);
      analogWrite(pwm1,value_mapped);
      analogWrite(pwm2,value_mapped);
      analogWrite(pwm3,value_mapped);
      analogWrite(pwm4,value_mapped);
      }

//All MOtors Anti-CLockwise
     if(ps2x.Analog(PSS_LX)>128)
     {
      Serial.println("CLOCKWISE RUNNING ALL MOTORS");
      digitalWrite(dir1,HIGH);
      digitalWrite(dir2,HIGH);
      digitalWrite(dir3,HIGH);
      digitalWrite(dir4,HIGH);
      value_mapped=map(ps2x.Analog(PSS_LX),128,255,0,80);
      analogWrite(pwm1,value_mapped);
      analogWrite(pwm2,value_mapped);
      analogWrite(pwm3,value_mapped);
      analogWrite(pwm4,value_mapped);
     } 
}
if(ps2x.Button(PSB_L1)){

   if((ps2x.Analog(PSS_LX)>=120) && (ps2x.Analog(PSS_LX)<=128)){

   analogWrite(pwm1,0);
   analogWrite(pwm3,0);

   }

 //dIAGONAL L


        if(ps2x.Analog(PSS_LX)<120)
         {
          Serial.println("CLOCKWISE RUNNING ALL MOTORS");
          digitalWrite(dir1,LOW);
          digitalWrite(dir3,HIGH);
          value_mapped=map(ps2x.Analog(PSS_LX),128,0,0,80);
          analogWrite(pwm1,value_mapped);
          analogWrite(pwm3,value_mapped);
         } 
    //dIAGONAL R
         if(ps2x.Analog(PSS_LX)>=128)
         {
          Serial.println("CLOCKWISE RUNNING ALL MOTORS");
          digitalWrite(dir2,HIGH);
          digitalWrite(dir4,LOW);
          value_mapped=map(ps2x.Analog(PSS_LX),128,255,0,80);
          analogWrite(pwm2,value_mapped);
          analogWrite(pwm4,value_mapped);
         } 

}

  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);  
}
#包括//用于v1.6
int-dir1=13;
int-dir2=11;
int-dir3=9;
int-dir4=7;
int pwm1=12;
int pwm2=10;
int pwm3=8;
int pwm4=6;
int值_映射;
/******************************************************************
*设置连接到PS2控制器的针脚:
*-1e列:原件
*-2e colmun:Stef?
*将pin码替换为您使用的pin码
******************************************************************/
#定义PS2_DAT 44//14
#定义PS2_CMD 46//15
#定义PS2_SEL 48//16
#定义PS2_CLK 50//17
/******************************************************************
*选择PS2控制器的模式:
*-压力=推力器的模拟读数
*-隆隆声=电机隆隆声
*为每个模式选择取消注释1行
******************************************************************/
//#定义压力为真
#定义压力为假
//#定义隆隆声为真
#定义隆隆声为假
PS2X PS2X;//创建PS2控制器类
//目前,该库不支持热插拔控制器,这意味着
//您必须始终在连接控制器后重新启动Arduino,
//或在连接控制器后再次调用config_gamepad(PIN)。
整数误差=0;
字节类型=0;
字节振动=0;
无效设置(){
序列号。开始(57600);
pinMode(dir1,输出);
pinMode(dir2,输出);
pinMode(dir3,输出);
pinMode(dir4,输出);
引脚模式(pwm1,输出);
pinMode(pwm2,输出);
pinMode(pwm3,输出);
引脚模式(pwm4,输出);
延迟(1000);//增加了延迟,以便在配置无线ps2模块之前给它一些启动时间
//这里是v1.6的更改!!!*************请注意*************
如果发现错误://
//设置引脚和设置:GamePad(时钟、命令、注意、数据、压力?、隆隆声?)检查错误
错误=ps2x.config_gamepad(PS2_CLK、PS2_CMD、PS2_SEL、PS2_DAT、压力、隆隆声);
如果(错误==0){
串行打印(“找到控制器,配置成功”);
Serial.print(“pressures=”);
如果(压力)
Serial.println(“真”);
其他的
Serial.println(“假”);
Serial.print(“rumble=”);
如果(隆隆声)
Serial.println(“true”);
其他的
Serial.println(“假”);
println(“尝试所有按钮,X将振动控制器,越用力,振动速度越快;”;
Serial.println(“保持L1或R1将打印模拟棒值”);
println(“注意:访问www.billporter.info获取更新并报告错误。”);
}  
else if(错误==1)
{
Serial.println(“未找到控制器,请检查接线,请参阅readme.txt以启用调试。有关疑难解答提示,请访问www.billporter.info”);
如果发现错误,则转到;//
}
else if(错误==2)
Serial.println(“找到控制器但不接受命令。请参阅readme.txt以启用调试。有关疑难解答提示,请访问www.billporter.info”);
否则如果(错误==3)
Serial.println(“控制器拒绝进入压力模式,可能不支持它”);
//串行打印(ps2x模拟(1),十六进制);
type=ps2x.readType();
开关(类型){
案例0:
串行打印(“找到未知控制器类型”);
打破
案例1:
串行打印(“发现双冲击控制器”);
打破
案例2:
串行打印(“找到GuitarHero控制器”);
打破
案例3:
串行打印(“找到无线索尼DualShock控制器”);
打破
}
}
void循环(){
/*您必须阅读Gamepad才能获得新值并设置振动值
ps2x.read_gamepad(小型电机开/关,0-255之间的较大电机强度)
如果不启用隆隆声,请使用ps2x.read_gamepad();不带任何值
你应该至少每秒打一次电话
*/  
if(error==1)//如果找不到控制器,则跳过循环
返回;
如果(类型==2){//
ps2x.read_gamepad();//读取控制器
如果(按下ps2x按钮(绿色)
序列号。打印号(“绿色刻印”);
如果(ps2x按钮按下(红色)
序列号。打印号(“红色刻印”);
如果(按下ps2x按钮(黄色)
序列号。打印号(“黄色刻印”);
如果(按下ps2x按钮(蓝色)
序列号。打印号(“蓝色刻印”);
如果(按下ps2x按钮(橙色)
序列号。打印号(“橙色刻印”);
if(按下ps2x按钮(星形电源))
Serial.println(“星电源命令”);
只要按下按钮,if(ps2x.Button(UP_STRUM))//将为真
Serial.println(“Up Strum”);
如果(ps2x.按钮(向下)
Serial.println(“DOWN Strum”);
if(ps2x.按钮(PSB_启动))
void setup()
{
  Serial.begin(9600);

  // retry logic to avoid a reset after power up
  do
  {
    delay(1000);
    error = ps2x.config_gamepad(13, 11, 10, 12, true, true);
    if (error == 1)
      Serial.println("No controller found, retry in a sec");
  } while (error == 1);

  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 == 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");