فهرست
- آشنایی با ماژول شتابسنج و ژیروسکوپ MPU6050
- قطعات مورد نیاز
- نحوهی اتصالات
- کد (با استفاده از CodeVision AVR)
آشنایی با ماژول شتابسنج و ژیروسکوپ MPU6050
MPU6050 یک سنسور ردیابی حرکت 6 محوره است که شتابسنج 3 محوره و ژیروسکوپ 3 محوره را در یک مدار مجتمع ترکیب کرده است. از این ماژول معمولاً در پروژههای الکترونیکی مختلفی که نیاز به قابلیتهای سنجش حرکت و ردیابی جهتگیری دارند، استفاده میشود. در ادامه شرح مفصلی از MPU6050 آورده شده است:
شتاب سنج: شتاب سنج 3 محوره MPU6050 شتاب خطی را در امتداد محورهای X، Y و Z اندازه گیری میند. این مقادیر شتاب دقیق را تا محدودهی 16g± (که یک g نشان دهنده گرانشی زمین است، g = 9.8 (m/s2)) ارائه میدهد. شتاب سنج برای تشخیص تغییرات در سرعت، جهت گیری و شیب مفید است.
ژیروسکوپ: ژیروسکوپ 3 محوره MPU6050 حرکت چرخشی حول محورهای X، Y و Z را اندازه گیری میکند. سرعت زاویهای را اندازهگیری کرده و امکان ردیابی دقیق حرکات چرخشی را فراهم میکند. ژیروسکوپ دارای محدوده اندازهگیری قابل برنامه ریزی، معمولاً 250±، 500±، 1000± یا 2000± درجه در ثانیه (dps) است. این سنسور برای کاربردهایی مانند تشخیص جنبش، کنترل حرکت و پایدارسازی حرکتی مفید است.
رابط I2C: ماژول MPU6050 با استفاده از رابط I2C (Inter-Integrated Circuit) با میکروکنترلر ارتباط برقرار میکند. این ماژول از هر دو حالت ارتباط سریع (400 کیلوهرتز) و حالت استاندارد (100 کیلوهرتز) پشتیبانی میکند. رابط I2C اتصال را ساده میکند و امکان ادغام آسان با انواع میکروکنترلرها را فراهم میکند.
کاربردهای سنجش حرکت: MPU6050 به طور گسترده در برنامه های کاربردی مختلف از جمله روباتیک، هواپیماهای بدون سرنشین، واقعیت مجازی، بازی و دستگاه های کنترل حرکت استفاده میشود. MPU6050 دادههای حرکتی را به صورت لحظهای ارائه می دهد و ردیابی حرکت و تخمین جهت گیری دقیق را امکان پذیر میکند. MPU6050 با اندازه جمع و جور، مصرف انرژی کم و عملکرد عالی، گزینه ای محبوب برای پروژه های سنجش حرکت است.
قطعات مورد نیاز
- میکروکنترلر ATmega32
- ماژول MPU6050 (شتاب سنج و ژیروسکوپ 6 محوره)
- LCD کاراکتری 2×16
- برد برد
- سیم جامپر (سیم بردبردی)
- منبع تغذیه (مانند باتری یا تغذیه USB)
نحوهی اتصالات
مطابق شکل زیر اتصالات را انجام دهید:
- پایههای VCC و GND ماژول MPU6050 و میکروکنترلر ATmega32 را به ترتیب به پایههای 5 ولت و GND تغذیه وصل کنید.
- پایههای SDA و SCL ماژول MPU6050 را به پایههای I2C مربوطه (به عنوان مثال SDA -> PC.1، SCL -> PC.0) ATmega32 وصل کنید.
- پایههای AD0 و INT ماژول MPU6050 را به پایهی GND وصل کنید.
- پینهای RD، RS و E صفحه نمایش LCD کاراکتری را میتوانید به هر پایهی دلخواه از ATmega32 وصل کنید. مطابق شکل در این پروژه این پایهها به ترتیب به پینهای PD.1 ،PD.0 و PD.2 وصل شده است.
- پایههای داده D4-D7 صفحه نمایش LCD را میتوانید به هر پایهی دلخواه از ATmega32 وصل کنید. مطابق شکل در این پروژه این پایهها به ترتیب به پینهای PD.5 ،PD.4 ،PD.3 و PD.6 وصل شده است.
- پایههای VCC و آند (A) صفحه نمایش LCD را به پایهی 5 ولت تغذیه و GND و کاتد (K) آن را به GND تغذیه وصل کنید.
- پایهی V0 صفحه نمایش LCD را با مقاومت 2.2K اهم به پایهی 5 ولت تغذیه وصل کنید.
کد (با استفاده از CodeVision AVR):
پس از باز کردن پروژهی جدید در نرمافزار CodeVision و انتخاب ATmega32 به عنوان پردازنده، در قسمت Alphanumeric LCD گزینهی Enable Alphanumeric LCD support را تیک بزنید. در قسمت باز شده تعداد کارکتر بر خط (Character/Line) را 16 وارد کنید و در قسمت پایین آن انتخاب کنید که هر پایه از LCD کاراکتری را به کدام پین از میکروکنترلر وصل کردهاید.
در این پروژه اتصالات مطابق با تصویر بالا انتخاب شده است. در ادامه کد مربوطه برای نمایش شتاب و سرعت زاویهای با استفاده از ماژول MPU6050 و میکروکنترلر ATMEGA32 در LCD کارکتری ارائه شده است. توجه داشته باشید که این کد برای هر یک از میکروکنترلرهای دیگر خانوادهی AVR نیز قابل استفاده است.
#include <mega32.h>
#include <stdio.h>
#include <delay.h>
#include <i2c.h>
#include <lcd.h>
#define MPU6050_ADDRESS 0xD0 // MPU6050 I2C address
void MPU6050_Init()
{
i2c_start();
i2c_write(MPU6050_ADDRESS);
i2c_write(0x6B); // PWR_MGMT_1 register
i2c_write(0x00); // Wake up the MPU6050 (set to 0x00)
i2c_stop();
}
void MPU6050_ReadAccelerometer(int *accX, int *accY, int *accZ)
{
i2c_start();
i2c_write(MPU6050_ADDRESS);
i2c_write(0x3B); // ACCEL_XOUT_H register
i2c_start();
i2c_write(MPU6050_ADDRESS + 1);
*accX = (((int)i2c_read(ACK) << 8) | i2c_read(ACK));
*accY = (((int)i2c_read(ACK) << 8) | i2c_read(ACK));
*accZ = (((int)i2c_read(ACK) << 8) | i2c_read(NACK));
i2c_stop();
}
void MPU6050_ReadGyroscope(int *gyroX, int *gyroY, int *gyroZ)
{
i2c_start();
i2c_write(MPU6050_ADDRESS);
i2c_write(0x43); // GYRO_XOUT_H register
i2c_start();
i2c_write(MPU6050_ADDRESS + 1);
*gyroX = (((int)i2c_read(ACK) << 8) | i2c_read(ACK));
*gyroY = (((int)i2c_read(ACK) << 8) | i2c_read(ACK));
*gyroZ = (((int)i2c_read(ACK) << 8) | i2c_read(NACK));
i2c_stop();
}
void LCD_Init()
{
lcd_init(16);
lcd_clear();
lcd_gotoxy(0, 0);
lcd_puts("Acc(X,Y,Z):");
lcd_gotoxy(0, 1);
lcd_puts("Gyro(X,Y,Z):");
}
void LCD_Update(int accX, int accY, int accZ, int gyroX, int gyroY, int gyroZ)
{
char buffer[10];
lcd_gotoxy(11, 0);
sprintf(buffer, "%4d,%4d,%4d", accX, accY, accZ);
lcd_puts(buffer);
lcd_gotoxy(11, 1);
sprintf(buffer, "%4d,%4d,%4d", gyroX, gyroY, gyroZ);
lcd_puts(buffer);
}
void main()
{
int accX, accY, accZ;
int gyroX, gyroY, gyroZ;
MPU6050_Init();
LCD_Init();
while (1)
{
MPU6050_ReadAccelerometer(&accX, &accY, &accZ);
MPU6050_ReadGyroscope(&gyroX, &gyroY, &gyroZ);
LCD_Update(accX, accY, accZ, gyroX, gyroY, gyroZ);
delay_ms(200);
}
}
توضیح کد:
تابع MPU6050_Init ماژول را از حالت خواب درآورده و آن را مقداردهی اولیه میکند.
تابع MPU6050_ReadAccelerometer دادههای خام شتاب سنج (accX، accY، accZ) را از ماژول میخواند.
تابع MPU6050_ReadGyroscope دادههای خام ژیروسکوپ (gyroX، gyroY، gyroZ) را از ماژول میخواند.
تابع LCD_Init نمایشگر LCD را مقداردهی اولیه میکند و طرح اولیه نمایشگر را تنظیم میکند.
تابع LCD_Update نمایشگر LCD را با آخرین مقادیر شتاب سنج و ژیروسکوپ به روز میکند.
در تابع ()main کد به طور مداوم مقادیر سنسور را میخواند، صفحه نمایش LCD به روز میشود. این فرآیند را با تاخیر 200 میلی ثانیهای بی هر به روز رسانی تکرار میشود.
قبل از کامپایل و آپلود کد در میکروکنترلر مطمئن شوید که تنظیمات محیط CodeVision AVR، از جمله افزودن کتابخانههای لازم و انتخاب میکروکنترلر مناسب (ATmega32) را را به درستی تنظیم کردهاید.
توجه
در صورتی که در راهاندازی این پروژه نیاز به راهنمایی بیشتر دارید، در قسمت دیدگاه مطرح کنید.
با سلام،
لطفا در مورد انواع مختلف ماژول شتاب سنج هم مطلب بذارید.
ممنون
بله، حتما.