Gyro Accel MPU 6050 - FabLabSeoul/WingProject GitHub Wiki
- MPU-6050
- Gyro 3 Axis + Accel 3 Axis ์ธ์ ์ผ์
- ์ผ์ ์๊ฐ: http://www.invensense.com/mems/gyro/mpu6050.html
- Spec: http://www.invensense.com/mems/gyro/documents/PS-MPU-6000A-00v3.4.pdf
(GY-521 breakout๋ณด๋์ MPU-6050์ด ์ฅ์ฐฉ๋์ด ์๋ค.)
STM32 Value line ๋ณด๋์์ GY-521 breakout ๋ณด๋๋ฅผ ์ด์ฉํ์ฌ MPU-6050์ ํ ์คํธ ํ๋ค. ์์ค๋ STM32\stm32vldiscovery_package\Project\Examples\MPU-6050 ์ ์๋ค.
์ด ํ๋ก์ ํธ ์์ค๋ MPU-6050๊ณผ I2C ํต์ ์ผ๋ก ๊ฐ์๋ x,y,z (๋จ์ g), ์์ด๋ก x,y,z (๋จ์ ๊ฐ์๋, degree/seconds) ๊ฐ์ ๊ฐ์ ธ์์ roll, pitch, yaw ๊ฐ์ ๊ณ์ฐํ๋ค. ๊ณ์ฐ์ Stm32์์ ์ด๋ค์ง๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์๋ฆฌ์ผ ํต์ ์ผ๋ก ๋ณด๋ธ๋ค. ์๋ฆฌ์ผ ์ ๋ณด๋ฅผ ๋ฐ์ ์ปดํจํฐ๋ Processing ํ๋ก๊ทธ๋จ์ ํตํด 3์ฐจ์ ๋ชจ๋ธ๋ก ์ถ๋ ฅํ๋ค.
์์ง Stm32 Value line ๋ณด๋๋ก ์ปดํจํฐ์ ์๋ฆฌ์ผํต์ ์ ํ๋ ๋ฒ์ ๋ชฐ๋ผ์, ์๋์ด๋ ธ๋ฅผ ๊ฑฐ์ณ ์ปดํจํฐ์ ์๋ฆฌ์ผ ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค. ์ผ์์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฌ๊ฐ๋ค. GY-521 -> Stm32 -> Arduino -> Computer -> Processing (์ด ๋ฌธ์ ํด๊ฒฐ์ Stm32 printf Debugging, Stm32 Serial Debugging ๋ฌธ์์์ ํ์ธํ ์์๋ค.)
์ด ์์ ๋ฅผ ๋ง๋ค๊ธฐ์ํด ๋๊ฐ์ ์คํ ์์ค๋ฅผ ์ฌ์ฉํ์๋ค. MPU-6050์์ I2C ํต์ ์ผ๋ก ์์ด๋ก, ๊ฐ์๋ ๊ฐ์ ๋ฐ์์ค๋ ๋ถ๋ถ์ https://harinadha.wordpress.com/2012/05/23/mpu6050lib/ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค. (์ด ์์ค๋ ACK๋ฅผ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฒ๊ทธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค์ ํ๋ธ์์๋ ์ฐ์ง ์์ ๊ณํ์ด๋ค.)
MPU-6050์ผ๋ก๋ถํฐ ๋ฐ์ ์ ๋ณด๋ฅผ ์ค์ ๋ก ์ฐ์ผ Roll, Pitch, Yaw ๊ฐ์ผ๋ก ๋ฐ๊พธ๋ ๊ณ์ฐ์ http://m.kocoafab.cc/tutorial/view/239 ์ ์ด์ฉํ๋ค.
ํ๋ก๊ตฌ์ฑ์ https://harinadha.wordpress.com/tag/stm32/ ์ ์ฐธ๊ณ ํ์. Stm32 I2Cํฌํธ๋ก ์ฐ์ผ PB10,11์ GY-521์ SCL, SDA ํ์ ์ฐ๊ฒฐํ๋ฉด ๋๋ค. ์ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- GY-521 Vcc -> 3.3V or 5V
- GY-521 Gnd -> Ground
- Stm32 PB10(I2C2 SCL) -> GY-521 SCL
- Stm32 PB11(I2C2 SDA) -> GY-521 SDA
I2C ์ค์
MPU-6050๊ณผ ํต์ ์ ํ๊ธฐ ์ํ I2C ์ด๊ธฐํ ์ฝ๋๋ค. ์ด๋ STM32 I2C๋ฌธ์์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค. PB10,11 ํฌํธ๋ MPU-6050๊ณผ์ ํต์ ์ ์ํด ์ฐ์ด๊ณ , I2C์ฃผ์๋ฅผ 0x68๋ก ์ค์ ํ๋ค. ๋ง์คํฐ์ธ Stm32 MCU๋ ์ฌ๋์ด๋ธ์ธ MPU-6050์ ์ ๊ทผํ๊ธฐ ์ํด 0x68์ฃผ์๋ก I2Cํต์ ์ ์์ํ๊ฒ ๋๋ค.
์ด ์์ค์ฝ๋๋ Harinadha Reddy๊ฐ ์ง ์ฝ๋์ ์ผ๋ถ๋ค. (https://harinadha.wordpress.com/about/)
#define MPU6050_I2C I2C2
#define MPU6050_I2C_RCC_Periph RCC_APB1Periph_I2C2
#define MPU6050_I2C_Port GPIOB
#define MPU6050_I2C_SCL_Pin GPIO_Pin_10
#define MPU6050_I2C_SDA_Pin GPIO_Pin_11
#define MPU6050_I2C_RCC_Port RCC_APB2Periph_GPIOB
#define MPU6050_I2C_Speed 100000 // 100kHz standard mode
MPU6050_I2C_Init();
/**
* @brief Initializes the I2C peripheral used to drive the MPU6050
* @param None
* @return None
*/
void MPU6050_I2C_Init()
{
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable I2C and GPIO clocks */
RCC_APB1PeriphClockCmd(MPU6050_I2C_RCC_Periph, ENABLE);
RCC_APB2PeriphClockCmd(MPU6050_I2C_RCC_Port, ENABLE);
/* Configure I2C pins: SCL and SDA */
GPIO_InitStructure.GPIO_Pin = MPU6050_I2C_SCL_Pin | MPU6050_I2C_SDA_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(MPU6050_I2C_Port, &GPIO_InitStructure);
/* I2C configuration */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = MPU6050_DEFAULT_ADDRESS; // MPU6050 7-bit adress = 0x68, 8-bit adress = 0xD0;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = MPU6050_I2C_Speed;
/* Apply I2C configuration after enabling it */
I2C_Init(MPU6050_I2C, &I2C_InitStructure);
/* I2C Peripheral Enable */
I2C_Cmd(MPU6050_I2C, ENABLE);
}
I2C๋ฅผ ํตํ MPU-6050 ์ด๊ธฐํ
MPU-6050๊ณผ I2Cํต์ ์ํด์ ์ต์ ์ ์ค์ ํ๋ค. ์ต์ ์ MPU-6050์ ๊ณ ์ ๋ ์ง์คํฐ ์ฃผ์๊ฐ์ ์ ๋ณด๋ฅผ ์ฐ๋ ๊ฒ์ ๋ฐํ์ผ๋ก ํ๋ค. I2C ํต์ ์ ํตํด MPU-6050 ๋ ์ง์คํฐ์ ๋ฐ์ดํ๋ฅผ ์ฐ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
MPU-6050์ ์ ๋ณด๋ฅผ ์ธ ๋.
- ๋ง์คํฐ๊ฐ MPU-6050์ Start์ ํธ๋ฅผ ๋ณด๋ธ๋ค. (์ฐ๊ธฐ ๋ชจ๋ W)
- ๊ธฐ๋ณธ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ~ (ACK)
- ๊ฐ์ ๋ฐ๊ฟ MPU-6050์ ๋ ์ง์คํฐ ์ฃผ์๊ฐ์ ๋ณด๋ธ๋ค. (RA)
- ๊ธฐ๋ณธ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ~ (ACK)
- ํด๋น ๋ ์ง์คํฐ ์ฃผ์์ ์ ์ฅํ ์ ๋ณด๋ฅผ ํ ๋ฐ์ดํธ์ฉ ์ก์ ํ๋ค. (DATA)
- ์ ์์ ๋์ ๋๊น์ง ์ ๋ณด๊ฐ ์ก์ ๋๊ณ , ๋ฐ๋ ์ธก์์๋ ์๋์ ์ผ๋ก ๋ค์ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๊ฒ ๋๋ค.
- ์ฐ๊ฒฐ์ ๋๋๋ค.
MPU-6050 ์ ๋ณด๋ฅผ ๋ฐ์ ์ฌ ๋.
- ๋ง์คํฐ๊ฐ MPU-6050์ Start์ ํธ๋ฅผ ๋ณด๋ธ๋ค. (์ฐ๊ธฐ ๋ชจ๋ W)
- ๊ธฐ๋ณธ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ~ (ACK)
- ๊ฐ์ ์ป์ด์ฌ MPU-6050์ ๋ ์ง์คํฐ ์ฃผ์๊ฐ์ ๋ณด๋ธ๋ค. (RA)
- ๋ค์ Start์ ํธ๋ฅผ ๋ณด๋ธ๋ค. (์ฝ๊ธฐ ๋ชจ๋ R)
- ๊ธฐ๋ณธ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ~ (ACK)
- ๋ฐ์ดํ๋ฅผ ํ ๋ฐ์ดํธ์ฉ ์ํ๋ ํ์๋งํผ ๋ฐ๋๋ค. (DATA)
- ACK๋ฅผ ๋ณด๋ธ ํ์๋งํผ ์ ๋ณด๋ฅผ ๋ฐ๊ณ , ๋ณด๋ด๋ ์ชฝ์์ ์๋์ ์ผ๋ก ๋ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๊ฒ ๋๋ค.
- ์ฐ๊ฒฐ์ ๋๋๋ค.
MPU-6050์ ๋ ์ง์คํฐ ์ฃผ์๋ ๋งค๋ด์ผ์ ์ฐธ์กฐํ์. ์ผ๋จ ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ์ ๊ฐ์ง๋ gyro_x,y,z, accel_x,y,z ๋ ์ง์คํฐ ์ฃผ์๋ ๋ค์๊ณผ ๊ฐ๋ค. ๋ฉ๋ชจ๋ฆฌ์ฃผ์๊ฐ ์์๋๋ก ACCEL_XOUT_H ~ GYRO_ZOUT_L ๊น์ง ๋์ด๋์ด ์๊ธฐ ๋๋ฌธ์, ํ ๋ฒ์ ์ ์์ผ๋ก ์์๋๋ก ์ฝ์ผ๋ฉด ๋ชจ๋ ์ฝ์ด ์ฌ ์ ์๋ค. ๊ฐ์ด๋ฐ ์จ๋์ผ์ ๊ฐ์ ๊ฐ์ ธ์ค์ง๋ง(TEMP_OUT_H,L), ์ด ๊ฐ์ ๋ฌด์ํ๋ค.
MPU-6050์ด๊ธฐํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค. MPU-6050 ์ต์ ์ ๋งค๋ด์ผ์ ํตํด ํ์ธํ์.
์์ด๋ก ์ผ์ฑ ๋ฒ์, ๊ฐ์๋ ์ผ์ฑ ๋ฒ์๋ฅผ ๊ฐ๊ฐ +-250 degree/s, +-2g ๋ก ์ค์ ํ๋ค.
/** Power on and prepare for general usage.
* This will activate the device and take it out of sleep mode (which must be done
* after start-up). This function also sets both the accelerometer and the gyroscope
* to their most sensitive settings, namely +/- 2g and +/- 250 degrees/sec, and sets
* the clock source to use the X Gyro for reference, which is slightly better than
* the default internal clock source.
*/
void MPU6050_Initialize()
{
MPU6050_SetClockSource(MPU6050_CLOCK_PLL_XGYRO);
MPU6050_SetFullScaleGyroRange(MPU6050_GYRO_FS_250);
MPU6050_SetFullScaleAccelRange(MPU6050_ACCEL_FS_2);
MPU6050_SetSleepModeStatus(DISABLE);
}
MPU-6050 ๋งค๋ด์ผ์ ๋ค์๊ณผ ๊ฐ๋ค.
์์ด๋ก์ผ์ Scale Factor, ๊ฐ์์ผ์ Scale Factor๊ฐ ๊ฐ๊ฐ +-250, 2g์ผ ๋, 131, 16384์ธ ๊ฒ์ ํ์ธํ์. ๋์ค์ ์ด ๊ฐ์ผ๋ก roll, pitch, yaw ๊ฐ์ ๊ณ์ฐํ๋ค.
MPU_6050๊ณผ I2C ํต์ ์ ํ๋ ๊ฐ๋จํ ์๋ก, ์์ด๋ก ์ผ์ ๋ฒ์ ์ค์ ํ๋ ์ฝ๋๋ฅผ ๋ณด์. MPU6050_RA_GYRO_CONFIG ๋ ์ง์คํฐ ์ฃผ์์ ์ ๋ณด๋ฅผ ์ฐ๊ธฐ์ ์, ์ต์ ์ด ๋ฎ์ด ์์ด์ง ์ ์๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด ์ต์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ํ, ๋ฐ๊ฟ ๋นํธ๊ฐ๋ง ์ ๋ฐ์ดํธ ํ๋ค. ์ด ๊ณผ์ ์ MPU6050_WriteBits() ํจ์์ ์ฒ๋ฆฌ ํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ฃผ๋ชฉํ ๊ฒ์, ์ ๋ณด๋ฅผ ์ธ ๋, ์ด๋ค ํ๋ฆ์ผ๋ก I2Cํต์ ์ ํ๋๋์ด๋ MPU6050_I2C_ByteWrite()ํจ์๋ฅผ ๋ณด์. MPU-6050๊ณผ ์ ์์ ์์ํ ํ, ๋ ์ง์คํฐ ์ฃผ์๋ฅผ ์ก์ ํ๊ณ , ์ด ํ์ ์ธ ๋ฐ์ดํ๋ฅผ ๋ณด๋ด๊ณ ์๋ค.
์ด ์ฝ๋๋ Harinadha Reddy๊ฐ ์์ฑํ๋ค.
MPU-6050์์ I2Cํต์ ์ผ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ถ๋ถ์ MPU6050_I2C_BufferRead() ํจ์๋ฅผ ํ์ธํ์. ์์ ๋์จ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ๊ณผ ์ผ์นํ๋ค.
MPU6050_I2C_ByteWrite(MPU6050_DEFAULT_ADDRESS, data, MPU6050_RA_GYRO_CONFIG);
void MPU6050_I2C_ByteWrite(u8 slaveAddr, u8* pBuffer, u8 writeAddr)
{
// ENTR_CRT_SECTION();
/* Send START condition */
I2C_GenerateSTART(MPU6050_I2C, ENABLE);
/* Test on EV5 and clear it */
while (!I2C_CheckEvent(MPU6050_I2C, I2C_EVENT_MASTER_MODE_SELECT));
/* Send MPU6050 address for write */
I2C_Send7bitAddress(MPU6050_I2C, slaveAddr, I2C_Direction_Transmitter);
/* Test on EV6 and clear it */
while (!I2C_CheckEvent(MPU6050_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* Send the MPU6050's internal address to write to */
I2C_SendData(MPU6050_I2C, writeAddr);
/* Test on EV8 and clear it */
while (!I2C_CheckEvent(MPU6050_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* Send the byte to be written */
I2C_SendData(MPU6050_I2C, *pBuffer);
/* Test on EV8 and clear it */
while (!I2C_CheckEvent(MPU6050_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* Send STOP condition */
I2C_GenerateSTOP(MPU6050_I2C, ENABLE);
// EXT_CRT_SECTION();
}
MPU-6050๊ณผ ์ ์์ ์ผ๋ก ์ฐ๊ฒฐ๋์๋์ง๋ฅผ ํ์ธํ๊ณ , ์ผ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
MPU-6050๊ณผ ์ ์์ ์ผ๋ก ์ฐ๊ฒฐ์ด ๋์๋ค๋ฉด, MPU6050_GetRawAccelGyro() ํจ์๋ก ์ผ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค. 6๊ฐ์ ์ ์๊ฐ์ ์์๋๋ก ๊ฐ์๋ x,y,z ์์ด๋ก์ผ์ x,y,z ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
int16_t AccelGyro[6]={0};
if (MPU6050_TestConnection() != 0)
{
// connection success
}
else
{
// connection failed
return 0;
}
MPU6050_GetRawAccelGyro(AccelGyro);
MPU-6050 ์ผ์์ ๋ณด๋ฅผ Roll,Pitch,Yaw ๊ฐ์ผ๋ก ๋ณํ
์ด ์ฝ๋๋ http://m.kocoafab.cc/tutorial/view/239 ์์ ๊ฐ์ ธ ์๊ณ , ์๋ณธ์ Krodal์ด ์์ฑํ๋ค.
๊ฐ์๋ ์ผ์์ ์์ด๋ก ์ผ์๋ฅผ ๊ฐ๋จํ ์๋ณดํํฐ๋ฅผ ์ด์ฉํด์ ๊ตฌํํ๊ณ ์๋ค. ๊ฐ์๋๋ฅผ roll, pitch, yaw๋ก ๋ณํํ๋ ๊ณต์์ ์ฌ๋ฌ ์ฌ์ดํธ์์ ํ์ธํ ์ ์๋ค. ์ฌ๊ธฐ์๋ yaw๊ฐ์ ๊ตฌํ์ง ์๊ณ ์๋ค.
//
// ์์ค ์ฐธ์กฐ. ์๋์ด๋
ธ ์์ค๋ฅผ stm32 ์์ค๋ก ๋ฐ๊ฟจ๋ค.
// http://m.kocoafab.cc/tutorial/view/239
//
void SendSerialAccelGryro( int16_t accelgyro[6] )
{
// 250 degree/s ๋ฒ์๋ฅผ ๊ฐ์ง๊ณ , ์ด ๊ฐ์ 16 bit ๋ถํด๋ฅ์ผ๋ก ํํํ๊ณ ์์ผ๋ฏ๋ก,
// mpu-6050์์ ๋ณด๋ด๋ ๊ฐ์ -32766 ~ +32766 ๊ฐ์ด๋ค.
// ๊ทธ๋ฌ๋ฏ๋ก ์ด ๊ฐ์ ์ค์ 250 degree/s ๋ก ๋ณํํ๋ ค๋ฉด 131๋ก ๋๋ ์ค์ผ ํ๋ค. ๋ฒ์๊ฐ
// ๋ค๋ฅด๋ฉด ์ด ๊ฐ๋ ๊ฐ์ด ๋ฐ๊ปด์ผํ๋ค.
float FS_SEL = 131;
//ํ์ ์ ํ์ ๋ ์๊ฐ ์๊ธฐ
unsigned long t_now = GetTickCount();
float gyro_x = (accelgyro[3] - base_x_gyro)/FS_SEL;
float gyro_y = (accelgyro[4] - base_y_gyro)/FS_SEL;
float gyro_z = (accelgyro[5] - base_z_gyro)/FS_SEL;
// ๊ฐ์๋ ๊ฐ ๋ฒ์๋?
// 16bit ๋ -32766 ~ +32766 ๋ฒ์์ด๊ณ ,
// +-2g ๋ฒ์๋ผ๋ฉด mpu-6050์ผ๋ก๋ถํฐ ๋์ด์จ ๊ฐ์ ์ค์ g๋จ์๋ก ํ์ฐํ๋ ค๋ฉด
// scale factor(16384)๋ก ๋๋ ์ค์ผ ํ๋ค. +-2g ๋ฒ์๋ +-32766๊ฐ์ด๋ค. ์ฆ 32766๊ฐ์ด๋ฉด 2๊ฐ ๋๋ค.
//acceleration ์์ ๋ฐ์ดํฐ ์ ์ฅ
float accel_x = accelgyro[0];
float accel_y = accelgyro[1];
float accel_z = accelgyro[2];
//accelerometer๋ก ๋ถํฐ ๊ฐ๋ ์ป๊ธฐ
float RADIANS_TO_DEGREES = 180/3.14159;
// float accel_vector_length = sqrt(pow(accel_x,2) + pow(accel_y,2) + pow(accel_z,2));
float accel_angle_y = atan(-1*accel_x/sqrt(pow(accel_y,2) + pow(accel_z,2)))*RADIANS_TO_DEGREES;
float accel_angle_x = atan(accel_y/sqrt(pow(accel_x,2) + pow(accel_z,2)))*RADIANS_TO_DEGREES;
float accel_angle_z = 0;
//gyro angles ๊ณ์ฐ1
float dt =(t_now - get_last_time())/1000.0;
float gyro_angle_x = gyro_x*dt + get_last_x_angle();
float gyro_angle_y = gyro_y*dt + get_last_y_angle();
float gyro_angle_z = gyro_z*dt + get_last_z_angle();
//gyro angles ๊ณ์ฐ2
float unfiltered_gyro_angle_x = gyro_x*dt + get_last_gyro_x_angle();
float unfiltered_gyro_angle_y = gyro_y*dt + get_last_gyro_y_angle();
float unfiltered_gyro_angle_z = gyro_z*dt + get_last_gyro_z_angle();
//์ํ๋ฅผ ์ด์ฉํด์ ์ต์ข
๊ฐ๋ ๊ณ์ฐ3
float alpha = 0.96;
float angle_x = alpha*gyro_angle_x + (1.0 - alpha)*accel_angle_x;
float angle_y = alpha*gyro_angle_y + (1.0 - alpha)*accel_angle_y;
float angle_z = gyro_angle_z; //Accelerometer๋ z-angle ์์
//์ต์ข
๊ฐ๋ ์ ์ฅ
set_last_read_angle_data(t_now, angle_x, angle_y, angle_z, unfiltered_gyro_angle_x, unfiltered_gyro_angle_y, unfiltered_gyro_angle_z);
// ์์ ๋ฌธ์ ์ ์ก
print_byte('S');
print_byte( (int16_t)dt );
// 2 ๋ฐ์ดํธ ์ ์๋ก ๋ณด๋ด๊ธฐ ์ํด 100์ ๊ณฑํ๊ณ , ๋ฐ์ ๋, 100์ ๋๋ ์ค๋ค.
print_short( (int16_t)(accel_angle_x*100) );
print_short( (int16_t)(accel_angle_y*100) );
print_short( (int16_t)(accel_angle_z*100) );
print_short( (int16_t)(unfiltered_gyro_angle_x*100) );
print_short( (int16_t)(unfiltered_gyro_angle_y*100) );
print_short( (int16_t)(unfiltered_gyro_angle_z*100) );
print_short( (int16_t)(angle_x*100) );
print_short( (int16_t)(angle_y*100) );
print_short( (int16_t)(angle_z*100) );
}
๋ ํผ๋ฐ์ค
- https://harinadha.wordpress.com/2012/05/23/mpu6050lib/
- ์๋์ด๋ ธ์์ MPU-6050์ ์ฌ์ฉํ๋ ๋ฒ
- mpu-6050 ๋งค๋ด์ผ ๋ฒ์ญ
- http://www.nano-i.com/salse/1272665