用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;
}
}
}
这个,搞好了就是个机器人的原形 在loop里面放delay(1000)是有问题的。因为串口的数据是10ms来一次,一次来33个数据,如果不及时处理的话,缓冲区就会被覆盖,所以delay(1000)以后再去取缓冲区里面的数据,就说不定当前的是加速度数据,角速度数据还是角度数据了。
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;
}
}
}
}
把数据解析放到中断里面处理就没有问题了。 楼住应该把注释也写上去给我们菜鸟看看 求正确写法!!! 楼主可以加个QQ好友吗我最近也在做这个能给我指教一下吗?
页:
[1]