Управление телескопом кнопками через Arduino

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
inv-h
Сообщения: 5
Зарегистрирован: 02 июн 2015, 10:11

Управление телескопом кнопками через Arduino

Сообщение inv-h »

Здравствуйте! Я тут новичок и меня заинтересовала схема управления телескопом. Только начал разбираться с программированием, и хочу собрать управление для своего телескопа. Есть Ардуино, моторизированый привод для 2х осей и мощный драйвер для ШД. Вопрос в следующем, как приладить простые кнопки "Верх", "Вниз", "Вправо", "Влево".
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1018
Зарегистрирован: 22 окт 2010, 23:57

Re: Управление телескопом кнопками через Arduino

Сообщение Mr.Kubikus »

Привет!

Я вынес ваш вопрос в отдельную тему чтобы было проще искать.

Скажите, а у вас Arduino уже используется для управления телескопом?
С уважением, Григорий
GitHub FB ВК
inv-h
Сообщения: 5
Зарегистрирован: 02 июн 2015, 10:11

Re: Управление телескопом кнопками через Arduino

Сообщение inv-h »

Нет, через Arduino телескопом не управлял. Я пробовал управлять вручную из программ для ЧПУ. Arduino я хочу попробовать приладить к астономической программе типа Star Calc, чтоб можно было наводить прямо из программы. В инете готовых открытых проектов я не нашел, поэтому пытаюсть сам разобраться. Опыта по программированию для Arduino пока нет, но есть опыт написания программ на асемблере для PIC.
inv-h
Сообщения: 5
Зарегистрирован: 02 июн 2015, 10:11

Re: Управление телескопом кнопками через Arduino

Сообщение inv-h »

Маленько приходит понимание процесса. Нашел интересный скетеч для управления станком ЧПУ, хочу к нему приладить кнопки управления. Опыта маловато, поэтому не могу вкурить как приделат потенциометр на скорость перемещения. Программка принимает данные с COM порта в формате X,Y,Z,F; ( XYZ количество шагов, F скорость) и выдает сигналы STEP\DIR.
Вот скетч и схемка:

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

iint a = 0;
int pin;
int b, f = 0;
int readButtons (int pin);
int potpin = 0;
int valr;
int motorPins[3][2] = {{8, 9}, {10, 11}, {12, 13}};
int count;
int count2[3] = {0, 0, 0};
int val = 0;
int rot = 0;
int incomingByte = 0;
int sign = 1;
long delayTime;

//Процедура настройки прошивки
void setup() {
  int i;
  Serial.begin(9600);  //Эта скорость должна совпадать со скоростью, установленной в программе

  for (i = 0; i < 3; i++) {
    for (count = 0; count < 2; count++) {
      pinMode(motorPins[i][count], OUTPUT); //установка режима работы цифровых pin'ов Ардуино

      pinMode (A4, INPUT);
      pinMode (A5, INPUT);
      // pinMode (led, OUTPUT);

    }
  }
  delayTime = 2000;
}

//Поворот двигателя с номерм sm на один шаг вперёд
void moveForward(int sm) {
  digitalWrite(motorPins[sm][1], HIGH); //Задаём направление
  digitalWrite(motorPins[sm][0], HIGH);
  digitalWrite(motorPins[sm][0], LOW);
}

//Поворот двигателя с номерм sm на один шаг назад
void moveBackward(int sm) {
  digitalWrite(motorPins[sm][1], LOW);
  digitalWrite(motorPins[sm][0], HIGH);
  digitalWrite(motorPins[sm][0], LOW);
}

//Задержка в микосекундах
void delayMicros(long wt) {
  unsigned long mls;
  unsigned int mks;

  mls = (unsigned long)(wt / 1000);
  mks = (unsigned int)(wt % 1000);
  if (mls > 0) delay(mls);
  if (mks > 0) delayMicroseconds(mks);
}

//Одновременный поворот двигателей 0, 1, 2 на x, y, z шагов соответственно
void MoveSM(long x, long y, long z) {
  long c[3], c2[3];
  double c1[3], d[3];
  long m, i;
  boolean flg;

  c[0] = x;
  c[1] = y;
  c[2] = z;

  m = 1;
  for (i = 0; i < 3; i++) {
    if (m < abs(c[i])) m = abs(c[i]);
  }

  for (i = 0; i < 3; i++) {
    c1[i] = 0;
    d[i] = 1.0 * c[i] / m;
    c2[i] = 0;
  }

  flg = false;
  for (i = 0; i < 3; i++) {
    if (abs(c1[i]) < abs(c[i])) flg = true;
  }
  while (flg) {
    flg = false;
    for (i = 0; i < 3; i++) {
      if (abs(c1[i]) < abs(c[i]))
        c1[i] += d[i];
      if (abs(c1[i]) - abs(c2[i]) >= 0.5) {
        if (c[i] > 0) {
          c2[i]++;
          moveForward(i);
        } else {
          c2[i]--;
          moveBackward(i);
        }
      }
      if (abs(c1[i]) < abs(c[i])) flg = true;
    }
    delayMicros(delayTime);
  }
}

//Основной цикл
void loop()

{
  if (Serial.available() > 0) { //Пришла команда
    long c[4] = {0, 0, 0, 0};
    int i;
    sign = 1;
    i = 0;
    incomingByte = Serial.read();
    while (incomingByte != ';') { //Читаем входящую строку, признак конца строки знак "точка с запятой"
      if (c[i] == 0) {
        if (incomingByte == '-')
          sign = -1;
      }
      if (incomingByte == ',') {
        c[i] *= sign;
        sign = 1;
        i++;
      } else if (incomingByte >= '0' && incomingByte <= '9') {
        c[i] = c[i] * 10 + incomingByte - '0';
      }

      while (Serial.available() == 0) {
        delayMicroseconds(1); //Ждём очередной символ, если не пришел
      }
      incomingByte = Serial.read();
    }
    c[i] *= sign;
    if (c[3] > 0) delayTime = c[3];
    MoveSM(c[0], c[1], c[2]); //Вращаем двигатели на заданное число шагов
    Serial.println("OK"); //Отправляем компьютеру сообщение "OK", значит можно высылать новую команду
  }
  {
    // Проверка нажатия кнопок

    a = analogRead (5);
    if (a >= 171 && a <= 204)  MoveSM(1, 0, 0); //Вращаем двигатель x враво
    if (a >= 205 && a <= 255)  MoveSM(-1, 0, 0); //Вращаем двигатель x влево
    if (a >= 256 && a <= 340)  MoveSM(0, 1, 0); //Вращаем двигатель y враво
    if (a >= 341 && a <= 511)  MoveSM(0, -1, 0); //Вращаем двигатель y влево
    if (a >= 512 && a <= 1022) MoveSM(0, 0, 1); //Вращаем двигатель z враво
    if (a >= 1023 && a <= 2000) MoveSM(0, 0, -0); //Вращаем двигатель z влево
  }

  //  Проверка потециометра

  valr = analogRead(4);
  // Serial.println(valr);



  delay (250);
  delayMicroseconds(1); //Если ничего не пришло, ждём 1 микросекуду.
} 
Вложения
p1.jpg
p1.jpg (94.27 КБ) 22880 просмотров
inv-h
Сообщения: 5
Зарегистрирован: 02 июн 2015, 10:11

Re: Управление телескопом кнопками через Arduino

Сообщение inv-h »

Вот что у меня в итоге получается. Моделировал в Протеусе. Теперь надо делать состыковку с астропрограммой. Но это уже другая история.....

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

/* Программа управления тремя ШД 
Управление кнопками +X, -X, +Y, -Y, +Z, -Z скорость задается потенциометром
Возможно упраление по COM порту в виде команды  X,Y,Z,скорость;
inv-h@mail.ru
*/
int a = 0;
int motorPins[3][2] = {{8, 9}, {10, 11}, {12, 13}};
int count;
int count2[3] = {0, 0, 0};
int val = 0;
int rot = 0;
int incomingByte = 0;
int sign = 1;
long delayTime;

//Процедура настройки прошивки
void setup() {
  int i;
  Serial.begin(9600);  //Эта скорость должна совпадать со скоростью, установленной в программе

  for (i = 0; i < 3; i++) {
    for (count = 0; count < 2; count++) {
      pinMode(motorPins[i][count], OUTPUT); //установка режима работы цифровых pin'ов Ардуино

      pinMode (A4, INPUT);
      pinMode (A5, INPUT);
   }
  }
  delayTime = 2000;
}

//Поворот двигателя с номерм sm на один шаг вперёд
void moveForward(int sm) {
  digitalWrite(motorPins[sm][1], HIGH); //Задаём направление
  digitalWrite(motorPins[sm][0], HIGH);
  digitalWrite(motorPins[sm][0], LOW);
}

//Поворот двигателя с номерм sm на один шаг назад
void moveBackward(int sm) {
  digitalWrite(motorPins[sm][1], LOW);
  digitalWrite(motorPins[sm][0], HIGH);
  digitalWrite(motorPins[sm][0], LOW);
}

//Задержка в микосекундах
void delayMicros(long wt) {
  unsigned long mls;
  unsigned int mks;

  mls = (unsigned long)(wt / 1000);
  mks = (unsigned int)(wt % 1000);
  if (mls > 0) delay(mls);
  if (mks > 0) delayMicroseconds(mks);
}

//Одновременный поворот двигателей 0, 1, 2 на x, y, z шагов соответственно
void MoveSM(long x, long y, long z) {
  long c[3], c2[3];
  double c1[3], d[3];
  long m, i;
  boolean flg;

  c[0] = x;
  c[1] = y;
  c[2] = z;

  m = 1;
  for (i = 0; i < 3; i++) {
    if (m < abs(c[i])) m = abs(c[i]);
  }

  for (i = 0; i < 3; i++) {
    c1[i] = 0;
    d[i] = 1.0 * c[i] / m;
    c2[i] = 0;
  }

  flg = false;
  for (i = 0; i < 3; i++) {
    if (abs(c1[i]) < abs(c[i])) flg = true;
  }
  while (flg) {
    flg = false;
    for (i = 0; i < 3; i++) {
      if (abs(c1[i]) < abs(c[i]))
        c1[i] += d[i];
      if (abs(c1[i]) - abs(c2[i]) >= 0.5) {
        if (c[i] > 0) {
          c2[i]++;
          moveForward(i);
        } else {
          c2[i]--;
          moveBackward(i);
        }
      }
      if (abs(c1[i]) < abs(c[i])) flg = true;
    }
    delayMicros(delayTime);
  }
}

//Основной цикл
void loop()

{
  if (Serial.available() > 0) { //Пришла команда
    long c[4] = {0, 0, 0, 0};
    int i;
    sign = 1;
    i = 0;
    incomingByte = Serial.read();
    while (incomingByte != ';') { //Читаем входящую строку, признак конца строки знак "точка с запятой"
      if (c[i] == 0) {
        if (incomingByte == '-')
          sign = -1;
      }
      if (incomingByte == ',') {
        c[i] *= sign;
        sign = 1;
        i++;
      } else if (incomingByte >= '0' && incomingByte <= '9') {
        c[i] = c[i] * 10 + incomingByte - '0';
      }

      while (Serial.available() == 0) {
        delayMicroseconds(1); //Ждём очередной символ, если не пришел
      }
      incomingByte = Serial.read();
    }
    c[i] *= sign;
    if (c[3] > 0) delayTime = c[3];
    MoveSM(c[0], c[1], c[2]); //Вращаем двигатели на заданное число шагов
    Serial.println("OK"); //Отправляем компьютеру сообщение "OK", значит можно высылать новую команду
	
	delay (250);
  delayMicroseconds(1); //Если ничего не пришло, ждём 1 микросекуду.
  }
  {
    //  Проверка потециометра

  delayTime = analogRead(4)*30;
 
   // Serial.println(delayTime);
    
    // Проверка нажатия кнопок

    a = analogRead (5);
    if (a >= 90 && a <= 189)   MoveSM(1, 0, 0); //Вращаем двигатель x вправо
    if (a >= 190 && a <= 219)  MoveSM(-1, 0, 0); //Вращаем двигатель x влево
    if (a >= 220 && a <= 299)  MoveSM(0, 1, 0); //Вращаем двигатель y вправо
    if (a >= 300 && a <= 399)  MoveSM(0, -1, 0); //Вращаем двигатель y влево
    if (a >= 400 && a <= 699)  MoveSM(0, 0, 1); //Вращаем двигатель z вправо
    if (a >= 700 && a <= 3000) MoveSM(0, 0, -1); //Вращаем двигатель z влево
  }
} 
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Управление телескопом кнопками через Arduino

Сообщение Oleg1601 »

Уже проверяли свой скетч, работает?
А третий двигатель у вас для чего используется - фокусёр?
inv-h
Сообщения: 5
Зарегистрирован: 02 июн 2015, 10:11

Re: Управление телескопом кнопками через Arduino

Сообщение inv-h »

К сожалению, пока руки до железа не дошли. Третий двигатель хотелось бы приладить к фокусеру.
Oleg1601
Сообщения: 47
Зарегистрирован: 26 апр 2015, 11:25

Re: Управление телескопом кнопками через Arduino

Сообщение Oleg1601 »

inv-h писал(а):Маленько приходит понимание процесса. Нашел интересный скетеч для управления станком ЧПУ, хочу к нему приладить кнопки управления. Опыта маловато, поэтому не могу вкурить как приделат потенциометр на скорость перемещения.
Посмотрите здесь http://www.schmalzhaus.com/EasyDriver/E ... mples.html - Пример 5 , управление одной осью телескопа с помощью кнопок, и скорость регулируется, как вам и надо, пер. резистором.
Фокусер - http://habrahabr.ru/post/245265/
Ответить