Template for LPC1768

Dependencies:   Gimbal MLX90620 Socket lwip-eth lwip-sys lwip mbed-rtos mbed

Fork of EkkoEye by EkkoSense

CGimbal.cpp

Committer:
Mike
Date:
2016-04-14
Revision:
53:72f350a6d09c

File content as of revision 53:72f350a6d09c:

/*
 * 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;

}