首页 > 解决方案 > Arduino在中间停止接受来自PS3的命令。?? 虽然它显示连接??在特定功能之后?

问题描述

请完整阅读并抱歉,但它必须是描述性的。我们正在使用 PS3 控制器来控制我们的机器人,所以问题是 PS3 正在连接并且在单击按钮时会调用函数但是我们发现在调用某些函数之后 Arduino 不接受来自 PS3 的任何命令的问题。 . 我们调试了函数,所以函数完全运行,然后执行返回到 void 循环,但它停止响应 PS3 命令。它表明 PS3 仍然连接,但 Arduino 不接受中间命令。我们无法找到问题所在,因为某些功能正确执行,之后 PS3 也会响应,特别是当我们在 Arduino 停止响应 PS3 之后调用肘上()或肘下()时。

肘部功能

void elbowUP()
{ 
  /*** checking if my shoulder angle is lesser than threshold or no **/

  //elbow UP CODE HERE...

      int min_val= 30;
      int max_val= 140;
      Serial.println("ELBOW UP");
      for(int j=30;j<=max_val;j++)
       {
         ElbowGripperservo.write(j);
         Serial.println(j);
         delay(20);
       }    
    
       Serial.println("coming out of loop");
     //Usb.Task();
     Serial.println("print after usb task");
      
    }
    
    void elbowDown()
    { 
      /*** checking if my shoulder angle is greater than threshold or no **/
      //ELBOW DOWN CODE TO WRITTEN HERE
      int min_val= 30;
      int max_val= 140;
      Serial.println("Elbow Down");
       for(int j=max_val;j>=min_val;j--)
       {
         ElbowGripperservo.write(j);
         Serial.println(j);
         delay(20);
       }   
       Usb.Task(); 
     
    }



        void loop(){
        Usb.Task();
    
     //Serial.println("working in loop");
    
      //By default pistons pins must be at LOW when user not pressing CROSS Button
      //pistonBack();
      //releaseVacuum(); 
        
        int xl, yl, xr, yr;
    
        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)
            {
                xl = PS3.getAnalogHat(LeftHatX);
                yl = PS3.getAnalogHat(LeftHatY);
    
                if (PS3.PS3Connected)
                { // The Navigation controller only have one joystick
                    xr = PS3.getAnalogHat(RightHatX);
                    yr = PS3.getAnalogHat(RightHatY);
                }
    
                calculate(xl, yl, xr, yr);
            }
    
            // Analog button values can be read from almost all buttons
        if (PS3.getButtonClick(L2) ){
            
           // elbowDown();
            Usb.Task();
    
        }
        else if(PS3.getButtonClick(R2)){
    
          
          shoulderDown();
          Usb.Task();
        
        }
    
            if (PS3.getButtonClick(PS))
            {
                Serial.print(F("\r\nPS"));
                PS3.disconnect();
            }
            else
            {
    
          while(PS3.getButtonClick(TRIANGLE)){
              Usb.Task();
             // createVacuum();    
          }
                if (PS3.getButtonClick(CIRCLE))
                {
                    Serial.print(F("\r\nCircle"));
            releaseVacuum();
                }
          while(PS3.getButtonClick(CROSS)){
              Usb.Task();
              createVacuum();    
          }
    
                if (PS3.getButtonClick(SQUARE))
         {
                    Serial.print(F("\r\nSquare"));
            elbowUP();
            
         }
                if (PS3.getButtonClick(UP))
                {
    
            pistonPush();
                    Serial.print(F("\r\nUp"));
                    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))
                {
              pistonBack();
                    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)){
    
            //Elbow up function to be called here....
            
           // elbowUP();
            Serial.println("after function call");
            Usb.Task();
            Serial.println("after function usb");
    
                }
    
                if (PS3.getButtonClick(L3))
                    Serial.print(F("\r\nL3"));
                if (PS3.getButtonClick(R1)){
    
             // Usb.Task();
              shoulderUp();
              Usb.Task();
            
                }
                    
                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"));
                    
                }
            }
        }
    }


for confirmation that when we press other buttons some functions get executed properly, i am also adding serial monitor stuff


PS3 Bluetooth Library StartedTable Back--Release Vacuum

PS3 Bluetooth Library StartedTable Back--Release Vacuum

CircleRelease Vacuum
Create vacuum

CircleRelease Vacuum
Create vacuum

CircleRelease Vacuum
Create vacuum
Table Push

UpTable Back--
DownTable Push

UpTable Back--
Down
Right
Left
Right
LeftTable Back--
Down
SquareELBOW UP
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
coming out of loop
print after usb task

请提出真正的要求,帮我找到问题,这将是一个很大的帮助。抱歉让它太长了,但请找出为什么 Arduino 停止接受 PS3 命令虽然它仍然连接的问题。

标签: arduinoarduino-unoarduino-c++

解决方案


我想到了一些问题:

  1. 您是否在代码中的任何地方使用中断?如果是这样,请确保它们很短并且您没有在Serial.println()里面做任何事情。

  2. 您是否确信以 16 MHz 运行的 Uno 具有足够的计算能力来处理控制器、真空执行器和您的伺服电机?后者通常是时间关键设备,您可能正在使用耗费太多时间的阻塞功能。否则,也许考虑将您的代码迁移到 Mega 上?

  3. 您是否考虑过使用 FSM(有限状态机)近似值,这通常会改善代码执行的流程。在我看来,您需要某种多任务处理功能(例如 RTOS)来提高应用程序的可操作性,但是,您的代码是基于函数的,并且对于检测按钮按下似乎不是很优化。检测下一个按钮按下肯定会很慢,因为激活活塞、马达等需要一些时间。

底线是:您需要通过考虑系统中的状态来改进流程

请分享您的整个代码以查看弱点


推荐阅读