سلام دوستان.این ماژول در حالت TTL چجوری راه اندازی میشه؟؟
یه راهنمایی بفرمایید.من روی خروجی یک سری اعداد عجیب غریب دارم اصلا نمیدونم باید چیکار کرد.
ماژول IMU شش محوره MPU6050 با فیلتر کالمن ( رابط TTL )
سلام دوستان.این ماژول در حالت TTL چجوری راه اندازی میشه؟؟
یه راهنمایی بفرمایید.من روی خروجی یک سری اعداد عجیب غریب دارم اصلا نمیدونم باید چیکار کرد.
ماژول IMU شش محوره MPU6050 با فیلتر کالمن ( رابط TTL )
یکی راهنمایی کنه لطفا
سلام
اون اعداد عجیب و غریب شامل 3 سری 11 تایی عدد هست که اولی یه عدد هگز ثابت (آدرس) ، دومی یه عدد هگز که 3 مقدار مختلف میتونه داشته باشه و آدرس سری هست و سری 9 تایی که پشتش میاد سه حالت داره
1-سه محور ژیروسکوپ و دما (hi-low) ، جمع مقادیر عددی
2-سه محور شتاب سنج و دما (hi-low) ، جمع مقادیر عددی
3-زاویه حول سه محور و دما (hi-low) ، جمع مقادیر عددی
تو دیتاشیت متاسفانه چینی این محصول هم یک سری برنامه برای نمونه آورده که باز هم متاسفانه باید عرض کنم نتونستم برای آردوینو تطبیقش بدم با این که به زبان سی هست...
و عرض دیگم هم اینه که بنده واقعا سواد الکترونیکم محدوده (با فرض اینکه اصلا وجود داره!!) ، برنامه نویسی رو هم اندکی از دوران طفولیت به یاد دارم ، دستم هم زیر ساطوره ، اگر کسی میدونه چطور باید ورودی تی تی ال آردوینو رو به این کدها داد و چه تغییراتی خود کدها لازم دارن متشکر میشم در میون بذاره
کد ها :
double a[3],w[3],Angle[3],T;
void DecodeIMUData(unsigned char chrTemp[])
{
switch(chrTemp[1])
{
case 0x51:
a[0] = (short(chrTemp[3]<<8|chrTemp[2]))/32768.0*16;
a[1] = (short(chrTemp[5]<<8|chrTemp[4]))/32768.0*16;
a[2] = (short(chrTemp[7]<<8|chrTemp[6]))/32768.0*16;
T = (short(chrTemp[9]<<8|chrTemp[8]))/340.0+36.25;
printf("a = %4.3f\t%4.3f\t%4.3f\t\r\n",a[0],a[1],a[2]);
break;
case 0x52:
w[0] = (short(chrTemp[3]<<8|chrTemp[2]))/32768.0*2000;
w[1] = (short(chrTemp[5]<<8|chrTemp[4]))/32768.0*2000;
w[2] = (short(chrTemp[7]<<8|chrTemp[6]))/32768.0*2000;
T = (short(chrTemp[9]<<8|chrTemp[8]))/340.0+36.25;
printf("w = %4.3f\t%4.3f\t%4.3f\t\r\n",w[0],w[1],w[2]);
break;
case 0x53:
Angle[0] = (short(chrTemp[3]<<8|chrTemp[2]))/32768.0*180;
Angle[1] = (short(chrTemp[5]<<8|chrTemp[4]))/32768.0*180;
Angle[2] = (short(chrTemp[7]<<8|chrTemp[6]))/32768.0*180;
T = (short(chrTemp[9]<<8|chrTemp[8]))/340.0+36.25;
printf("Angle = %4.2f\t%4.2f\t%4.2f\tT=%4.2f\r\n",Angle[0],Angle[1],Angle[2],T);
break;
}
}
بعدی
unsigned char Re_buf[11],counter=0;
unsigned char sign;
interrupt [USART_RXC] void usart_rx_isr(void) //USART串行接收中断
{
Re_buf[counter]=UDR;//不同单片机略有差异
if(counter==0&&Re_buf[0]!=0x55) return; //第 0 号数据不是帧头,跳过
counter++;
if(counter==11) //接收到11 个数据
{
counter=0; //重新赋值,准备下一帧数据的接收
sign=1;
}
}
بعدی
float a[3],w[3],angle[3],T;
extern unsigned char Re_buf[11],counter;
extern unsigned char sign;
while(1)
{
if(sign)
{
sign=0;
if(Re_buf[0]==0x55) //检查帧头
{
switch(Re_buf [1])
{
case 0x51:
a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;
a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;
a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x52:
w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000;
w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000;
w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x53:
angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180;
angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180;
angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
}
}
}
عملکرد کد ها رو تقریبا می فهمم ولی چطور با rx باید ارتباط برقرار کنه؟! و آیا نیاز به فراخوانی هست؟!
متشکر
کسی نبود واقعا؟
الحمدلله تونستم برنامش رو واسه آردو بنویسم
#include <SoftwareSerial.h>
SoftwareSerial imu(10, 11); // RX, TX (TX not used)
const int sentenceSize = 80;
float a[3],w[3],angle[3],T;
unsigned char Re_buf[11],counter;
void setup()
{
Serial.begin(9600);
imu.begin(115200);
imu.print(0x64 , HEX);
}
void loop()
{
Re_buf[0]=imu.read();
if(Re_buf[0]==0x55)
{
Re_buf[1]=imu.read();
Re_buf[2]=imu.read();
Re_buf[3]=imu.read();
Re_buf[4]=imu.read();
Re_buf[5]=imu.read();
Re_buf[6]=imu.read();
Re_buf[7]=imu.read();
Re_buf[8]=imu.read();
Re_buf[9]=imu.read();
Re_buf[10]=imu.read();
Re_buf[11]=imu.read();
switch(Re_buf [1])
{
case 0x51:
a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;
a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;
a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x52:
w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000;
w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000;
w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x53:
angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180;
angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180;
angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
}
}
}
می تونید داده ها رو که 100 بار در ثانیه آپدیت میشه پرینت بگیرید یا تو محاسباتتون تو خود آردو استفاده کنید
ویرایش توسط litron : 07-05-2015 در ساعت 06:47 PM
حالا مشکل دیگه ای هست و اون اینه که سافتوار سریال واسه due جواب نمی ده و من اینو تو uno امتحان کردم..
کسی هست بتونه راهنمایی کنه که چطور باید ارتباط ttl رو واسه due تعریف کرد؟
متشکر
حل شد ، با تشکر از راهنمایی های دوستان!!!!
باید از خود پورت های سریال استفاده کرد و اصلا نیازی به سافتوار سریال نداره ، و باید کد های اصلی سریال رو با پسوند شماره پورت نوشت...
با سلام
اعمال فیلتر کالمن روی داده های MPU6050
آموزش کامل کار با MPU6050 و راه اندازی آن توسط بردهای آردوینو
فیلم آموزشی
http://www.aparat.com/v/tFvQw
ویرایش توسط engamanc : 07-14-2016 در ساعت 09:56 PM
سلام من این کد رو تو اردوینو اپلود کردم ولی تئ سریال مانیتور چیزی برام بالا نمیاره چیکار باید بکنم؟