atmega128 / mpu6050 / gy-521 / 자이로 / 가속도 / 센서
TWI 통신으로 레지스터 0x3B부터 0x40, 0x43부터 0x48까지
그러니까 가속도 XYZ 출력과 자이로 XYZ 출력 레지스터를 읽기까지 성공함.
읽어들인 RAW 데이터를 정제하는데 머리가 아픔
MPU는 ATmega128을 사용했고
GY-521의 SCL -> PD0 / SDA -> PD1에 연결
사용된 센서는 MPU-6050 3축 가속도 / 3축 자이로 / 온도를 감지
오프셋을 설정 / 필터로 안정적인 값을 추출하는 작업을 해야 하는 것 같은데
아직 완벽히 이해하지 못함.
아래의 소스에서 getRawData();는 레지스터에서 읽은 단순한 값을 각 변수에 저장함.
변수의 내용을 확인 하기 위해선 텍스트 LCD로 확인하거나 시리얼 통신으로 값을 읽어서 확인해야 함.
#include <stdlib.h>
#include <delay.h>
#include <mega128.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
typedef unsigned char byte;
/*------MPU------------*/
byte MPU6050_read(byte addr);
void MPU6050_write(byte addr, char data);
void getRawData();
unsigned int gx = 0, gy = 0, gz = 0, ax = 0, ay = 0, az = 0;
byte buffer[12];
void main(void)
{
TWSR = 0x00;
TWBR = 0x12;
MPU6050_write(0x6B, 0x00);
MPU6050_write(0x6C, 0x00);
getRawData();
while(1)
{
getRawData();
}
}
byte MPU6050_read(byte addr)
{
byte dat;
TWCR = 0xA4;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x08)));
TWDR = 0xD0;
TWCR = 0x84;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x18)));
TWDR = addr;
TWCR = 0x84;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x28)));
TWCR = 0xA4;
//-------------------------------------------------------------
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x10)));
TWDR = 0xD1;
TWCR = 0x84;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x40)));
TWCR = 0x84;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x58)));
dat = TWDR;
TWCR = 0x94;
return dat;
}
void MPU6050_write(byte addr, char data)
{
TWCR = 0xA4;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x08)));
TWDR = 0xD0;
TWCR = 0x84;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x18)));
TWDR = addr; // addr = 0x43
TWCR = 0x84;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x28)));
//-------------------------------------------------------------
TWDR = data;
TWCR = 0x84;
while(((TWCR & 0x80) == 0x00 || ((TWSR & 0xF8) != 0x28)));
TWCR = 0x94;
delay_us(50);
}
void getRawData()
{
buffer[0] = MPU6050_read(0x3B);
buffer[1] = MPU6050_read(0x3C);
buffer[2] = MPU6050_read(0x3D);
buffer[3] = MPU6050_read(0x3E);
buffer[4] = MPU6050_read(0x3F);
buffer[5] = MPU6050_read(0x40);
buffer[6] = MPU6050_read(0x43);
buffer[7] = MPU6050_read(0x44);
buffer[8] = MPU6050_read(0x45);
buffer[9] = MPU6050_read(0x46);
buffer[10] = MPU6050_read(0x47);
buffer[11] = MPU6050_read(0x48);
ax = (int)buffer[0] << 8 | (int)buffer[1];
ay = (int)buffer[2] << 8 | (int)buffer[3];
az = (int)buffer[4] << 8 | (int)buffer[5];
gx = (int)buffer[6] << 8 | (int)buffer[7];
gy = (int)buffer[8] << 8 | (int)buffer[9];
gz = (int)buffer[10] << 8 | (int)buffer[11];
}
2014 / 02 / 19 - 20:23 최초 작성
STM32F103 - QuadCopter 참고 소스 (0) | 2014.02.19 |
---|---|
STM32F103 - PWM 소스 (0) | 2014.02.19 |
FB155BC 설정 with USB2UART Downloader (0) | 2014.02.19 |
STM32F103 - Flash Downloader 에러 (0) | 2014.02.19 |
ATmega128 - PWM Mode 14 소스 (0) | 2014.02.19 |