Добро пожаловать на наш астрономический форум!
Надеемся, что здесь вы сможете получить толковые ответы на свои вопросы по любительской астрономии основанные на опыте и знаниях, а не на догадках, мифах и чтении Интернета по диагонали.
Если вы решили присоединиться к нам - придерживайтесь и Вы в своих ответах этих правил

Зоны особого внимания: ЧАВО (FAQ), Обзоры оборудования и Окуляры

Помогите с эл.приводом !!!

Обсуждение всего что сделано своими руками, модернизация оборудования, телескопостроение и т.д.

Модератор: Ernest

Александр Краснодар
Сообщения: 35
Зарегистрирован: 09 мар 2014, 10:10

Помогите с эл.приводом !!!

Сообщение Александр Краснодар » 24 мар 2014, 21:00

Уважаемые любители астрономии! Помогите с выбором эл.привода по осям монтировки. Есть готовые комплекты но как я думаю они узкоспециализированы. Предлагают шаговые двигатели но: какой момент , шаг , и т.д... Прошу дать хоть какую информацию!

Аватара пользователя
georgievvs
Сообщения: 554
Зарегистрирован: 05 ноя 2013, 08:24

Re: Помогите с эл.приводом !!!

Сообщение georgievvs » 24 мар 2014, 21:37

Какая у вас монтировка?
Делай, что должен, и будь, что будет.

Александр Краснодар
Сообщения: 35
Зарегистрирован: 09 мар 2014, 10:10

Re: Помогите с эл.приводом !!!

Сообщение Александр Краснодар » 25 мар 2014, 11:08

Монтировка самодельная. Червячное колесо 120 зубов, червяк однозаходный. Вес трубы примерно 10 кг. Спасибо!

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 19 ноя 2015, 15:40

Моя новая задумка.
Хочу построить самодельную монтировку GO TO с использованием Платы "Ардуино УНО"
Вот первые наброски:
Плата "ардуино",
плата расширения для удобства подключения,
драйверы для шаговых двигателей,
дисплей,
шаговые двигатели (0.9 градуса шаг)- они уже вертятся.
Ещё нужно добавить кнопки и плату часов реального времени.
Теперь требуется изучить язык программирования C++ ,иначе нет смысла дальше строить.
Вложения
IMG_1603.JPG
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

Аватара пользователя
Diff
Сообщения: 666
Зарегистрирован: 07 ноя 2013, 12:06

Re: Помогите с эл.приводом !!!

Сообщение Diff » 19 ноя 2015, 16:00

Владислав, а что за двигатели (параметры, модель, цена, где брали)?

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

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 кг
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 21 ноя 2015, 01:17

Добавил в схему пять кнопок.
Вверх,вниз, влево, вправо.
Пятая кнопка ещё не задействована.
На данный момент удалось добиться вращения движков с использованием этих кнопок.
Кнопки подключены последовательно с сопротивлениями.В результате каждая кнопка выдает свой уровень напряжения в вольтах,которое отправляется на пин "A0".
Контроллер анализирует этот "сигнал" и выполняет соответствующую команду.
Вложения
пятьКнопок.jpg
Последний раз редактировалось Владислав 09 окт 2016, 23:38, всего редактировалось 1 раз.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

a.pozharov
Сообщения: 437
Зарегистрирован: 30 июл 2012, 08:47

Re: Помогите с эл.приводом !!!

Сообщение a.pozharov » 22 ноя 2015, 23:07

о, круто!

marvincfs
Сообщения: 402
Зарегистрирован: 16 окт 2013, 22:31

Re: Помогите с эл.приводом !!!

Сообщение marvincfs » 23 ноя 2015, 12:54

А голову из чего планируете и в каком виде?
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 23 ноя 2015, 19:45

Корпус из алюминия будет.Экваториальная. Грузоподъёмность 5-7 кг.
Последний раз редактировалось Владислав 23 ноя 2015, 20:46, всего редактировалось 1 раз.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

marvincfs
Сообщения: 402
Зарегистрирован: 16 окт 2013, 22:31

Re: Помогите с эл.приводом !!!

Сообщение marvincfs » 23 ноя 2015, 20:45

Вы планируете крутить шестерни или напрямую сажать на движки?
Я просто тоже нечто похожее думаю сделать.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 23 ноя 2015, 20:47

Червячная пара. На движке червяк сразу
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

marvincfs
Сообщения: 402
Зарегистрирован: 16 окт 2013, 22:31

Re: Помогите с эл.приводом !!!

Сообщение marvincfs » 23 ноя 2015, 22:50

Ну тогда микрошаги при слежении и обычные при быстром повороте не вариант?
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 24 ноя 2015, 11:27

Можно использовать обычные двигатели постоянного тока + энкодеры. И будет быстро наводиться и следить.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

marvincfs
Сообщения: 402
Зарегистрирован: 16 окт 2013, 22:31

Re: Помогите с эл.приводом !!!

Сообщение marvincfs » 24 ноя 2015, 15:38

Точность и скорость наведения будут хуже.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 24 ноя 2015, 16:05

В монтировке Стар эдвенчер установлен обычный моторчик с энкодером и ведет отлично.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

marvincfs
Сообщения: 402
Зарегистрирован: 16 окт 2013, 22:31

Re: Помогите с эл.приводом !!!

Сообщение marvincfs » 24 ноя 2015, 21:03

Забавно, думал там шаговик, тогда можно подглядеть в этой теме что там и как внутри.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 24 ноя 2015, 23:49

Посмотрел темку.Фотки информативные.Там "крутые" любители астрономии. Понятное дело,для них всё более доступно.
А монтировка "Star Adventurer" похоже многим приглянулась :) .
Порассуждаем :ugeek: :
Надо выбрать достаточное количество шагов шагового двигателя за секунду, чтобы не было заметно дрожание изображения в телескопе.
В звёздных сутках у нас 86164,090530833 секунд. Можно округлить - 86165 сек.
Допустим, будем делать 5 шагов в секунду(может это и мало), значит 86165 секунд умножаем на 5 шагов и получается 430825 шагов за один оборот полярной оси монтировки.
У меня двигатели 0.9 градуса(400 шагов за один оборот). 430825 шагов делим на 400. Получается 1077,0625 оборотов двигателя за сутки.Округляем. Получается, у главной шестерни должно быть 1077 зубьев :D .
Такую шестерню с трудом себе представляю,а если и сделать,то она будет очень большая. Делаем вывод: нужно добавить ещё шестерёнок, или уменьшить количество шагов за одну секунду жертвуя плавностью хода.
Приложил ухо к "Star Adventurer" ,слышу пять чётких тиков в секунду.Такое ощущение что там всё таки шаговик стоит, уж больно чётко тикает,а энкодер стоит для контроля и защиты механики. В общем не знаю...буду думать.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

marvincfs
Сообщения: 402
Зарегистрирован: 16 окт 2013, 22:31

Re: Помогите с эл.приводом !!!

Сообщение marvincfs » 25 ноя 2015, 09:43

На stepper-online есть шаговики с планетаркой (ключевое слово "geared"). Правда отправляют "небюджетной" EMS, брал пару месяцев назад с их магазина через aliexpress обычные шаговики+плату для других целей, доставка быстрая. Тут уже встает вопрос цены, если цена не важна, а важно "собрать самому" монтировку - то стоит заморочиться.
Самому хочется заморочиться, но пока идет медленно. ;)
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 25 ноя 2015, 18:25

Посмотрел, классно ,у них есть подходящие модели.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

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)
  }
    // эх, как не хватает ещё кнопок :(   ну ничего, добавим.
    // как осуществить плавный старт и плавный стоп пока не знаю.









     

Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

marvincfs
Сообщения: 402
Зарегистрирован: 16 окт 2013, 22:31

Re: Помогите с эл.приводом !!!

Сообщение marvincfs » 09 дек 2015, 23:56

Владислав писал(а): Подскажите ,как осуществить плавный разгон. Какую функцию использовать ? И ещё проблема - двигатели наводятся по очереди, вместе не хотят,хоть убей.
Я пока не пробовал собирать скетчи, но беглый гугл выдает на впорос "arduino sketch functions" такое. Суть в том, чтобы собрать функцию с парой петель внутри.
Для плавного старта в начале функции запускаем вращение на низкой скорости и крутим N оборотов, далее переходим на следующий уровень и крутим быстрее и все это в одной функции.
А вот сколько шагов нужно проскочить между нулем оборотов и максимальной скоростью - либо гуглить, либо проверять опытным путем.
Важно, чтобы плата+контроллер не пропускали шаги и не тормозили (интервал между шагами должен быть выверенный), иначе скорости не будет.
мертвый друг не предаст.
HEQ5 + SW2008(GSO Comacorr) + Ra72 + A70lf + qhy5/ Ler 3, ES 4.7, ES 8.8, ES 24

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 10 дек 2015, 19:39

Спасибо!
Отлично, плавный старт и стоп теперь есть. Пришлось добавить в скетч 80 строчек. Наверно это не совсем разумный подход,но главное работает.
И по прежнему движки наводятся по очереди.Не знаю как это исправить.
Количество шагов можно легко изменить под любой редуктор и двигатель :D

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

              //  Управление  двумя шаговыми двигателями с плавным ускорением и замедлением
    // Скетч составил Савельев Владислав Сергеевич "нуб"
#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.

marvincfs
Сообщения: 402
Зарегистрирован: 16 окт 2013, 22:31

Re: Помогите с эл.приводом !!!

Сообщение marvincfs » 10 дек 2015, 21:11

У вас 26я строка начинается с пробела, о там не лишний?
pinMode(stepPin, OUTPUT); // этот пин даёт команду сделать шаг двигателю1
Строки 178-218, 233-273 и прочие разве нельзя завернуть в петлю? Я конечно понимаю, что:
Отлично, плавный старт и стоп теперь есть. Пришлось добавить в скетч 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

Аватара пользователя
Владислав
Сообщения: 335
Зарегистрирован: 21 ноя 2013, 19:38

Re: Помогите с эл.приводом !!!

Сообщение Владислав » 10 дек 2015, 22:14

У нас с вами строки не совпадают по номерам.
Все пробелы можно вообще убрать .Компилятор их не воспринимает. Разделяю пробелами,что бы легче читать.
Я пытался залить библиотеку для шаговых двигателей. Компилятор не принимает их,выдаёт ошибку. И решил сам программу составлять, так интересней.
Если движки будут шагать по очереди, то шагать будут в два раза медленнее. И с разгоном будут проблемы, в конце разгона начнутся пропуски.
Эти 80 строчек действительно повторяются 4 раза для разных условий. Но пока не придумал как уменьшить их количество.
Скоро начну делать модель монтировки. Из дерева.
Зеркальный 130/650;линзовый ED66/400;бинокль 10*50.

Ответить