$IMU - данные из FIFO буффера MPU-6050. Первые 3 похожи на акселерометр, и следующие - на гироскоп
Предположительно ACCEL_X, ACCEL_Y, ACCEL_Z, GYRO_X, GYRO_Y, GYRO_Z.
$MAGR - магнетометр. X, Z, Y.
$WRAW - с ним читатель уже знаком
Ничего не знаю, что выдало - то и записал Возможно, нуждается в калибровке. Возможно чип бракованный.
Исходный кот:
short imu[]={0,0,0,0,0,0};
short magn[]={0,0,0};
while(app_running){
/* MPU6050 */
// check FIFO overflow
if(mpu6050_fifo_overflow()){
printf("FIFO overflow!\r\n");
fprintf(log, "$ERR overflow\r\n");
mpu6050_fifo_reset();
continue;
}
// get FIFO count
int fifo_count=getFIFOCount();
if(fifo_count>1024){
printf("Wrong FIFO count (%i)!\r\n", fifo_count);
mpu6050_fifo_reset();
continue;
}
int frames=fifo_count/12;
if(frames==0){continue;}
// get timestamp
getdate(&date);
if(date.wMilliseconds!=prevdate.wMilliseconds || date.wSecond!=prevdate.wSecond){
fprintf(log, "[%02i:%02i:%02i.%03i]\r\n", date.wHour, date.wMinute, date.wSecond, date.wMilliseconds);
}
prevdate=date;
// read FIFO
unsigned char tmp[1024];
read(GYRO_ADDR, MPU6050_FIFO_R_W, tmp, frames*12);
// parse data
for(int i=0;i<frames;i++){
unsigned char * rbuf=tmp+(i*12);
imu[0]=(rbuf[0]<<8)|(rbuf[1]&0xFF);
imu[1]=(rbuf[2]<<8)|(rbuf[3]&0xFF);
imu[2]=(rbuf[4]<<8)|(rbuf[5]&0xFF);
imu[3]=(rbuf[6]<<8)|(rbuf[7]&0xFF);
imu[4]=(rbuf[8]<<8)|(rbuf[9]&0xFF);
imu[5]=(rbuf[10]<<8)|(rbuf[11]&0xFF);
fprintf(log, "$IMU %i,%i,%i,%i,%i,%i\r\n", imu[0],imu[1],imu[2],imu[3],imu[4],imu[5]);
}
if(++tick2%2==0){
/* wheel sensors */
unsigned char ss_cnt[2];
unsigned int ss_interval[2], ss_delay[2];
if(!speedsensor_get(ss_cnt, ss_interval, ss_delay)){printf("Bad packet\r\n");}
fprintf(log, "$WRAW %i,%i,%i,%i,%i,%i\r\n", ss_cnt[0], ss_cnt[1], ss_interval[0], ss_interval[1], ss_delay[0], ss_delay[1]);
}else{
/* compass */
compass_read(&magn[0], &magn[1], &magn[2]);
fprintf(log, "$MAGR %i,%i,%i\r\n", magn[0], magn[1], magn[2]);
}
}