Thứ Tư, 5 tháng 8, 2015

Giao tiếp cảm biến MPU6050 với vi điều khiển

1
    Giới Thiệu.
-  Cảm biến MPU6050 là cảm biến góc, con quay hổi chuyển với 3 giá trị tọa độ và 3 giá trị gia tốc.
- Ngoài ra MPU6050 còn có 1 đơn vị tăng tốc phần cứng chuyên xử lý tín hiệu(Digital Motion Processor-DMP) do cảm biến thu thập và thức hiện các tính toán cần thiết. Điều này giúp giảm bớt đáng kể phần xử lý tính toán của vi điều khiển, cải thiện tốc độ xử lý và cho ra phản hồi nhanh hơn. Đây chính là 1 điểm khác biệt đáng kể của MPU6050 so với các cảm biến gia tốc và gyro khác.

Thông số kỹ thuật của module MPU6050:
Ø Điện áp hoạt động : 5V
Ø Giao tiếp I2C
Ø Độ phân giải góc +250 500 1000 2000 dps

Ø Độ phân giải gia tốc ±2 ±4 ±8 ±16g




Số thứ tự
Tên chân
Chức năng
1
VCC
Nối nguồn 5V
2
GND
Nối mass nguồn 5V
3
SCL
Chân xung nhịp giao tiếp I2C (5V)
4
SDA
Chân data giao tiếp I2C (5V)
5
XDA
Chân data giao tiếp I2C (3.3V)
6
XCL
Chân xung nhịp giao tiếp I2C (3.3V)
7
ADO
Kéo đã xuống GND, địa chỉ SLAVE của MPU6050 là 0x68
8
INT
Sử dụng cho ngắt ngoài





1   Phương Thức Giao Tiếp.
Ø Giao tiếp MPU6050 với vi điều khiển: Giao tiếp I2C.
                       -Sử dụng 2 chân SCL và SDA, hỗ trợ hầu hết trên các vi điều khiển.
                   -Trên module đã có sẵn trở treo dương đối với chân SCL và SDA.



Code mẫu (với ATMEGA32)


#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <math.h>
#include "lcd.h"
#include "mpu6050.h"


#define UART_BAUD_RATE 57600  //toc do baud, truyen uart len  PC
#include "uart.h"

void convert (long *temp_data, unsigned char x, unsigned char y)  //Lay 1 so sau dau phay
{
//   unsigned char k;
   move_LCD(y,x);
   if((*temp_data)<0)               //bit dau
   {
      *temp_data=-(*temp_data);
 putChar_LCD('-');
   }
   else putChar_LCD('+');

//   k=((*temp_data) % 100000000000)/10000000000+48;  
   putChar_LCD(((*temp_data) % 1000000000)/100000000+48);  //Lay MSB chuyen doi sang so, in len LCD
   putChar_LCD('.');

   putChar_LCD((*temp_data%100000000)/10000000+48);  //Lay bit cao thu 2, in len LCD
   


}

int main(void) {


#if MPU6050_GETATTITUDE == 1 || MPU6050_GETATTITUDE == 2  //lay toa do va gia toc
    long *ptr = 0;
    double qw = 1.0f;
double qx = 0.0f;
double qy = 0.0f;
double qz = 0.0f;
double roll = 0.0f;
double pitch = 0.0f;
double yaw = 0.0f;
#endif


uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));  //khoi tao uart
init_LCD();
clr_LCD();
print_LCD("Linhkien69.vn");
_delay_ms(1000);
clr_LCD();
  

//init interrupt
sei();  //su dung ngat neu dung chan INT (connect toi INT0), 1 ngat xay ra khi doc data

//init mpu6050
mpu6050_init();  //Khoi tao mpu
_delay_ms(50);
  


while(1) {

#if MPU6050_GETATTITUDE == 1 || MPU6050_GETATTITUDE == 2
mpu6050_getQuaternion(&qw, &qx, &qy, &qz);  //Lay gia tri toa do
mpu6050_getRollPitchYaw(&roll, &pitch, &yaw);  //Lay gia tri gia toc
_delay_ms(10);

_delay_ms(10);
/* Lay toa do va gia toc, in len LCD va truyen uart len PC */

// toa do
ptr = (long *)(&qw);
uart_putc(*ptr);
uart_putc(*ptr>>8);
uart_putc(*ptr>>16);
uart_putc(*ptr>>24);
        


ptr = (long *)(&qx);
uart_putc(*ptr);
uart_putc(*ptr>>8);
uart_putc(*ptr>>16);
uart_putc(*ptr>>24);

        move_LCD(1,1);
print_LCD("A");
convert (ptr,3,1);


ptr = (long *)(&qy);
uart_putc(*ptr);
uart_putc(*ptr>>8);
uart_putc(*ptr>>16);
uart_putc(*ptr>>24);

convert (ptr,8,1);

ptr = (long *)(&qz);
uart_putc(*ptr);
uart_putc(*ptr>>8);
uart_putc(*ptr>>16);
uart_putc(*ptr>>24);

convert (ptr,13,1);

        //gia toc
ptr = (long *)(&roll);
uart_putc(*ptr);
uart_putc(*ptr>>8);
uart_putc(*ptr>>16);
uart_putc(*ptr>>24);

move_LCD(2,1);
print_LCD("G");
convert (ptr,3,2);


ptr = (long *)(&pitch);
uart_putc(*ptr);
uart_putc(*ptr>>8);
uart_putc(*ptr>>16);
uart_putc(*ptr>>24);

convert (ptr,8,2);


ptr = (long *)(&yaw);
uart_putc(*ptr);
uart_putc(*ptr>>8);
uart_putc(*ptr>>16);
uart_putc(*ptr>>24);

convert (ptr,13,2);

uart_putc('\n');
// _delay_ms(30);
#endif

}

}



Chi tiết tại link:     TamBKSTAR


Không có nhận xét nào:

Đăng nhận xét