Добро пожаловать на наш астрономический форум!
Надеемся, что здесь вы сможете получить толковые ответы на свои вопросы по любительской астрономии основанные на опыте и знаниях, а не на догадках, мифах и чтении Интернета по диагонали.
Если вы решили присоединиться к нам - придерживайтесь и Вы в своих ответах этих правил
Зоны особого внимания: ЧАВО (FAQ), Обзоры оборудования и Окуляры
Надеемся, что здесь вы сможете получить толковые ответы на свои вопросы по любительской астрономии основанные на опыте и знаниях, а не на догадках, мифах и чтении Интернета по диагонали.
Если вы решили присоединиться к нам - придерживайтесь и Вы в своих ответах этих правил
Зоны особого внимания: ЧАВО (FAQ), Обзоры оборудования и Окуляры
Помогите с эл.приводом !!!
Модератор: Ernest
-
- Сообщения: 35
- Зарегистрирован: 09 мар 2014, 10:10
Помогите с эл.приводом !!!
Уважаемые любители астрономии! Помогите с выбором эл.привода по осям монтировки. Есть готовые комплекты но как я думаю они узкоспециализированы. Предлагают шаговые двигатели но: какой момент , шаг , и т.д... Прошу дать хоть какую информацию!
- georgievvs
- Сообщения: 554
- Зарегистрирован: 05 ноя 2013, 08:24
-
- Сообщения: 35
- Зарегистрирован: 09 мар 2014, 10:10
Re: Помогите с эл.приводом !!!
Монтировка самодельная. Червячное колесо 120 зубов, червяк однозаходный. Вес трубы примерно 10 кг. Спасибо!
Re: Помогите с эл.приводом !!!
Моя новая задумка.
Хочу построить самодельную монтировку GO TO с использованием Платы "Ардуино УНО"
Вот первые наброски:
Плата "ардуино",
плата расширения для удобства подключения,
драйверы для шаговых двигателей,
дисплей,
шаговые двигатели (0.9 градуса шаг)- они уже вертятся.
Ещё нужно добавить кнопки и плату часов реального времени.
Теперь требуется изучить язык программирования C++ ,иначе нет смысла дальше строить.
Хочу построить самодельную монтировку GO TO с использованием Платы "Ардуино УНО"
Вот первые наброски:
Плата "ардуино",
плата расширения для удобства подключения,
драйверы для шаговых двигателей,
дисплей,
шаговые двигатели (0.9 градуса шаг)- они уже вертятся.
Ещё нужно добавить кнопки и плату часов реального времени.
Теперь требуется изучить язык программирования C++ ,иначе нет смысла дальше строить.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
Владислав, а что за двигатели (параметры, модель, цена, где брали)?
Re: Помогите с эл.приводом !!!
Всё купил на сайте "Амперка" цены там все есть
Шаговый двигатель 36HT20-0504MA
Шаг: 0,9°±5% (400 на оборот)
Номинальное напряжение питания: 6,5 В
Номинальный ток фазы: 500 мА
Крутящий момент (holding torque): не менее 0,95 кг×см
Крутящий момент покоя (detent torque): 0,05 кг×см
Максимальная скорость старта: 1500 шагов/сек
Диаметр вала: 5 мм
Длина вала: 20 мм
Габариты корпуса: 51×36×20 мм
Вес: 0,16 кг
Шаговый двигатель 36HT20-0504MA
Шаг: 0,9°±5% (400 на оборот)
Номинальное напряжение питания: 6,5 В
Номинальный ток фазы: 500 мА
Крутящий момент (holding torque): не менее 0,95 кг×см
Крутящий момент покоя (detent torque): 0,05 кг×см
Максимальная скорость старта: 1500 шагов/сек
Диаметр вала: 5 мм
Длина вала: 20 мм
Габариты корпуса: 51×36×20 мм
Вес: 0,16 кг
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
Добавил в схему пять кнопок.
Вверх,вниз, влево, вправо.
Пятая кнопка ещё не задействована.
На данный момент удалось добиться вращения движков с использованием этих кнопок.
Кнопки подключены последовательно с сопротивлениями.В результате каждая кнопка выдает свой уровень напряжения в вольтах,которое отправляется на пин "A0".
Контроллер анализирует этот "сигнал" и выполняет соответствующую команду.
Вверх,вниз, влево, вправо.
Пятая кнопка ещё не задействована.
На данный момент удалось добиться вращения движков с использованием этих кнопок.
Кнопки подключены последовательно с сопротивлениями.В результате каждая кнопка выдает свой уровень напряжения в вольтах,которое отправляется на пин "A0".
Контроллер анализирует этот "сигнал" и выполняет соответствующую команду.
Последний раз редактировалось Владислав 09 окт 2016, 23:38, всего редактировалось 1 раз.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
-
- Сообщения: 437
- Зарегистрирован: 30 июл 2012, 08:47
Re: Помогите с эл.приводом !!!
о, круто!
Re: Помогите с эл.приводом !!!
А голову из чего планируете и в каком виде?
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
Re: Помогите с эл.приводом !!!
Корпус из алюминия будет.Экваториальная. Грузоподъёмность 5-7 кг.
Последний раз редактировалось Владислав 23 ноя 2015, 20:46, всего редактировалось 1 раз.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
Вы планируете крутить шестерни или напрямую сажать на движки?
Я просто тоже нечто похожее думаю сделать.
Я просто тоже нечто похожее думаю сделать.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
Re: Помогите с эл.приводом !!!
Червячная пара. На движке червяк сразу
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
Ну тогда микрошаги при слежении и обычные при быстром повороте не вариант?
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
Re: Помогите с эл.приводом !!!
Можно использовать обычные двигатели постоянного тока + энкодеры. И будет быстро наводиться и следить.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
Точность и скорость наведения будут хуже.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
Re: Помогите с эл.приводом !!!
В монтировке Стар эдвенчер установлен обычный моторчик с энкодером и ведет отлично.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
Забавно, думал там шаговик, тогда можно подглядеть в этой теме что там и как внутри.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
Re: Помогите с эл.приводом !!!
Посмотрел темку.Фотки информативные.Там "крутые" любители астрономии. Понятное дело,для них всё более доступно.
А монтировка "Star Adventurer" похоже многим приглянулась .
Порассуждаем :
Надо выбрать достаточное количество шагов шагового двигателя за секунду, чтобы не было заметно дрожание изображения в телескопе.
В звёздных сутках у нас 86164,090530833 секунд. Можно округлить - 86165 сек.
Допустим, будем делать 5 шагов в секунду(может это и мало), значит 86165 секунд умножаем на 5 шагов и получается 430825 шагов за один оборот полярной оси монтировки.
У меня двигатели 0.9 градуса(400 шагов за один оборот). 430825 шагов делим на 400. Получается 1077,0625 оборотов двигателя за сутки.Округляем. Получается, у главной шестерни должно быть 1077 зубьев .
Такую шестерню с трудом себе представляю,а если и сделать,то она будет очень большая. Делаем вывод: нужно добавить ещё шестерёнок, или уменьшить количество шагов за одну секунду жертвуя плавностью хода.
Приложил ухо к "Star Adventurer" ,слышу пять чётких тиков в секунду.Такое ощущение что там всё таки шаговик стоит, уж больно чётко тикает,а энкодер стоит для контроля и защиты механики. В общем не знаю...буду думать.
А монтировка "Star Adventurer" похоже многим приглянулась .
Порассуждаем :
Надо выбрать достаточное количество шагов шагового двигателя за секунду, чтобы не было заметно дрожание изображения в телескопе.
В звёздных сутках у нас 86164,090530833 секунд. Можно округлить - 86165 сек.
Допустим, будем делать 5 шагов в секунду(может это и мало), значит 86165 секунд умножаем на 5 шагов и получается 430825 шагов за один оборот полярной оси монтировки.
У меня двигатели 0.9 градуса(400 шагов за один оборот). 430825 шагов делим на 400. Получается 1077,0625 оборотов двигателя за сутки.Округляем. Получается, у главной шестерни должно быть 1077 зубьев .
Такую шестерню с трудом себе представляю,а если и сделать,то она будет очень большая. Делаем вывод: нужно добавить ещё шестерёнок, или уменьшить количество шагов за одну секунду жертвуя плавностью хода.
Приложил ухо к "Star Adventurer" ,слышу пять чётких тиков в секунду.Такое ощущение что там всё таки шаговик стоит, уж больно чётко тикает,а энкодер стоит для контроля и защиты механики. В общем не знаю...буду думать.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
На stepper-online есть шаговики с планетаркой (ключевое слово "geared"). Правда отправляют "небюджетной" EMS, брал пару месяцев назад с их магазина через aliexpress обычные шаговики+плату для других целей, доставка быстрая. Тут уже встает вопрос цены, если цена не важна, а важно "собрать самому" монтировку - то стоит заморочиться.
Самому хочется заморочиться, но пока идет медленно.
Самому хочется заморочиться, но пока идет медленно.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
Re: Помогите с эл.приводом !!!
Посмотрел, классно ,у них есть подходящие модели.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
Вымучиваю программу.Сейчас движки делают правильное кол-во шагов.Могут шагать вперёд,назад(Как бы наводят телескоп по координатам RA и DEC) и возвращаться на нольа, также сопровождать. Наводятся ну оочень долго.
Если получится сделать правильный плавный разгон, то скорость шага можно увеличить до 1 миллисекунды.
При резком старте начинаются пропуски.
Когда будет плавный старт, можно приступать к созданию монтировки.
Может кто понимает Я зыке C++ ? Подскажите ,как осуществить плавный разгон. Какую функцию использовать ? И ещё проблема - двигатели наводятся по очереди, вместе не хотят,хоть убей.
Сам скетч может кому надо:
Если получится сделать правильный плавный разгон, то скорость шага можно увеличить до 1 миллисекунды.
При резком старте начинаются пропуски.
Когда будет плавный старт, можно приступать к созданию монтировки.
Может кто понимает Я зыке C++ ? Подскажите ,как осуществить плавный разгон. Какую функцию использовать ? И ещё проблема - двигатели наводятся по очереди, вместе не хотят,хоть убей.
Сам скетч может кому надо:
Код: Выделить всё
// Управление двумя шаговыми двигателями с плавным ускорением и замедлением
// Скетч составил Савельев Владислав Сергеевич "нуб"
#include <LiquidCrystal.h> // библиотека дисплея
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); // назначеные пины для дисплея
// драйверы Troyka-Stepper для шаговиков подключены через плату расширения(Troyka Shield) к следующим пинам:
const byte stepPin = 7; // сделать шаг
const byte directionPin = 1; // направление
const byte enablePin = 6; // питание
const byte stepPin2 = 2; // сделать шаг
const byte directionPin2 = 4; // направление
const byte enablePin2 = 5; // питание
// задаём переменные:
long shagov = 0; // количество шагов
int times = 2; // задержка шага
int b = 0; // переменная которая печатается на экран
long q = 0; // сколько шагов сделано ось RA
long w = 0; // сколько шагов сделано ось DEC
long d = 0; // сколько должно быть шагов дв1
long d2 = 0; // сколько должно быть шагов дв2
int h = 0; // координаты RA, часы
int m = 0; // координаты RA, минуты
int dec = 0; // координаты DEC,градусы
int dec2 = 0; // координаты DEC, минуты
long q1 = 0; // количество минут, на которое надо повернуть ось RA
long w1 = 0; // количество минут, на которое надо повернуть ось DEC
void setup() {
lcd.begin(16, 2); // у дисплея 16 столбцов и 2 строки
lcd.setCursor(0,0);
lcd.print(b); // не нужно
// Настраиваем нужные контакты на выход
pinMode(stepPin, OUTPUT); // этот пин даёт команду сделать шаг двигателю1
pinMode(directionPin, OUTPUT); // этот пин даёт команду выбрать направление вращения двигателя1
pinMode(enablePin, OUTPUT); // этот пин управляет питанием двигателя1
pinMode(stepPin2, OUTPUT); // шаг двиг2
pinMode(directionPin2, OUTPUT); // направление вращения двиг2
pinMode(enablePin2, OUTPUT); // питание двиг2
}
// далее идёт цикл программы
void loop() {
float voltage = analogRead(A0) / 1024.0; // высчитываем напряжение с кнопок
lcd.setCursor(0, 1); // ставим курсор дисплея на 0 столбец, 1 строка
lcd.print(voltage, 2); // печатаем напряжение идущее с кнопок
// обучаем контроллер понимать клики кнопок
// каждая из кнопок при нажатии подаёт напряжение на пин A0 через отдельный резистор
// у меня получилось так: кн1 = 1.00 вольт , кн2=0.5в, кн3=0.91в, кн4=0.33в, и кн5=0.83в
//напряжение зависит от номинала резисторов
bool clic1 = (voltage > 0.95 && voltage < 1.05); // если напряжение находится в пределах от 0.95 до 1.05
bool clic2 = (voltage > 0.45 && voltage < 0.55); // аналогично
bool clic3 = (voltage > 0.87 && voltage < 0.95); // аналогично
bool clic4 = (voltage > 0.3 && voltage < 0.38); // аналогично
bool clic5 = (voltage > 0.80 && voltage < 0.85); // аналогично
bool neclic = (voltage < 0.05); // если кнопки отпущены - работает стягивающий резистор и на пине "A0" ноль вольт
// в таком варианте одновременно несколько кнопок работать не могут :(
// если кнопка только что отпущена,замедляем и останавливаем первый или второй двигатель
if(neclic) {
/* // слежение :
digitalWrite(enablePin, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin, HIGH); // Задаём направление вращения вправо
digitalWrite(stepPin, HIGH); // делаем шаг
delay(20);
analogWrite(enablePin, 100);
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(q); // печатаем количество шагов дв 1
delay(980); */
digitalWrite(stepPin, LOW); // не делаем шаг
digitalWrite(enablePin, LOW); // выключаем двигатель 1
digitalWrite(stepPin2, LOW); // не подаём питание на след. обмотку дв2
digitalWrite(enablePin2, LOW); // выключаем двигатель 2
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(q); // выводим на дисплей сделанное кол-во шагов
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(5, 0);
lcd.print(m); // печатаем координаты в минутах (ось RA)
lcd.setCursor(2, 0);
lcd.print(" ");
lcd.setCursor(2, 0);
lcd.print(h); // печатаем координаты в часах ( ось RA)
lcd.setCursor(10, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(w); // печатаем сделанное кол-во шагов (ось DEC)
lcd.setCursor(5, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.print(dec); // печатаем координаты в градусах (ось DEC)
lcd.setCursor(7, 1);
lcd.print(" ");
lcd.setCursor(7, 1);
lcd.print(dec2); // и печатаем в минутах (ось DEC)
}
// если кнопка 1 нажата, прибавляем часы (ось RA)
if(clic1) { // если клик кнопка 1
h = h + 1 ; // при нажатии кнопки прибавляем час
if(h >= 24) h = 0; // если 24 часа, обнуляем
delay(100); // ждём
lcd.setCursor(2, 0);
lcd.print(" ");
lcd.setCursor(2, 0);
lcd.print(h); // печатаем координаты в часах (ось RA)
}
// если кнопка 2 нажата, прибавляем минуты (ось RA)
if(clic2) {
m = m + 1; // при нажатии кнопки прибавляется 1 минута (ось RA)
if(m >= 60) { m = 0 ; h = h + 1; } // если минут больше 60,обнуляем минуты прибавляем час
if(h >= 24) h = 0; // если часов 24, обнуляем часы
delay(100); // пауза
lcd.setCursor(5, 0); // выставляем курсор на дисплее
lcd.print(" "); // затираем это место на дисплее
lcd.setCursor(5, 0); // возвращаем курсор
lcd.print(m); // печатаем минуты (координаты RA)
lcd.setCursor(2, 0); // выбрали место на дисплее
lcd.print(" "); // очистили этот участок
lcd.setCursor(2, 0); // вернули курсор
lcd.print(h); // печатаем часы (координаты RA)
}
// если кнопка 3 нажата, прибавляем градусы (ось DEC)
if(clic3) { // если клик кнопка3
dec = dec + 1; // прибавляем один градус (ось DEC )
if (dec >= 90) dec = 0; // если градус больше 90, обнуляем
delay(100); // ждем
lcd.setCursor(5, 1); // выбрали столбец и строку
lcd.print(" "); // очистили место на дисплее
lcd.setCursor(5, 1); // вернули курсор
lcd.print(dec); // печатаем градус на дисплее (ось DEC)
}
// если кнопка 4 нажата,прибавляем минуты в градусах
if(clic4) { // клик 4 кнопка
dec2 = dec2 + 1; // прибавляем минуты (ось DEC)
if (dec2 >= 60) { dec2 = 0; dec = dec + 1; } // если минут стало 60,обнуляем минуты и добавляем к градусу 1
if (dec >= 90) dec = 0; // если больше 90,обнуляем
delay(100); // пауза против дребезга
lcd.setCursor(7, 1); // выбрали столбец и строку
lcd.print(" "); // затёрли
lcd.setCursor(7, 1); // выбрали столбец и строку
lcd.print(dec2); // печатаем минуты (ось DEC)
lcd.setCursor(5, 1); // выбрали столбец и строку
lcd.print(" "); // очистили место
lcd.setCursor(5, 1); // снова выбрали
lcd.print(dec); // печатаем градусы (ось DEC)
}
// если клик 5 000000000000000000000000000000000000000000000000000000000000000000000000000
if(clic5 && d > q) { // если клик кнопки5, и заданное кол-во шагов больше сделанного, то:
shagov = d - q; // из заданного кол-ва шагов вычитаем сделанное кол-во шагов
for( int i = 0; i < shagov; ++i) { // счетчик шагов
digitalWrite(enablePin, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin, HIGH); // Задаём направление вращения вправо
digitalWrite(stepPin, HIGH); // подаётся питпние на след обмотку
delay(times); // ждём
digitalWrite(stepPin, LOW); // не подаём питание на след обмотку
q = q + 1; // записываем сделанный шаг
}
}
if(clic5 && d < q) { // если мы возвращаемся на некоторое кол-во шагов назад, то...:
shagov = q - d; // вычитаем из сделанного кол-ва шагов нужное кол-во шагов
for( int i = 0; i < shagov; ++i) {
digitalWrite(enablePin, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin, LOW); // Задаём направление вращения вправо
digitalWrite(stepPin, HIGH); // подаётся питпние на след обмотку
delay(times); // ждём
digitalWrite(stepPin, LOW); // не подаём питание на след обмотку
q = q - 1; // вычитаем один шаг
}
}
if(clic5 && d2 > w) { // если шагаем на некоторое кол-во шагов вперед, то:
shagov = d2 - w; // вычитаем из нужного кол-ва шагов сделанное кол-во шагов
for( int i = 0; i < shagov; ++i) {
digitalWrite(enablePin2, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin2, HIGH); // Задаём направление вращения вправо
digitalWrite(stepPin2, HIGH); // подаётся питпние на след обмотку
delay(times); // ждём
digitalWrite(stepPin2, LOW); // не подаём питание на след обмотку
w = w + 1; // записываем сделанный шаг
}
}
if(clic5 && d2 < w) { // если клик, и нужное кол-во шагов меньше сделанного, то:
shagov = w - d2; // из сделанного кол-ва шагов вычитаем нужное кол-во шагов
for( int i = 0; i < shagov; ++i) { // счётчик шагов
digitalWrite(enablePin2, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin2, LOW); // Задаём направление вращения вправо
digitalWrite(stepPin2, HIGH); // подаётся питпние на след обмотку
delay(times); // ждём
digitalWrite(stepPin2, LOW); // не подаём питание на след обмотку
w = w - 1; // вычитаем один шаг
}
}
q1 = (h * 60) + m; // количество минут, на которое надо повернуть ось RA
d = map(q1, 0, 1440, 0, 86165); // превращаем минуты в шаги (ось RA)
w1 = (dec * 60) + dec2; // количество минут, на которое надо повернуть ось DEC
d2 = map(w1, 0, 5400, 0, 324000); // преврвшаем минуты в шаги (ось DEC)
}
// эх, как не хватает ещё кнопок :( ну ничего, добавим.
// как осуществить плавный старт и плавный стоп пока не знаю.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
Я пока не пробовал собирать скетчи, но беглый гугл выдает на впорос "arduino sketch functions" такое. Суть в том, чтобы собрать функцию с парой петель внутри.Владислав писал(а): Подскажите ,как осуществить плавный разгон. Какую функцию использовать ? И ещё проблема - двигатели наводятся по очереди, вместе не хотят,хоть убей.
Для плавного старта в начале функции запускаем вращение на низкой скорости и крутим N оборотов, далее переходим на следующий уровень и крутим быстрее и все это в одной функции.
А вот сколько шагов нужно проскочить между нулем оборотов и максимальной скоростью - либо гуглить, либо проверять опытным путем.
Важно, чтобы плата+контроллер не пропускали шаги и не тормозили (интервал между шагами должен быть выверенный), иначе скорости не будет.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
Re: Помогите с эл.приводом !!!
Спасибо!
Отлично, плавный старт и стоп теперь есть. Пришлось добавить в скетч 80 строчек. Наверно это не совсем разумный подход,но главное работает.
И по прежнему движки наводятся по очереди.Не знаю как это исправить.
Количество шагов можно легко изменить под любой редуктор и двигатель
Отлично, плавный старт и стоп теперь есть. Пришлось добавить в скетч 80 строчек. Наверно это не совсем разумный подход,но главное работает.
И по прежнему движки наводятся по очереди.Не знаю как это исправить.
Количество шагов можно легко изменить под любой редуктор и двигатель
Код: Выделить всё
// Управление двумя шаговыми двигателями с плавным ускорением и замедлением
// Скетч составил Савельев Владислав Сергеевич "нуб"
#include <LiquidCrystal.h> // библиотека дисплея
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); // назначеные пины для дисплея
// драйверы Troyka-Stepper для шаговиков подключены через плату расширения(Troyka Shield) к следующим пинам:
const byte stepPin = 7; // сделать шаг
const byte directionPin = 1; // направление
const byte enablePin = 6; // питание
const byte stepPin2 = 2; // сделать шаг
const byte directionPin2 = 4; // направление
const byte enablePin2 = 5; // питание
// задаём переменные:
long shagov = 0; // количество шагов
int times = 0; // задержка шага
int b = 0; // переменная которая печатается на экран
long q = 0; // сколько шагов сделано ось RA
long w = 0; // сколько шагов сделано ось DEC
long d = 0; // сколько должно быть шагов дв1
long d2 = 0; // сколько должно быть шагов дв2
int h = 0; // координаты RA, часы
int m = 0; // координаты RA, минуты
int dec = 0; // координаты DEC,градусы
int dec2 = 0; // координаты DEC, минуты
long q1 = 0; // количество минут, на которое надо повернуть ось RA
long w1 = 0; // количество минут, на которое надо повернуть ось DEC
void setup() {
lcd.begin(16, 2); // у дисплея 16 столбцов и 2 строки
lcd.setCursor(0,0);
lcd.print(b); // не нужно
// Настраиваем нужные контакты на выход
pinMode(stepPin, OUTPUT); // этот пин даёт команду сделать шаг двигателю1
pinMode(directionPin, OUTPUT); // этот пин даёт команду выбрать направление вращения двигателя1
pinMode(enablePin, OUTPUT); // этот пин управляет питанием двигателя1
pinMode(stepPin2, OUTPUT); // шаг двиг2
pinMode(directionPin2, OUTPUT); // направление вращения двиг2
pinMode(enablePin2, OUTPUT); // питание двиг2
}
// далее идёт цикл программы
void loop() {
float voltage = analogRead(A0) / 1024.0; // высчитываем напряжение с кнопок
lcd.setCursor(0, 1); // ставим курсор дисплея на 0 столбец, 1 строка
lcd.print(voltage, 2); // печатаем напряжение идущее с кнопок
// обучаем контроллер понимать клики кнопок
// каждая из кнопок при нажатии подаёт напряжение на пин A0 через отдельный резистор
// у меня получилось так: кн1 = 1.00 вольт , кн2=0.5в, кн3=0.91в, кн4=0.33в, и кн5=0.83в
//напряжение зависит от номинала резисторов
bool clic1 = (voltage > 0.95 && voltage < 1.05); // если напряжение находится в пределах от 0.95 до 1.05
bool clic2 = (voltage > 0.45 && voltage < 0.55); // аналогично
bool clic3 = (voltage > 0.87 && voltage < 0.95); // аналогично
bool clic4 = (voltage > 0.3 && voltage < 0.38); // аналогично
bool clic5 = (voltage > 0.80 && voltage < 0.85); // аналогично
bool neclic = (voltage < 0.05); // если кнопки отпущены - работает стягивающий резистор и на пине "A0" ноль вольт
// в таком варианте одновременно несколько кнопок работать не могут :(
// если кнопка только что отпущена,замедляем и останавливаем первый или второй двигатель
if(neclic) {
/* // слежение :
digitalWrite(enablePin, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin, HIGH); // Задаём направление вращения вправо
digitalWrite(stepPin, HIGH); // делаем шаг
delay(20);
analogWrite(enablePin, 100);
q = q + 1;
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(q); // печатаем количество шагов дв 1
delay(980); */
digitalWrite(stepPin, LOW); // не делаем шаг
digitalWrite(enablePin, LOW); // выключаем двигатель 1
digitalWrite(stepPin2, LOW); // не подаём питание на след. обмотку дв2
digitalWrite(enablePin2, LOW); // выключаем двигатель 2
lcd.setCursor(10, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(q); // выводим на дисплей сделанное кол-во шагов
lcd.setCursor(5, 0);
lcd.print(" ");
lcd.setCursor(5, 0);
lcd.print(m); // печатаем координаты в минутах (ось RA)
lcd.setCursor(2, 0);
lcd.print(" ");
lcd.setCursor(2, 0);
lcd.print(h); // печатаем координаты в часах ( ось RA)
lcd.setCursor(10, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
lcd.print(w); // печатаем сделанное кол-во шагов (ось DEC)
lcd.setCursor(5, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.print(dec); // печатаем координаты в градусах (ось DEC)
lcd.setCursor(7, 1);
lcd.print(" ");
lcd.setCursor(7, 1);
lcd.print(dec2); // и печатаем в минутах (ось DEC)
}
// если кнопка 1 нажата, прибавляем часы (ось RA)
if(clic1) { // если клик кнопка 1
h = h + 1 ; // при нажатии кнопки прибавляем час
if(h >= 24) h = 0; // если 24 часа, обнуляем
delay(100); // ждём
lcd.setCursor(2, 0);
lcd.print(" ");
lcd.setCursor(2, 0);
lcd.print(h); // печатаем координаты в часах (ось RA)
}
// если кнопка 2 нажата, прибавляем минуты (ось RA)
if(clic2) {
m = m + 1; // при нажатии кнопки прибавляется 1 минута (ось RA)
if(m >= 60) { m = 0 ; h = h + 1; } // если минут больше 60,обнуляем минуты прибавляем час
if(h >= 24) h = 0; // если часов 24, обнуляем часы
delay(100); // пауза
lcd.setCursor(5, 0); // выставляем курсор на дисплее
lcd.print(" "); // затираем это место на дисплее
lcd.setCursor(5, 0); // возвращаем курсор
lcd.print(m); // печатаем минуты (координаты RA)
lcd.setCursor(2, 0); // выбрали место на дисплее
lcd.print(" "); // очистили этот участок
lcd.setCursor(2, 0); // вернули курсор
lcd.print(h); // печатаем часы (координаты RA)
}
// если кнопка 3 нажата, прибавляем градусы (ось DEC)
if(clic3) { // если клик кнопка3
dec = dec + 1; // прибавляем один градус (ось DEC )
if (dec >= 90) dec = 0; // если градус больше 90, обнуляем
delay(100); // ждем
lcd.setCursor(5, 1); // выбрали столбец и строку
lcd.print(" "); // очистили место на дисплее
lcd.setCursor(5, 1); // вернули курсор
lcd.print(dec); // печатаем градус на дисплее (ось DEC)
}
// если кнопка 4 нажата,прибавляем минуты в градусах
if(clic4) { // клик 4 кнопка
dec2 = dec2 + 1; // прибавляем минуты (ось DEC)
if (dec2 >= 60) { dec2 = 0; dec = dec + 1; } // если минут стало 60,обнуляем минуты и добавляем к градусу 1
if (dec >= 90) dec = 0; // если больше 90,обнуляем
delay(100); // пауза против дребезга
lcd.setCursor(7, 1); // выбрали столбец и строку
lcd.print(" "); // затёрли
lcd.setCursor(7, 1); // выбрали столбец и строку
lcd.print(dec2); // печатаем минуты (ось DEC)
lcd.setCursor(5, 1); // выбрали столбец и строку
lcd.print(" "); // очистили место
lcd.setCursor(5, 1); // снова выбрали
lcd.print(dec); // печатаем градусы (ось DEC)
}
// если клик 5 000000000000000000000000000000000000000000000000000000000000000000000000000
if(clic5 && d > q) { // если клик кнопки5, и заданное кол-во шагов больше сделанного, то:
times = 20;
shagov = d - q; // из заданного кол-ва шагов вычитаем сделанное кол-во шагов
for( int i = 0; i < shagov; ++i) { // счетчик шагов
digitalWrite(enablePin, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin, HIGH); // Задаём направление вращения вправо
digitalWrite(stepPin, HIGH); // подаётся питпние на след обмотку
delay(times); // ждём
if(i >0 && i <1) times = 20;
if(i >1&& i <2) times = 19;
if(i >2&& i <3) times = 18;
if(i >3&& i < 4) times = 17;
if(i >4&& i <5 ) times = 16;
if(i >5&& i <6 ) times = 15;
if(i >6&& i <7) times = 14;
if(i >7&& i <8 ) times = 13;
if(i >8&& i <10 ) times = 12;
if(i >10&& i <14 ) times = 11;
if(i >14&& i <18 ) times = 10;
if(i >18&& i <22 ) times = 9;
if(i >22&& i <26 ) times = 8;
if(i >26&& i <30 ) times = 7;
if(i >30&& i <34 ) times = 6;
if(i >34&& i <38 ) times = 5;
if(i >38&& i <44 ) times = 4;
if(i >44&& i <54 ) times = 3;
if(i >54&& i <69 ) times = 2;
if(i >69&& i <89 ) times = 1;
if(times <= 1) times = 1;
if(i > shagov - 89&& i < shagov - 69) times = 1;
if(i > shagov - 69 && i < shagov - 54 ) times = 2;
if(i > shagov - 54 && i < shagov - 44) times = 3;
if(i > shagov - 44 && i < shagov - 38 ) times = 4;
if(i > shagov - 38 && i < shagov - 34 ) times = 5;
if(i > shagov - 34 && i < shagov - 30 ) times = 6;
if(i > shagov - 30 && i < shagov - 26 ) times = 7;
if(i > shagov - 26 && i < shagov - 22 ) times = 8;
if(i > shagov - 22 && i < shagov - 18 ) times = 9;
if(i > shagov - 18 && i < shagov -14 ) times = 10;
if(i > shagov - 14 && i < shagov - 10) times = 11;
if(i > shagov - 10 && i < shagov - 8) times = 12;
if(i > shagov - 8 && i < shagov - 7 ) times = 13;
if(i > shagov - 7 && i < shagov - 6 ) times = 14;
if(i > shagov - 6 && i < shagov - 5 ) times = 15;
if(i > shagov - 5 && i < shagov - 4 ) times = 16;
if(i > shagov - 4 && i < shagov - 3 ) times = 17;
if(i > shagov - 3 && i < shagov - 2 ) times = 18;
if(i > shagov - 2 && i < shagov - 1 ) times = 19;
if(i > shagov - 1 && i < shagov - 0 ) times = 20;
digitalWrite(stepPin, LOW); // не подаём питание на след обмотку
q = q + 1; // записываем сделанный шаг
}
}
if(clic5 && d < q) { // если мы возвращаемся на некоторое кол-во шагов назад, то:
times = 20;
shagov = q - d; // вычитаем из сделанного кол-ва шагов нужное кол-во шагов
for( int i = 0; i < shagov; ++i) {
digitalWrite(enablePin, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin, LOW); // Задаём направление вращения вправо
digitalWrite(stepPin, HIGH); // подаётся питпние на след обмотку
delay(times); // ждём
if(i >0 && i <1) times = 20;
if(i >1&& i <2) times = 19;
if(i >2&& i <3) times = 18;
if(i >3&& i < 4) times = 17;
if(i >4&& i <5 ) times = 16;
if(i >5&& i <6 ) times = 15;
if(i >6&& i <7) times = 14;
if(i >7&& i <8 ) times = 13;
if(i >8&& i <10 ) times = 12;
if(i >10&& i <14 ) times = 11;
if(i >14&& i <18 ) times = 10;
if(i >18&& i <22 ) times = 9;
if(i >22&& i <26 ) times = 8;
if(i >26&& i <30 ) times = 7;
if(i >30&& i <34 ) times = 6;
if(i >34&& i <38 ) times = 5;
if(i >38&& i <44 ) times = 4;
if(i >44&& i <54 ) times = 3;
if(i >54&& i <69 ) times = 2;
if(i >69&& i <89 ) times = 1;
if(times <= 1) times = 1;
if(i > shagov - 89&& i < shagov - 69) times = 1;
if(i > shagov - 69 && i < shagov - 54 ) times = 2;
if(i > shagov - 54 && i < shagov - 44) times = 3;
if(i > shagov - 44 && i < shagov - 38 ) times = 4;
if(i > shagov - 38 && i < shagov - 34 ) times = 5;
if(i > shagov - 34 && i < shagov - 30 ) times = 6;
if(i > shagov - 30 && i < shagov - 26 ) times = 7;
if(i > shagov - 26 && i < shagov - 22 ) times = 8;
if(i > shagov - 22 && i < shagov - 18 ) times = 9;
if(i > shagov - 18 && i < shagov -14 ) times = 10;
if(i > shagov - 14 && i < shagov - 10) times = 11;
if(i > shagov - 10 && i < shagov - 8) times = 12;
if(i > shagov - 8 && i < shagov - 7 ) times = 13;
if(i > shagov - 7 && i < shagov - 6 ) times = 14;
if(i > shagov - 6 && i < shagov - 5 ) times = 15;
if(i > shagov - 5 && i < shagov - 4 ) times = 16;
if(i > shagov - 4 && i < shagov - 3 ) times = 17;
if(i > shagov - 3 && i < shagov - 2 ) times = 18;
if(i > shagov - 2 && i < shagov - 1 ) times = 19;
if(i > shagov - 1 && i < shagov - 0 ) times = 20;
digitalWrite(stepPin, LOW); // не подаём питание на след обмотку
q = q - 1; // вычитаем один шаг
}
}
if(clic5 && d2 > w) { // если шагаем на некоторое кол-во шагов вперед, то:
times = 20;
shagov = d2 - w; // вычитаем из нужного кол-ва шагов сделанное кол-во шагов
for( int i = 0; i < shagov; ++i) {
digitalWrite(enablePin2, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin2, HIGH); // Задаём направление вращения вправо
digitalWrite(stepPin2, HIGH); // подаётся питпние на след обмотку
delay(times); // ждём
if(i >0 && i <1) times = 20;
if(i >1&& i <2) times = 19;
if(i >2&& i <3) times = 18;
if(i >3&& i < 4) times = 17;
if(i >4&& i <5 ) times = 16;
if(i >5&& i <6 ) times = 15;
if(i >6&& i <7) times = 14;
if(i >7&& i <8 ) times = 13;
if(i >8&& i <10 ) times = 12;
if(i >10&& i <14 ) times = 11;
if(i >14&& i <18 ) times = 10;
if(i >18&& i <22 ) times = 9;
if(i >22&& i <26 ) times = 8;
if(i >26&& i <30 ) times = 7;
if(i >30&& i <34 ) times = 6;
if(i >34&& i <38 ) times = 5;
if(i >38&& i <44 ) times = 4;
if(i >44&& i <54 ) times = 3;
if(i >54&& i <69 ) times = 2;
if(i >69&& i <89 ) times = 1;
if(times <= 1) times = 1;
if(i > shagov - 89&& i < shagov - 69) times = 1;
if(i > shagov - 69 && i < shagov - 54 ) times = 2;
if(i > shagov - 54 && i < shagov - 44) times = 3;
if(i > shagov - 44 && i < shagov - 38 ) times = 4;
if(i > shagov - 38 && i < shagov - 34 ) times = 5;
if(i > shagov - 34 && i < shagov - 30 ) times = 6;
if(i > shagov - 30 && i < shagov - 26 ) times = 7;
if(i > shagov - 26 && i < shagov - 22 ) times = 8;
if(i > shagov - 22 && i < shagov - 18 ) times = 9;
if(i > shagov - 18 && i < shagov -14 ) times = 10;
if(i > shagov - 14 && i < shagov - 10) times = 11;
if(i > shagov - 10 && i < shagov - 8) times = 12;
if(i > shagov - 8 && i < shagov - 7 ) times = 13;
if(i > shagov - 7 && i < shagov - 6 ) times = 14;
if(i > shagov - 6 && i < shagov - 5 ) times = 15;
if(i > shagov - 5 && i < shagov - 4 ) times = 16;
if(i > shagov - 4 && i < shagov - 3 ) times = 17;
if(i > shagov - 3 && i < shagov - 2 ) times = 18;
if(i > shagov - 2 && i < shagov - 1 ) times = 19;
if(i > shagov - 1 && i < shagov - 0 ) times = 20;
digitalWrite(stepPin2, LOW); // не подаём питание на след обмотку
w = w + 1; // записываем сделанный шаг
}
}
if(clic5 && d2 < w) { // если клик, и нужное кол-во шагов меньше сделанного, то:
times = 20;
shagov = w - d2; // из сделанного кол-ва шагов вычитаем нужное кол-во шагов
for( int i = 0; i < shagov; ++i) { // счётчик шагов
digitalWrite(enablePin2, HIGH); // Подаём питание на двигатель
digitalWrite(directionPin2, LOW); // Задаём направление вращения вправо
digitalWrite(stepPin2, HIGH); // подаётся питпние на след обмотку
delay(times); // ждём
if(i >0 && i <1) times = 20;
if(i >1&& i <2) times = 19;
if(i >2&& i <3) times = 18;
if(i >3&& i < 4) times = 17;
if(i >4&& i <5 ) times = 16;
if(i >5&& i <6 ) times = 15;
if(i >6&& i <7) times = 14;
if(i >7&& i <8 ) times = 13;
if(i >8&& i <10 ) times = 12;
if(i >10&& i <14 ) times = 11;
if(i >14&& i <18 ) times = 10;
if(i >18&& i <22 ) times = 9;
if(i >22&& i <26 ) times = 8;
if(i >26&& i <30 ) times = 7;
if(i >30&& i <34 ) times = 6;
if(i >34&& i <38 ) times = 5;
if(i >38&& i <44 ) times = 4;
if(i >44&& i <54 ) times = 3;
if(i >54&& i <69 ) times = 2;
if(i >69&& i <89 ) times = 1;
if(times <= 1) times = 1;
if(i > shagov - 89&& i < shagov - 69) times = 1;
if(i > shagov - 69 && i < shagov - 54 ) times = 2;
if(i > shagov - 54 && i < shagov - 44) times = 3;
if(i > shagov - 44 && i < shagov - 38 ) times = 4;
if(i > shagov - 38 && i < shagov - 34 ) times = 5;
if(i > shagov - 34 && i < shagov - 30 ) times = 6;
if(i > shagov - 30 && i < shagov - 26 ) times = 7;
if(i > shagov - 26 && i < shagov - 22 ) times = 8;
if(i > shagov - 22 && i < shagov - 18 ) times = 9;
if(i > shagov - 18 && i < shagov -14 ) times = 10;
if(i > shagov - 14 && i < shagov - 10) times = 11;
if(i > shagov - 10 && i < shagov - 8) times = 12;
if(i > shagov - 8 && i < shagov - 7 ) times = 13;
if(i > shagov - 7 && i < shagov - 6 ) times = 14;
if(i > shagov - 6 && i < shagov - 5 ) times = 15;
if(i > shagov - 5 && i < shagov - 4 ) times = 16;
if(i > shagov - 4 && i < shagov - 3 ) times = 17;
if(i > shagov - 3 && i < shagov - 2 ) times = 18;
if(i > shagov - 2 && i < shagov - 1 ) times = 19;
if(i > shagov - 1 && i < shagov - 0 ) times = 20;
digitalWrite(stepPin2, LOW); // не подаём питание на след обмотку
w = w - 1; // вычитаем один шаг
}
}
q1 = (h * 60) + m; // количество минут, на которое надо повернуть ось RA
d = map(q1, 0, 1440, 0, 86165); // превращаем минуты в шаги (ось RA) 86165 шагов.Можно выбрать любое разрешение
w1 = (dec * 60) + dec2; // количество минут, на которое надо повернуть ось DEC
d2 = map(w1, 0, 5400, 0, 81000); // преврвшаем минуты в шаги (ось DEC) 81000 шагов.Можно выбрать любое разрешение
}
// эх, как не хватает ещё кнопок :( ну ничего, добавим.
// отлично! теперь есть плавный старт.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.
Re: Помогите с эл.приводом !!!
У вас 26я строка начинается с пробела, о там не лишний?
Я таки подозреваю, что чтобы можно было рулить двумя движками сразу - нужно рулить ими из одной функции. Т.е. пишите кусок кода для руления двумя движками сразу. Когда нужно рулить одним - функции передаются переменные - (1, 0), двумя - (1, 1) и тд.
Беглое гугление "arduino uno two stepper motors in a same time" дает такое. В первом ответе есть пример кода как раз и дальше вроде что то есть.
Пожалуйста продолжайте, мне самому жутко интересен такой проект.
Строки 178-218, 233-273 и прочие разве нельзя завернуть в петлю? Я конечно понимаю, что:pinMode(stepPin, OUTPUT); // этот пин даёт команду сделать шаг двигателю1
но все же!Отлично, плавный старт и стоп теперь есть. Пришлось добавить в скетч 80 строчек. Наверно это не совсем разумный подход,но главное работает.
Я таки подозреваю, что чтобы можно было рулить двумя движками сразу - нужно рулить ими из одной функции. Т.е. пишите кусок кода для руления двумя движками сразу. Когда нужно рулить одним - функции передаются переменные - (1, 0), двумя - (1, 1) и тд.
Беглое гугление "arduino uno two stepper motors in a same time" дает такое. В первом ответе есть пример кода как раз и дальше вроде что то есть.
Пожалуйста продолжайте, мне самому жутко интересен такой проект.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24
Re: Помогите с эл.приводом !!!
У нас с вами строки не совпадают по номерам.
Все пробелы можно вообще убрать .Компилятор их не воспринимает. Разделяю пробелами,что бы легче читать.
Я пытался залить библиотеку для шаговых двигателей. Компилятор не принимает их,выдаёт ошибку. И решил сам программу составлять, так интересней.
Если движки будут шагать по очереди, то шагать будут в два раза медленнее. И с разгоном будут проблемы, в конце разгона начнутся пропуски.
Эти 80 строчек действительно повторяются 4 раза для разных условий. Но пока не придумал как уменьшить их количество.
Скоро начну делать модель монтировки. Из дерева.
Все пробелы можно вообще убрать .Компилятор их не воспринимает. Разделяю пробелами,что бы легче читать.
Я пытался залить библиотеку для шаговых двигателей. Компилятор не принимает их,выдаёт ошибку. И решил сам программу составлять, так интересней.
Если движки будут шагать по очереди, то шагать будут в два раза медленнее. И с разгоном будут проблемы, в конце разгона начнутся пропуски.
Эти 80 строчек действительно повторяются 4 раза для разных условий. Но пока не придумал как уменьшить их количество.
Скоро начну делать модель монтировки. Из дерева.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.