Скетч для управления телескопом

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Скетч для управления телескопом

Сообщение Oleg1601 »

Здравствуйте.
Для имеющегося телескопа хочу собрать систему управления по двум осям монтировки. Для этого приобрел Ардуино-УНО R3, два драйвера EasyDriver на a3967, джойстик и пару шаговых моторов.
Хочу сделать следующее - при помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения. Для этого, на каждую ось монтировки будет установлено по одному мотору. Плавные старт/стоп не нужны. Переменный резистор регулировки скорости не нужен - скорость будет регулироваться программно. Джойстик нужен для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки. Нажатие на кнопку джойстика (или на отдельную кнопку) - режим "стоп" для обоих моторов. Нажатие еще на одну кнопку включает/выключает один двигатель с заданной скоростью для ведения за объектом наблюдения.
Здесь, на форуме, нашел наиболее подходящую к моим требования конструкцию Панорамной головки.
viewtopic.php?f=23&t=233

С электроникой дружу, но в программировании полный ноль. Как можно изменить представленный в указанной выше теме скетч под мои требования, а именно кроме управления джойстиком 2-мя моторами (скорость и направление - это уже вроде решено автором), останавливать с одной кнопки оба мотора, а с другой кнопки старт/стоп одного двигателя в одну сторону с одной скоростью (+светодиод индикации этого режима) ?

Схема подключения.
Изображение

Купленные компоненты (на пульт внимания не обращайте - его использовать не буду)
Изображение
Жду Ваших советов!
Последний раз редактировалось Oleg1601 28 апр 2015, 15:25, всего редактировалось 2 раза.
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 »

Из темы управления панорамной головкой viewtopic.php?f=23&t=233 взял и переработал немного скетч.

Код: Выделить всё

/*
    Для управления ШД в программе используется библиотека AccelStepper - http://www.open.com.au/mikem/arduino/AccelStepper/index.html
*/


#include <AccelStepper.h>

#define MOTOR1_DIR_PIN  8
#define MOTOR2_DIR_PIN  11

#define MOTOR1_STEP_PIN 9
#define MOTOR2_STEP_PIN 10

#define MOTOR1_LS_PIN 6
#define MOTOR2_LS_PIN 7

#define MOTOR1_SPR 200  // Кол-во шагов на 1 оборот вала двигателя
#define MOTOR2_SPR 200  

#define MOTOR1_MAX_SPEED 50000.0
#define MOTOR2_MAX_SPEED 50000.0

#define MOTOR1_INIT_SPEED -200.0
#define MOTOR2_INIT_SPEED 800.0

#define MOTOR1_JOY_IN 0 // Ось Y джойстика
#define MOTOR2_JOY_IN 1 // Ось X джойстика
#define SPEED_KNOB_IN 2 // Задатчик скорости - переменный резистор 4,7К

AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
AccelStepper stpMotor2(AccelStepper::DRIVER, MOTOR2_STEP_PIN, MOTOR2_DIR_PIN);

int nMotor1SP, nMotor2SP;            // Задание направления от джойстика
int nSpeedSP;                        // Задание скорости от задачика
int nMotor1MV, nMotor2MV;  // Задание скорости после ограничителя

void setup() {                
  phInit();
}

void loop() {
  phGetCommand();
  phMotorRun();
}


void phInit()
{
  pinMode(MOTOR1_DIR_PIN, OUTPUT);
  pinMode(MOTOR2_DIR_PIN, OUTPUT);
  pinMode(MOTOR1_STEP_PIN, OUTPUT);
  pinMode(MOTOR2_STEP_PIN, OUTPUT);
 
  pinMode(MOTOR1_LS_PIN, INPUT_PULLUP);
  pinMode(MOTOR2_LS_PIN, INPUT_PULLUP);
  
  nMotor1MV = 0;
  nMotor2MV = 0;
  stpMotor1.setMaxSpeed(MOTOR1_MAX_SPEED);
  stpMotor2.setMaxSpeed(MOTOR2_MAX_SPEED);
  stpMotor1.setAcceleration(10.0);
  stpMotor2.setAcceleration(10.0);
  stpMotor1.setSpeed(0);
  stpMotor2.setSpeed(0);
  
  stpMotor1.setSpeed(MOTOR1_INIT_SPEED);
  while (digitalRead(MOTOR1_LS_PIN) != 0) {
    stpMotor1.runSpeed();
  }

  stpMotor1.setCurrentPosition(0);
  stpMotor1.setSpeed(-MOTOR1_INIT_SPEED);
  while (abs(stpMotor1.currentPosition()) < 400) {
    stpMotor1.runSpeed();
  } 
  stpMotor1.setCurrentPosition(0);
  stpMotor1.setSpeed(0);

  stpMotor2.setSpeed(MOTOR2_INIT_SPEED);
  while (digitalRead(MOTOR2_LS_PIN) != 0) {
    stpMotor2.runSpeed();
  }

  stpMotor2.setCurrentPosition(0);
  stpMotor2.setSpeed(-MOTOR2_INIT_SPEED);
  while (abs(stpMotor2.currentPosition()) < 2400) {
    stpMotor2.runSpeed();
  } 
  stpMotor2.setCurrentPosition(0);
  stpMotor2.setSpeed(0);
  
  return;
}

void phGetCommand()
{
  nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512; // Ось Y джойстика 
  nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512; // Ось X джойстика
  nSpeedSP = 1023 - analogRead(SPEED_KNOB_IN);
  
  if (nMotor1SP > 100) {
    nMotor1MV = nSpeedSP;
  } else if (nMotor1SP < -100) {
    nMotor1MV = -nSpeedSP;
  } else {
    nMotor1MV = 0;
  }
  
  nMotor1MV = nMotor1MV / 5;
  
  if (nMotor2SP > 100) {
    nMotor2MV = nSpeedSP;
  } else if (nMotor2SP < -100) {
    nMotor2MV = -nSpeedSP;
  } else {
    nMotor2MV = 0;
  }
  
  nMotor2MV = nMotor2MV * -1;
}

void phMotorRun() 
{
  stpMotor1.setSpeed(nMotor1SP);  // Задаем скорость по оси Y
  stpMotor2.setSpeed(nMotor2SP);  // Задаем скорость по оси X
  
  stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью
  stpMotor2.runSpeed();
}
Последний раз редактировалось Oleg1601 28 апр 2015, 13:53, всего редактировалось 4 раза.
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 »

Залил для тестирования, выложенный мной выше скетч - управление джойстиком не включается, пока не сработают концевики установленные на 6 и 7 контактах (схема управления Панорамной головкой). Затем моторы, скорость и направление вращения, управляются джойстиком.
Но, в процессе тестирования, было замечено, что двигатели ( режиме стоп) всё-же медленно вращаются - 1-ый против часовой стрелки (за 1,5 минуты - четверть оборота), 2-ой по часовой (четверть оборота - за 5минут).
Отчего это может быть? Что то в скетче, или из-за джойстика (утечки)?

Возникшие вопросы:
1. Как убрать из скетча концевые выключатели (а то, пока они последовательно не сработают, не включается управление джойстиком)?
2. Как устранить медленное вращение двигателей в режиме Стоп?
3. Как в скетч внести старт/стоп одного двигателя, с помощью дополнительной кнопки, в одну сторону с одной скоростью (+светодиод индикации этого режима) ?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Скетч для управления телескопом

Сообщение Mr.Kubikus »

Привет!

Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?
С уважением, Григорий
GitHub FB ВК
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 »

Mr.Kubikus писал(а):Привет!

Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?
Схема есть в самом первом сообщении.
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 »

Oleg1601 писал(а):
Mr.Kubikus писал(а):Привет!

Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?
Схема есть в самом первом сообщении. Единственное различие - это джойстик, но его распиновка указана на схеме (GND, +5V, VrX, VrY ) и выполнена практически верно. Аналоговые контакты 4 и 5 на Ардуино - это кнопки Стоп (уже не надо, т.к. cтоп - это среднее/нейтральное положение джойстика) и Ведение (когда кнопкой запускается один двигатель, без участия джойстика).
Вот, изобразил, как смог. :)

Изображение
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Скетч для управления телескопом

Сообщение Mr.Kubikus »

Ух ты! Отлично.

У меня еще один вопрос и можно будет перейти к коду. На схеме не хватает обозначений контактов на платах драйверов (красненькие). Можете добавить?
С уважением, Григорий
GitHub FB ВК
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 »

Вот
Изображение
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Скетч для управления телескопом

Сообщение Mr.Kubikus »

Хорошо. Теперь переходим, собственно, к алгоритму управления. Я немного структурировал ваши требования:

== Требования с системе управления ==

1. При помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения.
2. Джойстик для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки.
3. Нажатие на кнопку джойстика (или на отдельную кнопку) - режим "стоп" для обоих моторов.
4. Нажатие еще на одну кнопку включает/выключает один двигатель с заданной скоростью для ведения за объектом наблюдения.

Правильно ли я все перечислил?

Теперь у меня есть несколько вопросов по вашим требованиям:

п. 3: Зачем вам нужен дополнительный сигнал для остановки моторов? Ведь, если джойстик возвращен в нейтральное положение, то моторы итак уже остановлены.
п. 4: Какой двигатель включаем "Мотор1" или ""Мотор2? Как задается скорость в этом случае?
С уважением, Григорий
GitHub FB ВК
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 »

Mr.Kubikus писал(а): п. 3: Зачем вам нужен дополнительный сигнал для остановки моторов? Ведь, если джойстик возвращен в нейтральное положение, то моторы итак уже остановлены.
п. 4: Какой двигатель включаем "Мотор1" или ""Мотор2? Как задается скорость в этом случае?
Все перечислили верно.
п.3 Все верно допсигнал Стоп не нужен.
п.4 Не принципиально - пусть будет "Мотор 1". Скорость, думал задавать вводом значений в соответствующий пункт, т.к. её нужно один раз подобрать и в дальнейшем уже менять не надо.
Ответить