Страница 1 из 8
Помогите с эл.приводом !!!
Добавлено: 24 мар 2014, 21:00
Александр Краснодар
Уважаемые любители астрономии! Помогите с выбором эл.привода по осям монтировки. Есть готовые комплекты но как я думаю они узкоспециализированы. Предлагают шаговые двигатели но: какой момент , шаг , и т.д... Прошу дать хоть какую информацию!
Re: Помогите с эл.приводом !!!
Добавлено: 24 мар 2014, 21:37
georgievvs
Какая у вас монтировка?
Re: Помогите с эл.приводом !!!
Добавлено: 25 мар 2014, 11:08
Александр Краснодар
Монтировка самодельная. Червячное колесо 120 зубов, червяк однозаходный. Вес трубы примерно 10 кг. Спасибо!
Re: Помогите с эл.приводом !!!
Добавлено: 19 ноя 2015, 15:40
Владислав
Моя новая задумка.
Хочу построить самодельную монтировку GO TO с использованием Платы "Ардуино УНО"
Вот первые наброски:
Плата "ардуино",
плата расширения для удобства подключения,
драйверы для шаговых двигателей,
дисплей,
шаговые двигатели (0.9 градуса шаг)- они уже вертятся.
Ещё нужно добавить кнопки и плату часов реального времени.
Теперь требуется изучить язык программирования C++ ,иначе нет смысла дальше строить.
Re: Помогите с эл.приводом !!!
Добавлено: 19 ноя 2015, 16:00
Diff
Владислав, а что за двигатели (параметры, модель, цена, где брали)?
Re: Помогите с эл.приводом !!!
Добавлено: 19 ноя 2015, 17:03
Владислав
Всё купил на сайте "Амперка" цены там все есть
Шаговый двигатель 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 кг
Re: Помогите с эл.приводом !!!
Добавлено: 21 ноя 2015, 01:17
Владислав
Добавил в схему пять кнопок.
Вверх,вниз, влево, вправо.
Пятая кнопка ещё не задействована.
На данный момент удалось добиться вращения движков с использованием этих кнопок.
Кнопки подключены последовательно с сопротивлениями.В результате каждая кнопка выдает свой уровень напряжения в вольтах,которое отправляется на пин "A0".
Контроллер анализирует этот "сигнал" и выполняет соответствующую команду.
Re: Помогите с эл.приводом !!!
Добавлено: 22 ноя 2015, 23:07
a.pozharov
о, круто!
Re: Помогите с эл.приводом !!!
Добавлено: 23 ноя 2015, 12:54
marvincfs
А голову из чего планируете и в каком виде?
Re: Помогите с эл.приводом !!!
Добавлено: 23 ноя 2015, 19:45
Владислав
Корпус из алюминия будет.Экваториальная. Грузоподъёмность 5-7 кг.
Re: Помогите с эл.приводом !!!
Добавлено: 23 ноя 2015, 20:45
marvincfs
Вы планируете крутить шестерни или напрямую сажать на движки?
Я просто тоже нечто похожее думаю сделать.
Re: Помогите с эл.приводом !!!
Добавлено: 23 ноя 2015, 20:47
Владислав
Червячная пара. На движке червяк сразу
Re: Помогите с эл.приводом !!!
Добавлено: 23 ноя 2015, 22:50
marvincfs
Ну тогда микрошаги при слежении и обычные при быстром повороте не вариант?
Re: Помогите с эл.приводом !!!
Добавлено: 24 ноя 2015, 11:27
Владислав
Можно использовать обычные двигатели постоянного тока + энкодеры. И будет быстро наводиться и следить.
Re: Помогите с эл.приводом !!!
Добавлено: 24 ноя 2015, 15:38
marvincfs
Точность и скорость наведения будут хуже.
Re: Помогите с эл.приводом !!!
Добавлено: 24 ноя 2015, 16:05
Владислав
В монтировке Стар эдвенчер установлен обычный моторчик с энкодером и ведет отлично.
Re: Помогите с эл.приводом !!!
Добавлено: 24 ноя 2015, 21:03
marvincfs
Забавно, думал там шаговик, тогда можно подглядеть в
этой теме что там и как внутри.
Re: Помогите с эл.приводом !!!
Добавлено: 24 ноя 2015, 23:49
Владислав
Посмотрел темку.Фотки информативные.Там "крутые" любители астрономии. Понятное дело,для них всё более доступно.
А монтировка "Star Adventurer" похоже многим приглянулась
.
Порассуждаем
:
Надо выбрать достаточное количество шагов шагового двигателя за секунду, чтобы не было заметно дрожание изображения в телескопе.
В звёздных сутках у нас 86164,090530833 секунд. Можно округлить - 86165 сек.
Допустим, будем делать 5 шагов в секунду(может это и мало), значит 86165 секунд умножаем на 5 шагов и получается 430825 шагов за один оборот полярной оси монтировки.
У меня двигатели 0.9 градуса(400 шагов за один оборот). 430825 шагов делим на 400. Получается 1077,0625 оборотов двигателя за сутки.Округляем. Получается, у главной шестерни должно быть 1077 зубьев
.
Такую шестерню с трудом себе представляю,а если и сделать,то она будет очень большая. Делаем вывод: нужно добавить ещё шестерёнок, или уменьшить количество шагов за одну секунду жертвуя плавностью хода.
Приложил ухо к "Star Adventurer" ,слышу пять чётких тиков в секунду.Такое ощущение что там всё таки шаговик стоит, уж больно чётко тикает,а энкодер стоит для контроля и защиты механики. В общем не знаю...буду думать.
Re: Помогите с эл.приводом !!!
Добавлено: 25 ноя 2015, 09:43
marvincfs
На
stepper-online есть шаговики с планетаркой (ключевое слово "geared"). Правда отправляют "небюджетной" EMS, брал пару месяцев назад с их магазина через aliexpress обычные шаговики+плату для других целей, доставка быстрая. Тут уже встает вопрос цены, если цена не важна, а важно "собрать самому" монтировку - то стоит заморочиться.
Самому хочется заморочиться, но пока идет медленно.
Re: Помогите с эл.приводом !!!
Добавлено: 25 ноя 2015, 18:25
Владислав
Посмотрел, классно ,у них есть подходящие модели.
Re: Помогите с эл.приводом !!!
Добавлено: 09 дек 2015, 23:12
Владислав
Вымучиваю программу.Сейчас движки делают правильное кол-во шагов.Могут шагать вперёд,назад(Как бы наводят телескоп по координатам RA и DEC) и возвращаться на нольа, также сопровождать. Наводятся ну оочень долго.
Если получится сделать правильный плавный разгон, то скорость шага можно увеличить до 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)
}
// эх, как не хватает ещё кнопок :( ну ничего, добавим.
// как осуществить плавный старт и плавный стоп пока не знаю.
Re: Помогите с эл.приводом !!!
Добавлено: 09 дек 2015, 23:56
marvincfs
Владислав писал(а):
Подскажите ,как осуществить плавный разгон. Какую функцию использовать ? И ещё проблема - двигатели наводятся по очереди, вместе не хотят,хоть убей.
Я пока не пробовал собирать скетчи, но беглый гугл выдает на впорос "arduino sketch functions"
такое. Суть в том, чтобы собрать функцию с парой петель внутри.
Для плавного старта в начале функции запускаем вращение на низкой скорости и крутим N оборотов, далее переходим на следующий уровень и крутим быстрее и все это в одной функции.
А вот сколько шагов нужно проскочить между нулем оборотов и максимальной скоростью - либо гуглить, либо проверять опытным путем.
Важно, чтобы плата+контроллер не пропускали шаги и не тормозили (интервал между шагами должен быть выверенный), иначе скорости не будет.
Re: Помогите с эл.приводом !!!
Добавлено: 10 дек 2015, 19:39
Владислав
Спасибо!
Отлично, плавный старт и стоп теперь есть. Пришлось добавить в скетч 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 шагов.Можно выбрать любое разрешение
}
// эх, как не хватает ещё кнопок :( ну ничего, добавим.
// отлично! теперь есть плавный старт.
Re: Помогите с эл.приводом !!!
Добавлено: 10 дек 2015, 21:11
marvincfs
У вас 26я строка начинается с пробела, о там не лишний?
pinMode(stepPin, OUTPUT); // этот пин даёт команду сделать шаг двигателю1
Строки 178-218, 233-273 и прочие разве нельзя завернуть в петлю? Я конечно понимаю, что:
Отлично, плавный старт и стоп теперь есть. Пришлось добавить в скетч 80 строчек. Наверно это не совсем разумный подход,но главное работает.
но все же!
Я таки подозреваю, что чтобы можно было рулить двумя движками сразу - нужно рулить ими из одной функции. Т.е. пишите кусок кода для руления двумя движками сразу. Когда нужно рулить одним - функции передаются переменные - (1, 0), двумя - (1, 1) и тд.
Беглое гугление "arduino uno two stepper motors in a same time" дает
такое. В первом ответе есть пример кода как раз и дальше вроде что то есть.
Пожалуйста продолжайте, мне самому жутко интересен такой проект.
Re: Помогите с эл.приводом !!!
Добавлено: 10 дек 2015, 22:14
Владислав
У нас с вами строки не совпадают по номерам.
Все пробелы можно вообще убрать .Компилятор их не воспринимает. Разделяю пробелами,что бы легче читать.
Я пытался залить библиотеку для шаговых двигателей. Компилятор не принимает их,выдаёт ошибку. И решил сам программу составлять, так интересней.
Если движки будут шагать по очереди, то шагать будут в два раза медленнее. И с разгоном будут проблемы, в конце разгона начнутся пропуски.
Эти 80 строчек действительно повторяются 4 раза для разных условий. Но пока не придумал как уменьшить их количество.
Скоро начну делать модель монтировки. Из дерева.