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

راهنما راه اندازی ماژول MPU9250 توسط برد AVR Wizard
هدف از این آموزش چگونگی برقراری ارتباط با یک سنسور دیجیتال و راه اندازی یک LCD می باشد
در نهایت شما قادر خواهید بود ماژول mpu9250 را، راه اندازی کرده و خروجی سنسور را بر روی LCD نمایش دهید.
لوازم مورد نیاز :
- برد AVR Wizard
- ماژول mpu9250
- پروگرامر MKII
- منبع تغذیه 6-12 ولت
مقدمه:
ماژول mpu9250 دو چیپ را در خود جای دادهاست؛ یک چیپ شامل شتاب سنج و ژایروسکوپ 3 محوره و چیپ دیگر شامل یک مگنتومتر سه محوره میباشد. به همین خاطر mpu9250 یک ردیاب حرکتی (motion tracking) 9 محوره میباشد. این سنسور قادر است از طریق درگاه I2C یا SPI، تمامی اطلاعات مربوط به 9 محور را منتقل کند.
MPU9250 متشکل از 9 ADC 16 بیتی میباشد؛ 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; }
نتیجه: