Скетч для управления телескопом
Скетч для управления телескопом
Здравствуйте.
Для имеющегося телескопа хочу собрать систему управления по двум осям монтировки. Для этого приобрел Ардуино-УНО R3, два драйвера EasyDriver на a3967, джойстик и пару шаговых моторов.
Хочу сделать следующее - при помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения. Для этого, на каждую ось монтировки будет установлено по одному мотору. Плавные старт/стоп не нужны. Переменный резистор регулировки скорости не нужен - скорость будет регулироваться программно. Джойстик нужен для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки. Нажатие на кнопку джойстика (или на отдельную кнопку) - режим "стоп" для обоих моторов. Нажатие еще на одну кнопку включает/выключает один двигатель с заданной скоростью для ведения за объектом наблюдения.
Здесь, на форуме, нашел наиболее подходящую к моим требования конструкцию Панорамной головки.
viewtopic.php?f=23&t=233
С электроникой дружу, но в программировании полный ноль. Как можно изменить представленный в указанной выше теме скетч под мои требования, а именно кроме управления джойстиком 2-мя моторами (скорость и направление - это уже вроде решено автором), останавливать с одной кнопки оба мотора, а с другой кнопки старт/стоп одного двигателя в одну сторону с одной скоростью (+светодиод индикации этого режима) ?
Схема подключения.
Купленные компоненты (на пульт внимания не обращайте - его использовать не буду)
Жду Ваших советов!
Для имеющегося телескопа хочу собрать систему управления по двум осям монтировки. Для этого приобрел Ардуино-УНО R3, два драйвера EasyDriver на a3967, джойстик и пару шаговых моторов.
Хочу сделать следующее - при помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения. Для этого, на каждую ось монтировки будет установлено по одному мотору. Плавные старт/стоп не нужны. Переменный резистор регулировки скорости не нужен - скорость будет регулироваться программно. Джойстик нужен для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки. Нажатие на кнопку джойстика (или на отдельную кнопку) - режим "стоп" для обоих моторов. Нажатие еще на одну кнопку включает/выключает один двигатель с заданной скоростью для ведения за объектом наблюдения.
Здесь, на форуме, нашел наиболее подходящую к моим требования конструкцию Панорамной головки.
viewtopic.php?f=23&t=233
С электроникой дружу, но в программировании полный ноль. Как можно изменить представленный в указанной выше теме скетч под мои требования, а именно кроме управления джойстиком 2-мя моторами (скорость и направление - это уже вроде решено автором), останавливать с одной кнопки оба мотора, а с другой кнопки старт/стоп одного двигателя в одну сторону с одной скоростью (+светодиод индикации этого режима) ?
Схема подключения.
Купленные компоненты (на пульт внимания не обращайте - его использовать не буду)
Жду Ваших советов!
Последний раз редактировалось Oleg1601 28 апр 2015, 15:25, всего редактировалось 2 раза.
Re: Скетч для управления телескопом
Из темы управления панорамной головкой 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 раза.
Re: Скетч для управления телескопом
Залил для тестирования, выложенный мной выше скетч - управление джойстиком не включается, пока не сработают концевики установленные на 6 и 7 контактах (схема управления Панорамной головкой). Затем моторы, скорость и направление вращения, управляются джойстиком.
Но, в процессе тестирования, было замечено, что двигатели ( режиме стоп) всё-же медленно вращаются - 1-ый против часовой стрелки (за 1,5 минуты - четверть оборота), 2-ой по часовой (четверть оборота - за 5минут).
Отчего это может быть? Что то в скетче, или из-за джойстика (утечки)?
Возникшие вопросы:
1. Как убрать из скетча концевые выключатели (а то, пока они последовательно не сработают, не включается управление джойстиком)?
2. Как устранить медленное вращение двигателей в режиме Стоп?
3. Как в скетч внести старт/стоп одного двигателя, с помощью дополнительной кнопки, в одну сторону с одной скоростью (+светодиод индикации этого режима) ?
Но, в процессе тестирования, было замечено, что двигатели ( режиме стоп) всё-же медленно вращаются - 1-ый против часовой стрелки (за 1,5 минуты - четверть оборота), 2-ой по часовой (четверть оборота - за 5минут).
Отчего это может быть? Что то в скетче, или из-за джойстика (утечки)?
Возникшие вопросы:
1. Как убрать из скетча концевые выключатели (а то, пока они последовательно не сработают, не включается управление джойстиком)?
2. Как устранить медленное вращение двигателей в режиме Стоп?
3. Как в скетч внести старт/стоп одного двигателя, с помощью дополнительной кнопки, в одну сторону с одной скоростью (+светодиод индикации этого режима) ?
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Скетч для управления телескопом
Привет!
Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?
Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?
Re: Скетч для управления телескопом
Схема есть в самом первом сообщении.Mr.Kubikus писал(а):Привет!
Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?
Re: Скетч для управления телескопом
Схема есть в самом первом сообщении. Единственное различие - это джойстик, но его распиновка указана на схеме (GND, +5V, VrX, VrY ) и выполнена практически верно. Аналоговые контакты 4 и 5 на Ардуино - это кнопки Стоп (уже не надо, т.к. cтоп - это среднее/нейтральное положение джойстика) и Ведение (когда кнопкой запускается один двигатель, без участия джойстика).Oleg1601 писал(а):Mr.Kubikus писал(а):Привет!
Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?
Вот, изобразил, как смог.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Скетч для управления телескопом
Ух ты! Отлично.
У меня еще один вопрос и можно будет перейти к коду. На схеме не хватает обозначений контактов на платах драйверов (красненькие). Можете добавить?
У меня еще один вопрос и можно будет перейти к коду. На схеме не хватает обозначений контактов на платах драйверов (красненькие). Можете добавить?
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Скетч для управления телескопом
Хорошо. Теперь переходим, собственно, к алгоритму управления. Я немного структурировал ваши требования:
== Требования с системе управления ==
1. При помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения.
2. Джойстик для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки.
3. Нажатие на кнопку джойстика (или на отдельную кнопку) - режим "стоп" для обоих моторов.
4. Нажатие еще на одну кнопку включает/выключает один двигатель с заданной скоростью для ведения за объектом наблюдения.
Правильно ли я все перечислил?
Теперь у меня есть несколько вопросов по вашим требованиям:
п. 3: Зачем вам нужен дополнительный сигнал для остановки моторов? Ведь, если джойстик возвращен в нейтральное положение, то моторы итак уже остановлены.
п. 4: Какой двигатель включаем "Мотор1" или ""Мотор2? Как задается скорость в этом случае?
== Требования с системе управления ==
1. При помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения.
2. Джойстик для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки.
3. Нажатие на кнопку джойстика (или на отдельную кнопку) - режим "стоп" для обоих моторов.
4. Нажатие еще на одну кнопку включает/выключает один двигатель с заданной скоростью для ведения за объектом наблюдения.
Правильно ли я все перечислил?
Теперь у меня есть несколько вопросов по вашим требованиям:
п. 3: Зачем вам нужен дополнительный сигнал для остановки моторов? Ведь, если джойстик возвращен в нейтральное положение, то моторы итак уже остановлены.
п. 4: Какой двигатель включаем "Мотор1" или ""Мотор2? Как задается скорость в этом случае?
Re: Скетч для управления телескопом
Все перечислили верно.Mr.Kubikus писал(а): п. 3: Зачем вам нужен дополнительный сигнал для остановки моторов? Ведь, если джойстик возвращен в нейтральное положение, то моторы итак уже остановлены.
п. 4: Какой двигатель включаем "Мотор1" или ""Мотор2? Как задается скорость в этом случае?
п.3 Все верно допсигнал Стоп не нужен.
п.4 Не принципиально - пусть будет "Мотор 1". Скорость, думал задавать вводом значений в соответствующий пункт, т.к. её нужно один раз подобрать и в дальнейшем уже менять не надо.