diff --git a/Makefile b/Makefile
index 5933af0bc649d05ee2b5115417a501e47bffdca5..f11eaa6ddb8dc3aa603a028d857a2a25a9e1168b 100755
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,7 @@ TARGET_FILES+=src/system_stm32f4xx.c
 TARGET_FILES+=src/stm32f4xx_hal_msp.c
 TARGET_FILES+=src/gpio.c
 TARGET_FILES+=src/bioloid_time.c
+TARGET_FILES+=src/bioloid_dyn_slave.c
 TARGET_PROCESSOR=STM32F407VG
 
 HAL_PATH=../../STM32_processor/hal/f4
@@ -65,6 +66,9 @@ TARGET_FILES+=$(HAL_PATH)/src/stm32f4xx_hal_flash.c
 TARGET_FILES+=$(HAL_PATH)/src/stm32f4xx_hal_flash_ex.c
 TARGET_FILES+=$(HAL_PATH)/src/stm32f4xx_hal_dma.c
 TARGET_FILES+=$(HAL_PATH)/src/stm32f4xx_hal.c
+TARGET_FILES+=$(HAL_PATH)/src/stm32f4xx_hal_uart.c
+
+TARGET_FILES+=$(USART_PATH)/src/usart3.c
 
 BIOLOID_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o))
 BIOLOID_OBJS = $(patsubst %,$(BUILD_PATH)/%,$(BIOLOID_OBJS_TMP))
diff --git a/include/bioloid_dyn_slave.h b/include/bioloid_dyn_slave.h
new file mode 100644
index 0000000000000000000000000000000000000000..2298418bf77f015680f896614020e0c74e5eaa04
--- /dev/null
+++ b/include/bioloid_dyn_slave.h
@@ -0,0 +1,22 @@
+#ifndef _BIOLOID_DYN_SLAVE_H
+#define _BIOLOID_DYN_SLAVE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "stm32f4xx_hal.h"
+#include "stm32_time.h"
+#include "dynamixel_slave.h"
+#include "comm.h"
+
+extern TDynamixelSlave bioloid_dyn_slave;
+
+void bioloid_dyn_slave_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/src/bioloid_dyn_slave.c b/src/bioloid_dyn_slave.c
new file mode 100644
index 0000000000000000000000000000000000000000..28eceee2a0077d80d2aff8ab3758dc65f183db0c
--- /dev/null
+++ b/src/bioloid_dyn_slave.c
@@ -0,0 +1,54 @@
+#include "bioloid_dyn_slave.h"
+#include "bioloid_time.h"
+#include "usart3.h"
+
+/* private variables */
+TDynamixelSlave bioloid_dyn_slave;
+TTime bioloid_dyn_slave_timer;
+TComm bioloid_dyn_slave_comm;
+
+// private functions
+unsigned char bioloid_on_read(unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  return 0x00;
+}
+
+unsigned char bioloid_on_write(unsigned short int address,unsigned short int length,unsigned char *data)
+{
+  return 0x00;
+}
+
+// public functions
+void bioloid_dyn_slave_init(void)
+{
+  TUSART_IRQ_Priorities priorities;
+  UART_InitTypeDef Init;
+
+  // initialize timer structure
+  time_init(&bioloid_dyn_slave_timer,bioloid_time_get_counts_per_us(),bioloid_time_get_counts);
+
+  /* initialize the comm object */
+  comm_init(&bioloid_dyn_slave_comm,0x01,&bioloid_dyn_slave_timer);
+  Init.BaudRate     = 921600;
+  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=0;
+  priorities.dma_rx_priority=1;
+  priorities.dma_rx_subpriority=1;
+  priorities.dma_tx_priority=1;
+  priorities.dma_tx_subpriority=0;
+
+  usart3_init(&bioloid_dyn_slave_comm,&Init,&priorities);
+  dyn_slave_init(&bioloid_dyn_slave,&bioloid_dyn_slave_comm,0x01);
+  bioloid_dyn_slave.on_read=bioloid_on_read;
+  bioloid_dyn_slave.on_write=bioloid_on_write;
+  //dyn_slave_set_return_delay(&battery_dyn_slave,ram_data[BATTERY_RETURN_DELAY_TIME]);
+  //dyn_slave_set_return_level(&battery_dyn_slave,ram_data[BATTERY_STATUS_RETURN_LEVEL]);
+}
+
diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c
index 471649eef3dd21ee4388e7a7fd360b72f13be2fb..927065e7f2e113b64a3c856cd606c2bd40be7f9f 100644
--- a/src/bioloid_stm32.c
+++ b/src/bioloid_stm32.c
@@ -1,26 +1,22 @@
 #include "stm32f4xx_hal.h"
+#include "bioloid_dyn_slave.h"
 #include "gpio.h"
 #include "bioloid_time.h"
 #include "stm32_time.h"
 
 int32_t main(void)
 {
-  TTime timer;
-  int i;
-
   HAL_Init();
   /* initialize the gpio */
   gpio_init();
   /* initialize the time module */
   bioloid_time_init();
-
-  time_init(&timer, bioloid_time_get_counts_per_us(), bioloid_time_get_counts);
+  /* initialize the dynamixel slave interface */
+  bioloid_dyn_slave_init();
 
   while(1)
   {
-    for(i=0;i<10000;i++)
-      time_delay_us(&timer,100);
-    gpio_toggle_led(USER1_LED);
+    dyn_slave_loop(&bioloid_dyn_slave);
   }
 }