1

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
}```
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.
asked Nov 23, 2021 at 4:32
0

1 Answer 1

0

I found that when you use delay inbuilt function, it completely blocks Arduino from accepting any command, that causes some communication barrier. Although ps3 remains connected, it doesn't accept commands. so all you have to do is to remove all delays from your function and build logic based Millis.

answered Jan 1, 2022 at 9:18

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.