{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Servo Valve Controller Design Notes\n",
    "\n",
    "**Project:** 901101 Ocean Imaging  \n",
    "**PI:** David Caress  \n",
    "**Designer:** Eric Martin  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Requirements\n",
    "\n",
    "### Functional Requirements\n",
    "\n",
    "1. Must interface electrically either with OI power can or directly with Doc Ricketts through one of its *science ports*. \n",
    "* Can actuate 1 servo valves of the [Moog 30 Series Servo Valves](https://www.moog.com/products/servovalves-servo-proportional-valves/industrial/flow-control/analog-without-integrated-electronics/30-series-flow-control-servo-valve.html)\n",
    "* Can achieve high-resolution position control through remote valve command.\n",
    "* Can have persistent null point current calibration storage\n",
    "* Can update setpoint at rates to allow for tilt at maximum and minimum speeds.\n",
    "* Provides utility for software and either SMD software control or remote control through a fiber optic transceiver.\n",
    "* Fits within the same oil-compensated volume housing the backside of the servo valves, and be pressure tolerant to 6,000-PSIG.\n",
    "* Be compatible with Ventana integration as well. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Derived Requirements\n",
    "\n",
    "1. ROV science port interface is optimal as it provides utility for this valve pack on other potential users of the sled. This can be 12-VDC or 24-VDC, and is limited around 2-amperes. `DETAILS PENDING`\n",
    "* Science ports offer both RS-232 and RS-485 interface through Focal fiber-optic converters. The channels limit communication speeds to `DETAIL PENDING`. \n",
    "* Resolution requirements impart a certain control response limit both from the valve itself and the DAC frontend driving the spool. This will be evaluated. \n",
    "* Speed of the final tilting apparatus must be within the range of 0-20-degrees/second (xxx GPM)\n",
    "* Null point drift can often vary with time, temperature and system pressure. However, we want to ensure that the zero-current command truly stops motion. This can be employed through persistent storage on a target controller. \n",
    "* SMD software control enforces implementation of MODBUS protocol, which can be employed on a variety of physical layers, such as RS-232 and RS-485. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Non-Essential Features\n",
    "\n",
    "1. Self contained closed loop control through direct communication with the tilt sensor.\n",
    "*  Sing Science port integration"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Response Time\n",
    "\n",
    "How fast and how slow does the system need to go? There are two operational requirements:\n",
    "\n",
    "1. The system must respond to a rapidly change topography.\n",
    "2. The system must move slowly enough for a uniformly survey. \n",
    "\n",
    "Let's look at each one:\n",
    "\n",
    "### Topography Response\n",
    "\n",
    "To expand this operational scenario informs the design in such a way that the system must be able to sense and tilt the array fast enough that at normal forward survey velocities it can see and register the worst case problem: a flat bottom approaching a vertical wall. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "173.20508075688772"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Assuming the vehicle is moving at its usual survey speed\n",
    "speed_forward = 30 #cm/s\n",
    "altitude = 300 #cm\n",
    "\n",
    "# Also assuming we are using the DVL Beams as the first warning and bottom tracking solution\n",
    "theta_forward = 30 #degrees\n",
    "\n",
    "# What are the ranges of speeds we are interested in? \n",
    "speed_tilt = np.linspace(5,20) #degrees/s\n",
    "\n",
    "# How far out are we seeing as we approach and tilt up at maximum speed\n",
    "look_ahead_distance = altitude * np.tan(np.deg2rad(theta_forward))\n",
    "look_ahead_distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.773502691896257"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# So now how much time is there to stop from there\n",
    "time_to_stop = look_ahead_distance / speed_forward\n",
    "speed_lim = [5,20]\n",
    "time_lim  = [time_to_stop, time_to_stop]\n",
    "time_to_stop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmEAAADTCAYAAADJaMQcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl4ldW5/vHvk3kOCQkECBBAJgUMAioiKFrHWjlSrRarqLU4tNa2x7ba86tTj6eDtnW2tYo41Tqg1lq1OICIooxhUEYZwxgSEpKQkTy/P/YmBkxIgCQ7kPtzXVzZ+93v8PAKm9u11ruWuTsiIiIi0rrCQl2AiIiISHukECYiIiISAgphIiIiIiGgECYiIiISAgphIiIiIiGgECYiIiISAgphIiIiIiGgECYiIiISAgphIiIiIiEQEeoCmiItLc2zsrJCXYaIiIhIo+bPn7/D3dMb2++ICGFZWVnMmzcv1GWIiIiINMrM1jdlP3VHioiIiISAQpiIiIhICLRYCDOzyWa23cyW1tmWbWafmlmOmc0zsxNb6voiIiIibVlLjgmbAjwMPFNn2x+Au9z9bTM7P/j+9BasQURE5KBUVVWRm5tLeXl5qEuRNi4mJobMzEwiIyMP6fgWC2HuPtPMsvbfDCQFXycDm1vq+gdjSW4RT8xaw70XH09UhHpoRUTas9zcXBITE8nKysLMQl2OtFHuTn5+Prm5ufTq1euQztHaT0f+BPiPmd1HoCv0lIZ2NLNJwCSAHj16tGhRK7cV88+czdQ4PHBpNmFh+ksnItJelZeXK4BJo8yMjh07kpeXd8jnaO1mnxuAn7p7d+CnwJMN7ejuj7v7cHcfnp7e6FQbh+XbwzK59bwB/GvRZu5+8wvcvUWvJyIibZsCmDTF4f45ae2WsInAzcHXLwNPtPL1G3TdmN7kFVfw5Ky1pCdG88Oxx4S6JBERETmKtXZL2GbgtODrM4BVrXz9BpkZ/3P+QP4ruyv3/mcFL87dEOqSRESkHcrPzyc7O5vs7GwyMjLo1q1b7ftTTgmM4lm3bh2DBg0CICcnh7feeqvec82YMYPk5GSGDh3KgAEDuOWWW1rt9yGNa7GWMDN7gcCTj2lmlgvcAfwAeMDMIoBygmO+2oqwMOMPFx9Pwe4qbnt1Canx0Zx1bOdQlyUiIu1Ix44dycnJAeDOO+8kISHhgOEpJyeHefPmcf7559f7+ejRo3nzzTcpKytj6NChXHTRRYwaNapFapeD05JPR363gY+GtdQ1m0NURBiPXX4CE574jB/9fQHPfv8kTuyVGuqyREQkBO761+d8sXlXs57z2K5J3PGt4w7p2ISEBEpKSmrfV1ZWcvvtt1NWVsasWbO47bbbuPTSS+s9NjY2luzsbDZt2gRAaWkpN910E0uWLKG6upo777yTcePG8fnnn3P11VdTWVlJTU0NU6dOJTIyknPPPZeTTjqJhQsX0q9fP5555hni4uJ4//33ueWWW6iurmbEiBE89thjREdHk5WVxcSJE/nXv/5FVVUVL7/8MgMGDODDDz/k5psDI5PMjJkzZ5KYmMi9997LSy+9REVFBRdddBF33XXXId2jI4nmY6hHfHQET101gm4psVz79FyWb23ev4AiIiLNISoqirvvvptLL72UnJycBgMYwM6dO1m1ahVjxowB4J577uGMM85g7ty5TJ8+nZ///OeUlpbyl7/8hZtvvrm2hS0zMxOAFStWMGnSJBYvXkxSUhKPPvoo5eXlXHXVVbz44ou1Ye6xxx6rvWZaWhoLFizghhtu4L777gPgvvvu45FHHiEnJ4ePPvqI2NhYpk2bxqpVq5gzZw45OTnMnz+fmTNntuCdaxuOiAW8QyE1PopnrjmRbz/2CRMnz2HqDaeQmRIX6rJERKQVHWqLVVvy0UcfMWTIEFasWMGtt95KRkYGANOmTeONN96oDUfl5eVs2LCBkSNHcs8995Cbm8v48ePp27cvAN27d6/txvze977Hgw8+yFlnnUWvXr3o168fABMnTuSRRx7hJz/5CQDjx48HYNiwYbz66qsAjBo1ip/97GdcfvnljB8/nszMTKZNm8a0adMYOnQoACUlJfsExqOVWsIOIDMljqevOZGyyj1cOXkOBaWVoS5JRETkoIwePZrFixezZMkSHnvssdrxZu7O1KlTycnJIScnhw0bNjBw4EAmTJjAG2+8QWxsLOeccw4ffPAB8PXpGMys0SmdoqOjAQgPD6e6uhqAW2+9lSeeeIKysjJOPvlkli9fjrtz22231dayevVqvv/97zf3rWhzFMIaMSAjiScmjmDTzjKunjKX0orqUJckIiJSKzExkeLi4kb369evH7fddhu///3vATjnnHN46KGHaoPUwoULAVizZg29e/fmxz/+MRdeeCGLFy8GYMOGDcyePRuAF154gVNPPZUBAwawbt06Vq9eDcCzzz7Laaedtv+l9/Hll18yePBgfvnLXzJ8+HCWL1/OOeecw+TJk2vHu23atInt27cfwt04siiENcGJvVJ5eMIJLMkt5IbnF1BZXRPqkkRERAAYO3YsX3zxBdnZ2bz44osH3Pf6669n5syZrF27ll//+tdUVVUxZMgQBg0axK9//WsAXnzxRQYNGkR2djbLly/nyiuvBGDgwIE8/fTTDBkyhIKCAm644QZiYmJ46qmnuOSSSxg8eDBhYWFcf/31B6zh/vvvZ9CgQRx//PHExsZy3nnncfbZZzNhwgRGjhzJ4MGDufjii5sULI90diTMDj98+HCfN29eqMvgxbkb+OXUJZxzXGce+u4JWmdSROQotGzZMgYOHBjqMtqUdevWccEFF7B06dJQl9Lm1Pfnxczmu/vwxo5VijgIl47owR3fOpb/fL6NG5+fT0X1nlCXJCIiIkcohbCDdPWoXvxm3HG8t2w71z87n/IqBTERETm6ZWVlqRWsBSiEHYIrRmbxfxcNZvqKPH7wzDwFMRERETloCmGHaMJJPfjDxUOYtXoH10yZy+5KPTUpIiIiTacQdhi+M7w7f7zkeD5dk8/VT2n6ChEREWk6hbDDNP6ETP58aTbz1u/kqqfmUKIgJiIiIk2gENYMxmV348HLhrJwQyFXPPkZu8qrQl2SiIgcofLz88nOziY7O5uMjAy6detW+/6UU05p9utNmTKFH/3oRwd1zMsvv8zAgQMZO3Zss9dzMOrWfuedd9YuwXT77bfz3nvvNXjcX/7yF5555plWqfFAWmztSDObDFwAbHf3QXW23wT8CKgG/u3uv2ipGlrTN4d0ITzM+NHfF3DFE5/xzDUnkRwXGeqyRETkCNOxY8fapYXuvPNOEhISuOWWW0Jc1b6efPJJHn300SaHsOrqaiIiWm+56rvvvvuAnzc2oWxrack7MgV4GKiNmmY2FhgHDHH3CjPr1ILXb3XnDsrgse8N48bn53P5k5/y7DUnkRIfFeqyRETkUL19K2xd0rznzBgM5/3ukA5NSEigpKSEGTNmcMcdd9C5c2dycnIYP348gwcP5oEHHqCsrIzXX3+dPn36kJeXx/XXX8+GDRuAwGz1exfhrmvjxo2ce+65rF27lgkTJnDHHXcA8Nxzz/Hggw9SWVnJSSedxKOPPso999zDrFmzWLt2LRdeeCG/+c1vuOGGG5g3bx4RERH86U9/YuzYsUyZMoV///vflJeXU1paygcffMC9997LSy+9REVFBRdddBF33XXX12p55513+NWvfsWePXtIS0vj/fffp6CggGuuuYY1a9YQFxfH448/zpAhQxq8T1dddRUXXHABF198MbfeeitvvPEGERERnH322dx33337hNucnByuv/56du/eTZ8+fZg8eTIpKSmcfvrpnHTSSUyfPp3CwkKefPJJRo8efUj/3RrSYiHM3WeaWdZ+m28AfufuFcF9jrqFoc46tjOPXzGc656bz2WPf8pTV4+ga4fYUJclIiJHmUWLFrFs2TJSU1Pp3bs31157LXPmzOGBBx7goYce4v777+fmm2/mpz/9KaeeeiobNmzgnHPOYdmyZV8715w5c1i6dClxcXGMGDGCb37zm8THx/Piiy/y8ccfExkZyY033sjzzz/P7bffzgcffMB9993H8OHD+eMf/wjAkiVLWL58OWeffTYrV64EYPbs2SxevJjU1FSmTZvGqlWrmDNnDu7OhRdeyMyZMxkzZkxtHXl5efzgBz9g5syZ9OrVi4KCAgDuuOMOhg4dyuuvv84HH3zAlVdeWdtaeCAFBQW89tprLF++HDOjsLDwa/tceeWVPPTQQ5x22mncfvvt3HXXXdx///1AoAVvzpw5vPXWW9x1110H7OI8FK3XNhjQDxhtZvcA5cAt7j63vh3NbBIwCaBHjx6tV2EzGDugE09dNYLrnp3P+Ec/4amrRzCwS1KoyxIRkYN1iC1WrWHEiBF06dIFgD59+nD22WcDMHjwYKZPnw7Ae++9xxdffFF7zK5duyguLiYxMXGfc5111ll07NgRgPHjxzNr1iwiIiKYP38+I0aMAKCsrIxOnb7egTVr1ixuuukmAAYMGEDPnj1rQ9hZZ51FamoqANOmTWPatGkMHToUgJKSElatWrVPCPv0008ZM2YMvXr1Aqg9dtasWUydOhWAM844g/z8fIqKihq9R0lJScTExHDttdfyzW9+kwsuuGCfz4uKiigsLKxddHzixIlccskltZ+PHz8egGHDhrFu3bpGr3ewWjuERQApwMnACOAlM+vt9Sxg6e6PA49DYO3IVq2yGYw6Jo2Xrx/J1U/N5Tt/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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# So how long to tilt up to face that? \n",
    "time_to_face = 90 / speed_tilt\n",
    "fig = plt.figure(figsize=(10,3))\n",
    "ax = fig.add_subplot(111)\n",
    "ax.plot(speed_tilt, time_to_face, label='Tilt Response')\n",
    "ax.plot(speed_lim, time_lim, label='Time before collision')\n",
    "plt.xlabel('Tilt Speed (deg/s)')\n",
    "plt.ylabel('Time of Response (s)')\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Uniform Survey\n",
    "\n",
    "The slowest data aggregation tool along track is the multibeam, which usually surveys with 5-cm cross-track spacing at a scan rate of 5-Hz, let's understand how slow we need to tilt at a steady rate to acheive the same along-track spacing, assuming the ROV is stopped and we are surveying a feature with 3-m curved profile. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.77464829275686"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Determine the scan speed for this arc to move through 5-cm at 5-Hz\n",
    "along_track_resolution = 5 #cm\n",
    "ping_rate = 5 #hertz\n",
    "arc_length_bt_pings = along_track_resolution\n",
    "theta = np.rad2deg(arc_length_bt_pings/altitude) # degrees of motion in subtended arc\n",
    "max_tilt_speed = theta *ping_rate # degrees/sec\n",
    "max_tilt_speed # max tilt speed for multibeam to have 5-cm along-track resolution"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Selecting Hardware for COTS Solutions\n",
    "\n",
    "The below response curve helps establish the upper response of the amplifier and any DAC's in the system:\n",
    "\n",
    "![30 Series Frequency Response](files/30-series-response-plot.png)\n",
    "\n",
    "If we are using the [Moog G123-825](https://www.moog.com/products/servovalves-servo-proportional-valves/industrial/valve-accessories/din-rail-modules/g123-825-buffer-amplifier.html) servo amplifier, its corner filter on the input is set in steps of `7, 16, 34, 72, & 723 Hz, ±10%` So we are looking for a PLC module that can supply either 4-20mA drive or ±10V and can update around 100Hz. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PLC Modules\n",
    "\n",
    "1. [Adam-4024] (https://buy.advantech-bb.com/I-O/Serial-I-O/model-ADAM-4024-B1E.htm)\n",
    "    *  RS-485 (Max baud 38.4)\n",
    "    *  Compact (60x125x25)\n",
    "    *  Only frequency response published is a output slope setting of 0.124 mA/sec\n",
    "    *  This limits to 62Hz for 1mA oscillations, and 3.8Hz for full range oscillations. \n",
    "    *  Cost $309\n",
    " \n",
    "    \n",
    "3. [DGH D4000](https://www.dghcorp.com/datasheets/dgh_d34.pdf)\n",
    "    * RS-232/485\n",
    "    * Compact (91x64x28)\n",
    "    * Similar controls to the 4024, but single channel\n",
    "    * Cost $275\n",
    "    \n",
    "    \n",
    "2. [CLICK PLCs] (https://www.automationdirect.com/clickplcs)\n",
    "    *  [C0-02DD1-D](https://cdn.automationdirect.com/static/specs/single/c002dd1d_sf.pdf): Has required bits, and another analog output card could expand for proportional valve control.\n",
    "    * Dual serial port means one port could talk through vehicle, and another could parse data from the level sensor\n",
    "    * Low cost (<200$)\n",
    "    * More channels easily [c004da1](https://cdn.automationdirect.com/static/specs/c004da1.pdf)\n",
    "    * About the size of a wago\n",
    "\n",
    "3. WAGO\n",
    "    * Comparable to CLICK, likely better quality\n",
    "    * 3x the price\n",
    "    * larger\n",
    "4. Microprocessor\n",
    "    * implement an i2c 4-20mA current transmitter with a micro to provide a similar unit to the DGH module, plugged into a micro like an arduino, tiny and cost <150$, but not worth it. \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.875"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Calculate the full swing\n",
    "(((16)*2/0.124)/1000)**-1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Next\n",
    "\n",
    "Looks like all of the available solutions are rate limited and likely just expensive enough to warrant a custom design. Let's look into that in the next page:\n",
    "\n",
    "*  [Custom Design Notes](./Custom%20Design.ipynb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
