diff --git a/ArduinoDriver/ArduinoDriver.ino b/ArduinoDriver/ArduinoDriver.ino
new file mode 100644
index 0000000000000000000000000000000000000000..dec8a02c746203aece320a53bbaa6187e7aa05c0
--- /dev/null
+++ b/ArduinoDriver/ArduinoDriver.ino
@@ -0,0 +1,167 @@
+#include <elapsedMillis.h>
+#include <Servo.h>
+
+#define BAUDRATE 57600 // Serial baudrate
+#define SIZE 12 // Size of incoming data in bytes
+
+// DC motor pins
+#define E1 5     //M1 Speed Control
+#define E2 6     //M2 Speed Control
+
+Servo motor1;
+Servo motor2;
+
+// Servo pins
+#define sNum 6
+#define mNum 4
+int sPins[] = { 2, // arm
+                3, // claw
+                8, // bottom
+                9, // top
+                10, // cagelock
+                11 // droplock
+              };
+
+int sInit[] = { 90,
+                90,
+                90,
+                90,
+                90,
+                90
+              };
+
+// Byte array to hold incoming serial data
+byte bytes[SIZE];
+
+// Data arrays to hold motor values
+int mData[mNum];
+int sData[sNum];
+
+// Servos
+Servo servos[sNum];
+
+// Timer for communications problems check
+elapsedMillis timer0;
+
+void setup(void)
+{
+  // Initialize DC motor
+  for (int i = 0; i < mNum; i++)
+    mData[i] = 0;
+
+  // Initialize servos
+  for (int i = 0; i < sNum; i++) {
+    sData[i] = sInit[i];
+
+    servos[i].attach(sPins[i]);
+    servos[i].write(sData[i]);
+  }
+
+  // Initialize DC motor pins
+  for (int i = 4; i <= 7; i++)
+    pinMode(i, OUTPUT);
+
+  // Write initial DC motor values
+  //digitalWrite(E1, LOW);
+  //digitalWrite(E2, LOW);
+  motor2.attach(E2);
+  motor1.attach(E1);
+
+  // Initialize serial
+  Serial.begin(BAUDRATE);
+  // Serial.println("COMMUNICATION ESTABLISHED !!\n");
+}
+
+void loop(void)
+{
+  // Clear bytes array
+  for (int i = 0; i < SIZE; i++) {
+    bytes[i] = 0;
+  }
+
+  // Check for connection problems
+  while (Serial.available() < SIZE) {
+    if (timer0 > 100) {
+      timer0 = 0;
+
+      mData[0] = 0;
+      mData[2] = 0;
+
+      //digitalWrite(E1, mData[0]);
+      //digitalWrite(E2, mData[2]);
+      motor1.writeMicroseconds(1500);
+      motor2.writeMicroseconds(1500);
+    }
+
+    delay(10);
+  }
+
+  // Fill bytes array with serial data
+  while (Serial.available() >= SIZE) {
+    for (int i = 0; i < SIZE; i++) {
+      bytes[i] = Serial.read();
+    }
+  }
+
+  // If serial data looks ok, fill data array
+  if (bytes[0] == 'b' && bytes[SIZE - 1] == 'e') {
+    for (int i = 0; i < mNum; i++)
+      mData[i] = bytes[i + 1];
+
+    for (int i = 0; i < sNum; i++)
+      sData[i] = bytes[i + mNum + 1];
+
+    Serial.print("OK\n");
+
+    // Serial.print("mData: ");
+    // // Print contents of mData to serial
+    // for(int i = 0; i < 4; i++) {
+    //     Serial.print(mData[i]);
+    //     Serial.print(" ");
+    // }
+
+    // Serial.print(" sData: ");
+    // // Print contents of sData to serial
+    // for(int i = 0; i < sNum; i++) {
+    //     Serial.print(sData[i]);
+    //     Serial.print(" ");
+    // }
+    // Serial.praint("\n");
+  } else {
+    Serial.print("Corrupt data!\n");
+  }
+
+  // Write DC motor values
+  //analogWrite(E1, mData[0]);
+  if (mData[1] == 1) {
+    //digitalWrite(M1, HIGH);
+    mData[1] = 1;
+  } else if (mData[1] == 0) {
+    //digitalWrite(M1, LOW);
+    mData[1] = -1;
+  }
+  
+  if (mData[3] == 1) {
+    //digitalWrite(M2, HIGH);
+    mData[3] = 1;
+  } else if (mData[3] == 0) {
+    //digitalWrite(M2, LOW);
+    mData[3] = -1;
+  }
+  //analogWrite(E2, mData[2]);
+  motor1.writeMicroseconds(1500+mData[1]*mData[0]*2);
+  motor2.writeMicroseconds(1500+mData[3]*mData[2]*2);
+  //delay(6);
+
+
+
+  for (int i = 0; i < sNum; i++)
+    servos[i].write(sData[i]);
+
+  while (Serial.available() > 0) {
+    char t = Serial.read();
+  }
+
+  timer0 = 0;
+  delay(10);
+}
diff --git a/interruptRust/interruptRust.ino b/interruptRust/interruptRust.ino
new file mode 100644
index 0000000000000000000000000000000000000000..17de6867dfd40af8c17917d1141582112eb741d5
--- /dev/null
+++ b/interruptRust/interruptRust.ino
@@ -0,0 +1,52 @@
+
+const byte interruptPinL = 3;
+const byte interruptPinR = 8;
+volatile long countL = 0;
+volatile long countR = 0;
+byte *countPtrL = (byte*) &countL;
+byte *countPtrR = (byte*) &countR;
+
+const long timeThresh = 500; //ms
+long lastTime = 0;
+volatile long lastCountL = 0;
+volatile long lastCountR = 0;
+const long countTimeThresh = 100;
+
+void setup() {
+  pinMode(interruptPinL, INPUT_PULLUP);
+  pinMode(interruptPinR, INPUT_PULLUP);
+  Serial.begin(9600);
+  lastTime = millis();
+  attachInterrupt(digitalPinToInterrupt(interruptPinL), myInterruptL, RISING);
+  attachInterrupt(digitalPinToInterrupt(interruptPinR), myInterruptR, RISING);
+}
+
+void loop() {
+  if(millis() - lastTime > timeThresh) {
+    
+    lastTime = millis();
+
+    for(byte i=3;i<4;i--) { // underflows
+      Serial.write(*(countPtrL+i));
+    }
+    for(byte i=3;i<4;i--) { // underflows
+      Serial.write(*(countPtrR+i));
+    }
+
+    countL=0;
+    countR=0;
+  }
+}
+
+void myInterruptL() {
+  if(millis() - lastCountL > countTimeThresh) {
+    countL+=50;
+    lastCountL = millis();
+  }
+}
+void myInterruptR() {
+  if(millis() - lastCountR > countTimeThresh) {
+    countR+=50;
+    lastCountR = millis();
+  }
+}
diff --git a/src/main.rs b/src/main.rs
index af0b939a0dc2ab4e005c260d39f70bff265ea4e2..01ee19ca13558ad6eddad4ca836f4f6de13b391c 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -17,7 +17,6 @@ use serial::prelude::*;
 //use std::str;
 
 
-
 /////////////////////////////
 ///////   constants   ///////
 /////////////////////////////
@@ -68,6 +67,8 @@ fn main() {
         let listener = TcpListener::bind(REMOTE_OPERATOR_ADDRESS).unwrap();
         let mut stream;
         let mut state: (f32, f32, f32, f32, f32) = (COLS as f32/2.0,ROWS as f32/2.0, 0.0, 0.0, 0.0);
+        let left_motor = Pin::new(127); // number depends on chip, etc.
+        let right_motor = Pin::new(128); 
         match listener.accept() {
             Ok((socket, addr)) => {
                 println!("controller: new client: {:?}", addr); stream=socket;