started calibration fixing
This commit is contained in:
parent
622a61f17f
commit
e75e8a7089
@ -73,6 +73,9 @@ typedef enum
|
|||||||
ACTION_RESET, //Resets the entire eeprom
|
ACTION_RESET, //Resets the entire eeprom
|
||||||
ACTION_STATS, //gives statistics on the system
|
ACTION_STATS, //gives statistics on the system
|
||||||
ACTION_MOTORCALIBRATE,
|
ACTION_MOTORCALIBRATE,
|
||||||
|
ACTION_GYROCALIBRATE,
|
||||||
|
ACTION_ACCELEROMTETERCALIBRATE,
|
||||||
|
ACTION_COMPASSCALIBRATE,
|
||||||
|
|
||||||
//The number of actions
|
//The number of actions
|
||||||
ACTION_COUNT, //Count of the number of actions
|
ACTION_COUNT, //Count of the number of actions
|
||||||
@ -94,7 +97,10 @@ const typeString commandAction_Strings[ACTION_COUNT] = {
|
|||||||
"reboot",
|
"reboot",
|
||||||
"reset",
|
"reset",
|
||||||
"stats",
|
"stats",
|
||||||
"motorcalibrate"
|
"calibrate_motors",
|
||||||
|
"calibrate_gyro",
|
||||||
|
"calibrate_accelerometer",
|
||||||
|
"calibrate_compass"
|
||||||
};
|
};
|
||||||
|
|
||||||
/* String values descrbing information of a certain action */
|
/* String values descrbing information of a certain action */
|
||||||
@ -110,8 +116,11 @@ const typeString commandActionInformation_Strings[ACTION_COUNT] = {
|
|||||||
"| exit - Exits the CLI mode.\n\r",
|
"| exit - Exits the CLI mode.\n\r",
|
||||||
"| reboot - Exit CLI and reboots the system.\n\r",
|
"| reboot - Exit CLI and reboots the system.\n\r",
|
||||||
"| reset - Restore all the values to its default values.\n\r",
|
"| reset - Restore all the values to its default values.\n\r",
|
||||||
"| stats - Gives some current stats of the system and tasks.\n\r"
|
"| stats - Gives some current stats of the system and tasks.\n\r",
|
||||||
"| motorcalibrate - Calibrates all motors."
|
"| calibrate_motors - Calibrates all motors.",
|
||||||
|
"| calibrate_gyro - Calibrates the gyro.",
|
||||||
|
"| calibrate_accelerometer - Calibrates the accelerometer.",
|
||||||
|
"| calibrate_compass - Calibrates the compass."
|
||||||
};
|
};
|
||||||
|
|
||||||
/* String array containing all the signature examples for each action */
|
/* String array containing all the signature examples for each action */
|
||||||
@ -128,7 +137,10 @@ const typeString commandActionSignature_Strings[ACTION_COUNT] = {
|
|||||||
" reboot",
|
" reboot",
|
||||||
" reset",
|
" reset",
|
||||||
" stats",
|
" stats",
|
||||||
" motorcalibrate"
|
" calibrate_motors",
|
||||||
|
" calibrate_gyro",
|
||||||
|
" calibrate_accelerometer",
|
||||||
|
" calibrate_compass"
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Size values for the values a command will require */
|
/* Size values for the values a command will require */
|
||||||
@ -1422,12 +1434,55 @@ void cliRun()
|
|||||||
{
|
{
|
||||||
TransmitBack("Starting calibration, BE CAREFUL!!! \n\n\r");
|
TransmitBack("Starting calibration, BE CAREFUL!!! \n\n\r");
|
||||||
calibrateMotors();
|
calibrateMotors();
|
||||||
|
TransmitBack("Wait until the beeping have ceased... \n\n\r");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TransmitBack("Exiting the calibration, BE CAREFUL!!! \n\n\r");
|
TransmitBack("Exiting the calibration, BE CAREFUL!!! \n\n\r");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case commandMask(commandSize_1, ACTION_GYROCALIBRATE):
|
||||||
|
TransmitBack("Do you really want to calibrate the gyro? (y/n)\n\n\r");
|
||||||
|
if (ReceiveBinaryDecision(121,110))
|
||||||
|
{
|
||||||
|
TransmitBack("Starting calibration! \n\n\r");
|
||||||
|
TransmitBack("NOT IMPLEMENTED! \n\n\r");
|
||||||
|
TransmitBack("Calibration complete! \n\n\r");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TransmitBack("Exiting the calibration! \n\n\r");
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case commandMask(commandSize_1, ACTION_ACCELEROMTETERCALIBRATE):
|
||||||
|
TransmitBack("Do you really want to calibrate the accelerometer? (y/n)\n\n\r");
|
||||||
|
if (ReceiveBinaryDecision(121,110))
|
||||||
|
{
|
||||||
|
TransmitBack("Starting calibration! \n\n\r");
|
||||||
|
TransmitBack("NOT IMPLEMENTED! \n\n\r");
|
||||||
|
TransmitBack("Calibration complete! \n\n\r");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TransmitBack("Exiting the calibration! \n\n\r");
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case commandMask(commandSize_1, ACTION_COMPASSCALIBRATE):
|
||||||
|
TransmitBack("Do you really want to calibrate the compass? (y/n)\n\n\r");
|
||||||
|
if (ReceiveBinaryDecision(121,110))
|
||||||
|
{
|
||||||
|
TransmitBack("Starting calibration! \n\n\r");
|
||||||
|
TransmitBack("NOT IMPLEMENTED! \n\n\r");
|
||||||
|
TransmitBack("Calibration complete! \n\n\r");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TransmitBack("Exiting the calibration! \n\n\r");
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (actionId != ACTION_NOACTION)
|
if (actionId != ACTION_NOACTION)
|
||||||
|
@ -44,7 +44,7 @@ bool mpu6000_transmit_receive(uint8_t reg, uint8_t* data, uint8_t length, uint32
|
|||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* BRIEF: mpu6000_read_offset reads and returns the offset of the *
|
* BRIEF: mpu6000_read_offset reads and returns the offset of the *
|
||||||
* gyroscope and accelerometer *
|
* gyroscope *
|
||||||
* INFORMATION: *
|
* INFORMATION: *
|
||||||
* Is automatically called when mpu6000_init is called *
|
* Is automatically called when mpu6000_init is called *
|
||||||
* The flight controller needs to be stationary when this function is *
|
* The flight controller needs to be stationary when this function is *
|
||||||
@ -52,46 +52,104 @@ bool mpu6000_transmit_receive(uint8_t reg, uint8_t* data, uint8_t length, uint32
|
|||||||
* When the UAV is finished this data could be saved so that the *
|
* When the UAV is finished this data could be saved so that the *
|
||||||
* offset doesn't need to be read every time *
|
* offset doesn't need to be read every time *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
HAL_StatusTypeDef mpu6000_read_offset(gyro_t* gyro, accel_t* accel)
|
HAL_StatusTypeDef mpu6000_read_gyro_offset(gyro_t* gyro)
|
||||||
{
|
{
|
||||||
uint8_t dataG[6]; /* Temporary data variable used to receive gyroscope data */
|
uint8_t dataG[6]; /* Temporary data variable used to receive gyroscope data */
|
||||||
uint8_t dataA[6]; /* Temporary data variable used to receive accelerometer data */
|
int16_t dataGCheck[6] = {0}; /* checkval */
|
||||||
|
uint8_t maxDrift = 5;
|
||||||
|
bool calibrate_go = true;
|
||||||
|
bool calibrate_ok = false;
|
||||||
|
int countCalibrate = 0;
|
||||||
|
|
||||||
if(!mpu6000_transmit_receive(MPU_RA_ACCEL_XOUT_H, dataA, 6, 10))
|
//small delay so that we know the gyro should give some values
|
||||||
return HAL_ERROR;
|
HAL_Delay(100);
|
||||||
|
for (int i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
//assume that we should calibrate at the start of each loop
|
||||||
|
calibrate_go = true;
|
||||||
|
|
||||||
|
//get new values
|
||||||
if(!mpu6000_transmit_receive(MPU_RA_GYRO_XOUT_H, dataG, 6, 10))
|
if(!mpu6000_transmit_receive(MPU_RA_GYRO_XOUT_H, dataG, 6, 10))
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
|
//cheack the new values and see if they are within acceptable range compared to the previous values, so that it is realativelly still
|
||||||
|
for(int j = 0; j < 6; j ++)
|
||||||
|
{
|
||||||
|
int16_t currentDrift = (int16_t)abs(dataGCheck[j] - dataG[j]);
|
||||||
|
if (!(currentDrift < maxDrift))
|
||||||
|
calibrate_go = false;
|
||||||
|
|
||||||
|
dataGCheck[j] = dataG[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
//if true, we have good values exit loop
|
||||||
|
if (calibrate_go)
|
||||||
|
{
|
||||||
|
countCalibrate++;
|
||||||
|
}
|
||||||
|
if (countCalibrate > 4)
|
||||||
|
{
|
||||||
|
calibrate_ok = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//wait for a little bit so the checks are not to fast
|
||||||
|
HAL_Delay(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef YAW_ROT_0
|
#ifdef YAW_ROT_0
|
||||||
gyro->offsetX = -(((int16_t)dataG[0] << 8) | dataG[1]);
|
gyro->offsetX = -(((int16_t)dataG[0] << 8) | dataG[1]);
|
||||||
gyro->offsetY = -(((int16_t)dataG[2] << 8) | dataG[3]);
|
gyro->offsetY = -(((int16_t)dataG[2] << 8) | dataG[3]);
|
||||||
gyro->offsetZ = (((int16_t)dataG[4] << 8) | dataG[5]);
|
gyro->offsetZ = (((int16_t)dataG[4] << 8) | dataG[5]);
|
||||||
|
|
||||||
accel->offsetX = -((int16_t)dataA[0] << 8) | dataA[1];
|
|
||||||
accel->offsetY = -((int16_t)dataA[2] << 8) | dataA[3];
|
|
||||||
accel->offsetZ = accel->accel1G - (((int16_t)dataA[4] << 8) | dataA[5]);
|
|
||||||
#elif defined(YAW_ROT_90)
|
#elif defined(YAW_ROT_90)
|
||||||
gyro->offsetX = -(((int16_t)dataG[2] << 8) | dataG[3]);
|
gyro->offsetX = -(((int16_t)dataG[2] << 8) | dataG[3]);
|
||||||
gyro->offsetY = (((int16_t)dataG[0] << 8) | dataG[1]);
|
gyro->offsetY = (((int16_t)dataG[0] << 8) | dataG[1]);
|
||||||
gyro->offsetZ = (((int16_t)dataG[4] << 8) | dataG[5]);
|
gyro->offsetZ = (((int16_t)dataG[4] << 8) | dataG[5]);
|
||||||
|
|
||||||
accel->offsetX = -((int16_t)dataA[2] << 8) | dataA[3];
|
|
||||||
accel->offsetY = ((int16_t)dataA[0] << 8) | dataA[1];
|
|
||||||
accel->offsetZ = accel->accel1G - (((int16_t)dataA[4] << 8) | dataA[5]);
|
|
||||||
#elif defined(YAW_ROT_180)
|
#elif defined(YAW_ROT_180)
|
||||||
gyro->offsetX = (((int16_t)dataG[0] << 8) | dataG[1]);
|
gyro->offsetX = (((int16_t)dataG[0] << 8) | dataG[1]);
|
||||||
gyro->offsetY = (((int16_t)dataG[2] << 8) | dataG[3]);
|
gyro->offsetY = (((int16_t)dataG[2] << 8) | dataG[3]);
|
||||||
gyro->offsetZ = (((int16_t)dataG[4] << 8) | dataG[5]);
|
gyro->offsetZ = (((int16_t)dataG[4] << 8) | dataG[5]);
|
||||||
|
|
||||||
accel->offsetX = ((int16_t)dataA[0] << 8) | dataA[1];
|
|
||||||
accel->offsetY = ((int16_t)dataA[2] << 8) | dataA[3];
|
|
||||||
accel->offsetZ = accel->accel1G - (((int16_t)dataA[4] << 8) | dataA[5]);
|
|
||||||
#elif defined(YAW_ROT_270)
|
#elif defined(YAW_ROT_270)
|
||||||
gyro->offsetX = (((int16_t)dataG[2] << 8) | dataG[3]);
|
gyro->offsetX = (((int16_t)dataG[2] << 8) | dataG[3]);
|
||||||
gyro->offsetY = -(((int16_t)dataG[0] << 8) | dataG[1]);
|
gyro->offsetY = -(((int16_t)dataG[0] << 8) | dataG[1]);
|
||||||
gyro->offsetZ = (((int16_t)dataG[4] << 8) | dataG[5]);
|
gyro->offsetZ = (((int16_t)dataG[4] << 8) | dataG[5]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return HAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* BRIEF: mpu6000_read_offset reads and returns the offset of the *
|
||||||
|
* accelerometer *
|
||||||
|
* INFORMATION: *
|
||||||
|
* Is automatically called when mpu6000_init is called *
|
||||||
|
* The flight controller needs to be stationary when this function is *
|
||||||
|
* called *
|
||||||
|
* When the UAV is finished this data could be saved so that the *
|
||||||
|
* offset doesn't need to be read every time *
|
||||||
|
***********************************************************************/
|
||||||
|
HAL_StatusTypeDef mpu6000_read_acc_offset(accel_t* accel)
|
||||||
|
{
|
||||||
|
uint8_t dataA[6]; /* Temporary data variable used to receive accelerometer data */
|
||||||
|
|
||||||
|
if(!mpu6000_transmit_receive(MPU_RA_ACCEL_XOUT_H, dataA, 6, 10))
|
||||||
|
return HAL_ERROR;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef YAW_ROT_0
|
||||||
|
accel->offsetX = -((int16_t)dataA[0] << 8) | dataA[1];
|
||||||
|
accel->offsetY = -((int16_t)dataA[2] << 8) | dataA[3];
|
||||||
|
accel->offsetZ = accel->accel1G - (((int16_t)dataA[4] << 8) | dataA[5]);
|
||||||
|
#elif defined(YAW_ROT_90)
|
||||||
|
accel->offsetX = -((int16_t)dataA[2] << 8) | dataA[3];
|
||||||
|
accel->offsetY = ((int16_t)dataA[0] << 8) | dataA[1];
|
||||||
|
accel->offsetZ = accel->accel1G - (((int16_t)dataA[4] << 8) | dataA[5]);
|
||||||
|
#elif defined(YAW_ROT_180)
|
||||||
|
accel->offsetX = ((int16_t)dataA[0] << 8) | dataA[1];
|
||||||
|
accel->offsetY = ((int16_t)dataA[2] << 8) | dataA[3];
|
||||||
|
accel->offsetZ = accel->accel1G - (((int16_t)dataA[4] << 8) | dataA[5]);
|
||||||
|
#elif defined(YAW_ROT_270)
|
||||||
accel->offsetX = ((int16_t)dataA[2] << 8) | dataA[3];
|
accel->offsetX = ((int16_t)dataA[2] << 8) | dataA[3];
|
||||||
accel->offsetY = -((int16_t)dataA[0] << 8) | dataA[1];
|
accel->offsetY = -((int16_t)dataA[0] << 8) | dataA[1];
|
||||||
accel->offsetZ = accel->accel1G - (((int16_t)dataA[4] << 8) | dataA[5]);
|
accel->offsetZ = accel->accel1G - (((int16_t)dataA[4] << 8) | dataA[5]);
|
||||||
@ -180,7 +238,8 @@ bool mpu6000_init(gyro_t* gyro, accel_t* accel)
|
|||||||
if(!mpu6000_transmit(reg, 2))
|
if(!mpu6000_transmit(reg, 2))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
mpu6000_read_offset(gyro, accel);
|
mpu6000_read_gyro_offset(gyro);
|
||||||
|
mpu6000_read_acc_offset(accel);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -183,7 +183,7 @@ void systemTaskBattery(void)
|
|||||||
|
|
||||||
void systemTaskBaro(void)
|
void systemTaskBaro(void)
|
||||||
{
|
{
|
||||||
barometer_CaclulateValues();
|
//barometer_CaclulateValues();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -261,10 +261,10 @@ void systemTaskSonar(void)
|
|||||||
void systemTaskAltitude(void)
|
void systemTaskAltitude(void)
|
||||||
{
|
{
|
||||||
//Keep track of the vehicles current altitude, based on some sensor. In this case either barometer or sonar
|
//Keep track of the vehicles current altitude, based on some sensor. In this case either barometer or sonar
|
||||||
double temperature = barometer_GetCurrentTemperature();
|
/*double temperature = barometer_GetCurrentTemperature();
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
sprintf(buffer, "Temperature: %8.2f \n\r", temperature);
|
sprintf(buffer, "Temperature: %8.2f \n\r", temperature);
|
||||||
usart_transmit(&cliUsart, buffer, 50, 1000000000);
|
usart_transmit(&cliUsart, buffer, 50, 1000000000);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void systemTaskBeeper(void)
|
void systemTaskBeeper(void)
|
||||||
|
Reference in New Issue
Block a user