Киевский клуб любителей астрономии "Астрополис"

astromagazin.net
* *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
16 Декабря 2017, 12:58:32


Автор Тема: Переделываем нерабочую Ioptron smartstar E  (Прочитано 453 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Vladimir_sx

  • Оффлайн Оффлайн
  • Сообщений: 119
  • Благодарностей: 70
  • Клуб АстроДнепр
Переделываем нерабочую Ioptron smartstar E
« : 17 Декабря 2014, 01:17:24 »
. - .

Всем привет. Хочу поведать историю о том как я переделал монтировку Ioptron smartstar E. Однажды на форуме за небольшую сумму денег преобрел данную монтировку без родного пульта какраз для эксперементов и модернизаций. Учитывая свои небольшие познания в электронике я не смог привести ее в чувства с радной платой, стандартные конекторы rj12 6 пинов, изначално пытался найти распиновку и подключить через сериал переходник через какие либо драйвера под нее, а так как сижу под операционной системой linux то с драйверами стало очень проблемотично. Открытого командного api под управление не нашел ( если кто владеит информацией о том как без пульта подключить с родной платой данную монтировку с удовольствием вслушаю). Вобщем принял решение разобрать и переделать.
Не так давно начал увлекатся Arduino и поэтому решил реализовать свой проект именно на нем.
Основная цель проекта заключалась в разработке простого пульта для монтировки, задача показалась мне обсолютно не сложной и я решил ее немного усложнить, сделать для нее беспроводное управление через bluetooth.
Все что мне понадобилось для данного проекта:
1. Сама монтировка


2. Драйвер двух двиготелей на базе L298N

цена его гдето ~130грн

3. На тот момент у меня в наличии был контроллер arduino uno  но он немного грамосткий для данной монтировки да и небыло смысла оставлять его так как я сним больше експерементирую поэтому для своей задачи взял более дешовую и довольно маленький по размерам контроллер Arduino Pro Micro он на то время стоил ~150грн


4. Bluetooth модуль HC-06

цена состовляла ~120грн

Процесс сборки очень прост. Внутри монтировки обычные двигатели не шаговые, и оптические энкодеры. side A драйвера двиготелей я подключил к Alt а Side B к Az двигателю. питание и землю от шагового драйвера запитал от блока батареек 12в. и землю в gnd пин arduino контроллера. саму плату arduino я запитал от того же блока батареек хоть она и расчитана на 5в но может приять 12в если подключить к пин RAW. на всякий случай соединил через резистор. далее управляющие провада с arduino к шаговому драйверу. pin 2, 3, 4, 5,  pin 9, 10 для управления скоростью. Далее дело за малым bluetooth там всего 4 pin Vcc к vcc (питание), gnd к gnd (земля), ну и интерфейс данных RX к TX а TX к RX. Здесь столкнулся с небольшой проблеммой так как pro micro основана на плате arduino leonardo то для общения RX и TX по сериал необходимо использовать класс Serial1  а я использовал по привычке как в UNO класс Serial

Код для Arduino



String incomByte; // строка для комманд из сериал порта

// инициализация управления двигателями
int dir1PinA = 2;
int dir2PinA = 3;
int dir1PinB = 4;
int dir2PinB = 5;

//инициализация пинов для скорости
int SpeedPinA = 9;
int SpeedPinB = 10;

void setup()
{
  Serial1.begin(9600);  // открываем сериал со скоростью 9600

  pinMode(dir1PinA,OUTPUT);
  pinMode(dir2PinA,OUTPUT);
  pinMode(SpeedPinA,OUTPUT);
 
  pinMode(dir1PinB,OUTPUT);
  pinMode(dir2PinB,OUTPUT);
  pinMode(SpeedPinB,OUTPUT);
 
// задаем скорость 90
  analogWrite(SpeedPinA, 90);
  analogWrite(SpeedPinB, 90);
}

void loop()
{
  if(Serial1.available() > 0)
  {
        incomByte = Serial1.readString(); // считываем строки
        Serial1.println(Serial1.readString()); //для теста отправляем тоже самое
       
        //если приходит 0 то делаем для всех движков стоп
        if(incomByte == "0")
        {
          digitalWrite(dir1PinA, LOW);
          digitalWrite(dir2PinA, LOW);
          digitalWrite(dir1PinB, LOW);
          digitalWrite(dir2PinB, LOW);
        }
        // если команда left то крутим влево чучуть полсекнды потом стопаем
        if(incomByte == "left")
        {
         
          Serial1.print("left");
          digitalWrite(dir1PinA, HIGH);
          digitalWrite(dir2PinA, LOW);
          delay(500);
          digitalWrite(dir1PinA, LOW);
          digitalWrite(dir2PinA, LOW);
         
        }
        //крутим вправо
        if(incomByte == "right")
        {
         
          Serial1.print("right");
          digitalWrite(dir1PinA, LOW);
          digitalWrite(dir2PinA, HIGH);
          delay(500);
          digitalWrite(dir1PinA, LOW);
          digitalWrite(dir2PinA, LOW);
        }
       
        //вверх
        if(incomByte == "top")
        {
          Serial1.print("top");
          digitalWrite(dir1PinB, HIGH);
          digitalWrite(dir2PinB, LOW);
          delay(500);
          digitalWrite(dir1PinB, LOW);
          digitalWrite(dir2PinB, LOW);
        }
       
        if(incomByte == "bottom")
        {
         
          Serial1.print("bottom");
          digitalWrite(dir1PinB, LOW);
          digitalWrite(dir2PinB, HIGH);
          delay(500);
          digitalWrite(dir1PinB, LOW);
          digitalWrite(dir2PinB, LOW);
        }
       
        //двигаем в лево постоянно пока не нажмем стоп
        if(incomByte == "longleft")
        {
         
          Serial1.print("longleft");
          digitalWrite(dir1PinA, HIGH);
          digitalWrite(dir2PinA, LOW);
         
        }
       
        if(incomByte == "longright")
        {
         
          Serial1.print("longright");
          digitalWrite(dir1PinA, LOW);
          digitalWrite(dir2PinA, HIGH);
        }
       
        if(incomByte == "longtop")
        {
          Serial1.print("longtop");
          digitalWrite(dir1PinB, HIGH);
          digitalWrite(dir2PinB, LOW);
        }
       
        if(incomByte == "longbottom")
        {
         
          Serial1.print("longbottom");
          digitalWrite(dir1PinB, LOW);
          digitalWrite(dir2PinB, HIGH);
        }
    }
}


Далее под нее написал андроид приложение (исходники и  скрин выложу позже).

На самом деле мы теперь можем с любого устройства через bluetooth подключится к нашей монтировке и передавать ей необходимые команды. left right top bottom для коротких движений longleft longriht ....... для постоянного движения пока не нажмем стоп.

В будущем планируется дописывать и модернизировать ее.
сейчас работаю над тем чтобы установить на монтировку экваториальный клин и устанавливать с помощью android смартфона звездную, лунную и солнечную скорость, в будущем придумать чтолибо с goto.

Спасибо за внимание!
« Последнее редактирование: 17 Декабря 2014, 01:22:46 от Vladimir_sx »
Записан
Sky-Watcher 2001P 1000/200,SkyWatcher 80ED PRO, Celestron CG5 - EQDrive mod., QHY5Vc,  Filter UHC, Canon 350D, Camera lens: ЗМ 5А МС
Сказали спасибо

MAKsutik

  • Оффлайн Оффлайн
  • Сообщений: 4707
  • Благодарностей: 249
  • Ищи на третьей планете.
    • Project EQDrive
Re: Переделываем нерабочую Ioptron smartstar E
« Ответ #1 : 17 Декабря 2014, 07:55:03 »
. - .

Насколько знаю ребята Ioptron любят серво приводы, то что сделали вы похвально, но ...
Где ПИД регулятор на мотор? На моторах стоят не просто так инкрементальные энкодеры.
Пока вы не стабилизируете скорость и не подключите энкодеры речи о звездной, луной, солнечной, гото быть не может.
Я бы делал как и ребята с Ioptron, по ардуине на мотор (как в родной конструкции на каждый мотор своя плата с контроллером смотрим фото)
Или применив более мощную арду 2560, там по моему можно задействовать до 4 прерываний, для энкодеров на двух моторах как раз хватит.

А так вы просто водите в заблуждение ЛА которые захотят моторизировать по вашему примеру, или сами не понимаете того что делаете. :SLA:


« Последнее редактирование: 17 Декабря 2014, 08:28:44 от MAKsutik »
Записан



Vladimir_sx

  • Оффлайн Оффлайн
  • Сообщений: 119
  • Благодарностей: 70
  • Клуб АстроДнепр
Re: Переделываем нерабочую Ioptron smartstar E
« Ответ #2 : 17 Декабря 2014, 09:32:31 »
. - .

Спасибо за рекомендаци, да я прекрасно понимаю что для дальнейшей цели нужно будет использовать энкодеры, с ними я еще покамись не сталкивался, но по идеи там должен быть выход для данных который просто считает инкремент и декримент. 
Записан
Sky-Watcher 2001P 1000/200,SkyWatcher 80ED PRO, Celestron CG5 - EQDrive mod., QHY5Vc,  Filter UHC, Canon 350D, Camera lens: ЗМ 5А МС

MAKsutik

  • Оффлайн Оффлайн
  • Сообщений: 4707
  • Благодарностей: 249
  • Ищи на третьей планете.
    • Project EQDrive
Re: Переделываем нерабочую Ioptron smartstar E
« Ответ #3 : 17 Декабря 2014, 09:42:53 »
. - .

Выходы энкодера
Сигнал А
Сигнал В
Сигнал Z зеро
питание +
питание -



Код что бы поиграться с энкодером

#include <TimerOne.h>


#define pinA  3
#define pinB  2

/*
old_encoder - предыдущее значение каналов энкодера
new_encoder - новое значение каналов энкодера
*/
byte old_encoder, new_encoder;
/*
Энкодер с двумя каналами при вращении будет выдавать коды Грея, например:
00 (0)
10 (2)
11 (3)
01 (1)
Ячейки массива ns содержат значения следующего кода для заданного индекса массива.
Например если текущее значение каналов энкодера равно 00, то в ячейке массива ns[0]
содержится следующее значение равное 2 (в бинарном виде - 10).
*/
byte ns[4] = {2,0,3,1};
/*
counter - текущее значение счетчика энкодера
*/
int counter;
/*
tmp - предыдущее значение счетчика
*/
int tmp;
unsigned long time;


void setup()
{
  //start serial connection
  Serial.begin(115200);
   
  pinMode(pinA, INPUT);
  digitalWrite(pinA, HIGH);
  pinMode(pinB, INPUT);
  digitalWrite(pinB, HIGH);
  Timer1.initialize(200000);
  Timer1.attachInterrupt(tickTimer);
// encoder pin on interrupt 0 (pin 2)
  attachInterrupt(0, doEncoderAB, CHANGE);
// encoder pin on interrupt 1 (pin 3)
  attachInterrupt(1, doEncoderAB, CHANGE);
 
  counter = 0;
  tmp = 0;
// присваиваем текущие значения каналов энкодера
  old_encoder = (PINE&48)>>4;
  new_encoder = old_encoder;
}

void doEncoderAB()
{
  noInterrupts();
  new_encoder = (PINE&48)>>4;
  if (ns[old_encoder] == new_encoder)
  {
    counter--;
    time = millis();
  }
  else if (ns[new_encoder] == old_encoder)
  {
     counter++;
     time = millis();
  }
  old_encoder = new_encoder;
  interrupts();
}

void loop()
{
  if (tmp != counter)
  {
    Serial.print(counter);
    Serial.print(' ');
    Serial.println(new_encoder);
    Serial.println(time);
    tmp = counter;
  }
}

void tickTimer()
{

    Serial.println(counter);
    counter = 0;
   
}
Записан


Сказали спасибо

Vladimir_sx

  • Оффлайн Оффлайн
  • Сообщений: 119
  • Благодарностей: 70
  • Клуб АстроДнепр
Re: Переделываем нерабочую Ioptron smartstar E
« Ответ #4 : 17 Декабря 2014, 09:51:09 »
. - .

Спасибо то что нужно. Буду разбератся.
Записан
Sky-Watcher 2001P 1000/200,SkyWatcher 80ED PRO, Celestron CG5 - EQDrive mod., QHY5Vc,  Filter UHC, Canon 350D, Camera lens: ЗМ 5А МС