diff --git a/include/imu_9dof_dma.h b/include/imu_9dof_dma.h
index 993d8ac3e0321bb031b66fa15afe5031dc5cd978..3ece2d8ceb7f310dccbf9edecc6010a18fe5c852 100644
--- a/include/imu_9dof_dma.h
+++ b/include/imu_9dof_dma.h
@@ -46,4 +46,10 @@ void imu_accel_justify_left(void);
 void imu_accel_justify_right(void);
 void imu_accel_config(void);
 
+// gyroscope public functions
+uint8_t imu_gyro_detect(void);
+
+// compass public functions
+uint8_t imu_compass_detect(void);
+
 #endif
diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c
index c9917ba99788c9e79e18a3e9c6ecc1a34015465d..702a1d02d548e8272fd2b5114d4e5b544778749d 100644
--- a/src/bioloid_stm32.c
+++ b/src/bioloid_stm32.c
@@ -74,10 +74,15 @@ int32_t main(void)
     GPIO_SetBits(GPIOD,GPIO_Pin_12);
   else
     GPIO_ResetBits(GPIOD,GPIO_Pin_12);
-  
-  gpio_set_pushbutton_callback(NORTH_PB,test_led);
-  gpio_blink_led(EAST_LED,2000);
-  gpio_blink_led(WEST_LED,1000);
+  if(imu_gyro_detect())
+    GPIO_SetBits(GPIOD,GPIO_Pin_13);
+  else
+    GPIO_ResetBits(GPIOD,GPIO_Pin_13);
+  if(imu_compass_detect())
+    GPIO_SetBits(GPIOD,GPIO_Pin_14);
+  else
+    GPIO_ResetBits(GPIOD,GPIO_Pin_14);
+
   while(1)                             /* main function does not return */
   {
     if(dyn_slave_is_packet_ready())// check if a new instruction packet has been received
diff --git a/src/imu_9dof_dma.c b/src/imu_9dof_dma.c
index 8144b635bd436dae0cbcbc63e03cda778bc5a770..2d595a2941485d813543706e241e6646274a487f 100644
--- a/src/imu_9dof_dma.c
+++ b/src/imu_9dof_dma.c
@@ -49,6 +49,8 @@ volatile uint8_t i2c_error;
 volatile i2c_op_t i2c_op;
 uint8_t i2c_conf[32];
 uint8_t i2c_data[32];
+uint8_t i2c_rd_addr;
+uint8_t i2c_wr_addr;
 // accelerometer data and configuration
 const uint8_t accel_id_reg=0x00;
 const uint8_t accel_id=0xE5;
@@ -59,6 +61,26 @@ const uint8_t accel_data_reg=0x32;
 const uint8_t accel_data_len=0x06;
 const uint8_t accel_rd_addr=0xA6;
 const uint8_t accel_wr_addr=0xA7;
+// gyroscope data and configuration
+const uint8_t gyro_id_reg=0x00;
+const uint8_t gyro_id=0x68;
+const uint8_t gyro_id_len=0x01;
+const uint8_t gyro_conf_reg=0x15;
+const uint8_t gyro_conf_len=0x03;
+const uint8_t gyro_data_reg=0x1B;
+const uint8_t gyro_data_len=0x08;
+const uint8_t gyro_rd_addr=0xD0;
+const uint8_t gyro_wr_addr=0xD1;
+// compass data adn configuration
+const uint8_t compass_id_reg=0x0A;
+const uint8_t compass_id[3]={'H','4','3'};
+const uint8_t compass_id_len=0x03;
+const uint8_t compass_conf_reg=0x00;
+const uint8_t compass_conf_len=0x03;
+const uint8_t compass_data_reg=0x03;
+const uint8_t compass_data_len=0x06;
+const uint8_t compass_rd_addr=0x3D;
+const uint8_t compass_wr_addr=0x3C;
 // dma initialization structures;
 DMA_InitTypeDef IMU_DMA_TX_InitStructure;
 DMA_InitTypeDef IMU_DMA_RX_InitStructure;
@@ -71,9 +93,9 @@ void I2C_IMU_EV_IRQHandler(void)
     /* Test on I2C1 EV5 and clear it */
     case I2C_EVENT_MASTER_MODE_SELECT:              
       if(i2c_op==I2C_RD_OP_DATA)
-        I2C_Send7bitAddress(I2C_IMU,accel_rd_addr,I2C_Direction_Receiver);
+        I2C_Send7bitAddress(I2C_IMU,i2c_rd_addr,I2C_Direction_Receiver);
       else
-        I2C_Send7bitAddress(I2C_IMU,accel_wr_addr,I2C_Direction_Transmitter);
+        I2C_Send7bitAddress(I2C_IMU,i2c_wr_addr,I2C_Direction_Transmitter);
       break;
 
     /* Test on I2C1 EV6 and first EV8 and clear them */
@@ -86,9 +108,12 @@ void I2C_IMU_EV_IRQHandler(void)
 
     case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:
       I2C_ITConfig(I2C_IMU, I2C_IT_EVT, DISABLE);
-      I2C_AcknowledgeConfig(I2C_IMU,DISABLE);
       /* enable DMA transfer */
-      I2C_DMACmd(I2C_IMU, ENABLE);
+      if(IMU_DMA_RX_InitStructure.DMA_BufferSize==1)
+        I2C_AcknowledgeConfig(I2C_IMU,DISABLE);
+      else
+        I2C_AcknowledgeConfig(I2C_IMU,ENABLE);
+      I2C_DMALastTransferCmd(I2C_IMU,ENABLE);
       DMA_Cmd(I2C_IMU_DMA_STREAM_RX, ENABLE);
       break;
 
@@ -154,6 +179,7 @@ uint8_t imu_is_op_done(void)
     return 0x00;
 }
 
+// accelerometer public functions
 uint8_t imu_accel_detect(void)
 {
   i2c_op=I2C_RD_OP_CMD;
@@ -165,6 +191,8 @@ uint8_t imu_accel_detect(void)
   DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure);
   i2c_conf[0]=accel_id_reg;
   i2c_data[0]=0x00;
+  i2c_rd_addr=accel_rd_addr;
+  i2c_wr_addr=accel_wr_addr;
   I2C_GenerateSTART(I2C_IMU, ENABLE);
 
   imu_wait_op_done();
@@ -223,7 +251,57 @@ void imu_accel_config(void)
   i2c_conf[0]=accel_conf_reg;
   i2c_conf[15]=0x0A;
   i2c_conf[20]=0x02;
+  i2c_rd_addr=accel_rd_addr;
+  i2c_wr_addr=accel_wr_addr;
+  I2C_GenerateSTART(I2C_IMU, ENABLE);
+}
+
+// gyroscope public functions
+uint8_t imu_gyro_detect(void)
+{
+  i2c_op=I2C_RD_OP_CMD;
+  IMU_DMA_RX_InitStructure.DMA_BufferSize=gyro_id_len;
+  IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data;
+  DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure);
+  IMU_DMA_TX_InitStructure.DMA_BufferSize=1;
+  IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_conf;
+  DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure);
+  i2c_conf[0]=gyro_id_reg;
+  i2c_data[0]=0x00;
+  i2c_rd_addr=gyro_rd_addr;
+  i2c_wr_addr=gyro_wr_addr;
+  I2C_GenerateSTART(I2C_IMU, ENABLE);
+
+  imu_wait_op_done();
+  if((i2c_data[0]&0x7E)==gyro_id)
+    return 0x01;
+  else
+    return 0x00;
+}
+
+// compass public functions
+uint8_t imu_compass_detect(void)
+{
+  i2c_op=I2C_RD_OP_CMD;
+  IMU_DMA_RX_InitStructure.DMA_BufferSize=compass_id_len;
+  IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data;
+  DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure);
+  IMU_DMA_TX_InitStructure.DMA_BufferSize=1;
+  IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_conf;
+  DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure);
+  i2c_conf[0]=compass_id_reg;
+  i2c_data[0]=0x00;
+  i2c_data[1]=0x00;
+  i2c_data[2]=0x00;
+  i2c_rd_addr=compass_rd_addr;
+  i2c_wr_addr=compass_wr_addr;
   I2C_GenerateSTART(I2C_IMU, ENABLE);
+
+  imu_wait_op_done();
+  if(i2c_data[0]==compass_id[0] && i2c_data[1]==compass_id[1] && i2c_data[2]==compass_id[2])
+    return 0x01;
+  else
+    return 0x00;
 }
 
 // public functions
@@ -268,7 +346,7 @@ void imu_init(void)
   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
   I2C_InitStructure.I2C_OwnAddress1 = 0x00;
-  I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
+  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
   I2C_InitStructure.I2C_ClockSpeed = 400000;
   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
   I2C_Init(I2C_IMU, &I2C_InitStructure);