极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23299|回复: 7

用mpu6050控制舵机的问题

[复制链接]
发表于 2013-11-15 21:53:04 | 显示全部楼层 |阅读模式
本帖最后由 洋芋。煮不跁 于 2013-11-15 21:55 编辑

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

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

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

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


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

我自己改法是:

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




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




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





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

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

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

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

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



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

      






  1. unsigned char Re_buf[11],counter=0;
  2. unsigned char sign=0;
  3. float a[3],w[3],angle[3],T;
  4. void setup() {
  5.   // initialize serial:
  6.   Serial.begin(115200);
  7. }

  8. void loop() {
  9.   if(sign)
  10.   {  
  11.      sign=0;
  12.      if(Re_buf[0]==0x55)      //检查帧头
  13.      {  
  14.         switch(Re_buf [1])
  15.         {
  16.         case 0x51:
  17.                 a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;
  18.                 a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;
  19.                 a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;
  20.                 T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
  21.                 break;
  22.         case 0x52:
  23.                 w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000;
  24.                 w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000;
  25.                 w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000;
  26.                 T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
  27.                 break;
  28.         case 0x53:
  29.                 angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180;
  30.                 angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180;
  31.                 angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
  32.                 T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
  33.                 Serial.print("a:");
  34.                 Serial.print(a[0]);Serial.print(" ");
  35.                 Serial.print(a[1]);Serial.print(" ");
  36.                 Serial.print(a[2]);Serial.print(" ");
  37.                 Serial.print("w:");
  38.                 Serial.print(w[0]);Serial.print(" ");
  39.                 Serial.print(w[1]);Serial.print(" ");
  40.                 Serial.print(a[2]);Serial.print(" ");
  41.                 Serial.print("angle:");
  42.                 Serial.print(angle[0]);Serial.print(" ");
  43.                 Serial.print(angle[1]);Serial.print(" ");
  44.                 Serial.print(angle[2]);Serial.print(" ");
  45.                 Serial.print("T:");
  46.                 Serial.println(T);
  47.                 break;
  48.         }
  49.     }
  50.   }
  51. }

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

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

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

  63.   }
  64. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-11-15 22:39:46 来自手机 | 显示全部楼层
这个,搞好了就是个机器人的原形
回复 支持 反对

使用道具 举报

发表于 2013-11-16 00:38:00 | 显示全部楼层
在loop里面放delay(1000)是有问题的。因为串口的数据是10ms来一次,一次来33个数据,如果不及时处理的话,缓冲区就会被覆盖,所以delay(1000)以后再去取缓冲区里面的数据,就说不定当前的是加速度数据,角速度数据还是角度数据了。
回复 支持 反对

使用道具 举报

发表于 2013-11-16 00:42:38 | 显示全部楼层
[pre lang="arduino" line="1" file="sevo.ino"]
void loop() {
  if (sign==0) return;
  sign=0;

  Serial.print("angle:");
  Serial.print(Angle[0]);Serial.print(" ");
  Serial.print(Angle[1]);Serial.print(" ");
  Serial.print(Angle[2]);Serial.print(" ");
  Serial.print("T:");
  Serial.println(T);
  if(Angle[0]>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[counter]=(unsigned char)Serial.read();
    if(counter==0&&Re_buf[0]!=0x55) return;         
    counter++;      
    if(counter==11)            
   {   
       counter=0;               
       switch(Re_buf [1])
        {
        case 0x51:
                a[0] = float(short(Re_buf [3]<<8| Re_buf [2]))/32768*16;
                a[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*16;
                a[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*16;               
                break;
        case 0x52:
                w[0] =  float(short(Re_buf [3]<<8| Re_buf [2]))/32768*250;
                w[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*250;
                w[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*250;
                break;
        case 0x53:
                Angle[0] =  float(short(Re_buf [3]<<8| Re_buf [2]))/32768*180;
                Angle[1] =  float(short(Re_buf [5]<<8| Re_buf [4]))/32768*180;
                Angle[2] =  float(short(Re_buf [7]<<8| Re_buf [6]))/32768*180;
                T =  float(short(Re_buf [9]<<8| Re_buf [8]));///340.0+36.25   
sign=1;
                break;
        }
    }
      
  }
}
[/code]
回复 支持 反对

使用道具 举报

发表于 2013-11-16 00:43:30 | 显示全部楼层
把数据解析放到中断里面处理就没有问题了。
回复 支持 反对

使用道具 举报

发表于 2013-11-19 14:17:14 | 显示全部楼层
楼住应该把注释也写上去给我们菜鸟看看
回复 支持 反对

使用道具 举报

发表于 2016-3-25 21:22:31 | 显示全部楼层
求正确写法!!!
回复 支持 反对

使用道具 举报

发表于 2017-4-17 21:21:23 | 显示全部楼层
楼主可以加个QQ好友吗  我最近也在做这个  能给我指教一下吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 11:54 , Processed in 0.043456 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表