Template for LPC1768
Dependencies: Gimbal MLX90620 Socket lwip-eth lwip-sys lwip mbed-rtos mbed
Fork of EkkoEye by
Diff: CGimbal.cpp
- Revision:
- 53:72f350a6d09c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CGimbal.cpp Thu Apr 14 13:45:38 2016 +0100 @@ -0,0 +1,210 @@ +/* + * CGimbal.cpp + * + * Created on: 15 Feb 2016 + * Author: mike + */ +#include "base.h" +#include <CGimbal.h> +#include <math.h> +int debug = 0; + +extern Serial pc; + +/* + * The way-points required when performing a sweep of the room, moves from Home to a mid-point of the left-most x,y coords + * Then moves at 60 degree increments to the right-most position + * Then moves down at 15 degree increments + * Uses meander-scan technique rather than raster-scan to reduce motor loading and risk of skipping steps + */ +static const float ScanArray[36][2] = +{ + {30, 7.5}, {90, 7.5}, {150, 7.5}, {150, 22.5}, {90, 22.5}, {30, 22.5}, + {30, 37.5}, {90, 37.5}, {150, 37.5}, {150, 52.5}, {90, 52.5}, {30, 52.5}, + {30, 67.5}, {90, 67.5}, {150, 67.5}, {150, 82.5}, {90, 82.5}, {30, 82.5}, + {30, 97.5}, {90, 97.5}, {150, 97.5}, {150, 112.5}, {90, 112.5}, {30, 112.5}, + {30, 127.5}, {90, 127.5}, {150, 127.5}, {150, 142.5}, {90, 142.5}, {30, 142.5}, + {30, 157.5}, {90, 157.5}, {150, 157.5}, {150, 172.5}, {90, 172.5}, {30, 172.5} +}; + + + +CGimbal::CGimbal(DigitalOut * pXStepPin, DigitalOut * pXDirPin, DigitalOut * pYStepPin, DigitalOut * pYDirPin) +{ + // Zero the tracking parameters + + m_StepInterval = DFT_STEP_INTERVAL; // Determines the default motor speed (10us Ticks between each step pulse) + m_AbsoluteXPos = 0; // Always starts at 0 point + m_AbsoluteXAngle = 0.0; // Ditto + m_AbsoluteYPos = 0; + m_AbsoluteYAngle = 0.0; + m_xDir = FORWARD; // Always initialised in forward direction + m_yDir = FORWARD; // Ditto + + m_xSteps=0; // Nothing to do immediately after being constructed + m_ySteps=0; + + m_pXStepPin = pXStepPin; // Initialise Pointers to each pin + m_pXDirPin = pXDirPin; + m_pYStepPin = pYStepPin; + m_pYDirPin = pYDirPin; + + m_pXStepPin->write(0); // Set all motor driver signals to a known state (LOW) + m_pXDirPin->write(0); + m_pYStepPin->write(0); + m_pYDirPin->write(0); + + m_NumWaypoints = 2; // Start with 2 waypoints + + m_TickCount=0; // Start at 0 +} + +// Destructor +CGimbal::~CGimbal() +{ + +} + +/* + * Perform a vectored move, relative to the current x,y position and update internal tracking parameters + */ +int CGimbal::MoveRel() +{ + + if (m_xSteps > 0) // Determine which direction the motors needs to move + m_xDir = FORWARD; + else + m_xDir = REVERSE; + if (m_ySteps > 0) + m_yDir = 1; + else + m_yDir = 0; + m_pXDirPin->write(m_xDir); + m_pYDirPin->write(m_yDir); + + if (m_xSteps > 0) // Absolute number of pulses is always positive regardless of directiong + m_xPulses = m_xSteps; + else + if ((m_xSteps < 0)) + m_xPulses = -m_xSteps; + else + m_xPulses = 0; // If no steps, do nothing + + if (m_ySteps > 0) // Absolute number of pulses is always positive regardless of directiong + m_yPulses = m_ySteps; + else + if ((m_ySteps < 0)) + m_yPulses = -m_ySteps; + else + m_yPulses = 0; // If no steps, do nothing + + // Wait for the Ticker to complete this move + while (m_xPulses > 0 || m_yPulses > 0); + + m_AbsoluteXPos += m_xSteps; // Track the new absolute x position + m_AbsoluteYPos += m_ySteps; // Track the new absolute y position + m_AbsoluteXAngle = (float) ( (float) m_AbsoluteXPos * DEGREES_PER_STEP); // Track the new absolute x angle + m_AbsoluteYAngle = (float) ( (float) m_AbsoluteYPos * DEGREES_PER_STEP); // Track the new absolute y angle + + return(0); + +} + +/* + * Work through the pre-defined tour points to conduct a sweep of the scene in 3 60-degree steps by 12 15-degree steps + * Uses a meander-scan rather than raster-scan technique to reduce motor loading + * Covers a total scene angle of 180 x 180 (Presently, some points may be occluded by the gimbal housing) + */ +void CGimbal::MeanderScan(void) +{ + int i; + + for (i=0; i<36; i++) + { + RotateAbs(ScanArray[i][X_AXIS], ScanArray[i][Y_AXIS] ); + } +} + +/* + * Move to absolute x,y position in steps + */ +int CGimbal::MoveAbs(float x, float y) +{ + m_xSteps = x - m_AbsoluteXPos; + m_ySteps = y - m_AbsoluteYPos; + + MoveRel(); + + return(0); +} + +/* + * Move to absolute x,y angle in degrees + */ +int CGimbal::RotateAbs(float xAngle, float yAngle) +{ + m_xSteps = (float) ((float) ((xAngle - m_AbsoluteXAngle) / (float) DEGREES_PER_STEP)); + m_ySteps = (float) ((float) ((yAngle - m_AbsoluteYAngle) / (float) DEGREES_PER_STEP)); + + MoveRel(); + + return(0); +} + +/* + * Calculate how far away from the home position + * Then move there. Note speed is reduced during homing + */ +void CGimbal::Home(void) +{ + int oldSpeed = m_StepInterval; + + m_StepInterval = HOME_STEP_INTERVAL; + + m_xSteps = -m_AbsoluteXPos; + m_ySteps = -m_AbsoluteYPos; + MoveRel(); + + m_StepInterval = oldSpeed; + +} + +/* + * Rotate to waypoint n. x,y angle parameters are stored in the member array + */ +int CGimbal::TourPoint(int n) +{ + RotateAbs(m_TourPoints[X_AXIS][n], m_TourPoints[Y_AXIS][n]); + return(0); +} + +/* + * Define the current point as the home reference + */ +void CGimbal::Zero(void) +{ + int oldSpeed = m_StepInterval; + int timeout = 0; + + + // Move at normal speed until 20 steps away from opto switch + m_xSteps = (-m_AbsoluteXPos) - 20; + m_ySteps = (-m_AbsoluteYPos) -20; + MoveRel(); + + // Now move at Homing (slow) speed until X opto reached + m_StepInterval = HOME_STEP_INTERVAL; + + for (timeout = 0; timeout < 10; timeout++) + { + + } + // Move at normal speed until 20 steps away from opto switch + //m_xSteps = -(sgn(m_AbsoluteXPos) - 20); + + + m_StepInterval = oldSpeed; + +} + +