نمایش نتایج: از 1 به 10 از 10
Like Tree1 لایک
  • 1 Post By litron

موضوع: ماژول imu شش محوره mpu6050 با فیلتر کالمن

  1. #1
    Junior Member
    تاریخ عضویت
    Jun 2015
    نوشته ها
    2

    ماژول imu شش محوره mpu6050 با فیلتر کالمن

    سلام دوستان.این ماژول در حالت TTL چجوری راه اندازی میشه؟؟

    یه راهنمایی بفرمایید.من روی خروجی یک سری اعداد عجیب غریب دارم اصلا نمیدونم باید چیکار کرد.



    ماژول IMU شش محوره MPU6050 با فیلتر کالمن ( رابط TTL )

  2. #2
    Junior Member
    تاریخ عضویت
    Jun 2015
    نوشته ها
    2
    یکی راهنمایی کنه لطفا

  3. #3
    Junior Member
    تاریخ عضویت
    Jun 2015
    نوشته ها
    9
    سلام
    اون اعداد عجیب و غریب شامل 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 باید ارتباط برقرار کنه؟! و آیا نیاز به فراخوانی هست؟!
    متشکر
    لایک کردن

  4. #4
    Junior Member
    تاریخ عضویت
    Jun 2015
    نوشته ها
    9
    کسی نبود واقعا؟

  5. #5
    Junior Member
    تاریخ عضویت
    Jun 2015
    نوشته ها
    9
    الحمدلله تونستم برنامش رو واسه آردو بنویسم
    #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

  6. #6
    Junior Member
    تاریخ عضویت
    Jun 2015
    نوشته ها
    9
    حالا مشکل دیگه ای هست و اون اینه که سافتوار سریال واسه due جواب نمی ده و من اینو تو uno امتحان کردم..
    کسی هست بتونه راهنمایی کنه که چطور باید ارتباط ttl رو واسه due تعریف کرد؟
    متشکر

  7. #7
    Junior Member
    تاریخ عضویت
    Jun 2015
    نوشته ها
    9
    حل شد ، با تشکر از راهنمایی های دوستان!!!!
    باید از خود پورت های سریال استفاده کرد و اصلا نیازی به سافتوار سریال نداره ، و باید کد های اصلی سریال رو با پسوند شماره پورت نوشت...

  8. #8
    Member
    تاریخ عضویت
    Oct 2013
    نوشته ها
    70
    با سلام
    اعمال فیلتر کالمن روی داده های MPU6050
    آموزش کامل کار با MPU6050 و راه اندازی آن توسط بردهای آردوینو
    فیلم آموزشی
    http://www.aparat.com/v/tFvQw
    ویرایش توسط engamanc : 07-14-2016 در ساعت 09:56 PM

  9. #9
    Junior Member
    تاریخ عضویت
    Aug 2016
    نوشته ها
    6
    سلام من این کد رو تو اردوینو اپلود کردم ولی تئ سریال مانیتور چیزی برام بالا نمیاره چیکار باید بکنم؟

  10. #10
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,064
    نقل قول نوشته اصلی توسط mohadese نمایش پست ها
    سلام من این کد رو تو اردوینو اپلود کردم ولی تئ سریال مانیتور چیزی برام بالا نمیاره چیکار باید بکنم؟

    باد ریت کنسولتون با بادریتی که تو کدتون تنظیم کردید همخونی داره ؟

    باید مساوی باشه!

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO