From 3d9a299836484260fcc5363a27fb0342b156a01d Mon Sep 17 00:00:00 2001 From: Fisch Date: Sat, 4 Jan 2025 14:47:29 +0100 Subject: [PATCH] general pcb component positioning --- movinghead/src/main.cpp | 81 +- .../ptz_board-2025-01-01_124150.zip | Bin 12533 -> 0 bytes ptz_board/ptz_board.kicad_pcb | 7366 ++++++++++++++++- ptz_board/ptz_board.kicad_prl | 6 +- ptz_board/ptz_board.kicad_pro | 224 +- ptz_board/ptz_board.kicad_sch | 2703 +++++- 6 files changed, 10301 insertions(+), 79 deletions(-) delete mode 100644 ptz_board/ptz_board-backups/ptz_board-2025-01-01_124150.zip diff --git a/movinghead/src/main.cpp b/movinghead/src/main.cpp index 2a3ce1a..d426509 100644 --- a/movinghead/src/main.cpp +++ b/movinghead/src/main.cpp @@ -6,65 +6,82 @@ // https://learn.watterott.com/de/silentstepstick/pinconfig/tmc2130/ -#define EN_PIN D0 -#define ROLL_STEP_PIN D8 -#define ROLL_DIR_PIN D7 +#define EN_PIN D0 +#define TILT_STEP_PIN D7 +#define TILT_DIR_PIN D4 +#define ENDSTOP_TILT D5 -#define PITCH_STEP_PIN D6 -#define PITCH_DIR_PIN D5 +#define PAN_STEP_PIN D8 +#define PAN_DIR_PIN D3 +#define ENDSTOP_PAN A0 -AccelStepper stepperPitch(AccelStepper::DRIVER, PITCH_STEP_PIN, PITCH_DIR_PIN); +#define PIN_LIGHT D6 -AccelStepper stepperRoll(AccelStepper::DRIVER, ROLL_STEP_PIN, ROLL_DIR_PIN); +AccelStepper stepperPan(AccelStepper::DRIVER, PAN_STEP_PIN, PAN_DIR_PIN); -unsigned long stepsPerRotationPitch=16*42*400/12; //12z to 42z, 16x microstepping +AccelStepper stepperTilt(AccelStepper::DRIVER, TILT_STEP_PIN, TILT_DIR_PIN); -unsigned long stepsPerRotationRoll=16*85*400/17;//17z to 85z, 16x microstepping +unsigned long stepsPerRotationPan=16*42*400/12; //12z to 42z, 16x microstepping + +unsigned long stepsPerRotationTilt=16*85*400/17;//17z to 85z, 16x microstepping + +void setEnable(bool t){ + digitalWrite(EN_PIN,!t); //active low +} void setup() { Serial.begin(115200); - - stepperPitch.setMaxSpeed(15000); - stepperPitch.setAcceleration(80000.0); - stepperPitch.moveTo(stepsPerRotationPitch/2); - stepperRoll.setMaxSpeed(15000); - stepperRoll.setAcceleration(80000.0); - stepperRoll.moveTo(stepsPerRotationRoll/8); + pinMode(EN_PIN,OUTPUT); + pinMode(ENDSTOP_TILT,INPUT_PULLUP); + pinMode(ENDSTOP_PAN,INPUT_PULLUP); + pinMode(PIN_LIGHT, OUTPUT); + digitalWrite(PIN_LIGHT, LOW); + setEnable(false); + + stepperPan.setMaxSpeed(10000); //tested w/o load 15000 + stepperPan.setAcceleration(20000.0); //tested w/o load 80000 + stepperPan.moveTo(stepsPerRotationPan/2); + + stepperTilt.setMaxSpeed(10000); //tested w/o load 15000 + stepperTilt.setAcceleration(20000.0); //tested w/o load 80000 + stepperTilt.moveTo(stepsPerRotationTilt/8); + + setEnable(true); } void loop() { static unsigned long last_change; - if (stepperPitch.distanceToGo() == 0) { - if (stepperPitch.currentPosition()>100) { - Serial.print("Pitch Moving to: "); Serial.println(0); - stepperPitch.moveTo(0); + if (stepperPan.distanceToGo() == 0) { + if (stepperPan.currentPosition()>100) { + Serial.print("Pan Moving to: "); Serial.println(0); + stepperPan.moveTo(0); }else{ - Serial.print("Pitch Moving to: "); Serial.println(stepsPerRotationPitch/2); - stepperPitch.moveTo(stepsPerRotationPitch/2); + Serial.print("Pan Moving to: "); Serial.println(stepsPerRotationPan/2); + stepperPan.moveTo(stepsPerRotationPan/2); } } - if (stepperRoll.distanceToGo() == 0) { - if (stepperRoll.currentPosition()>100) { - Serial.print("Roll Moving to: "); Serial.println(0); - stepperRoll.moveTo(0); + if (stepperTilt.distanceToGo() == 0) { + if (stepperTilt.currentPosition()>100) { + Serial.print("Tilt Moving to: "); Serial.println(0); + stepperTilt.moveTo(0); }else{ - Serial.print("Roll Moving to: "); Serial.println(stepsPerRotationRoll/8); - stepperRoll.moveTo(stepsPerRotationRoll/8); + Serial.print("Tilt Moving to: "); Serial.println(stepsPerRotationTilt/8); + stepperTilt.moveTo(stepsPerRotationTilt/8); } } - bool resultPitch = stepperPitch.run(); - bool resultRoll = stepperRoll.run(); + bool resultPan = stepperPan.run(); + bool resultTilt = stepperTilt.run(); if ( millis() > last_change+500 ) { last_change=millis(); //Serial.print("run="); Serial.print(result); - //Serial.print(" dist="); Serial.print(stepperPitch.distanceToGo()); - //Serial.print(" pos="); Serial.print(stepperPitch.currentPosition()); + //Serial.print(" dist="); Serial.print(stepperPan.distanceToGo()); + //Serial.print(" pos="); Serial.print(stepperPan.currentPosition()); //Serial.println(); } diff --git a/ptz_board/ptz_board-backups/ptz_board-2025-01-01_124150.zip b/ptz_board/ptz_board-backups/ptz_board-2025-01-01_124150.zip deleted file mode 100644 index 1438ab7fda4b59d8c883b720a6b4e91f6a576971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12533 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