Compare commits

...

7 commits

5 changed files with 35 additions and 100 deletions

View file

@ -5,6 +5,9 @@ Code de la tourelle de pointage laser du projet bouchons EDF.
> [!WARNING]
> Code de debuggage uniquement.
> [!IMPORTANT]
> Nouvelle méca, les axes H/x et V/y sont découplés.
# Usage
Compile through Arduino IDE or equivalent.

View file

@ -14,15 +14,15 @@
#define PIN_PD2 (2)
#define PIN_MOSI (11)
#define PIN_X_PULSE (PIN_PB0)
#define PIN_X_ENABLE (PIN_PD6)
#define PIN_X_DIRECTION (PIN_PD7)
#define PIN_X_HOME (PIN_PD3)
#define PIN_Y_PULSE (PIN_PB0)
#define PIN_Y_ENABLE (PIN_PD6)
#define PIN_Y_DIRECTION (PIN_PD7)
#define PIN_Y_HOME (PIN_PD3)
#define PIN_Y_PULSE (PIN_PB2)
#define PIN_Y_ENABLE (PIN_PB1)
#define PIN_Y_DIRECTION (PIN_MOSI)
#define PIN_Y_HOME (PIN_PD4)
#define PIN_X_PULSE (PIN_PB2)
#define PIN_X_ENABLE (PIN_PB1)
#define PIN_X_DIRECTION (PIN_MOSI)
#define PIN_X_HOME (PIN_PD4)
#define PIN_LASER (PIN_PD2)

View file

@ -1,24 +1,16 @@
#include "math.h"
// rollH atan((22.5 - 18.5) / 236) ~0.97°
// rollV ~1°
double degToRad(double deg) { return deg * M_PI / 180.0; }
double radToDeg(double rad) { return rad * 180.0 / M_PI; }
void angleToStep(long &stepX, long &stepY, double angleX, double angleY) {
// TODO remove magic numbers
double stepRatioX = M_PI / ((51.2 / 15.0) * (100.0 * 64.0));
double stepRatioY = M_PI / ((48.0 / 15.0) * (100.0 * 64.0));
double stepRatioX = 6000 / M_PI;
double stepRatioY = 6500 / M_PI;
stepX = angleX / stepRatioX;
stepY = angleY / stepRatioY;
}
double rollCorrection(double x, double max, double width) {
double correction = max * (1.0 - cos((10.0 * x) / (width * M_PI))) / 2.0;
return x - correction;
stepX = angleX * stepRatioX;
stepY = angleY * stepRatioY;
}
void cartesianToPolar(long &stepX, long &stepY, double zeroX, double zeroY,
@ -28,21 +20,14 @@ void cartesianToPolar(long &stepX, long &stepY, double zeroX, double zeroY,
double offsetY = 21.0; // laser to stand
double offsetX = 0.0; // unused
x = -x; // natural axis direction
// x = -x; // natural axis direction
y = -y; // natural axis direction
double dX = x + offsetX;
double dY = rollCorrection(y + offsetY, 0.2, 400.0);
double dY = y + offsetY;
double dZ = z + distance;
double roll = atan2(4.0, 236.0);
double rollY = dX * tan(roll);
double rollX = dY * tan(roll);
double dXr = dX + rollX;
double dYr = dY + rollY;
double rho = sqrt(pow(dXr, 2.0) + pow(dYr, 2.0) + pow(dZ, 2.0));
double angleY = M_PI / 2.0 - acos(dYr / rho);
double angleX = atan2(dXr, dZ);
double angleY = atan2(dZ, dY) - M_PI / 2;
double angleX = atan2(dZ, dX) - M_PI / 2;
angleToStep(stepX, stepY, angleX, angleY);
}

View file

@ -74,8 +74,8 @@ Turret &Turret::gotoHome() {
Turret &Turret::gotoZero() {
// TODO remove magic numbers
_stepperX.prepareMove(_homeX + 9300);
_stepperY.prepareMove(_homeY + 3500);
_stepperX.prepareMove(_homeX + 0);
_stepperY.prepareMove(_homeY + 2500);
bool xStop = false;
bool yStop = false;

View file

@ -10,8 +10,7 @@ void setup() {
Serial.begin(BAUDRATE);
turret.laserOn().calibrate();
turret.moveTo(0, 0, 0);
turret.laserOn().calibrate().moveTo(0, 0, 0);
delay(5000);
// test pointage
@ -20,74 +19,22 @@ void setup() {
int panelHCount = 3;
int panelVCount = 2;
// double zeroOffsetV = -31.5;
double zeroOffsetV = -20.8;
// double zeroOffsetH = -184.5;
double zeroOffsetH = -195.5;
double zeroOffsetV = -21;
double zeroOffsetH = -163;
// double zeroOffsetH = -147;
// Test constant step h,v
Serial.println("Start demo_0");
for (int i = 0; i < 20; i++) {
Serial.print("> ");
Serial.println(i);
for (double step = -198.5; step < 176.0; step += 10) {
Serial.print("[step]: ");
Serial.println(step);
turret.moveTo(step, 87, 0);
// turret.moveBy(20.0, 0.0, 0.0);
delay(500);
}
for (double step = 0; step < 200.0; step += 10) {
Serial.print("[step]: ");
Serial.println(step);
turret.moveTo(0, step, 0);
// turret.moveBy(20.0, 0.0, 0.0);
delay(500);
}
delay(5000);
turret.moveTo(0, 0, 0);
for (double step = 0; step < 160; step += 10) {
Serial.print("[step]: ");
Serial.println(step);
turret.moveTo(step, 0, 0);
delay(5000);
}
// Test rollX
turret.moveTo(0 * panelWidth + zeroOffsetH, 0, 0);
delay(5000);
turret.moveTo((panelHCount * panelWidth) / 2 + zeroOffsetH, 0, 0);
delay(5000);
turret.moveTo(panelHCount * panelWidth + zeroOffsetH, 0, 0);
delay(5000);
turret.gotoZero();
// Test rollY
turret.moveTo(0, 0 * panelHeight + zeroOffsetV, 0);
delay(5000);
turret.moveTo(0, (panelVCount * panelHeight) / 2 + zeroOffsetV, 0);
delay(5000);
turret.moveTo(0, panelVCount * panelHeight + zeroOffsetV, 0);
delay(5000);
turret.gotoZero();
// Test align to panels
for (double panelH = 0; panelH < panelHCount + 1; panelH += 0.5) {
for (double panelV = 0; panelV < panelVCount + 1; panelV += 0.5) {
double x = panelH * panelWidth + zeroOffsetH;
double y = panelV * panelHeight + zeroOffsetV;
double z = 0;
Serial.print("Goto (x, y, z) => (");
Serial.print(x);
Serial.print(", ");
Serial.print(y);
Serial.print(", ");
Serial.print(z);
Serial.println(")");
turret.moveTo(x, y, z);
delay(2000);
}
for (double step = 0; step > -160; step -= 10) {
Serial.print("[step]: ");
Serial.println(step);
turret.moveTo(step, 0, 0);
delay(5000);
}
turret.gotoZero();