0

所以我试图在 ps3 控制器和 USB 主机屏蔽的帮助下无线控制机器人,我使用 Arduino UNO 作为微控制器。我能够将 PS3 控制器与 Arduino 连接并检查所有按钮按下。它对于按钮按下工作非常顺利,并在串行监视器上显示哪个按钮被按下而没有任何延迟。但我面临的问题是,当我尝试在按下按钮时调用任何函数时,整个函数都会被执行并且执行会返回到 void 循环,但 Arduino 停止接受来自 ps3 的命令。但它显示 PS3 仍然连接并且连接没有丢失。我浏览了不同的博客,发现有人说问题出在新的 HOST SHIELD 库 2.0 上,有人说 UNO 计算需要时间。这是我尝试过的。

#define motopinl1 8
#define motopinr1 9
# define motopine1 10

#define motopinl2 11
#define motopinr2 12
#define motopine2 13

#define val 200


void setup() {
  Serial.begin(115200);
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
  Serial.print(F("\r\nPS3 Bluetooth Library Started"));
}

void moveforward()
{
  
 // digitalWrite(motopinl1,LOW);
  digitalWrite(motopinr1,LOW);
  digitalWrite(motopinl2,LOW);
 // digitalWrite(motopinr2,LOW);
  analogWrite(motopine1,200);
  analogWrite(motopine2,200);
 // digitalWrite(motopinl1,HIGH);
  //digitalWrite(motopinr2,HIGH);

  Serial.println("MoveForward called");
  Usb.Task();

}

void moveBackward()
{
  
  digitalWrite(motopinl1,LOW);
//  digitalWrite(motopinr1,LOW);
 // digitalWrite(motopinl2,LOW);
  digitalWrite(motopinr2,LOW);
  analogWrite(motopine1,200);
  analogWrite(motopine2,200);
 // digitalWrite(motopinr1,HIGH);
  //digitalWrite(motopinl2,HIGH);

  Serial.println("Movebackward called");
  Usb.Task();
}

void moveleft()
{
  
  digitalWrite(motopinl1,LOW);
 // digitalWrite(motopinr1,LOW);
  digitalWrite(motopinl2,LOW);
 // digitalWrite(motopinr2,LOW);
  analogWrite(motopine1,200);
  analogWrite(motopine2,200);
 // digitalWrite(motopinr2,HIGH);
  //digitalWrite(motopinr1,HIGH);

Usb.Task();
  Serial.println("Moveleft called");
}

void moveright()
{
  
 // digitalWrite(motopinl1,LOW);
  //digitalWrite(motopinr1,LOW);
  digitalWrite(motopinl2,LOW);
  digitalWrite(motopinr2,LOW);
  analogWrite(motopine1,200);
  analogWrite(motopine2,200);
 // digitalWrite(motopinl1,HIGH);
  //digitalWrite(motopinl2,HIGH);
  
  Serial.println("Moveright called");
  Usb.Task();
}

void stopit()
{
  digitalWrite(motopinl1,LOW);
  digitalWrite(motopinr1,LOW);
  digitalWrite(motopinl2,LOW);
  digitalWrite(motopinr2,LOW);
  analogWrite(motopine1,0);
  analogWrite(motopine2,0);
  Usb.Task();
}

void loop() {
  Usb.Task();

  if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
    if (PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117) {
     // Serial.print(F("\r\nLeftHatX: "));
      //Serial.print(PS3.getAnalogHat(LeftHatX));
      //Serial.print(F("\tLeftHatY: "));
      //Serial.print(PS3.getAnalogHat(LeftHatY));
      if (PS3.PS3Connected) { // The Navigation controller only have one joystick
        //Serial.print(F("\tRightHatX: "));
        //Serial.print(PS3.getAnalogHat(RightHatX));
        //Serial.print(F("\tRightHatY: "));
        //Serial.print(PS3.getAnalogHat(RightHatY));
      }
    }

    // Analog button values can be read from almost all buttons
    if (PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
      Serial.print(F("\r\nL2: "));
      Serial.print(PS3.getAnalogButton(L2));
      if (PS3.PS3Connected) {
        Serial.print(F("\tR2: "));
        Serial.print(PS3.getAnalogButton(R2));
      }
    }

    if (PS3.getButtonClick(PS)) {
      Serial.print(F("\r\nPS"));
      PS3.disconnect();
    }
    else {
      if (PS3.getButtonClick(TRIANGLE)) {
        Serial.print(F("\r\nTriangle"));
        moveforward();
        PS3.setRumbleOn(RumbleLow);
      }
      if (PS3.getButtonClick(CIRCLE)) {
        Serial.print(F("\r\nCircle"));
        PS3.setRumbleOn(RumbleHigh);
        moveright();
      }
      if (PS3.getButtonClick(CROSS))
      {
          Serial.print(F("\r\nCross"));
          moveBackward();
      }
      if (PS3.getButtonClick(SQUARE))
      {
        Serial.print(F("\r\nSquare"));
        moveleft();
      }

      if (PS3.getButtonClick(UP)) {
        Serial.print(F("\r\nUp"));
        stopit();
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED4);
        }
      }
      if (PS3.getButtonClick(RIGHT)) {
        Serial.print(F("\r\nRight"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED1);
        }
      }
      if (PS3.getButtonClick(DOWN)) {
        Serial.print(F("\r\nDown"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED2);
        }
      }
      if (PS3.getButtonClick(LEFT)) {
        Serial.print(F("\r\nLeft"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED3);
        }
      }

      if (PS3.getButtonClick(L1))
        Serial.print(F("\r\nL1"));
      if (PS3.getButtonClick(L3))
        Serial.print(F("\r\nL3"));
      if (PS3.getButtonClick(R1))
        Serial.print(F("\r\nR1"));
      if (PS3.getButtonClick(R3))
        Serial.print(F("\r\nR3"));

      if (PS3.getButtonClick(SELECT)) {
        Serial.print(F("\r\nSelect - "));
        PS3.printStatusString();
      }
      if (PS3.getButtonClick(START)) {
        Serial.print(F("\r\nStart"));
        printAngle = !printAngle;
      }
    }
#if 0 // Set this to 1 in order to see the angle of the controller
    if (printAngle) {
      Serial.print(F("\r\nPitch: "));
      Serial.print(PS3.getAngle(Pitch));
      Serial.print(F("\tRoll: "));
      Serial.print(PS3.getAngle(Roll));
    }
#endif
  }
#if 0 // Set this to 1 in order to enable support for the Playstation Move controller
  else if (PS3.PS3MoveConnected) {
    if (PS3.getAnalogButton(T)) {
      Serial.print(F("\r\nT: "));
      Serial.print(PS3.getAnalogButton(T));
    }
    if (PS3.getButtonClick(PS)) {
      Serial.print(F("\r\nPS"));
      PS3.disconnect();
    }
    else {
      if (PS3.getButtonClick(SELECT)) {
        Serial.print(F("\r\nSelect"));
        printTemperature = !printTemperature;
      }
      if (PS3.getButtonClick(START)) {
        Serial.print(F("\r\nStart"));
        printAngle = !printAngle;
      }
      if (PS3.getButtonClick(TRIANGLE)) {
        Serial.print(F("\r\nTriangle"));
        PS3.moveSetBulb(Red);
      }
      if (PS3.getButtonClick(CIRCLE)) {
        Serial.print(F("\r\nCircle"));
        PS3.moveSetBulb(Green);
      }
      if (PS3.getButtonClick(SQUARE)) {
        Serial.print(F("\r\nSquare"));
        PS3.moveSetBulb(Blue);
      }
      if (PS3.getButtonClick(CROSS)) {
        Serial.print(F("\r\nCross"));
        PS3.moveSetBulb(Yellow);
      }
      if (PS3.getButtonClick(MOVE)) {
        PS3.moveSetBulb(Off);
        Serial.print(F("\r\nMove"));
        Serial.print(F(" - "));
        PS3.printStatusString();
      }
    }
    if (printAngle) {
      Serial.print(F("\r\nPitch: "));
      Serial.print(PS3.getAngle(Pitch));
      Serial.print(F("\tRoll: "));
      Serial.print(PS3.getAngle(Roll));
    }
    else if (printTemperature) {
      Serial.print(F("\r\nTemperature: "));
      Serial.print(PS3.getTemperature());
    }
  }
#endif
}

添加了初始库。任何人都可以请建议可能是什么问题。还有为什么它显示仍然连接但不接受命令。

4

0 回答 0