洋芋。煮不跁 发表于 2013-11-15 21:53:04

用mpu6050控制舵机的问题

本帖最后由 洋芋。煮不跁 于 2013-11-15 21:55 编辑

经过半天的搭建,终于成功将UNO和mpu6050搭建好了

用了示范代码测试,串口监视器上的数据比较正常。

现在想通过6050数据的值间接来控制 舵机的运动

才开始学习Arduino,试着改了下原代码,但是失败了。


比如说6050中的一个角度(angle)大于30度时,舵机转过60度,该怎么写呢?

我自己改法是:

1)在开头添加Servo库,然后servo servo1;




2)在void setup 里添加 插脚值,舵机初始值;




3)在void loop 里最后添加控制舵机的指令





实践证明这是一种错误的方法

小白请教大家这个代码应该怎么改写

才能正确用6050里面值的变化来驱动舵机的不同运动

就如【当6050中angle的值大于30时 舵机转过60度】

灰常感谢各位前辈的指导啊



附没有改动的原始代码如下

      





unsigned char Re_buf,counter=0;
unsigned char sign=0;
float a,w,angle,T;
void setup() {
// initialize serial:
Serial.begin(115200);
}

void loop() {
if(sign)
{
   sign=0;
   if(Re_buf==0x55)      //检查帧头
   {
      switch(Re_buf )
      {
      case 0x51:
                a = (short(Re_buf <<8| Re_buf ))/32768.0*16;
                a = (short(Re_buf <<8| Re_buf ))/32768.0*16;
                a = (short(Re_buf <<8| Re_buf ))/32768.0*16;
                T = (short(Re_buf <<8| Re_buf ))/340.0+36.25;
                break;
      case 0x52:
                w = (short(Re_buf <<8| Re_buf ))/32768.0*2000;
                w = (short(Re_buf <<8| Re_buf ))/32768.0*2000;
                w = (short(Re_buf <<8| Re_buf ))/32768.0*2000;
                T = (short(Re_buf <<8| Re_buf ))/340.0+36.25;
                break;
      case 0x53:
                angle = (short(Re_buf <<8| Re_buf ))/32768.0*180;
                angle = (short(Re_buf <<8| Re_buf ))/32768.0*180;
                angle = (short(Re_buf <<8| Re_buf ))/32768.0*180;
                T = (short(Re_buf <<8| Re_buf ))/340.0+36.25;
                Serial.print("a:");
                Serial.print(a);Serial.print(" ");
                Serial.print(a);Serial.print(" ");
                Serial.print(a);Serial.print(" ");
                Serial.print("w:");
                Serial.print(w);Serial.print(" ");
                Serial.print(w);Serial.print(" ");
                Serial.print(a);Serial.print(" ");
                Serial.print("angle:");
                Serial.print(angle);Serial.print(" ");
                Serial.print(angle);Serial.print(" ");
                Serial.print(angle);Serial.print(" ");
                Serial.print("T:");
                Serial.println(T);
                break;
      }
    }
}
}

void serialEvent() {
while (Serial.available()) {

    //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code

    Re_buf=(unsigned char)Serial.read();
    if(counter==0&&Re_buf!=0x55) return;      //第0号数据不是帧头            
    counter++;      
    if(counter==11)             //接收到11个数据
    {   
       counter=0;               //重新赋值,准备下一帧数据的接收
       sign=1;
    }

}
}



邵林寺 发表于 2013-11-15 22:39:46

这个,搞好了就是个机器人的原形

zhaowenwin 发表于 2013-11-16 00:38:00

在loop里面放delay(1000)是有问题的。因为串口的数据是10ms来一次,一次来33个数据,如果不及时处理的话,缓冲区就会被覆盖,所以delay(1000)以后再去取缓冲区里面的数据,就说不定当前的是加速度数据,角速度数据还是角度数据了。

zhaowenwin 发表于 2013-11-16 00:42:38


void loop() {
if (sign==0) return;
sign=0;

Serial.print("angle:");
Serial.print(Angle);Serial.print(" ");
Serial.print(Angle);Serial.print(" ");
Serial.print(Angle);Serial.print(" ");
Serial.print("T:");
Serial.println(T);
if(Angle>60)
        servo1.write(60);
delay(1000);
}

void serialEvent() {
while (Serial.available()) {
   
    //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code

    Re_buf=(unsigned char)Serial.read();
    if(counter==0&&Re_buf!=0x55) return;         
    counter++;      
    if(counter==11)            
   {   
       counter=0;               
       switch(Re_buf )
        {
        case 0x51:
                a = float(short(Re_buf <<8| Re_buf ))/32768*16;
                a =float(short(Re_buf <<8| Re_buf ))/32768*16;
                a =float(short(Re_buf <<8| Re_buf ))/32768*16;               
                break;
        case 0x52:
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                w =float(short(Re_buf <<8| Re_buf ))/32768*250;
                break;
        case 0x53:
              Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                Angle =float(short(Re_buf <<8| Re_buf ))/32768*180;
                T =float(short(Re_buf <<8| Re_buf ));///340.0+36.25   
sign=1;
                break;
        }
    }
      
}
}

zhaowenwin 发表于 2013-11-16 00:43:30

把数据解析放到中断里面处理就没有问题了。

学慧放弃 发表于 2013-11-19 14:17:14

楼住应该把注释也写上去给我们菜鸟看看

awsaws613 发表于 2016-3-25 21:22:31

求正确写法!!!

HGP 发表于 2017-4-17 21:21:23

楼主可以加个QQ好友吗我最近也在做这个能给我指教一下吗?
页: [1]
查看完整版本: 用mpu6050控制舵机的问题