پروژه های AVR, پروژه‌ها

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

mpu9250 project

فهرست مطالب

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

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

قطعات مورد نیاز

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

مقدمه

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

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

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

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

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

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

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

				
					#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;
               }

				
			

نتیجه

نظرتان را درباره این مقاله بگویید 0 نظر

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

دیدگاهتان را بنویسید

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