Académique Documents
Professionnel Documents
Culture Documents
CHAPTER ONE
1. INTRODUCTION
SSM is a missile designed to be launched from the ground or the sea and strike targets on land.
They usually have fins and/or wings for lift and stability, although hyper-velocity or short-range
missiles may use body lift or fly a ballistic trajectory. The V-1 flying bomb was the first
operational surface-to-surface missile.
Contemporary surface-to-surface missiles are usually guided. An unguided surface-to-surface
missile is usually referred to as a rocket (for example, an RPG-7 or M72 LAW is an anti-tank
rocket whereas a BGM-71 TOW or AT-2 Swatter is an anti-tank guided missile).
Since the concept of SSM was proposed a few decades ago, SSM have attracted a lot of interest
from researchers all over the world. Many kinds of SSM prototypes have been developed by
universities and research laboratories. The primarily goal is to make the SSM have as more
functions as possible and suitable for different missions. SSM can significantly reduce the risk to
one’s country life and minimize the economic damage in the scientific, military and civil
application. The vertical take- off and landing (VTOL) SSM are particularly useful in missions
such as surveillance and reconnaissance, precision target location, signals intelligence, digital
mapping, forest fire monitoring, and indoor rescuing. Autopilots are systems to guide the UAVs
in flight without Assistance from human operators. Nowadays, Technological advances in wireless
#include "stm32f4xx_hal.h"
#include <math>
// BMP180 I2C address */
#ifndef BMP180_I2C_ADDRESS
#define BMP180_I2C_ADDRESS 0xEE
#end if
#define BMP180_ADDRESS 0x77<<1 // I2C address of BMP180, eight bit address on Kiel
#define AC1R 0xAA // R Calibration data (16 bits)
#define AC2R 0xAC // R Calibration data (16 bits)
#define AC3R 0xAE // R Calibration data (16 bits)
#define AC4R 0xB0 // R Calibration data (16 bits)
#define AC5R 0xB2 // R Calibration data (16 bits)
#define AC6R 0xB4 // R Calibration data (16 bits)
#define B1R 0xB6 // R Calibration data (16 bits)
#define B2R 0xB8 // R Calibration data (16 bits)
#define MBR 0xBA // R Calibration data (16 bits)
#define MCR 0xBC // R Calibration data (16 bits)
#define MDR 0xBE // R Calibration data (16 bits)*/
/* Multiple is faster than divide */
#define BMP180_1_16 ((float) 0.0625)
#define BMP180_1_256 ((float) 0.00390625)
#define BMP180_1_2048 ((float) 0.00048828125)
#define BMP180_1_4096 ((float) 0.000244140625)
#define BMP180_1_8192 ((float) 0.0001220703125)
// Commands
I2C_HandleTypeDef hi2c1;
Float Altitude;
HAL_Init ();
SystemClock_Config ();
MX_GPIO_Init ();
While (1)
HAL_Delay (20);
HAL_Delay (20);
HAL_Delay (8);
HAL_Delay (8);
B6 = B5 - 4000;
An analog to digital converter (ADC) converts an analog signal into digital form, shown in Figure
below. An embedded system uses the ADC to collect information about the external world (data
acquisition system.) The input signal is usually an analog voltage, and the output is a binary
number. The ADC precision is the number of distinguishable ADC inputs (e.g., 4096 alternatives,
12 bits). The ADC range is the maximum and minimum ADC input (e.g., 0 to +3.3V). The
ADC resolution is the smallest distinguishable change in input (e.g., 3.3V/4096, which is about
0.81 mV). The resolution is the change in input that causes the digital output to change by 1.
Interfacing materials\
#include"stm32f4xx_hal.h"
ADC_HandleTypeDef myADCtypeDef;
Uint32_t myAdcvalue;
HAL_Init ();
GPIO_Config ();
ADC_Config ();
Systick_Config ();
While (1)
{
// Read ADC value
HAL_ADC_Start (&myADCtypeDef);
If (HAL_ADC_PollForConversion (&myADCtypeDef, 5) ==HAL_OK)
{
MyAdcvalue = HAL_ADC_GetValue (&myADCtypeDef);
}
HAL_ADC_Stop (&myADCtypeDef);
//2.100ms delay
HAL_Delay (100);
} }
__HAL_RCC_GPIOD_CLK_ENABLE ();
GPIO_InitTypeDef myADCPin;
MyADCPin. Pin = GPIO_PIN_0;
MyADCPin. Mode = GPIO_MODE_ANALOG;
MyADCPin. Pull = GPIO_NOPULL;
HAL_GPIO_Init (GPIOA, &myADCPin);
}
Void ADC_Config (void)
{
__HAL_RCC_ADC1_CLK_ENABLE ();
MyADCtypeDef. Instance = ADC1;
myADCtypeDef.Init.Resolution = ADC_RESOLUTION8b;
myADCtypeDef.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
myADCtypeDef.Init.DataAlign = ADC_DATAALIGN_RIGHT;
HAL_ADC_Init (&myADCtypeDef);
ADC_ChannelConfTypeDef myADCchannelTypeDef;
myADCchannelTypeDef.Channel = ADC_CHANNEL_0;
MyADCchannelTypeDef. Rank = 1;
myADCchannelTypeDef.SamplingTime = ADC_SAMPLETIME_15CYCLES
HAL_ADC_ConfigChannel (&myADCtypeDef, &myADCchannelTypeDef);
}
Void Systick_Config (void) {
// set clock source and speed
HAL_SYSTICK_Config (HAL_RCC_GetHCLKFreq ()/1000);
// Configure the Systick
HAL_SYSTICK_CLKSourceConfig (SYSTICK_CLKSOURCE_HCLK);
// SysTick_IRQn interrupt priority configuration
HAL_NVIC_SetPriority (SysTick_IRQn, 0, 0);
HAL_NVIC_EnableIRQ (SysTick_IRQn);
}
Void SysTick_Handler (void)
{
Low duty cycle corresponds to low power, because the power is off for most of the time.
Duty cycle is expressed in percent, 100% being fully on.
When a digital signal is on half of the time and off the other half of the time, the digital
signal has a duty cycle of 50% and resembles a "square" wave.
When a digital signal spends more time in the on state than the off state, it has a duty
cycle of >50%.
PWM is the scheme in which the duty cycle of a square wave output from the
microcontroller is varied to provide a varying average DC output.
By applying a PWM pulse is that the motor is switched ON and OFF at a given
frequency. In this way, the motor reacts to the time average of the power supply.
Servo motor position is controlled by pulse width modulation (PWM) signal. The width of the
control signal pulse is used to vary shaft position of servo motor. We can vary SG90 Micro servo
motor angular rotation in between 0° to 180° angle with PWM signal as shown in figure below.
At ~1ms (5% duty cycle) we get shaft position at -90° of its rotation.
At 1.5ms (7.5% duty cycle) we get shaft position at 0° (neutral) of its rotation.
At ~2ms (10% duty cycle) we get shaft position at +90° of its rotation.
#include "stm32f4xx_hal.h"
// Private variables
TIM_HandleTypeDef htim1;
HAL_Init ();
SystemClock_Config ();
// Infinite loop
While (1)
Duty cycle+=10;
If (duty cycle>90) duty cycle =10;
HAL_Delay (1000);
}
}
Void SystemClock_Config (void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE ();
__HAL_PWR_VOLTAGESCALING_CONFIG
(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
If (HAL_TIM_ConfigClockSource (&htim1, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler (__FILE__, __LINE__);
}
If (HAL_TIM_PWM_Init (&htim1)! = HAL_OK)
{
_Error_Handler (__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
If (HAL_TIMEx_MasterConfigSynchronization (&htim1, &sMasterConfig)! = HAL_OK) {
_Error_Handler (__FILE__, __LINE__); }
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 50;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
_Error_Handler(__FILE__, __LINE__);
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
_Error_Handler(__FILE__, __LINE__);
HAL_TIM_MspPostInit(&htim1);
__HAL_RCC_GPIOE_CLK_ENABLE ();
// User can add his own implementation to report the HAL error return state
While (1)
CHAPTER TWO
SENSOR INTERFACING AND MODULE CONFIGURATION
2.1 MPU6050 Digital 6- DOF with Stm32f4 Microcontroller
MPU6050 is the world’s first integrated 6 axis motion sensor, it combines one 3 axis accelerometer
and one 3 axis gyroscope, and it has its own digital motion processor (DMP) which can process
the motion data with its inside algorithm. It can output 6 axis raw data as well as 6 axis data which
pass through the Kalman filter or processed by the Quaternion algorithm. However, access to the
filtered data as well as the DMP need specific permission, so only the raw data is used in this
project. This sensor can also attach a 3 axis compass through the I2C bus which makes it a 9 axis
inertial motion sensor. The chip itself has an internal 16 bit analog to digital converter (ADC), so
The MPU6050 consist of 3-axis Gyroscope with Micro Electro Mechanical System (MEMS)
technology. It is used to detect rotational velocity along the X, Y, Z axes as shown in below figure.
The MPU includes a 3-Axis vibratory MEMS rate gyroscope, which detect rotations about the X-
, Y-, and Z- Axes. When the gyro is are rotated about any of the sense axes, the Coriolis Effect
causes a vibration that is detected by a capacitive pickoff. The resulting signal is amplified,
demodulated, and filtered to produce a voltage that is proportional to the angular rate. This voltage
is digitized using individual on-chip 16-bit Analog to- Digital Converters (ADCs) to sample each
This displacement of moving plate (mass) unbalances the differential capacitor which results in
sensor output. Output amplitude is proportional to acceleration.
The figure 3 below shows a simplified diagram of a basic accelerometer structure. A simple mass
(m) is attached to a spring of stiffness (k) and the other end of the spring is then attached to the
casing. The dashpot with damping coefficient (B) is normally attached to the mass in parallel with
the spring. This provides desirable damping effect.
Operation
When the accelerometer is subjected to linear acceleration, a force equal to mass times acceleration
(F=ma), acts on the proof-mass, causing it to deflect. This deflection is sensed by a suitable means
and converted into an equivalent electrical signal. The amount of deflection is directly proportional
to the accelerometer’s acceleration. Some form of damping is required; otherwise the system
would not stabilize quickly under applied acceleration. To derive the motion equation of the system
Newton’s second law is used, where all real forces acting on the proof-mass are equal to the inertia
force on the proof-mass.
…….…………………….Eq (1)
………………………..Eq (2)
…………………………………………Eq (3)
Where: m= mass of the proof-mass, X= relative movement of the proof-mass with respect to frame,
B= damping coefficient, k= spring constant, F= force applied.
The equation of motion is a second order linear differential equation with constant coefficients.
The general solution x (t) is the sum of the complementary function XC (t) and the particular
integral Xp (t) [5].
…………………….Eq (4)
The complementary function satisfies the homogeneous equation
………………..……Eq (5)
The solution to XC (t) is
...........................................Eq (6)
Substituting equation (4) in equation (3)
……………………....Eq (7)
Called as the auxiliary or characteristic equation of the system.
The solution to this equation for values of S is
………...Eq (8)
From the above equation (9) the following useful formulae are derived
………………….………………………..Eq (9)
…………………………………………..….Eq (10)
Note that gyroscope and accelerometer sensor data of MPU6050 module consists of 16-bit raw
data in 2’s complement form.
Temperature sensor data of MPU6050 module consists of 16-bit data (not in 2’s complement
form). Now suppose we have selected,
- Accelerometer full scale range of +/- 2g with Sensitivity Scale Factor of 16,384 LSB (Count)/g.
- Gyroscope full scale range of +/- 250 °/s with Sensitivity Scale Factor of 131 LSB (Count)/°/s.
Then, to get sensor raw data, we need to first perform 2’s complement on sensor data of
Accelerometer and gyroscope.
After getting sensor raw data we can calculate acceleration and angular velocity by dividing sensor
raw data with their sensitivity scale factor as follows,
Accelerometer values into Gs (g force)
Raw Accelerometer value / 16384 (this is for +-2 G sensitivity
Acceleration along the X axis = (Accelerometer X axis raw data/16384) g.
Acceleration along the Y axis = (Accelerometer Y axis raw data/16384) g.
Acceleration along the Z axis = (Accelerometer Z axis raw data/16384) g.
Gyroscope values in °/s (degree per second)
In order to get degrees/sec form raw value;
Raw value of Gyro / 131 (this is for +-250 dps sensitivity)
Angular velocity along the X axis = (Gyroscope X axis raw data/131) °/s.
Angular velocity along the Y axis = (Gyroscope Y axis raw data/131) °/s.
Angular velocity along the Z axis = (Gyroscope Z axis raw data/131) °/s.
Temperature value in °/c (degree per Celsius)
Temperature in degrees C = ((temperature sensor data)/340 + 36.53) °/c.
For example,
Suppose, after 2’ complement we get accelerometer X axes raw value = +15454
Then Ax = +15454/16384 = 0.94 g.
Each 16-bit accelerometer measurement has a full scale defined in ACCEL_FS (Register 28). For
each full scale setting, the accelerometers’ sensitivity per LSB in ACCEL_XOUT is shown in the
table below.
The temperature in degrees C for a given register value may be computed as:
Temperature in degrees C = (TEMP_OUT Register Value as a signed quantity)/340 + 36.53
Each 16-bit gyroscope measurement has a full scale defined in FS_SEL (Register 27). For each
full scale setting, the gyroscopes’ sensitivity per LSB in GYRO_XOUT is shown in the table below:
You can change the sensitivity by writing different values to the MPU 6050s internal registers
via I2C. Below are a listing of the interested registers and their addresses:
FS_SEL - Register 1B, Bits 3 and 4 (gyroscope sensitivity)
Value written to FS_SEL - sensitivity:
0 - +-250
1 - +-500
2 - +-1000
3 - +-2000
AFS_SEL - Register 1C, Bits 3 and 4 (accelerometer sensitivity)
Value written to AFS_SEL - sensitivity:
0 - +-2G
1 - +-4G
2 - +-8G
3 - +-16G
A Gyroscope gives the values of degrees/sec in the three respective axis X, Y and Z (Yaw, Pitch
and Roll axes respectively).
But whatever raw value given first by these sensors should be converted to sensible acceleration
or angular velocity values by scaling.
Gyro full scale for X, Y and Z axis: +- 2000 degree/second. This means for example if the sensor
is rotated in X axis with maximum angular velocity of 2000 degrees per second, the gyro X data
will be maximum value of 16bit integer variable: 32768. In the other hand, the readout value
will be -32768 if the angular velocity is -2000 degrees per second. From here, we can come out
with the conversion ratio from raw sensor data to real angular velocity:
R = 32768 / full scale value = 32768 / 2000 = 16.384.
Therefore the Gyroscope can be set in the following form
Angular Velocity Sensitivity
250 131
500 65.5
1000 32.8
2000 16.4
Data on SDA must be stable during the high period of SCL as shown in Figure. The SDA signal
can only change when SCL is stable at low, otherwise it will generate the START or STOP
conditions. The master can issue a restart signal so that without first stopping a transfer, it can
change the direction of SDA data flow for either write or read, the restart signal contains the slave
address of the new data register as well as the direction specified by the R/W bit.
There are two types of operation on the I2C bus:
Write operation: master writes START, address, data (the slave sends ACKs only)
Read operation: master writes START, address. Slave sends data, master sends ACK /
NACK.
// using the GY-521 breakout board, I set ADO to 0 by grounding through a 4k7 resistor
// Seven-bit device address is 110100 for ADO = 0 and 110101 for ADO = 1
#define ADO 0
#if ADO
#define MPU6050_ADDRESS 0x69<<1 // Device address when ADO = 1
#else
#define MPU6050_ADDRESS 0x68<<1 // Device address when ADO = 0
#endif
#define MPU6050_GCONFIG_FS_SEL_BIT 4
#define MPU6050_GCONFIG_FS_SEL_LENGTH 2
#define MPU6050_GYRO_FS_250 0x00
#define MPU6050_GYRO_FS_500 0x01
#define MPU6050_GYRO_FS_1000 0x02
#define MPU6050_GYRO_FS_2000 0x03
#define MPU6050_ACONFIG_XA_ST_BIT 7
#define MPU6050_ACONFIG_YA_ST_BIT 6
#define MPU6050_ACONFIG_ZA_ST_BIT 5
#define MPU6050_ACONFIG_AFS_SEL_BIT 4
#define MPU6050_ACONFIG_AFS_SEL_LENGTH 2
#define MPU6050_ACONFIG_ACCEL_HPF_BIT 2
#define MPU6050_ACONFIG_ACCEL_HPF_LENGTH 3
#define MPU6050_ACCEL_FS_2 0x00
#define MPU6050_ACCEL_FS_4 0x01
#define MPU6050_ACCEL_FS_8 0x02
UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart1_tx;
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
//I2C variables
uint8_t i2cBuf [14];
Uint16_t ax, ay, az; //Stores the 16-bit signed accelerometer sensor output
int16_t gx, gy, gz; //Stores the 16-bit signed gyroscope sensor output
int16_t temp;
float temperature;
Float aRes;
Float gRes;
Float Xaccel, Yaccel, Zaccel; // Stores the real accel value in g's
Float Xgyro,Ygyro, Zgyro; //// Stores the real gyro value in degrees per second
#define mpu6050Address 0xD0
// Set initial input parameters
Enum Ascale {
AFS_2G = 0,
AFS_4G,
AFS_8G,
MX_GPIO_Init ();
// Infinite loop
ax= (i2cBuf[0]<<8 | i2cBuf[1]); // Turn the MSB and LSB into a signed 16-bit value
ay= (i2cBuf[2]<<8 | i2cBuf[3]);
az= (i2cBuf[4]<<8 | i2cBuf[5]);
temp = (i2cBuf [0] << 8 | i2cBuf [1]); // Turn the MSB and LSB into a signed 16-bit value
gx= (i2cBuf[0]<<8 | i2cBuf[1]);
gy= (i2cBuf[2]<<8 | i2cBuf[3]);
gz= (i2cBuf[4]<<8 | i2cBuf[5]);
Xaccel = ax/4096.0;
Yaccel = ay/4096.0;
Zaccel = az/4096.0;
Xgyro = gx/32.8;
Ygyro = gy/32.8;
Zgyro = gz/32.8;
HAL_Delay(1000);
}
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
}
Void _Error_Handler (char *file, int line)
{
// USER CODE BEGIN Error_Handler_Debug
//User can add his own implementation to report the HAL error return state
While (1)
{
}
}
#ifdef USE_FULL_ASSERT
Void assert_failed (uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
tex: printf ("Wrong parameters value: file %s on line %d\r\n", file, line) */
}
USART
Contents:
1. Principles of magnetometer (HMC5883L)
3. Explain how to extract data from HMC5883L using STM Microcontroller kit.
Configuration Register A
The configuration register is used to configure the device for setting the data output rate and
measurement configuration. CRA0_CRA7 indicate bit locations, with CRA denoting the bits that
are in the configuration register A. CRA7 denotes the first bit of the data stream. The number in
Configuration Register B
The configuration register B for setting the device gain. CRB0_CRB7 indicate bit locations, with
CRB denoting the bits that are in the configuration register. CRB7 denotes the first bit of the data
stream. The number in parenthesis indicates the default value of that bit.CRB0_CRB4 indicate
zero value.
Mode Register
The mode register is an 8-bit register from which data can be read or to which data can be written.
This register is used to select the operating mode of the device. MR0 through MR7 indicate bit
locations, with MR denoting the bits that are in the mode register. MR7 denotes the first bit of the
data stream. The number in parenthesis indicates the default value of that bit. MD1 to MD0 Mode
Select Bits. These bits select the operation mode of this device.
Status Register
The status register is an 8-bit read-only register. This register is used to indicate device status. SR0
through SR7 indicate bit locations, with SR denoting the bits that are in the status register. SR7
denotes the first bit of the data stream.
Identification Register A
The identification register A is used to identify the device. IRA0 through IRA7 indicate bit
locations, with IRA denoting the bits that are in the identification register A. IRA7 denotes the
first bit of the data stream. The number in parenthesis indicates the default value of that bit.
The identification value for this device is stored in this register. This is a read-only register.
Register values. ASCII value H.
Identification Register B
The identification register B is used to identify the device. IRB0 through IRB7 indicate bit
locations, with IRB denoting the bits that are in the identification register A. IRB7 denotes the first
bit of the data stream. Register values. ASCII value 4
Identification Register C
Q.What is an accelerometer ?
Ans: An accelerometer is an electro-mechanical device that will measure acceleration forces.
These forces may be static, like the constant force of gravity pulling at your feet, or they could be
dynamic – caused by moving or vibrating the accelerometer.
Q.What is range of an accelerometer?
Ans: Range is the level of acceleration supported by the sensor’s output signal specifications,
typically specified in ±g. This is the greatest amount of acceleration the part can measure and
accurately represent as an output. For example, the output of a ±3g accelerometer is linear with
acceleration up to ±3g. If it is accelerated at 4g, the output may rail.
Q. why you are getting data even while the accelerometer is at rest?
Ans: The reading of the accelerometer when at rest is due to the zero g output (typically 2.5V,
varies depending upon the accelerometer model you have). Consider a sensor in a steady state on
a horizontal surface, will measure 0g in X axis and 0g in Y axis whereas the Z axis will measure
1g, this Z axis value is getting at output of the accelerometer.
Q.What is zero-g offset?
Ans: Zero-g level Offset (Off) describes the deviation of an actual output signal from the ideal
output signal if there is no acceleration present. A sensor in a steady state on a horizontal surface
will measure 0g in X axis and 0g in Y axis whereas the Z axis will measure 1g
Q.Where would you use an accelerometer?
Ans:There are a number of practical applications for accelerometers; accelerometers are used to
measure static acceleration (gravity), tilt of an object, dynamic acceleration, shock to an object,
velocity, orientation and the vibration of an object. Cell phones, computers and washing
machines now contain accelerometers. Other practical applications include: Measuring the
performance of an automobile, measuring the vibration of a machine, measuring the motions of a
bridge, measuring how a package has been handled.
An inertial measurement unit (IMU) is an electronic device that measures and reports a body's specific force,
angular rate, and sometimes the magnetic field surroundings the body, using a combination
of accelerometers and gyroscopes, sometimes also magnetometers. IMUs are typically used to
maneuver aircraft, including unmanned aerial vehicles (UAVs), among many others, and spacecraft,
including satellites and landers. Recent developments allow for the production of IMU-enabled GPS devices.
An IMU allows a GPS receiver to work when GPS-signals are unavailable, such as in tunnels, inside buildings,
or when electronic interference is present.[1] A wireless IMU is known as a WIMU.