more kinematics
This commit is contained in:
+45
-34
@@ -77,6 +77,20 @@ void performHomingAll();
|
|||||||
void performHoming1();
|
void performHoming1();
|
||||||
void performHoming2();
|
void performHoming2();
|
||||||
|
|
||||||
|
// ─── Homing Routines ──────────────────────────────────────────────
|
||||||
|
|
||||||
|
void runSteppersWithNotify() {
|
||||||
|
stepper1.run();
|
||||||
|
stepper2.run();
|
||||||
|
if (bleConnected) {
|
||||||
|
unsigned long now = millis();
|
||||||
|
if (now - lastNotify >= NOTIFY_INTERVAL_MS) {
|
||||||
|
lastNotify = now;
|
||||||
|
sendPosition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ─── BLE Server Callbacks ─────────────────────────────────────────
|
// ─── BLE Server Callbacks ─────────────────────────────────────────
|
||||||
class ServerCallbacks : public BLEServerCallbacks {
|
class ServerCallbacks : public BLEServerCallbacks {
|
||||||
void onConnect(BLEServer *) override {
|
void onConnect(BLEServer *) override {
|
||||||
@@ -247,34 +261,31 @@ void loop() {
|
|||||||
|
|
||||||
void performHomingAll() {
|
void performHomingAll() {
|
||||||
// 1. Move against limits (M1 CCW, M2 CCW)
|
// 1. Move against limits (M1 CCW, M2 CCW)
|
||||||
stepper2.moveTo(1024);
|
stepper1.moveTo(1024);
|
||||||
stepper1.moveTo(2048);
|
stepper2.moveTo(2048);
|
||||||
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
|
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
|
||||||
stepper1.run();
|
runSteppersWithNotify();
|
||||||
stepper2.run();
|
|
||||||
}
|
|
||||||
stepper1.setCurrentPosition(0);
|
|
||||||
|
|
||||||
// 2. Move to negative limits (CW)
|
|
||||||
stepper2.moveTo(-1050);
|
|
||||||
stepper1.move(-1300); // equivalent to moveTo(-1300) since pos is 0
|
|
||||||
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
|
|
||||||
stepper1.run();
|
|
||||||
stepper2.run();
|
|
||||||
}
|
}
|
||||||
stepper2.setCurrentPosition(0);
|
stepper2.setCurrentPosition(0);
|
||||||
|
|
||||||
// 3. Move to final home position
|
// 2. Move to negative limits (CW)
|
||||||
stepper2.moveTo(550);
|
stepper1.moveTo(-1050);
|
||||||
stepper1.moveTo(-530);
|
stepper2.move(-1300);
|
||||||
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
|
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
|
||||||
stepper1.run();
|
runSteppersWithNotify();
|
||||||
stepper2.run();
|
}
|
||||||
|
stepper1.setCurrentPosition(0);
|
||||||
|
|
||||||
|
// 3. Move to final home position
|
||||||
|
stepper1.moveTo(550);
|
||||||
|
stepper2.moveTo(-530);
|
||||||
|
while (stepper1.distanceToGo() != 0 || stepper2.distanceToGo() != 0) {
|
||||||
|
runSteppersWithNotify();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Set origin relative to this final position
|
// 4. Set origin relative to this final position
|
||||||
stepper2.setCurrentPosition(-1024);
|
stepper1.setCurrentPosition(-1024);
|
||||||
stepper1.setCurrentPosition(0);
|
stepper2.setCurrentPosition(0);
|
||||||
|
|
||||||
stepper1.disableOutputs();
|
stepper1.disableOutputs();
|
||||||
stepper2.disableOutputs();
|
stepper2.disableOutputs();
|
||||||
@@ -282,37 +293,37 @@ void performHomingAll() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void performHoming1() {
|
void performHoming1() {
|
||||||
// M1 (Right) stalls going positive (CCW)
|
// M1 (Left) stalls going negative (CW)
|
||||||
stepper1.move(2048);
|
stepper1.move(-2048);
|
||||||
while (stepper1.distanceToGo() != 0) {
|
while (stepper1.distanceToGo() != 0) {
|
||||||
stepper1.run();
|
runSteppersWithNotify();
|
||||||
}
|
}
|
||||||
stepper1.setCurrentPosition(0);
|
stepper1.setCurrentPosition(0);
|
||||||
|
|
||||||
// Move to final home position (CW)
|
// Move to final home position (CCW)
|
||||||
stepper1.moveTo(-530);
|
stepper1.moveTo(550);
|
||||||
while (stepper1.distanceToGo() != 0) {
|
while (stepper1.distanceToGo() != 0) {
|
||||||
stepper1.run();
|
runSteppersWithNotify();
|
||||||
}
|
}
|
||||||
stepper1.setCurrentPosition(0);
|
stepper1.setCurrentPosition(-1024);
|
||||||
stepper1.disableOutputs();
|
stepper1.disableOutputs();
|
||||||
Serial.println("[S1] Homing complete.");
|
Serial.println("[S1] Homing complete.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void performHoming2() {
|
void performHoming2() {
|
||||||
// M2 (Left) stalls going negative (CW)
|
// M2 (Right) stalls going positive (CCW)
|
||||||
stepper2.move(-2048);
|
stepper2.move(2048);
|
||||||
while (stepper2.distanceToGo() != 0) {
|
while (stepper2.distanceToGo() != 0) {
|
||||||
stepper2.run();
|
runSteppersWithNotify();
|
||||||
}
|
}
|
||||||
stepper2.setCurrentPosition(0);
|
stepper2.setCurrentPosition(0);
|
||||||
|
|
||||||
// Move to final home position (CCW)
|
// Move to final home position (CW)
|
||||||
stepper2.moveTo(550);
|
stepper2.moveTo(-530);
|
||||||
while (stepper2.distanceToGo() != 0) {
|
while (stepper2.distanceToGo() != 0) {
|
||||||
stepper2.run();
|
runSteppersWithNotify();
|
||||||
}
|
}
|
||||||
stepper2.setCurrentPosition(-1024);
|
stepper2.setCurrentPosition(0);
|
||||||
stepper2.disableOutputs();
|
stepper2.disableOutputs();
|
||||||
Serial.println("[S2] Homing complete.");
|
Serial.println("[S2] Homing complete.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -282,11 +282,6 @@ async function executeMove(spot) {
|
|||||||
const delta1 = newSteps1 - steps1;
|
const delta1 = newSteps1 - steps1;
|
||||||
const delta2 = newSteps2 - steps2;
|
const delta2 = newSteps2 - steps2;
|
||||||
|
|
||||||
steps1 = newSteps1;
|
|
||||||
steps2 = newSteps2;
|
|
||||||
saveSteps();
|
|
||||||
updatePositionReadout();
|
|
||||||
|
|
||||||
const cmd1 = `S1${delta1 >= 0 ? '+' : ''}${delta1}`;
|
const cmd1 = `S1${delta1 >= 0 ? '+' : ''}${delta1}`;
|
||||||
const cmd2 = `S2${delta2 >= 0 ? '+' : ''}${delta2}`;
|
const cmd2 = `S2${delta2 >= 0 ? '+' : ''}${delta2}`;
|
||||||
|
|
||||||
@@ -300,6 +295,10 @@ async function executeMove(spot) {
|
|||||||
UI.log(`BLE error: ${e.message}`, 'error');
|
UI.log(`BLE error: ${e.message}`, 'error');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
steps1 = newSteps1;
|
||||||
|
steps2 = newSteps2;
|
||||||
|
saveSteps();
|
||||||
|
updatePositionReadout();
|
||||||
const simMsg = `[sim] ${cmd1} ${cmd2}`;
|
const simMsg = `[sim] ${cmd1} ${cmd2}`;
|
||||||
console.log(simMsg);
|
console.log(simMsg);
|
||||||
UI.log(simMsg, 'info');
|
UI.log(simMsg, 'info');
|
||||||
@@ -359,11 +358,6 @@ export default {
|
|||||||
isHomed = true;
|
isHomed = true;
|
||||||
localStorage.setItem('wiji_homed', 'true');
|
localStorage.setItem('wiji_homed', 'true');
|
||||||
updateHomingUI();
|
updateHomingUI();
|
||||||
|
|
||||||
steps1 = IK.ARM.HOME_STEPS.m1;
|
|
||||||
steps2 = IK.ARM.HOME_STEPS.m2;
|
|
||||||
saveSteps();
|
|
||||||
updatePositionReadout();
|
|
||||||
|
|
||||||
UI.log('Homing all motors...', 'info');
|
UI.log('Homing all motors...', 'info');
|
||||||
if (BLE.isConnected()) {
|
if (BLE.isConnected()) {
|
||||||
@@ -373,6 +367,10 @@ export default {
|
|||||||
UI.log(e.message, 'error');
|
UI.log(e.message, 'error');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
steps1 = IK.ARM.HOME_STEPS.m1;
|
||||||
|
steps2 = IK.ARM.HOME_STEPS.m2;
|
||||||
|
saveSteps();
|
||||||
|
updatePositionReadout();
|
||||||
UI.log('[sim] HOMEALL', 'info');
|
UI.log('[sim] HOMEALL', 'info');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -280,11 +280,6 @@ async function executeMove(spot) {
|
|||||||
const delta1 = newSteps1 - steps1;
|
const delta1 = newSteps1 - steps1;
|
||||||
const delta2 = newSteps2 - steps2;
|
const delta2 = newSteps2 - steps2;
|
||||||
|
|
||||||
steps1 = newSteps1;
|
|
||||||
steps2 = newSteps2;
|
|
||||||
saveSteps();
|
|
||||||
updatePosMarker();
|
|
||||||
|
|
||||||
const cmd1 = `S1${delta1 >= 0 ? '+' : ''}${delta1}`;
|
const cmd1 = `S1${delta1 >= 0 ? '+' : ''}${delta1}`;
|
||||||
const cmd2 = `S2${delta2 >= 0 ? '+' : ''}${delta2}`;
|
const cmd2 = `S2${delta2 >= 0 ? '+' : ''}${delta2}`;
|
||||||
|
|
||||||
@@ -299,6 +294,10 @@ async function executeMove(spot) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
steps1 = newSteps1;
|
||||||
|
steps2 = newSteps2;
|
||||||
|
saveSteps();
|
||||||
|
updatePosMarker();
|
||||||
console.log(`[sim] ${cmd1} ${cmd2}`);
|
console.log(`[sim] ${cmd1} ${cmd2}`);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -404,11 +403,6 @@ export default {
|
|||||||
isHomed = true;
|
isHomed = true;
|
||||||
localStorage.setItem('wiji_homed', 'true');
|
localStorage.setItem('wiji_homed', 'true');
|
||||||
updateHomingUI();
|
updateHomingUI();
|
||||||
|
|
||||||
steps1 = IK.ARM.HOME_STEPS.m1;
|
|
||||||
steps2 = IK.ARM.HOME_STEPS.m2;
|
|
||||||
saveSteps();
|
|
||||||
updatePosMarker();
|
|
||||||
|
|
||||||
UI.log('Homing all motors...', 'info');
|
UI.log('Homing all motors...', 'info');
|
||||||
if (BLE.isConnected()) {
|
if (BLE.isConnected()) {
|
||||||
@@ -418,6 +412,10 @@ export default {
|
|||||||
UI.log(e.message, 'error');
|
UI.log(e.message, 'error');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
steps1 = IK.ARM.HOME_STEPS.m1;
|
||||||
|
steps2 = IK.ARM.HOME_STEPS.m2;
|
||||||
|
saveSteps();
|
||||||
|
updatePosMarker();
|
||||||
UI.log('[sim] HOMEALL', 'info');
|
UI.log('[sim] HOMEALL', 'info');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -690,11 +690,6 @@ export default {
|
|||||||
isHomed = true;
|
isHomed = true;
|
||||||
localStorage.setItem('wiji_homed', 'true');
|
localStorage.setItem('wiji_homed', 'true');
|
||||||
updateHomingUI();
|
updateHomingUI();
|
||||||
|
|
||||||
steps1 = IK.ARM.HOME_STEPS.m1;
|
|
||||||
steps2 = IK.ARM.HOME_STEPS.m2;
|
|
||||||
saveSteps();
|
|
||||||
updatePositionReadout();
|
|
||||||
|
|
||||||
UI.log('Homing all motors...', 'info');
|
UI.log('Homing all motors...', 'info');
|
||||||
if (BLE.isConnected()) {
|
if (BLE.isConnected()) {
|
||||||
@@ -704,6 +699,10 @@ export default {
|
|||||||
UI.log(e.message, 'error');
|
UI.log(e.message, 'error');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
steps1 = IK.ARM.HOME_STEPS.m1;
|
||||||
|
steps2 = IK.ARM.HOME_STEPS.m2;
|
||||||
|
saveSteps();
|
||||||
|
updatePositionReadout();
|
||||||
UI.log('[sim] HOMEALL', 'info');
|
UI.log('[sim] HOMEALL', 'info');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -69,13 +69,6 @@ export default {
|
|||||||
const delta1 = newSteps1 - steps1;
|
const delta1 = newSteps1 - steps1;
|
||||||
const delta2 = newSteps2 - steps2;
|
const delta2 = newSteps2 - steps2;
|
||||||
|
|
||||||
steps1 = newSteps1;
|
|
||||||
steps2 = newSteps2;
|
|
||||||
|
|
||||||
if (onStepComplete) {
|
|
||||||
onStepComplete(steps1, steps2);
|
|
||||||
}
|
|
||||||
|
|
||||||
const cmd1 = `S1${delta1 >= 0 ? '+' : ''}${delta1}`;
|
const cmd1 = `S1${delta1 >= 0 ? '+' : ''}${delta1}`;
|
||||||
const cmd2 = `S2${delta2 >= 0 ? '+' : ''}${delta2}`;
|
const cmd2 = `S2${delta2 >= 0 ? '+' : ''}${delta2}`;
|
||||||
|
|
||||||
@@ -91,6 +84,12 @@ export default {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
steps1 = newSteps1;
|
||||||
|
steps2 = newSteps2;
|
||||||
|
|
||||||
|
if (onStepComplete) {
|
||||||
|
onStepComplete(steps1, steps2);
|
||||||
|
}
|
||||||
console.log(`[sim] ${cmd1} ${cmd2}`);
|
console.log(`[sim] ${cmd1} ${cmd2}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user