0

so I was trying to control a bot wirelessly with the help of ps3 controller and USB host shield, i am using Arduino UNO as micro-controller. I was able to connect PS3 controller with Arduino and checked all button presses. It works very smoothly for button presses and shows on serial monitor which button was pressed without any lag. But the issue I am facing is that when I try to call any function on button press, the entire function is getting executed and execution comes back to void loop but Arduino stops accepting commands from ps3. But it shows that PS3 is still connected and the connection isn't lost. I went through different blogs and I found out that some say that issue is with new HOST SHIELD library 2.0 and some say that UNO computation takes time. this is what I have tried.

#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
}

initial libraries have been added. Can anyone please suggest what could be the probable issue. also why it shows still connected but doesn't accept command.

  • I'm assuming the PS3 controller is wireless, rather than a connection between the Arduino and the bot being wireless? Am I reading this correctly that you still seeing the button presses in the serial monitor, but the bot doesn't move? Have you checked to see if your motor controllers are overheating? Have you made sure that the logic level voltage is compatible between the Arduino and motor controller? Do you need a resistor between them to manage current flow? – computercarguy Nov 22 '21 at 19:05
  • While this is on topic for this site, you might get a better response, or more targeted response, on https://arduino.stackexchange.com/. There's plenty of people from that Stack which use this Stack, but it 's something to keep in mind. – computercarguy Nov 22 '21 at 19:11
  • Have you looked at this question? https://stackoverflow.com/questions/68580750/arduino-stops-accepting-commands-from-ps3-in-middle-although-it-shows-connect?rq=1 – computercarguy Nov 22 '21 at 19:24
  • yes PS3 controller is wireless. secondly I was just trying to check that whether functions that i have defined are being called on particular button press of ps3 on serial monitor and without actually connecting to bot. so than power distribution issues shouldn't be there @computercarguy. any other clarity needed then do comment please so that i can get right suggestions. – aditya gupta Nov 23 '21 at 04:17

0 Answers0