summaryrefslogtreecommitdiff
path: root/CodesArduino-for-plugin/TwoRelay/OSP.h
diff options
context:
space:
mode:
Diffstat (limited to 'CodesArduino-for-plugin/TwoRelay/OSP.h')
-rw-r--r--CodesArduino-for-plugin/TwoRelay/OSP.h234
1 files changed, 234 insertions, 0 deletions
diff --git a/CodesArduino-for-plugin/TwoRelay/OSP.h b/CodesArduino-for-plugin/TwoRelay/OSP.h
new file mode 100644
index 0000000..12dd770
--- /dev/null
+++ b/CodesArduino-for-plugin/TwoRelay/OSP.h
@@ -0,0 +1,234 @@
+#ifndef OSP_h
+#define OSP_h
+#include <math.h>
+#include <string.h>
+
+ /**
+ * \brief Class that manages movements and the laser of the device
+ *
+ * Uses the stepper motors and sensors to positioning the device at a given horizontal coordinates,
+ * within a range of 360º degrees in horizontal, and 180º on vertical.
+ * To the movements uses the DDA algorithm (Digital Differential Algorithm).
+ */
+
+class OSP{
+ public:
+ int delayValue;
+ int step1, dir1, enable1, step2, dir2, enable2;
+ int stepx, stepy;
+ int low;
+ int high;
+ int stopper;
+ float degsH;
+ float degsV;
+
+ /**
+ * Pins to control the stepper motors
+ */
+
+ /**
+ * Steps per degree on each axis
+ */
+ float _pgrad_x, _pgrad_y;
+
+ /**
+ * Current position of each axis (in radians)
+ */
+ float _rx, _ry;
+
+ /**
+ * Auxiliary variables, maximum theoric values, and steps per revolution respectively
+ */
+ int _x, _y, _X, _Y, _pv_x, _pv_y;
+
+ /**
+ * Theoric central values of each axis
+ */
+ int _revx, _topy;
+
+ /**
+ * Indicates if X axis has been "reverted" (Y is between 90º and 180º)
+ */
+ bool _x_rev;
+
+ /**
+ * Sensor pins
+ */
+ int _s0Pin_x, _s360Pin_x, _sbottomPin_y, _stopPin_y;
+
+ /**
+ * Transforms radian to degrees
+ *
+ * \param rad Radians
+ * \return degrees
+ */
+ float _rad2deg(float rad);
+
+ /**
+ * Degrees to radians
+ *
+ * \param deg Degrees
+ * \return radians
+ */
+ float _deg2rad(float deg);
+
+ /**
+ * Moves one of the motors a given number of steps
+ *
+ * \param axis Pin of the motor to move
+ * \param dir Direction: True means clockwise direction on X, and upwards on Y
+ * \param steps Number of steps (if limit sensor is not reached)
+ * \param sensor Pin of the sensor that can be reached towards that direction
+ * \param nodelay Skip the initial delay (useful to DDA algorithm)
+ * \return Number of steps (distinct of the steps parameter if the sensor has been reached)
+ */
+ //int _step(int axis, bool dir, int steps, int sensor, bool nodelay=false);
+
+ /**
+ * Enables the motors power supply
+ */
+ void _enableMotors();
+
+ /**
+ * Disables the motors power supply
+ */
+ void _disableMotors();
+
+ /**
+ * Moves the device to the given position
+ *
+ * \param x Number of steps from 0 to the desired position on X axis
+ * \param y Number of steps from 0 to the desired position on Y axis
+ * \param method Algorithm selection: DDA or XY (first X axis, then Y), by default is DDA
+ */
+ void _moveTo(float x, float y, char* method = "DDA");
+
+ /**
+ * Moves the device to the given position, first X axis and then Y axis
+ *
+ * \param x Number of steps from 0 to the desired position on X axis
+ * \param y Number of steps from 0 to the desired position on Y axis
+ * \param nodelay Omits the delay on changes of axis or direction
+ */
+ void _moveXY(int x, int y, bool nodelay=false);
+
+ /**
+ * Moves the device to the given position using DDA algorithm
+ *
+ * \param x Number of steps from 0 to the desired position on X axis
+ * \param y Number of steps from 0 to the desired position on Y axis
+ */
+ void _moveDDA(int x, int y);
+ //void _moveDDA(int x, int y, float dirx, float diry);
+
+ public:
+ /**
+ * Class constructor
+ */
+ OSP();
+
+ /**
+ * Initializes the device
+ *
+ * Along the process obtains the number of steps on each axis, and calculates the steps
+ * per degree for positioning
+ */
+ void init();
+
+ /**
+ * Returns current position on X axis
+ *
+ * \return X position as radians
+ */
+ float getX();
+
+ /**
+ * Returns current position on Y axis
+ *
+ * \return Y position as radians
+ */
+ float getY();
+
+ /**
+ * Return the number of steps per revolution of the X axis
+ *
+ * \return Steps per revolution
+ */
+ int getPX();
+
+ /**
+ * Number of steps from 0º to current position on X axis
+ *
+ * \return Current position on X
+ */
+ int getPx();
+
+ /**
+ * Return the number of steps per revolution of the Y axis
+ *
+ * \return Steps per revolution
+ */
+ int getPY();
+
+ /**
+ * Number of steps from 0º to current position on Y axis
+ *
+ * \return Current position on Y
+ */
+ int getPy();
+
+ /**
+ * Sets the pins to control the stepper motors
+ *
+ * \param stPin_x Pin to move the X axis
+ * \param stPin_y Pin to move the Y axis
+ * \param dirPin Direction: True means clockwise direction on X axis, and downwards on Y
+ * \param enable_x Turn On/Off power supply on X axis motor
+ * \param enable_y Turn On/Off power supply on Y axis motor
+ *
+ */
+
+void setMotorsPins(int step1, int dir1, int enable1, int step2, int dir2, int enable2);
+
+
+ /**
+ * Sets the pins connected to the sensors
+ *
+ * \param s0Pin_x Pin for the 0º limit sensor on X axis
+ * \param s360Pin_x Pir for the 360º limit sensor on X axis
+ * \param sbottomPin_y Pin for the 0º limit sensor on Y axis
+ * \param stopPin_y Sensor for the 90º limit sensor on Y axis
+ */
+ void setSensorsPins(int s0Pin_x, int s360Pin_x, int sbottomPin_y, int stopPin_y);
+
+ /**
+ * Points the device towards the given coordinates
+ *
+ * \param rx Radians for the X axis, on range of 0 - 2*Pi
+ * \param ry Radians for the Y axis: on range of 0 - Pi
+ */
+ void goToRads(float rx, float ry);
+
+ /**
+ * Accelerated movement for X axis
+ *
+ * The movement stops when a 'stop' command is received by the serial port
+ *
+ * \param dir Direction: True means clockwise direction
+ * \return Returns true in case of reaches a limit sensor
+ */
+
+ bool movx(bool dir, int step1, int dir1);
+ /**
+ * Accelerated movement for Y axis
+ *
+ * The movement stops when a 'stop' command is received by the serial port
+ *
+ * \param dir Direction: True means upwards
+ * \return Returns true in case of reaches a limit sensor
+ */
+
+ bool movy(bool dir, int step2, int dir2);
+ void OSP::_moveEqua(int x, int y);
+ };
+#endif