diff --git a/arduino/devcomuino/devcomuino.h b/arduino/devcomuino/devcomuino.h
index 61d8738d2b05dd476c7a5e42ed689399a71c2cc2..214c2cc858fdae641f635cfe8af27dbaff9ba574 100644
--- a/arduino/devcomuino/devcomuino.h
+++ b/arduino/devcomuino/devcomuino.h
@@ -1,7 +1,17 @@
+// Arduino Uno
 #if defined(ARDUINO_AVR_UNO)
-static const uint8_t analog_pins[] = {A0, A1, A2, A3, A4, A5};  // Arduino Uno
+static const uint8_t analog_pins[] = {A0, A1, A2, A3, A4, A5};
+static const uint8_t n_digital_pins = 14;
+
+// Arduino mega
 #elif defined(ARDUINO_AVR_MEGA2560)
-static const uint8_t analog_pins[] = {
-    A0, A1, A2,  A3,  A4,  A5,  A6,  A7,
-    A8, A9, A10, A11, A12, A13, A14, A15};  // Arduino mega
+static const uint8_t analog_pins[] = {A0, A1, A2,  A3,  A4,  A5,  A6,  A7,
+                                      A8, A9, A10, A11, A12, A13, A14, A15};
+static const uint8_t n_digital_pins = 54;
+
+// Arduino Nano
+#elif defined(ARDUINO_AVR_NANO)
+static const uint8_t analog_pins[] = {A0, A1, A2, A3, A4, A5, A6, A7};
+static const uint8_t n_digital_pins = 22;
+
 #endif
diff --git a/arduino/devcomuino/devcomuino.ino b/arduino/devcomuino/devcomuino.ino
index 82be76d2f5a49cfdafdd0b72db1388e0e3d168e8..efbaf94300c91ce973199d655d6ec08712ccf11c 100644
--- a/arduino/devcomuino/devcomuino.ino
+++ b/arduino/devcomuino/devcomuino.ino
@@ -5,7 +5,7 @@
 
 const unsigned int MAXARGS = 5;
 const unsigned int MAXBYTES = 16;
-const unsigned int MAXCMDLENGTH = 256;
+const unsigned int MAXCMDLENGTH = 64;
 const unsigned int MAXARGLENGTH = 16;
 
 // Command parsing
@@ -31,7 +31,7 @@ void runcommand() {
     // need to check ADC functionality
     else if (strncmp("ADC", argv[0], 3) == 0) {  // Read ADC
         if (argc != 2) {
-            Serial.println("ERR wrong number of arguments to ADC");
+            Serial.println("ERR wrong number of args to ADC");
             return;
         }
         cmdADC(atoi(argv[1]));
@@ -41,7 +41,7 @@ void runcommand() {
 
         if (strncmp("WRITE", argv[1], 5) == 0) {
             if (argc < 4) {
-                Serial.println("ERR wrong number of arguments to EEPROM WRITE");
+                Serial.println("ERR wrong number of args to EEPROM WRITE");
                 return;
             }
 
@@ -52,7 +52,7 @@ void runcommand() {
 
         if (strncmp("READ", argv[1], 4) == 0) {
             if (argc < 3) {
-                Serial.println("ERR wrong number of arguments to EEPROM READ");
+                Serial.println("ERR wrong number of args to EEPROM READ");
                 return;
             }
             int address = atoi(argv[2]);
@@ -61,7 +61,7 @@ void runcommand() {
 
     } else if (strncmp("I2C", argv[0], 3) == 0) {  // I2C commands
         if (argc < 4) {
-            Serial.println("ERR wrong number of arguments to I2C");
+            Serial.println("ERR wrong number of args to I2C");
             return;
         }
 
@@ -74,9 +74,30 @@ void runcommand() {
         } else {
             Serial.println("ERR unknown I2C command");
         }
-    }
 
-    else {
+    } else if (strncmp("DGT", argv[0], 3) == 0) {  // DGT commands
+        if (argc == 3) {
+            int chan = atoi(argv[2]);
+            if (strncmp("OUT", argv[1], 3) == 0) {
+                cmdDGToutput(chan);
+            } else if (strncmp("IN", argv[1], 2) == 0) {
+                cmdDGTinput(chan);
+            } else if (strncmp("PULLUP", argv[1], 6) == 0) {
+                cmdDGTinputpullup(chan);
+            } else if (strncmp("READ", argv[1], 4) == 0) {
+                cmdDGTread(chan);
+            } else {
+                Serial.println("ERR unknown DGT command");
+            }
+        } else if (argc == 4 && strncmp("WRITE", argv[1], 5) == 0) {
+            int chan = atoi(argv[2]);
+            int value = atoi(argv[3]);
+            cmdDGTwrite(chan, value);
+        } else {
+            Serial.println("ERR wrong number of args to DGT");
+            return;
+        }
+    } else {
         Serial.println("ERR unknown command");
     }
 }
@@ -88,24 +109,27 @@ void runcommand() {
 //
 // Print
 void cmdHELP() {
-    Serial.println("Hello World from DevComduino!");
+    Serial.println(F("Hello World from DevComuino!"));
     Serial.println("");
-    Serial.println("Available commands:");
-    Serial.println("\tHELP - Print this help");
-    Serial.println("\tADC ch - Return ADC reading on channel ch");
-    Serial.println(
-        "\tI2C WRITE addr byte-string - Write a byte-string using I2C to addr, "
-        "MSB first");
-    Serial.println("\tI2C READ addr nbytes - Read number of bytes from addr");
+    Serial.println(F("Commands:"));
+    Serial.println(F("\tHELP - This help"));
+    Serial.println(F("\tADC ch - Read ADC channel ch"));
     Serial.println(
-        "\tEEPROM WRITE addr value - Write a value to a addr in EEPROM");
+        F("\tI2C WRITE addr byte-string - Write byte-string to I2C addr, "
+          "MSB first"));
+    Serial.println(F("\tI2C READ addr nbytes - Read nbytes from I2C addr"));
+    Serial.println(F("\tEEPROM WRITE addr value - Write to addr in EEPROM"));
+    Serial.println(F("\tEEPROM READ addr - Read addr from EEPROM"));
+    Serial.println(F("\tDGT OUT ch - Set digital pin ch as output"));
+    Serial.println(F("\tDGT IN ch - Set digital pin ch as input"));
+    Serial.println(F("\tDGT PULLUP ch - Set digital pin ch as input w/pullup"));
+    Serial.println(F("\tDGT READ ch - Read channel ch"));
     Serial.println(
-        "\tEEPROM READ addr - Read number of bytes from addr from EEPROM");
+        F("\tDGT WRITE ch 0|1 - Set channel ch to LOW (0) or HIGH (0)"));
 }
 
 //
 // Read an analogue pin
-
 void cmdADC(int channel) {
     float V;
 
@@ -166,6 +190,61 @@ void cmdI2Cread(int address, unsigned int nBytes) {
     Serial.println();
 }
 
+//
+// DGT input
+void cmdDGTinput(int channel) {
+    if (channel < n_digital_pins) {
+        pinMode(channel, INPUT);
+        Serial.println("OK");
+    } else {
+        Serial.println("ERR invalid channel");
+    }
+}
+
+//
+// DGT input with pullup resistors
+void cmdDGTinputpullup(int channel) {
+    if (channel < n_digital_pins) {
+        pinMode(channel, INPUT_PULLUP);
+        Serial.println("OK");
+    } else {
+        Serial.println("ERR invalid channel");
+    }
+}
+
+//
+// DGT output
+void cmdDGToutput(int channel) {
+    if (channel < n_digital_pins) {
+        pinMode(channel, OUTPUT);
+        Serial.println("OK");
+    } else {
+        Serial.println("ERR invalid channel");
+    }
+}
+
+//
+// DGT write
+void cmdDGTwrite(int channel, int value) {
+    if (channel < n_digital_pins) {
+        if (value == 0) {
+            digitalWrite(channel, LOW);
+        } else {
+            digitalWrite(channel, HIGH);
+        }
+        Serial.println("OK");
+    } else {
+        Serial.println("ERR invalid channel");
+    }
+}
+
+//
+// DGT read
+void cmdDGTread(int channel) {
+    uint8_t data = digitalRead(channel);
+    Serial.println(data);
+}
+
 //
 // The big main loop
 //
@@ -173,7 +252,7 @@ void cmdI2Cread(int address, unsigned int nBytes) {
 //
 // Setup serial
 void setup() {
-    Serial.begin(9600);
+    Serial.begin(115200);
     Wire.begin();
 }
 
@@ -194,7 +273,7 @@ void loop() {
         if (cmdptr >= MAXCMDLENGTH - 1) {
             // overflow command. Clean-up buffer to avoid stalled program
             cmdptr = 0;
-            Serial.print("ERR Command too long");
+            Serial.print("ERR command too long");
         }
         return;
     }