In diesem Post möchte ich nun auch das Auslesen mit einem ATMega zeigen, da sich der Post mit dem Raspberry PI ziemlich großer Beliebtheit erfreut (http://physudo.blogspot.de/2013/07/beschleunigungssensor-mpu-6050-mit.html). Für I2C benutze ich am ATMega diese Implementierung: http://physudo.blogspot.de/2013/07/atmega-ic-master.html.
Zuerst einmal habe ich mir zwei Funktionen gebastelt, die entweder ein Register auslesen oder in ein Register reinschreiben:
void TWIM_WriteRegister(char reg, char value)
{
TWIM_Start(addr, TWIM_WRITE); // set device address and write mode
TWIM_Write(reg);
TWIM_Write(value);
TWIM_Stop();
}
char TWIM_ReadRegister(char reg)
{
TWIM_Start(addr, TWIM_WRITE);
TWIM_Write(reg);
TWIM_Stop();
TWIM_Start(addr, TWIM_READ); // set device address and read mode
char ret = TWIM_ReadNack();
TWIM_Stop();
return ret;
}
Als nächstes möchte ich die Beschleunigung bzw. die Werte des Gyrometers auslesen. Zu beachten ist, dass zuerst der Sleep Mode deaktiviert werden muss, das geschieht mit
TWIM_WriteRegister(107, 0). Zum auslesen der Werte habe ich mir wieder 2 Funktionen gebaut:double MPU6050_ReadAccel(int axis)//x = 0; y = 1; z = 2
{
char reg = axis * 2 + 59;
char AFS_SEL = TWIM_ReadRegister(28);
double factor = 1<<AFS_SEL;
factor = 16384/factor;
int val = 0;
double double_val = 0;
char ret = 0;
ret = TWIM_ReadRegister(reg);
val = ret << 8;
ret = TWIM_ReadRegister(reg+1);
val += ret;
if (val & 1<<15)
val -= 1<<16; double_val = val;
double_val = double_val / factor;
return double_val;
}
double MPU6050_ReadGyro(int axis)//x = 0; y = 1; z = 2
{
char reg = axis * 2 + 67;
char FS_SEL = TWIM_ReadRegister(27);
double factor = 1<<FS_SEL;
factor = 131/factor;
int val = 0;
double double_val = 0;
char ret = 0;
ret = TWIM_ReadRegister(reg);
val = ret << 8;
ret = TWIM_ReadRegister(reg+1);
val += ret;
if (val & 1<<15)
val -= 1<<16; double_val = val;
double_val = double_val / factor;
return double_val;
}
Die Werte sind in Grad / Sekunde für das Gyrometer und in Einheiten von g für den Beschleunigungsmesser, mehr dazu gibt es auch in der Register Map, besonders bei der Erklärung von FS_SEL und AFS_SEL: http://www.invensense.com/mems/gyro/documents/RM-MPU-6000A.pdf





