Скетч для управления телескопом
- Войдите на сайт для отправки комментариев
Здравствуйте.
Для имеющегося телескопа хочу собрать систему управления по двум осям монтировки. Для этого приобрел Ардуино-УНО R3, два драйвера на a3967, джойстик и пару шаговых моторов.
Хочу сделать следующее - при помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения. При этом, на каждую ось монтировки будет установлено по одному мотору, вращающемуся в обе стороны. Нажатие на кнопку джойстика - режим "стоп" для обоих моторов. Нажатие еще на одну дополнительную кнопку включает один двигатель с заданной скоростью для ведения за объектом наблюдения.
Проблема в том, что я никогда не занимался программированием. Очень нужна Ваша помощь в написании скетча для моего проекта.
Ниже, примерная схема подключения узлов
Жду Ваших советов!
http://postimg.org/image/vwnsojqa3/
а железо уже есть?
Да, все есть.
http://postimg.org/image/h2osahsh3/
а пульт зачем?
открываешь примеры к stepper motor (библиотека такая) подключаешь все правильно. для драйверов внешнее питание не забудь и тренируешься управлять шаговиками. не сложнее чем: иди туда на 3 шага, и туда на 8 и стой там
а пульт зачем?
Да просто купил. Применять его не собираюсь (пока).
открываешь примеры к stepper motor (библиотека такая) подключаешь все правильно. для драйверов внешнее питание не забудь и тренируешься управлять шаговиками. не сложнее чем: иди туда на 3 шага, и туда на 8 и стой там
Пробовал уже кучу разных скетчей, особенно понравились примеры с сайта http://www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html . В 5-ом примере, там, говорится как раз про управление телескопом, но мне надо джойстик вместо кнопок, и не нужен переменный резистор. Кроме этого, с этого же джойстика надо управлять вторым двигателем.
хорошо. analogRead уже использовал? если нет научись
Джостик это хорошо и плохо, его позиционирование не всегда одинаково при отпускании и тут надо воспользоватьсся встроенной кнопкокой которая будет включать и откльчать управление, для обозначения можно рядом с джостиком прикрутить светодиод, а то получится напрвил телескоп отпустил а он всеравно по тихоньку ползет куданибуть.
1.Джойстик должен работать как 4 кнопки. Даже если ардуиновский это переменные резисторы плевать программой обрабатываем как кнопки
2.шаговые моторы твои думаю 200 шагов на оборот
Логика
палку заломал
шаговый мотор меееелкккккиииимммиии шажками начал двигать железо
если сегодня соками не напьюсь с другом может напишу код для своего Х У станка с ЧПУ может выложу нужный вам кусок
тут где-то лежит на форуме мой кусок кода нужный вам джойстик-шаговики
а пока посмотрите милицейскую мигалку на этом железе
https://yadi.sk/i/wVJKQNy8gDoAy
ТС думай над тем
как механику прикрутишь
как 12 вольтовый блок питания
как плату макетку закреплять на своем чудо оргстекле
Джостик это хорошо и плохо, его позиционирование не всегда одинаково при отпускании и тут надо воспользоватьсся встроенной кнопкокой которая будет включать и откльчать управление, для обозначения можно рядом с джостиком прикрутить светодиод, а то получится напрвил телескоп отпустил а он всеравно по тихоньку ползет куданибуть.
Да, тут стоит подумать, не хотелось бы, чтобы из-за переменных резисторов в джойстике телескоп действительно "уползал".
Вообще, джойстик хотел использовать не только для удобства управления (одним пальцем), но и для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки джойстика.
1.Джойстик должен работать как 4 кнопки. Даже если ардуиновский это переменные резисторы плевать программой обрабатываем как кнопки
Можно кусок скетча, как это выглядит?
2.шаговые моторы твои думаю 200 шагов на оборот
Да, на 200 шагов
... ТС думай над тем
как механику прикрутишь
как 12 вольтовый блок питания
как плату макетку закреплять на своем чудо оргстекле
Чудо оргстекла не будет - все платы будут размещены в другом корпусе. Блок питания на 12В имеется. На счет механики уже все решено-тут вопросов нет.
[Цитата=Oleg1601]
[Цитата=art100]
1.Джойстик должен работать как 4 кнопки. Даже если ардуиновский это переменные резисторы плевать программой обрабатываем как кнопки
[/Цитата]
Можно кусок скетча, как это выглядит?
[Цитата=art100]
2.шаговые моторы твои думаю 200 шагов на оборот
[/Цитата]
Да, на 200 шагов
[Цитата=art100]
... ТС думай над тем
как механику прикрутишь
как 12 вольтовый блок питания
как плату макетку закреплять на своем чудо оргстекле
[/Цитата]
Чудо оргстекла не будет - все платы будут размещены в другом корпусе. Блок питания на 12В имеется. На счет механики уже все решено-тут вопросов нет.
[/Цитата]
вот возьми за основу мой тестер драйверов шаговиков волшебной палкой
повырезай лишнее
у волшебной палки на одной оси 5 положений прграммируй
левая максимальная
левая медленная
не реагируем на центральное дрожание
правая медленная
правая максимальная
короче дарю код я его тут гдето выкладывал но найти уже не могу
правь
в железе этот тестер выглядил где-то вот так
http://yadi.sk/d/LYEIqRSMSENTT
или так
http://yadi.sk/d/sydH7XAzR5NQQ
покажи свою механику
Даааа, тут без бутылки не разберешься... особенно непрофессионалу.
Но, тем не менее, спасибо!
Перевожу:
недействительными установки()
void setup ()
Серийный.то begin(9600);
Serial.begin ( 9600 );
недействительными петля()
void loop()
Загрузил ваш скетч - пишет "Ошибка компиляции"
sketch_apr28b.ino:57:1: error: stray '\' in program
sketch_apr28b.ino:57:1: error: stray '\' in program
sketch_apr28b.ino:58:1: error: invalid digit "8" in octal constant
sketch_apr28b.ino:58:1: error: stray '\' in program
Нашел интересную статью http://pacpac.ru/forum/viewtopic.php?f=23&t=233 - управление панорамной головкой.
Практически все подходит под мои требования.
Вот, чуть изменил скетч - теперь скорость регулируется от угла наклона джойстика. Переменный резистор мне нужен.
#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();
}
Собрал схему:
http://postimg.org/image/um57qrgqr/
Залил для тестирования, выложенный мной выше скетч - управление джойстиком не включается, пока не сработают концевики установленные на 6 и 7 контактах (схема управления Панорамной головкой). Затем моторы, скорость и направление вращения, управляются джойстиком как положено.
Но, в процессе тестирования, было замечено, что двигатели незаметно (медленно) вращаются - 1-ый против часовой стрелки (за 1,5 минуты - четверть оборота), 2-ой по часовой (четверть оборота - за 5минут).
Что может быть? Что то в скетче, или из-за джойстика (утечки)?
Возникшие вопросы:
1. Как убрать из скетча концевые выключатели (а то, пока они последовательно не сработают, не включается управление джойстиком)?
2. Как устранить медленное вращение двигателей в режиме Стоп?
3. Как в скетч внести старт/стоп одного двигателя, с помощью дополнительной кнопки, в одну сторону с одной скоростью (+светодиод индикации этого режима) ?
Чуть не забыл, для управления ШД в программе используется библиотека AccelStepper - http://www.open.com.au/mikem/arduino/AccelStepper/index.html
........Но, в процессе тестирования, было замечено, что двигатели незаметно (медленно) вращаются.......
Вы только-что открыли что Земля вертится!!!!!!!!
#define MOTOR1_INIT_SPEED -200.0
#define MOTOR2_INIT_SPEED 800.0
........управление джойстиком не включается, пока не сработают концевики установленные на 6 и 7 контактах
stpMotor1.setCurrentPosition(0);
Это он "0" свой ищет......
........Но, в процессе тестирования, было замечено, что двигатели незаметно (медленно) вращаются.......
Ой. Я забыл написать, что вращение это происходит в режиме Стоп, когда джойстик находится в нейтральном положении.
Ну как-то так.
Промапить можно по желанию, лично я настроил что провода подходят с лева, особенности моего джостика x = 512; y = 520/521;.
Что получилось при бысром вращении по часовой стрелке.
Это, что, нужно залить и посмотреть зачения в Мониторе? Должны быть нули?
Нет сначало просто подключить и посмотреть данные при отпущенном джостике на другом могут быть совершенно другие значения, потом свои подставить и будут нули.
особенности моего джостика x = 512; y = 520/521;
значит
if
(sensorValuex < 510 || sensorValuex > 514)
if
(sensorValuey < 519 || sensorValuey > 523), повторюсь у вас могут быть другие значения.
Где данные то смотреть?
Всем спасибо! Вопрос со скетчен полностью решен.
Всем спасибо! Вопрос со скетчен полностью решен.
Добрый день, тем-же вопросом заинтересовался, можно как-то лично узнать как реализовали в итоге? Так совпало, что все тоже-самое грубо говоря взял. UNO + Nema17 шаговики, (правда еще шестерни + ремни) и контроллеры.
Я себе просто представлял как ТЗ, это как:
Что должен быть пульт, либо приложение, где буду задавать скорости постоянной работы оси RA(звездная, Лунная). В случае с пультом, как по-мне, тут удобнее 2 отдельные кнопки.
Но помимо основной постоянной рабочей скорости, неплохо бы иметь еще переключатель скоростей для корректировки или наведения телескопа на нужные объекты. Но с условием, что эти скорости после исполенения никак не влияют на постоянную рабочую(звездную/Лунную).
В идеале конечно еще и порт для гидирования реализовать в будущем.
Поэтому возвращаюсь к вопросу, если не сложно, объяснить может как реализовано у вас это сейчас? Арудино купил первый раз, поэтому попутно буду копаться в ресурсах сайта и форума для понимания, что это и с чем едят. :)
Спасибо заранее.
для получения помощи ПРАВИЛЬНО - создать свою тему, а не писать в чужой, да ещё и трёхлетней давности.
все ваши хотелки можно реализовать, а вот получить ответ от астронома здесь шанс не высокий))))
Я подумал с обратной логикой, первым делом пошел в поиск. Дабы не засорять форум одинаковыми темами. А нашел именно ту, в которой решена моя сегодняшняя задача, хоть и года назад :) Не ответит - пока сам, насколько смогу "матчасть" тут подтяну, и уже с проблемами и непонятками создам ветку.
Надежда умирает последней :)
путей несколько.
-найти полностью готовое решение и радоваться жизни (редко получается найти под свои хотелки).
-написать код и на форуме с помощью местных жителей довести его до удовлетворяющего вас состояния (долго, трудно)
-обратиться за платной помощью, получить код, собрать устройство и крутить монтировку (легче, быстрее, затратно).
выбор за вами)))
Угу, я понял, Готовое не найду это 100%.
Начну собирать сам, так как детали уже есть и от этого никуда не деться :) А там уже как получится, попробовать по крайне мере интересно.
Не справлюсь - уже буду обращаться за деньги :)
Спасибо.
главное написать себе техзадание, в котором чётко расписать логику работы системы и учесть все свои хотелки.
и в гугле задавать правильно вопросы. если и это не поможет - тогда на форум с написанным кодом и своей бедой)))