diff --git a/Makefile b/Makefile
index 96d9771a07750574c3bf785d4247b4c017aa9e08..6e70113ac0619acc80e1990f9ebc4a9718c73085 100755
--- a/Makefile
+++ b/Makefile
@@ -11,6 +11,7 @@ TARGET_FILES+=src/eeprom.c
 TARGET_FILES+=src/ram.c
 TARGET_FILES+=src/bioloid_time.c
 TARGET_FILES+=src/bioloid_dyn_slave.c
+TARGET_FILES+=src/bioloid_dyn_master_sensors.c
 TARGET_PROCESSOR=STM32F407VG
 
 HAL_PATH=../../STM32_processor/hal/f4
@@ -71,6 +72,7 @@ TARGET_FILES+=$(HAL_PATH)/src/stm32f4xx_hal.c
 TARGET_FILES+=$(HAL_PATH)/src/stm32f4xx_hal_uart.c
 
 TARGET_FILES+=$(USART_PATH)/src/usart3.c
+TARGET_FILES+=$(USART_PATH)/src/usart2.c
 
 BIOLOID_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o))
 BIOLOID_OBJS = $(patsubst %,$(BUILD_PATH)/%,$(BIOLOID_OBJS_TMP))
diff --git a/include/bioloid_dyn_master_sensors.h b/include/bioloid_dyn_master_sensors.h
new file mode 100644
index 0000000000000000000000000000000000000000..db8a6c449dfc14fe3f811c010fa71949f36a8642
--- /dev/null
+++ b/include/bioloid_dyn_master_sensors.h
@@ -0,0 +1,12 @@
+#ifndef _BIOLOID_DYN_MASTER_SENSORS_H
+#define _BIOLOID_DYN_MASTER_SENSORS_H
+
+#include "stm32f4xx_hal.h"
+#include "stm32_time.h"
+#include "dynamixel_master.h"
+#include "comm.h"
+
+void bioloid_dyn_master_sensors_init(void);
+
+#endif
+
diff --git a/src/bioloid_dyn_master_sensors.c b/src/bioloid_dyn_master_sensors.c
new file mode 100755
index 0000000000000000000000000000000000000000..783f116c17276b6485735206372ba3758a7dae24
--- /dev/null
+++ b/src/bioloid_dyn_master_sensors.c
@@ -0,0 +1,83 @@
+#include "bioloid_dyn_master_sensors.h"
+#include "bioloid_time.h"
+#include "usart2.h"
+#include "gpio.h"
+
+#define ENABLE_RX_EN_GPIO_CLK      __HAL_RCC_GPIOA_CLK_ENABLE()
+#define RX_EN_PIN                  GPIO_PIN_1
+#define RX_EN_GPIO_PORT            GPIOA                  
+
+#define ENABLE_TX_EN_GPIO_CLK      __HAL_RCC_GPIOA_CLK_ENABLE()
+#define TX_EN_PIN                  GPIO_PIN_0          
+#define TX_EN_GPIO_PORT            GPIOA          
+
+/* private variables */
+TDynamixelMaster bioloid_dyn_master_sensors;
+TTime bioloid_dyn_master_sensors_timer;
+TComm bioloid_dyn_master_sensors_comm;
+
+// private functions
+void bioloid_dyn_master_sensors_set_rx_mode(void)
+{
+  HAL_GPIO_WritePin(TX_EN_GPIO_PORT,TX_EN_PIN,GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(RX_EN_GPIO_PORT,RX_EN_PIN,GPIO_PIN_SET);
+}
+
+void bioloid_dyn_master_sensors_set_tx_mode(void)
+{
+  HAL_GPIO_WritePin(RX_EN_GPIO_PORT,RX_EN_PIN,GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(TX_EN_GPIO_PORT,TX_EN_PIN,GPIO_PIN_SET);
+}
+
+// public functions
+void bioloid_dyn_master_sensors_init(void)
+{
+  GPIO_InitTypeDef GPIO_InitStructure;
+  TUSART_IRQ_Priorities priorities;
+  UART_InitTypeDef Init;
+
+  // initialize timer structure
+  time_init(&bioloid_dyn_master_sensors_timer,bioloid_time_get_counts_per_us(),bioloid_time_get_counts);
+
+  // initialize GPIO
+  ENABLE_RX_EN_GPIO_CLK;
+  ENABLE_TX_EN_GPIO_CLK;
+
+  GPIO_InitStructure.Pin = RX_EN_PIN;
+  GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
+  GPIO_InitStructure.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(RX_EN_GPIO_PORT, &GPIO_InitStructure);
+
+  GPIO_InitStructure.Pin = TX_EN_PIN;
+  HAL_GPIO_Init(TX_EN_GPIO_PORT, &GPIO_InitStructure);
+
+  bioloid_dyn_master_sensors_set_rx_mode();
+
+  /* initialize the comm object */
+  comm_init(&bioloid_dyn_master_sensors_comm,0x01,&bioloid_dyn_master_sensors_timer);
+  Init.BaudRate     = 57600;
+  Init.WordLength   = UART_WORDLENGTH_8B;
+  Init.StopBits     = UART_STOPBITS_1;
+  Init.Parity       = UART_PARITY_NONE;
+  Init.Mode         = UART_MODE_TX_RX;
+  Init.HwFlowCtl    = UART_HWCONTROL_NONE;
+  Init.OverSampling = UART_OVERSAMPLING_16;
+  
+  priorities.irq_priority=0;
+  priorities.irq_subpriority=1;
+  priorities.dma_rx_priority=1;
+  priorities.dma_rx_subpriority=3;
+  priorities.dma_tx_priority=1;
+  priorities.dma_tx_subpriority=2;
+
+  usart2_init(&bioloid_dyn_master_sensors_comm,&Init,&priorities);
+  dyn_master_init(&bioloid_dyn_master_sensors,&bioloid_dyn_master_sensors_comm);
+  bioloid_dyn_master_sensors.set_rx_mode=bioloid_dyn_master_sensors_set_rx_mode;
+  bioloid_dyn_master_sensors.set_tx_mode=bioloid_dyn_master_sensors_set_tx_mode;
+
+  if(dyn_master_ping(&bioloid_dyn_master_sensors,0xC0)==DYN_SUCCESS)
+    gpio_set_led(RXD_LED); 
+  else
+    gpio_clear_led(RXD_LED);
+}
diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c
index 7b8d3f0a3e93d31a03ad2155a719893d79f8ed72..8c9688988924eb475345fd6bf33728f666450102 100644
--- a/src/bioloid_stm32.c
+++ b/src/bioloid_stm32.c
@@ -4,6 +4,7 @@
 #include "ram.h"
 #include "bioloid_time.h"
 #include "bioloid_dyn_slave.h"
+#include "bioloid_dyn_master_sensors.h"
 
 int32_t main(void)
 {
@@ -19,6 +20,8 @@ int32_t main(void)
   /* initialize the dynamixel slave interface */
   bioloid_dyn_slave_init();
   bioloid_dyn_slave_start();
+  /* initialize the dynamixel master module for the sensors */
+  bioloid_dyn_master_sensors_init();
 
   while(1);
 }
diff --git a/src/gpio.c b/src/gpio.c
index 95dd2f500ccf88431b5da50437873346b7e6246f..2d1e1fb798045af17722ee0fd6490e2708439643 100644
--- a/src/gpio.c
+++ b/src/gpio.c
@@ -97,10 +97,7 @@ void GPI_EXTI1_IRQHandler(void)
     {
       ram_data[BIOLOID_USER_PB_CNTRL]|=GPIO_INT_FLAG;
       if(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_EN)
-      {
         bioloid_dyn_slave_set_int();
-        gpio_toggle_led(TXD_LED);
-      }
     }
   }
 }
@@ -530,30 +527,42 @@ void gpio_process_read_cmd(unsigned short int address,unsigned short int length,
   if(ram_in_range(BIOLOID_RESET_PB_CNTRL,address,length))
     if(!(ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
     {
-      ram_data[BIOLOID_RESET_PB_CNTRL]&=(~GPIO_INT_FLAG);
-      if(ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_EN)
-        bioloid_dyn_slave_clear_int();
+      if(ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_FLAG)
+      {
+        ram_data[BIOLOID_RESET_PB_CNTRL]&=(~GPIO_INT_FLAG);
+        if(ram_data[BIOLOID_RESET_PB_CNTRL]&GPIO_INT_EN)
+          bioloid_dyn_slave_clear_int();
+      }
     } 
   if(ram_in_range(BIOLOID_USER_PB_CNTRL,address,length))
     if(!(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
     {
-      ram_data[BIOLOID_USER_PB_CNTRL]&=(~GPIO_INT_FLAG);
-      if(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_EN)
-        bioloid_dyn_slave_clear_int();
+      if(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_FLAG)
+      {
+        ram_data[BIOLOID_USER_PB_CNTRL]&=(~GPIO_INT_FLAG);
+        if(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_EN)
+          bioloid_dyn_slave_clear_int();
+      }
     } 
   if(ram_in_range(BIOLOID_START_PB_CNTRL,address,length))
     if(!(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
     {
-      ram_data[BIOLOID_START_PB_CNTRL]&=(~GPIO_INT_FLAG);
-      if(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_EN)
-        bioloid_dyn_slave_clear_int();
+      if(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_FLAG)
+      {
+        ram_data[BIOLOID_START_PB_CNTRL]&=(~GPIO_INT_FLAG);
+        if(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_EN)
+          bioloid_dyn_slave_clear_int();
+      }
     } 
   if(ram_in_range(BIOLOID_MODE_PB_CNTRL,address,length))
     if(!(ram_data[BIOLOID_MODE_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
     {
-      ram_data[BIOLOID_MODE_PB_CNTRL]&=(~GPIO_INT_FLAG);
-      if(ram_data[BIOLOID_MODE_PB_CNTRL]&GPIO_INT_EN)
-        bioloid_dyn_slave_clear_int();
+      if(ram_data[BIOLOID_MODE_PB_CNTRL]&GPIO_INT_FLAG)
+      {
+        ram_data[BIOLOID_MODE_PB_CNTRL]&=(~GPIO_INT_FLAG);
+        if(ram_data[BIOLOID_MODE_PB_CNTRL]&GPIO_INT_EN)
+          bioloid_dyn_slave_clear_int();
+      }
     } 
 }
 
@@ -720,10 +729,7 @@ void gpio_process_write_cmd(unsigned short int address,unsigned short int length
       ram_data[BIOLOID_RESET_PB_CNTRL]=data[BIOLOID_RESET_PB_CNTRL-address];
   if(ram_in_range(BIOLOID_USER_PB_CNTRL,address,length))
     if(!(ram_data[BIOLOID_USER_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
-    {
-      gpio_toggle_led(RXD_LED);
       ram_data[BIOLOID_USER_PB_CNTRL]=data[BIOLOID_USER_PB_CNTRL-address];
-    }
   if(ram_in_range(BIOLOID_START_PB_CNTRL,address,length))
     if(!(ram_data[BIOLOID_START_PB_CNTRL]&GPIO_INT_USED))/* GPIO is not internally used */
       ram_data[BIOLOID_START_PB_CNTRL]=data[BIOLOID_START_PB_CNTRL-address];