соединить два скетча
- Войдите на сайт для отправки комментариев
Чт, 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, подключается в скетч автоматически. Нахрена вам ее откуда-то скачивать?