     roboclaw.ForwardBackwardM2(RC_ADDR, motor2);
   }
 }
+
+void driveInit(boolean action)
+{
+  if (action) roboclaw.begin(38400);
+  else roboclaw.end();
+}
+
+//=======================================
+
+
+
+
+
+
+
+
+
+
+
+
+//=======================================
 
 // 'version' command
 // ex: V
 void ver()
 {
-  Serial.println("V2");
+  Serial.println("V3");
+}
+
+// 'power' command
+void power()
+{
+  cmd = buf[1];
+  if (cmd == 'A' || cmd == 'a') { pulsePin(AUX_PIN, 20); delay(3000); pulsePin(AUX_PIN, 20);  }
+  else
+  if (cmd == 'M' || cmd == 'm') pulsePin(MOTORS_PIN, 20);
+  else
+  if (cmd == 'U' || cmd == 'u') pulsePin(UPS_PIN, 5500);
 }
 
 // 'set parameter' command
-// ex: PT2500
-void param()
+// ex: ST2500
+void settings()
 {
   cmd = buf[1];
   // command timeout

  else
  if (cmd == 'V' || cmd == 'v') ver();
  else
  if (cmd == 'P' || cmd == 'p') param();
  else
  if (cmd == 'B' || cmd == 'b') battery();
  else

  }
  else
  if (cmd == 'Z' || cmd == 'z') // stop immediately
  {
    motor1_target = MOTOR_VELOCITY_0;
    motor1 = MOTOR_VELOCITY_0;
    motor2_target = MOTOR_VELOCITY_0;
    motor2 = MOTOR_VELOCITY_0;
    roboclaw.ForwardBackwardM1(RC_ADDR, motor1);
    roboclaw.ForwardBackwardM2(RC_ADDR, motor2);
  }
  else
  if (cmd == 'F' || cmd == 'f') { motor1_target = MOTOR_VELOCITY_0 + motor_velocity; motor2_target = motor1_target; }
  else
