پروژه راه اندازی ماژول MPU9250 توسط برد AVR Wizard

 پروژه راه اندازی ماژول MPU9250 توسط برد AVR Wizard

راهنما راه اندازی ماژول MPU9250 توسط برد AVR Wizard

هدف از این آموزش چگونگی برقراری ارتباط با یک سنسور دیجیتال و راه اندازی یک LCD می باشد

در نهایت شما قادر خواهید بود ماژول mpu9250 را، راه اندازی کرده و خروجی سنسور را بر روی LCD نمایش دهید.

لوازم مورد نیاز :

  1. برد AVR Wizard
  2. ماژول mpu9250
  3. پروگرامر MKII
  4. منبع تغذیه 6-12 ولت

مقدمه:

ماژول mpu9250 دو چیپ را در خود جای داده‌است؛ یک چیپ شامل شتاب سنج و ژایروسکوپ 3 محوره و چیپ دیگر شامل یک مگنتومتر سه محوره می‌باشد. به همین خاطر mpu9250 یک ردیاب حرکتی (motion tracking) 9 محوره می‌باشد. این سنسور قادر است از طریق درگاه I2C یا SPI، تمامی اطلاعات مربوط به 9 محور را منتقل کند.

MPU9250 متشکل از 9 ADC 16 بیتی می‌باشد؛ 3 مبدل برای تبدیل داده‌های سه محور ژایروسکوپ، 3 مبدل برای تبدیل دا‌ده‌های محورهای شتاب‌سنج و 3 مبدل برای تبدیل داده‌های محورهای مگنتومتر.

توضیحات برنامه:

ابتدا در CodeVision یک پروژه جدید ایجاد کنید.

پروژه جدید در CODE VISION

سپس درگاه I2C، LCD و Sw1 را فعال می‌کنیم.

تعیین ورودی و خروجی LCD و CHIP در CODE VIsion .

پس از ذخیره و تولید فایل‌ها، وارد محیط برنامه نویسی می‌شویم.

ابتدا توابع و متغیرهای مورد نیاز را تعریف می‌کنیم:

#include <stdint.h>
#include <stdlib.h>
#include <mpu.h>
#include <delay.h>
#define mpu_address 0x68
#define ak_address 0x0C


uint8_t acc_data[6],gyro_data[6],temperature[2],who[2],ak[2];
uint8_t who_am=0x75,user,who_ak=0x00;
float temperature_c;
char lcd_data[15];
float gyro_x,gyro_y,gyro_z,acl_x,acl_y,acl_z;

سپس ارتباط با ماژول را بررسی کرده و از صحت آن مطمئن می‌شویم:

who[1]=i2c_readReg(mpu_address<<1,who_am, (uint8_t*)who, 1);
if(who[1]!=0 )
{
        lcd_gotoxy(0,0); 
        lcd_puts("   I2C Error!");
}
else if(who[0]!=113&& who[0]!=115)
{
        lcd_gotoxy(0,0); 
        lcd_puts("    It isn't ");   
        lcd_gotoxy(0,1); 
        lcd_puts("     MPU9250");
}
else
      {

        lcd_gotoxy(0,0); 
        lcd_puts("    MPU9250 ");   
        lcd_gotoxy(0,1); 
        lcd_puts("   Detected!"); 
        }   
        delay_ms(2000); 

به خاطر زیاد بودن تعداد داده‌هایی که باید بر روی LCD نمایش داده شوند، داده‌ها در چند صفحه نمایش می‌دهیم و برای تغییر صفحات، از دکمه SW1 استفاده می‌کنیم:

if(PINC.4==0)
        {
         user++;
         delay_ms(300);
         if(user==3)
         user=0;
        }

حال دیتای لازم را از سنسور دریافت کرده و به مقادیر قابل درک تبدیل می‌کنیم:

i2c_readReg(mpu_address<<1,0x3B, (uint8_t*)acc_data,6);
        i2c_readReg(mpu_address<<1,0x43, (uint8_t*)gyro_data,6);
        i2c_readReg(mpu_address<<1,0x41, (uint8_t*)temperature,2); 
        temperature_c = ((float) (temperature[0]<<8 | temperature[1])) / 333.87 + 21.0; // Gyro chip temperature in degrees Centigrade
        acl_x=((int16_t)(acc_data[0]<<8 | acc_data[1]))*.000061;                     //  converting to +-2g range
        acl_y=((int16_t)(acc_data[2]<<8 | acc_data[3]))*.000061;                    //   converting to +-2g range
        acl_z=((int16_t)(acc_data[4]<<8 | acc_data[5]))*.000061;                   //    converting to +-2g range
        gyro_x=((int16_t)(gyro_data[0]<<8 | gyro_data[1]))/131;                   //     converting to +-250dps range
        gyro_y=((int16_t)(gyro_data[2]<<8 | gyro_data[3]))/131;                  //      converting to +-250dps range
        gyro_z=((int16_t)(gyro_data[4]<<8 | gyro_data[5]))/131;                 //       converting to +-250dps range

در ادامه با توجه به صفحه انتخاب شده توسط SW1، داده‌ها را بر روی LCD نمایش می‌دهیم:

switch (user)
               {
               case 0 : 
                lcd_gotoxy(0,0); //line 0, char 0
                lcd_puts("  Temperature: ");   
                lcd_gotoxy(6,1); //line 1, char 6
                ftoa(temperature_c,2,lcd_data); // Convert integer to string
                lcd_puts(lcd_data);

               break;

               case 1 :  
                lcd_gotoxy(0,0); //line 1, char 0
                lcd_puts(" Acc:  ");
                lcd_puts("x=");
                ftoa(acl_x,1,lcd_data); // Convert integer to string
                lcd_puts(lcd_data);   
                lcd_gotoxy(0,1); //line 2, char 0 
                lcd_puts("y=");
                ftoa(acl_y,1,lcd_data); // Convert integer to string
                lcd_puts(lcd_data);
                lcd_gotoxy(7,1); 
                lcd_puts("z=");
                ftoa(acl_z,1,lcd_data); // Convert integer to string
                lcd_puts(lcd_data);



               break; 
               
               case 2 :
                lcd_gotoxy(0,0); //line 1, char 0
                lcd_puts("Gyro : ");
                lcd_puts("Gx=");
                ftoa(gyro_x,1,lcd_data); // Convert integer to string
                lcd_puts(lcd_data); 
                lcd_gotoxy(0,1); //line 1, char 0  
                lcd_puts("Gy=");
                ftoa(gyro_y,1,lcd_data); // Convert integer to string
                lcd_puts(lcd_data);
                lcd_gotoxy(7,1); 
                lcd_puts("Gz=");
                ftoa(gyro_z,1,lcd_data); // Convert integer to string
                lcd_puts(lcd_data);

               break;
               }

نتیجه:

پروژه mpu9250

zahra_ahmadi

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

4 × 1 =