   return okIoJson(port, 0);
 }
 
+
+/*
+   LOWは何も繋げていないと大量に割込が入ってくるので注意
+*/
+char* attachInterruptTask(String queryWithType){
+
+  char type[16 + 1] = {0};
+  uint8_t num = 0;
+
+  char* error = checkPortWithType(queryWithType, &num, &type[0]);
+  if(error){
+    return error;
+  }
+
+  if(num >= ARRAYSIZE(INTERRUPT_FUNC_TBL)){
+    // ポートじゃないので後で別のエラーを作る.
+    return NgReturnJson(ILLEGAL_PORT_NUMBER);
+  }
+
+  for(uint8_t i = 0; i < ARRAYSIZE(INTERRUPT_MODE_TBL); i++){
+    if(strcmp(type, INTERRUPT_MODE_TBL[i].key) == 0){
+      attachInterrupt(num, INTERRUPT_FUNC_TBL[num], INTERRUPT_MODE_TBL[i].value);
+      return okAttachInterruptJson(num, i);
+    }
+  }
+
+  return NgReturnJson(ILLEGAL_TYPE);
+}
+
+char* detachInterruptTask(String queryWithPort){
+
+  char* error = checkPortQuery(queryWithPort);
+  if(error){
+    return error;
+  }
+
+  uint8_t num = strToInt(queryWithPort);
+  detachInterrupt(num);
+}
 
 // スタックオーバーフローにより強制的にリセット
 char* resetTask(String empty){

    }
  }

}

char* task(String msg){
  // 関数テーブルからタスクを決定する.

     example => d/mode/3?type=INPUT
   */
  {"d/mode/", &switchPinModeTask},


  /*
     attachInterrupt
     format  => d/int/on/{num}?type={type}
     {num}   => number of interrupt.
     {type}  => LOW | CHANGE | RISING | FALLING
     example => d/int/on/0?type=LOW

     LOW ピンがLOWのとき発生
     CHANGE ピンの状態が変化したときに発生
     RISING ピンの状態がLOWからHIGHに変わったときに発生
     FALLING ピンの状態がHIGHからLOWに変わったときに発生

     // TODO: typeじゃなくてmodeにしたい
   */
  {"d/int/on/", &attachInterruptTask},


  /*
     detachInterrupt
     format  => d/int/off/{num}
     {num}   => number of interrupt.
     example => d/int/off/0
   */
  {"d/int/off/", &detachInterruptTask},

  /*
    DI連続転送ON
