فهرست مطالب
قطعات مورد نیاز :
- برد AVR Wizard
- ماژول MPU6050
- پروگرامر MKII
- منبع تغذیه 6-12 ولت
مقدمه
توضیحات برنامه
ابتدا در CodeVision یک پروژه جدید ایجاد کنید.
سپس درگاه I2C، LCD و Sw1 را فعال میکنیم.
پس از ذخیره و تولید فایلها، وارد محیط برنامه نویسی میشویم.
ابتدا توابع و متغیرهای مورد نیاز را تعریف میکنیم:
#include
#include
#include
#include
#define mpu_address 0x68
uint8_t acc_data[6],gyro_data[6],temperature[2],who[2];
uint8_t who_am=0x75,user;
float temperature_c;
char lcd_data[15];
float gyro_x,gyro_y,gyro_z,acl_x,acl_y,acl_z;
سپس ارتباط با ماژول را بررسی کرده و از صحت آن مطمئن میشویم:
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(" Hi! Welcome ");
lcd_gotoxy(0,1);
lcd_puts("www.redronic.com");
delay_ms(2000);
lcd_clear();
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]!=104&& who[0]!=105)
{
lcd_gotoxy(0,0);
lcd_puts(" It isn't ");
lcd_gotoxy(0,1);
lcd_puts(" MPU6050");
}
else
{
lcd_gotoxy(0,0);
lcd_puts(" MPU6050 ");
lcd_gotoxy(0,1);
lcd_puts(" Detected!");
}
سپس ماژول را فعال میکنیم:
i2c_writeReg(mpu_address<<1, 0x6B, 0x00, 1);
به خاطر زیاد بودن تعداد دادههایی که باید بر روی 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;
}