Тел. (495) 972-27-12

Скетч для управления телескопом

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY

Скетч для управления телескопом

Сообщение Oleg1601 » 26 апр 2015, 11:52

Здравствуйте.
Для имеющегося телескопа хочу собрать систему управления по двум осям монтировки. Для этого приобрел Ардуино-УНО R3, два драйвера EasyDriver на a3967, джойстик и пару шаговых моторов.
Хочу сделать следующее - при помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения. Для этого, на каждую ось монтировки будет установлено по одному мотору. Плавные старт/стоп не нужны. Переменный резистор регулировки скорости не нужен - скорость будет регулироваться программно. Джойстик нужен для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки. Нажатие на кнопку джойстика (или на отдельную кнопку) - режим "стоп" для обоих моторов. Нажатие еще на одну кнопку включает/выключает один двигатель с заданной скоростью для ведения за объектом наблюдения.
Здесь, на форуме, нашел наиболее подходящую к моим требования конструкцию Панорамной головки.
viewtopic.php?f=23&t=233

С электроникой дружу, но в программировании полный ноль. Как можно изменить представленный в указанной выше теме скетч под мои требования, а именно кроме управления джойстиком 2-мя моторами (скорость и направление - это уже вроде решено автором), останавливать с одной кнопки оба мотора, а с другой кнопки старт/стоп одного двигателя в одну сторону с одной скоростью (+светодиод индикации этого режима) ?

Схема подключения.
Изображение

Купленные компоненты (на пульт внимания не обращайте - его использовать не буду)
Изображение
Жду Ваших советов!
Последний раз редактировалось Oleg1601 28 апр 2015, 15:25, всего редактировалось 2 раз(а).
Oleg1601
 
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 » 27 апр 2015, 17:51

Из темы управления панорамной головкой viewtopic.php?f=23&t=233 взял и переработал немного скетч.

Code: [Выделить всё] [Expand/Collapse]
  1. /*
  2.     Для управления ШД в программе используется библиотека AccelStepper - http://www.open.com.au/mikem/arduino/AccelStepper/index.html
  3. */
  4.  
  5.  
  6. #include <AccelStepper.h>
  7.  
  8. #define MOTOR1_DIR_PIN  8
  9. #define MOTOR2_DIR_PIN  11
  10.  
  11. #define MOTOR1_STEP_PIN 9
  12. #define MOTOR2_STEP_PIN 10
  13.  
  14. #define MOTOR1_LS_PIN 6
  15. #define MOTOR2_LS_PIN 7
  16.  
  17. #define MOTOR1_SPR 200  // Кол-во шагов на 1 оборот вала двигателя
  18. #define MOTOR2_SPR 200  
  19.  
  20. #define MOTOR1_MAX_SPEED 50000.0
  21. #define MOTOR2_MAX_SPEED 50000.0
  22.  
  23. #define MOTOR1_INIT_SPEED -200.0
  24. #define MOTOR2_INIT_SPEED 800.0
  25.  
  26. #define MOTOR1_JOY_IN 0 // Ось Y джойстика
  27. #define MOTOR2_JOY_IN 1 // Ось X джойстика
  28. #define SPEED_KNOB_IN 2 // Задатчик скорости - переменный резистор 4,7К
  29.  
  30. AccelStepper stpMotor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
  31. AccelStepper stpMotor2(AccelStepper::DRIVER, MOTOR2_STEP_PIN, MOTOR2_DIR_PIN);
  32.  
  33. int nMotor1SP, nMotor2SP;            // Задание направления от джойстика
  34. int nSpeedSP;                        // Задание скорости от задачика
  35. int nMotor1MV, nMotor2MV;  // Задание скорости после ограничителя
  36.  
  37. void setup() {                
  38.   phInit();
  39. }
  40.  
  41. void loop() {
  42.   phGetCommand();
  43.   phMotorRun();
  44. }
  45.  
  46.  
  47. void phInit()
  48. {
  49.   pinMode(MOTOR1_DIR_PIN, OUTPUT);
  50.   pinMode(MOTOR2_DIR_PIN, OUTPUT);
  51.   pinMode(MOTOR1_STEP_PIN, OUTPUT);
  52.   pinMode(MOTOR2_STEP_PIN, OUTPUT);
  53.  
  54.   pinMode(MOTOR1_LS_PIN, INPUT_PULLUP);
  55.   pinMode(MOTOR2_LS_PIN, INPUT_PULLUP);
  56.  
  57.   nMotor1MV = 0;
  58.   nMotor2MV = 0;
  59.   stpMotor1.setMaxSpeed(MOTOR1_MAX_SPEED);
  60.   stpMotor2.setMaxSpeed(MOTOR2_MAX_SPEED);
  61.   stpMotor1.setAcceleration(10.0);
  62.   stpMotor2.setAcceleration(10.0);
  63.   stpMotor1.setSpeed(0);
  64.   stpMotor2.setSpeed(0);
  65.  
  66.   stpMotor1.setSpeed(MOTOR1_INIT_SPEED);
  67.   while (digitalRead(MOTOR1_LS_PIN) != 0) {
  68.     stpMotor1.runSpeed();
  69.   }
  70.  
  71.   stpMotor1.setCurrentPosition(0);
  72.   stpMotor1.setSpeed(-MOTOR1_INIT_SPEED);
  73.   while (abs(stpMotor1.currentPosition()) < 400) {
  74.     stpMotor1.runSpeed();
  75.   }
  76.   stpMotor1.setCurrentPosition(0);
  77.   stpMotor1.setSpeed(0);
  78.  
  79.   stpMotor2.setSpeed(MOTOR2_INIT_SPEED);
  80.   while (digitalRead(MOTOR2_LS_PIN) != 0) {
  81.     stpMotor2.runSpeed();
  82.   }
  83.  
  84.   stpMotor2.setCurrentPosition(0);
  85.   stpMotor2.setSpeed(-MOTOR2_INIT_SPEED);
  86.   while (abs(stpMotor2.currentPosition()) < 2400) {
  87.     stpMotor2.runSpeed();
  88.   }
  89.   stpMotor2.setCurrentPosition(0);
  90.   stpMotor2.setSpeed(0);
  91.  
  92.   return;
  93. }
  94.  
  95. void phGetCommand()
  96. {
  97.   nMotor1SP = analogRead(MOTOR1_JOY_IN) - 512; // Ось Y джойстика
  98.   nMotor2SP = analogRead(MOTOR2_JOY_IN) - 512; // Ось X джойстика
  99.   nSpeedSP = 1023 - analogRead(SPEED_KNOB_IN);
  100.  
  101.   if (nMotor1SP > 100) {
  102.     nMotor1MV = nSpeedSP;
  103.   } else if (nMotor1SP < -100) {
  104.     nMotor1MV = -nSpeedSP;
  105.   } else {
  106.     nMotor1MV = 0;
  107.   }
  108.  
  109.   nMotor1MV = nMotor1MV / 5;
  110.  
  111.   if (nMotor2SP > 100) {
  112.     nMotor2MV = nSpeedSP;
  113.   } else if (nMotor2SP < -100) {
  114.     nMotor2MV = -nSpeedSP;
  115.   } else {
  116.     nMotor2MV = 0;
  117.   }
  118.  
  119.   nMotor2MV = nMotor2MV * -1;
  120. }
  121.  
  122. void phMotorRun()
  123. {
  124.   stpMotor1.setSpeed(nMotor1SP);  // Задаем скорость по оси Y
  125.   stpMotor2.setSpeed(nMotor2SP);  // Задаем скорость по оси X
  126.  
  127.   stpMotor1.runSpeed(); // Выполняем движение с заданной скоростью
  128.   stpMotor2.runSpeed();
  129. }
  130.  
GeSHi © Codebox Plus
Последний раз редактировалось Oleg1601 28 апр 2015, 13:53, всего редактировалось 4 раз(а).
Oleg1601
 
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 » 28 апр 2015, 11:22

Залил для тестирования, выложенный мной выше скетч - управление джойстиком не включается, пока не сработают концевики установленные на 6 и 7 контактах (схема управления Панорамной головкой). Затем моторы, скорость и направление вращения, управляются джойстиком.
Но, в процессе тестирования, было замечено, что двигатели ( режиме стоп) всё-же медленно вращаются - 1-ый против часовой стрелки (за 1,5 минуты - четверть оборота), 2-ой по часовой (четверть оборота - за 5минут).
Отчего это может быть? Что то в скетче, или из-за джойстика (утечки)?

Возникшие вопросы:
1. Как убрать из скетча концевые выключатели (а то, пока они последовательно не сработают, не включается управление джойстиком)?
2. Как устранить медленное вращение двигателей в режиме Стоп?
3. Как в скетч внести старт/стоп одного двигателя, с помощью дополнительной кнопки, в одну сторону с одной скоростью (+светодиод индикации этого режима) ?
Oleg1601
 
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Mr.Kubikus » 28 апр 2015, 14:19

Привет!

Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 881
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Скетч для управления телескопом

Сообщение Oleg1601 » 28 апр 2015, 15:23

Mr.Kubikus писал(а):Привет!

Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?

Схема есть в самом первом сообщении.
Oleg1601
 
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Oleg1601 » 28 апр 2015, 15:38

Oleg1601 писал(а):
Mr.Kubikus писал(а):Привет!

Для начала было бы интересно увидеть принципиальную схему вашей системы. Можете нарисовать на бумаге карандашом и опубликовать здесь фотку?

Схема есть в самом первом сообщении. Единственное различие - это джойстик, но его распиновка указана на схеме (GND, +5V, VrX, VrY ) и выполнена практически верно. Аналоговые контакты 4 и 5 на Ардуино - это кнопки Стоп (уже не надо, т.к. cтоп - это среднее/нейтральное положение джойстика) и Ведение (когда кнопкой запускается один двигатель, без участия джойстика).
Вот, изобразил, как смог. :)

Изображение
Oleg1601
 
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Mr.Kubikus » 28 апр 2015, 16:41

Ух ты! Отлично.

У меня еще один вопрос и можно будет перейти к коду. На схеме не хватает обозначений контактов на платах драйверов (красненькие). Можете добавить?
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 881
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Скетч для управления телескопом

Сообщение Oleg1601 » 28 апр 2015, 17:21

Вот
Изображение
Oleg1601
 
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Скетч для управления телескопом

Сообщение Mr.Kubikus » 28 апр 2015, 18:23

Хорошо. Теперь переходим, собственно, к алгоритму управления. Я немного структурировал ваши требования:

== Требования с системе управления ==

1. При помощи джойстика будут осуществляться повороты трубы телескопа (вверх/вниз, вправо/влево), для наведения.
2. Джойстик для возможности управлять скоростью вращения моторов в зависимости от угла наклона ручки.
3. Нажатие на кнопку джойстика (или на отдельную кнопку) - режим "стоп" для обоих моторов.
4. Нажатие еще на одну кнопку включает/выключает один двигатель с заданной скоростью для ведения за объектом наблюдения.

Правильно ли я все перечислил?

Теперь у меня есть несколько вопросов по вашим требованиям:

п. 3: Зачем вам нужен дополнительный сигнал для остановки моторов? Ведь, если джойстик возвращен в нейтральное положение, то моторы итак уже остановлены.
п. 4: Какой двигатель включаем "Мотор1" или ""Мотор2? Как задается скорость в этом случае?
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 881
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Скетч для управления телескопом

Сообщение Oleg1601 » 28 апр 2015, 18:47

Mr.Kubikus писал(а):п. 3: Зачем вам нужен дополнительный сигнал для остановки моторов? Ведь, если джойстик возвращен в нейтральное положение, то моторы итак уже остановлены.
п. 4: Какой двигатель включаем "Мотор1" или ""Мотор2? Как задается скорость в этом случае?

Все перечислили верно.
п.3 Все верно допсигнал Стоп не нужен.
п.4 Не принципиально - пусть будет "Мотор 1". Скорость, думал задавать вводом значений в соответствующий пункт, т.к. её нужно один раз подобрать и в дальнейшем уже менять не надо.
Oleg1601
 
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

След.

Вернуться в Arduino и Ко. ♥♥♥



Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex[bot] и гости: 1

cron