在arduino中运行代码时,不显示输出结果

时间:2013-12-25 14:24:42

标签: c++ arduino

我需要制作一个代码来移动一个机器人的单臂,其中包含基于某个给定(x,y)点的三个光束,而theta0必须从0开始。然后应根据以下内容计算xdyd

xd = x - L cos(theta)
yd = y - L cos(theta)

其中L是第一个单臂光束,theta0开始,xy输入。 现在,根据计算出的xdyd,它们将用于计算theta1theta2。 这三个角度应该发送到伺服电机。

但是,当我输入xy时,不会显示任何内容!如果你知道一些有用的链接可以帮助我解决这个问题,我们将非常感激。

序列号是:

#include <Servo.h>
#include <String.h>
#include <math.h>


Servo motor;
String content = "";
char character;

int yindex;
char End ;
String x,y;
int xt, yt;

float L0=297;
float L1=198;
float L2=165;

float theta0=0;
float theta1, theta2;

float xd,yd;
float xc,yc;




 void setup()
{

  Serial.begin(9600);
  motor.attach(9,660,2600);  

  }

void loop() 
{
 if (Serial.available ()>0)
  {

     while(Serial.available()) 
     {
         character = Serial.read();
         content.concat(character);
         content += character;
         Serial.println (content);

         End=content.length();
         yindex= content.indexOf("y");

         x=content.substring(1,yindex);
         y=content.substring(yindex+1, End);

          Serial.println (x);
          Serial.println (y);


             xt=x.toInt();
           Serial.println(xt);

            yt=y.toInt();
            Serial.println(yt);



   for ( theta0=0; theta0<180; theta0+=0.1)
  {
      xd= xt-L0*cos(theta0); 
      yd= yt-L0*cos(theta0);

       theta2 = acos((sq(xd)+sq(yd)- sq(L1)-sq(L2))/(2*L1*L2));
       theta1 = asin((L2*sin(theta2))/sqrt(sq(xd)+sq(yd)))+atan(yd/xd);

      Serial.println("The value of theta2 is : ");
      Serial.println(theta2);


      Serial.println("The value of theta1 is : ");
      Serial.println(theta1);


      xc = L0*cos(theta0) + L1*cos(theta1) + L2*cos(theta2);
      yc= L0*sin(theta0) + L1*sin(theta1) + L2*sin(theta2);


      Serial.println("The value of the calculated x is : ");
      Serial.println(xc);
      Serial.println("The value of the calculated y is : ");
     Serial.println(yc);
     Serial.println("The value of  theta0:");
      Serial.println(theta0);

      theta0=theta0*(180/3.14);
      theta1=theta1*(180/3.14);
      theta2=theta2*(180/3.14);

      if (theta1<=-180 && theta1>=0 && theta2>=0 && theta2 <=-180)
      {
           break;
       } 

     }



  }
 }

     content="";
 }

1 个答案:

答案 0 :(得分:0)

这里有很多问题。您应该通过一次测试解决方案的每个步骤来解决这样的问题,这样您就不会遇到大问题。首先,您需要确保正确读取字符串。

部分代码无法正常工作,因为{}循环周围的while(Serial.available())不在正确的位置。此外,您还要使用+=concat两次追加新字符。这是一个简单的解决方案来正确获取字符串。延迟是允许下一个字节可用,因此它不会过早退出循环。

  content="";
  while (Serial.available() < 1) {}
  while (Serial.available()) 
  {
    character = Serial.read();
    content += character;
    delay(10);
  }

  Serial.print("content = "); Serial.println (content);

接下来,您需要解析字符串中x和y的值。这里也有几个问题。我不认为你想对x和y使用整数,所以你需要一种方法将字符串解释为float。以下是如何将值解析为浮点数。

  End=content.length();
  yindex= content.indexOf("y");

  x=content.substring(1,yindex);
  y=content.substring(yindex+1, End);

  Serial.print("x = "); Serial.println (x);
  Serial.print("y = "); Serial.println (y);

  char xbuf[10] = "";
  x.toCharArray(xbuf, 10);
  xt = atof(xbuf);
  Serial.print("xt = "); Serial.println(xt);

  char ybuf[10] = "";
  y.toCharArray(ybuf, 10);
  yt = atof(ybuf);
  Serial.print("yt = "); Serial.println(yt);

这应该足以让你继续前进。在稍后的代码中你的数学有一些问题,但是在你使用print语句之后这应该更容易解决。注意 - 此代码期望来自串行监视器的格式为x0.34y0.678格式,其中0.34x的值,0.678y的值}。