соединить два скетча
- Войдите на сайт для отправки комментариев
Чт, 30/06/2022 - 13:49
здравствуйте. я только учусь сильно не пинайте) делаю телескоп на ардуино с управлением через ascom PHD2 , есть два скетча - один рабочий (не мой) сейчас залит на UNO работает вручную на телескопе от джойстика. Второй код задает управление моторчиками через порт, проблема в следущем : первый скетч написан на accelstepper библиотеке со своими командами а второй предлагает управлять через выходами через HI LOW , я думаю надо
digitalWrite(STEPPER1_PIN_STEP, HIGH);
delay(stepDelay);
digitalWrite(STEPPER1_PIN_STEP, LOW);
заменить на
disableOutputs();
enableOutputs();
или я не прав как правильно поступить?
/* * Для управления ШД в программе используется библиотека AccelStepper 1.48-1.51 * http://www.open.com.au/mikem/arduino/AccelStepper/index.html * */ #include <AccelStepper.h> // Назначение входов/выходов // Шаговые двигатели #define MOTOR1_DIR_PIN 8 #define MOTOR2_DIR_PIN 11 #define MOTOR3_DIR_PIN 5 #define MOTOR1_STEP_PIN 9 #define MOTOR2_STEP_PIN 10 #define MOTOR3_STEP_PIN 4 #define MOTOR1_SPR 1600 // Кол-во шагов на 1 оборот вала двигателя #define MOTOR2_SPR 1600 #define MOTOR3_SPR 800 // Кол-во шагов на 1 оборот вала двигателя фокусера #define MOTOR1_MAX_SPEED 8000.0 // Максимальная скорость моторов в режиме 1 #define MOTOR2_MAX_SPEED 8000.0 #define MOTOR3_MAX_SPEED 1500.0 // Максимальная скорость мотора фокусера #define MODE2_MAX_SPEED 7.12 // Скорость в режиме 2 Звездная скорость #define INT_PIN 12 // номер вывода на MS #define LED_PIN 6 // номер вывода светодиода HL2 #define BUTTON_PIN 7 // номер вывода кнопки В1 // Органы управления и индикации #define MOTOR1_JOY_IN 0 // Ось Y джойстика #define MOTOR2_JOY_IN 1 // Ось X джойстика #define MOTOR3_JOY_IN 1 // Ось фокусера #define BTN1 0 // Кнопка РЕЖИМ 2 СТАРТ/СТОП #define LED_MODE 1 // Индикатор режима: // 0=РЕЖИМ 2 (светодиод горит) // 1=РЕЖИМ 1 (светодиод не горит) // переменные и константы для обработки сигнала кнопки B1 boolean flagPress= false; // признак кнопка в нажатом состоянии boolean flagClick= false; // признак нажатия кнопки (фронт) byte buttonCount= 0; // счетчик подтверждений состояния кнопки #define TIME_BUTTON 12 // время устойчивого состояния кнопки (* 2 мс) boolean ledState; // переменная состояния светодиода HL2 int nMotor1SP, nMotor2SP; // Задание направления от джойстика int nMode2SP; // Задание скорости для работы в РЕЖИМ 2 int nMotor3SP; // Задание направления от джойстика фокусер int nMotor1MV, nMotor2MV; // Задание скорости после ограничителя int nMotor3MV; // Задание скорости после ограничителя фокусер int nModeControllerState = 0; // Текущее состояние конечного автомата ModeController int nMode = 0; // Текущий номер режима // 0=РЕЖИМ 1. Управление от джойстика // 1=РЕЖИМ 2. Движение с заданной скоростью по одной оси bool bBTN1Value; // Состояние кнопки BTN1 AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN); AccelStepper stpMotor2(AccelStepper::DRIVER, MOTOR2_STEP_PIN, MOTOR2_DIR_PIN); AccelStepper stpMotor3(AccelStepper::DRIVER, MOTOR3_STEP_PIN, MOTOR3_DIR_PIN); void setup() { phInit(); pinMode(INT_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { static int nBTN1Counter; phGetCommand(); switch (nModeControllerState) { case 0: if (bBTN1Value == false) { nBTN1Counter++; } else { nBTN1Counter = 0; } if ((bBTN1Value == false) && (nBTN1Counter > 10)) { nModeControllerState = 1; nBTN1Counter = 0; } break; case 1: if (bBTN1Value==true) { nModeControllerState = 2; nMode = 1; // Движение с заданной скоростью по одной оси digitalWrite(LED_MODE, 0); } break; case 2: if (bBTN1Value == false) { nBTN1Counter++; } else { nBTN1Counter = 0; } if ((bBTN1Value == false) && (nBTN1Counter > 10)) { nModeControllerState = 3; nBTN1Counter = 0; } break; case 3: if (bBTN1Value==true) { nModeControllerState = 0; nMode = 0; // Управление от джойстика digitalWrite(LED_MODE, 1); } break; default: break; } switch (nMode) { case 0: phMotorRunMode1(); break; case 1: phMotorRunMode2(); break; default: break; } if ( flagPress == (! digitalRead(BUTTON_PIN)) ) { buttonCount= 0; } else { buttonCount++; if ( buttonCount >= TIME_BUTTON ) { flagPress= ! flagPress; if ( flagPress == true ) flagClick= true; } } // блок управления светодиодом и выходом управления if ( flagClick == true ) { flagClick= false; ledState= ! ledState; digitalWrite(LED_PIN, ledState); digitalWrite(INT_PIN, ledState); } } void phInit() { pinMode(MOTOR1_DIR_PIN, OUTPUT); pinMode(MOTOR2_DIR_PIN, OUTPUT); pinMode(MOTOR3_DIR_PIN, OUTPUT); pinMode(MOTOR1_STEP_PIN, OUTPUT); pinMode(MOTOR2_STEP_PIN, OUTPUT); pinMode(MOTOR3_STEP_PIN, OUTPUT); pinMode(BTN1, INPUT_PULLUP); pinMode(LED_MODE, OUTPUT); nMotor1MV = 0; nMotor2MV = 0; stpMotor1.setMaxSpeed(MOTOR1_MAX_SPEED); stpMotor2.setMaxSpeed(MOTOR2_MAX_SPEED); stpMotor3.setMaxSpeed(MOTOR3_MAX_SPEED); stpMotor1.setAcceleration(10.0); stpMotor2.setAcceleration(10.0); stpMotor3.setAcceleration(10.0); stpMotor1.setSpeed(0); stpMotor2.setSpeed(0); stpMotor3.setSpeed(0); digitalWrite(LED_MODE, 1); return; } void phGetCommand() { bBTN1Value = digitalRead(BTN1); nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512; // Ось Y джойстика nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512; // Ось X джойстика nMotor3SP = analogRead(MOTOR3_JOY_IN) - 512; // Ось Y джойстика фокусер nMode2SP = MODE2_MAX_SPEED * -1; // Задание скорости режима 2 Поменять на -1 если требуется реверс if ((nMotor1SP < -40) || (nMotor1SP > 40)) { nMotor1MV = map(nMotor1SP, -512, 511, -1*MOTOR1_MAX_SPEED, MOTOR1_MAX_SPEED); } else { nMotor1MV = 0; } nMotor1MV = nMotor1MV * -1; // Поменять на -1 если требуется реверс if ((nMotor2SP < -40) || (nMotor2SP > 40)) { nMotor2MV = map(nMotor2SP, -512, 511, -1*MOTOR2_MAX_SPEED, MOTOR2_MAX_SPEED); } else { nMotor2MV = 0; } nMotor2MV = nMotor2MV * 1; // Поменять на -1 если требуется реверс if ((nMotor3SP < -40) || (nMotor3SP > 40)) { nMotor3MV = map(nMotor3SP, -1000, 999, -1*MOTOR3_MAX_SPEED, MOTOR3_MAX_SPEED); } else { nMotor3MV = 0; } nMotor3MV = nMotor3MV * 1; // Поменять на -1 если требуется реверс } void phMotorRunMode1() { stpMotor1.setSpeed(nMotor1MV); // Задаем скорость для мотора 1 stpMotor2.setSpeed(nMotor2MV); // Задаем скорость для мотора 2 stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью stpMotor2.runSpeed(); } void phMotorRunMode2() { stpMotor1.setSpeed(nMode2SP); // Задаем скорость для мотора 1 stpMotor3.setSpeed(nMotor3MV); // Задаем скорость для мотора 3 фокусера stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью stpMotor3.runSpeed(); }
а вот код который мне надо интегрировать в первый ,только void и loop void move
#include "Arduino.h" // Pin Definitions #define STEPPER1_PIN_STEP 3 #define STEPPER1_PIN_DIR 2 #define STEPPER2_PIN_STEP 5 #define STEPPER2_PIN_DIR 4 // Fixed track rate // 1 sidereal day = 86'164'000 ms // 1 day = 1 big wheel turn = 144 small screw turns (in RA) // 1 screw turn = 598'361 ms // 1 screw turn = 1 motor turn = 200 steps * 8 (microstepping) // 1 motor step = 374 ms int stepDelay = 374; // delay in ms for one step int dur; // duration boolean isPulseGuiding = false; // Setup the essentials for your circuit to work. It runs first every time your circuit is powered with electricity. void setup() { // assign pin modes pinMode(STEPPER1_PIN_DIR, OUTPUT); pinMode(STEPPER1_PIN_STEP, OUTPUT); pinMode(STEPPER2_PIN_DIR, OUTPUT); pinMode(STEPPER2_PIN_STEP, OUTPUT); // no power to pins digitalWrite(STEPPER1_PIN_STEP, LOW); digitalWrite(STEPPER2_PIN_STEP, LOW); // initialize serial connection: Serial.begin(57600); Serial.flush(); // wait for serial port to connect. Needed for native USB while (!Serial) ; Serial.println("Connection successful."); } void loop() { /* SerialEvent occurs whenever a new data comes in the hardware serial RX. The pulses are put out in the form of <direction#duration[in ms]#>. ( ex: "E#400#" ) */ if(Serial.available()>0) { String driver_cmd; driver_cmd = Serial.readStringUntil('#'); if(driver_cmd == "I") // Pulseguiding info { if(isPulseGuiding) { Serial.println("TRUE#"); } else { Serial.println("FALSE#"); } } // move motor 1 step north if(driver_cmd == "N") { driver_cmd = ""; driver_cmd = Serial.readStringUntil('#'); dur = driver_cmd.toInt(); Move(0, dur); isPulseGuiding = true; } // move motor 1 step south if(driver_cmd == "S") { driver_cmd = ""; driver_cmd = Serial.readStringUntil('#'); dur = driver_cmd.toInt(); Move(1, dur); isPulseGuiding = true; } // move motor 1 step west if(driver_cmd == "W") { driver_cmd = ""; driver_cmd = Serial.readStringUntil('#'); dur = driver_cmd.toInt(); Move(2, dur); isPulseGuiding = true; } // move motor 1 step east if(driver_cmd == "E") { driver_cmd = ""; driver_cmd = Serial.readStringUntil('#'); dur = driver_cmd.toInt(); Move(3, dur); isPulseGuiding = true; } // stop motors if(driver_cmd == "H") { driver_cmd = ""; Move(4, 0); isPulseGuiding = false; } } } void Move(int dir, int duration) { if(duration < 374) // for test to get at least one step for each pulse, delete this for actual tracking { duration = 374; } int steps = duration/stepDelay; if(dir == 0) // North { digitalWrite(STEPPER1_PIN_DIR, LOW); for ( int i=0; i<(steps); i++) { digitalWrite(STEPPER1_PIN_STEP, HIGH); delay(stepDelay); digitalWrite(STEPPER1_PIN_STEP, LOW); } } else if(dir == 1) // South { digitalWrite(STEPPER1_PIN_DIR, HIGH); for ( int i=0; i<(steps); i++) { digitalWrite(STEPPER1_PIN_STEP, HIGH); delay(stepDelay); digitalWrite(STEPPER1_PIN_STEP, LOW); } } else if(dir == 2) // West { digitalWrite(STEPPER2_PIN_DIR, LOW); for ( int i=0; i<steps; i++) { digitalWrite(STEPPER2_PIN_STEP, HIGH); delay(stepDelay); digitalWrite(STEPPER2_PIN_STEP, LOW); } } else if(dir == 3) // East { digitalWrite(STEPPER2_PIN_DIR, LOW); for ( int i=0; i<steps; i++) { digitalWrite(STEPPER2_PIN_STEP, HIGH); delay(stepDelay); digitalWrite(STEPPER2_PIN_STEP, LOW); } } else if(dir == 4) // STOP { digitalWrite(STEPPER1_PIN_STEP, LOW); digitalWrite(STEPPER2_PIN_STEP, LOW); } }
Нужно nMode менять в зависимости от того, что прилетело в порт.
А enable/disable тут непричем.
можно хотя бы пример по одном символу из порта?
В смысле - переписать весь скетч для примера?
ладно пытаюсь разобратся сам) вопрос надо применить библиотеку arduino.h нигде не могу найти . На гитхабе вроде есть она но как ее оттуда забрать? https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Arduino.h#L1
Она входит в состав Ардуино IDE, подключается в скетч автоматически. Нахрена вам ее откуда-то скачивать?