соединить два скетча

андрей80
Offline
Зарегистрирован: 04.11.2020

здравствуйте. я только учусь сильно не пинайте) делаю телескоп на ардуино с управлением через 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);
  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Нужно nMode менять в зависимости от того, что прилетело в порт.
А enable/disable тут непричем.

андрей80
Offline
Зарегистрирован: 04.11.2020

можно хотя бы пример по одном символу из порта?

sadman41
Offline
Зарегистрирован: 19.10.2016

В смысле - переписать весь скетч для примера?

андрей80
Offline
Зарегистрирован: 04.11.2020

ладно пытаюсь разобратся сам) вопрос надо применить библиотеку arduino.h нигде не могу найти . На гитхабе вроде есть она но как ее оттуда забрать? https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Arduino.h#L1

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Она входит в состав Ардуино IDE, подключается в скетч автоматически. Нахрена вам ее откуда-то скачивать?