Arduino Uno перестает принимать команды от беспроводного контроллера PS3?? Хотя он остается подключенным!

поэтому я пытался управлять ботом по беспроводной сети с помощью контроллера ps3 и USB host shield, я использую 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
}```

I haven't connected to bot. I was checking whether function are being executed on button press or not or serial monitor. so there cannot be issue of power supply. problem is PS3 still remains connected, also line of execution returns to void loop, then why it stops further commands. please please do suggest any ideas and methods by which I can solve this problem. thank you.

, 👍1

Обсуждение

`` должно быть в отдельной строке, иначе список кода будет испорчен, @jsotola


1 ответ


Лучший ответ:

0

Я обнаружил, что когда вы используете встроенную функцию delay, она полностью блокирует Arduino от принятия любой команды, что вызывает некоторый коммуникационный барьер. Хотя ps3 остается подключенной, она не принимает команд. поэтому все, что вам нужно сделать, это удалить все задержки из вашей функции и построить миллис на основе логики.

,