Телескопы покупают здесь


A A A A Автор Тема: Краснодарский астроклуб и обсерватория КубГУ  (Прочитано 451943 раз)

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

Оффлайн Евгенич

  • *****
  • Сообщений: 648
  • Благодарностей: 106
  • просто учитель астрономии, физики и т.д.
    • Сообщения от Евгенич
А потом был закат и дым от ТЭЦ  :)

Оффлайн Александр ИвановАвтор темы

  • *****
  • Сообщений: 14 705
  • Благодарностей: 608
  • МРС - C40, МРС - D04
    • Skype - ial1963
    • Сообщения от Александр Иванов
    • НАА
А к вечеру пошёл снег... :)
Храни Вас Господь!

Оффлайн ALTAIR 7

  • ***
  • Сообщений: 148
  • Благодарностей: 33
  • Вышла из мрака младая с перстами пурпурными Эос ..
    • Сообщения от ALTAIR 7
И  в  Краснодаре  наступил  снежополь )))  Как  обычно )))
Вышла из мрака младая с перстами пурпурными Эос ...

Оффлайн Azatot (Павел Николаев)

  • *****
  • Сообщений: 718
  • Благодарностей: 58
  • Мне нравится этот форум!
    • Skype - azatot77
    • Сообщения от Azatot (Павел Николаев)
Друзья, кто умеет программить для Arduino? Для трекера нужна помощь в написании скетча для шагового движка 28byj-48. Желательно не на библиотеке Stepper.h, а на CustomStepper или AccelStepper. Задача - выставить нужную скорость вращения двигателя. Силами Stepper.h это сделать не удается.

http://arduino-kit.ru/catalog/id/shagovyiy-4-h-faznyiy-dvigatel-5v-s-platoy-upravleniya-uln2003
Canon 500Da
EXOS-2 OnStep V4
SW 150/750, Sharpstar 2" 0,95
https://deepskyhosting.com/id46
https://dso-browser.com/profile/Azatot

Оффлайн mo

  • *****
  • Сообщений: 17 498
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Друзья, кто умеет программить для Arduino? Для трекера нужна помощь в написании скетча для шагового движка 28byj-48. Желательно не на библиотеке Stepper.h, а на CustomStepper или AccelStepper. Задача - выставить нужную скорость вращения двигателя. Силами Stepper.h это сделать не удается.

http://arduino-kit.ru/catalog/id/shagovyiy-4-h-faznyiy-dvigatel-5v-s-platoy-upravleniya-uln2003
А если без библиотек, подойдёт?
Я как-то писал трекер на этом же моторе с этим же драйвером. Там полушаг, если не ошибаюсь и звёздная скорость ведения для EQ1 / EQ2.

Вот код для EQ1 под AVRStudio. Давно это было...

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 12.04.2011
Author  :
Company :
Comments:


Chip type               : ATmega8
Program type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>

#define RA_1 PORTC.2
#define RA_2 PORTC.3
#define RA_3 PORTC.4
#define RA_4 PORTC.5

#define PULT_RA_LEFT PIND.0
#define PULT_RA_RIGHT PIND.2
#define PULT_DEC_LEFT PIND.1
#define PULT_DEC_RIGHT PIND.3

#define RA_DIR_LEFT 1
#define RA_DIR_RIGHT 2

#define LED PORTB.0

// Declare your global variables here
int step = 0;
char push = 0xCD;
int RA_direction = RA_DIR_LEFT;

void RA_full_step(int step)
{
        switch (step & 3)
        {
                case 0:
                        RA_1 = 1; RA_2 = 0; RA_3 = 0; RA_4 = 0;
                        break;
                case 1:
                        RA_1 = 0; RA_2 = 1; RA_3 = 0; RA_4 = 0;
                        break;
                case 2:
                        RA_1 = 0; RA_2 = 0; RA_3 = 1; RA_4 = 0;
                        break;
                case 3:
                        RA_1 = 0; RA_2 = 0; RA_3 = 0; RA_4 = 1;
                        break;
        }
}

void RA_half_step(int step)
{
        switch (step & 7)
        {
                case 0:
                        RA_1 = 1; RA_2 = 0; RA_3 = 0; RA_4 = 0;
                        break;
                case 1:
                        RA_1 = 1; RA_2 = 1; RA_3 = 0; RA_4 = 0;
                        break;
                case 2:
                        RA_1 = 0; RA_2 = 1; RA_3 = 0; RA_4 = 0;
                        break;
                case 3:
                        RA_1 = 0; RA_2 = 1; RA_3 = 1; RA_4 = 0;
                        break;
                case 4:
                        RA_1 = 0; RA_2 = 0; RA_3 = 1; RA_4 = 0;
                        break;
                case 5:
                        RA_1 = 0; RA_2 = 0; RA_3 = 1; RA_4 = 1;
                        break;
                case 6:
                        RA_1 = 0; RA_2 = 0; RA_3 = 0; RA_4 = 1;
                        break;
                case 7:
                        RA_1 = 1; RA_2 = 0; RA_3 = 0; RA_4 = 1;
                        break;
        }
}

void RA(int step)
{
        RA_half_step(step);
}

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
        RA(step);
        LED = step & 1;
        if (RA_direction == RA_DIR_LEFT)
        {
                step--;
        }
        else
        {
                step++;
        }
       
}


void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTB=0x00;
DDRB=0x01;

// Port C initialization
// Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
// State6=T State5=0 State4=0 State3=0 State2=0 State1=T State0=T
PORTC=0x00;
DDRC=0x3C;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=P State1=T State0=P
PORTD=0x05;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0xCD;
OCR1AL=0x6E;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
    {
        if ( !PULT_RA_LEFT || !PULT_RA_RIGHT )
        //  || !PULT_DEC_LEFT || !PULT_DEC_RIGHT
        {       
                if (push > 10)
                {
                        push=10;
                        OCR1AH=push;
                        OCR1AL=0x6E;
                }
                if (!PULT_RA_LEFT)
                {
                        RA_direction = RA_DIR_LEFT;
                }
                if (!PULT_RA_RIGHT)
                {
                        RA_direction = RA_DIR_RIGHT;
                }
               
        }
        else
        {
                push = 0xCD;
                RA_direction = RA_DIR_LEFT;
                OCR1AH=0xCD;
                OCR1AL=0x6E;
        }

//        LED = PULT_RA_LEFT;       
//        LED = PULT_RA_RIGHT;
//        LED = PULT_DEC_RIGHT;
//        LED = PULT_DEC_LEFT;
       
        delay_ms(50);
   
    }
}

Подробности не очень помню. Но можно попробовать вспомнить...
モ - mo

Оффлайн Azatot (Павел Николаев)

  • *****
  • Сообщений: 718
  • Благодарностей: 58
  • Мне нравится этот форум!
    • Skype - azatot77
    • Сообщения от Azatot (Павел Николаев)
Спасибо, очень интересно. Надо попробовать.

А какой оператор меняет скорость вращения?
И можно ли как то расчетно получить скорость вращения? Вернее, задать ее, зная, какая скорость должна быть.
Canon 500Da
EXOS-2 OnStep V4
SW 150/750, Sharpstar 2" 0,95
https://deepskyhosting.com/id46
https://dso-browser.com/profile/Azatot

Оффлайн Ivan Mhitarov

  • Модератор
  • *****
  • Сообщений: 6 227
  • Благодарностей: 108
  • Награды Неоднократный победитель конкурса астрофото
    • Сообщения от Ivan Mhitarov
А какой оператор меняет скорость вращения?
Этот?
        delay_ms(50);
Иван Мхитаров
Кубанский Астрономический Клуб "45".

Оффлайн mo

  • *****
  • Сообщений: 17 498
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
А какой оператор меняет скорость вращения?
Этот?
        delay_ms(50);
Неа. Это задержка опроса пульта.
Скорость вращения (точнее, периодичность полушага) задаётся настройкой делителя и компаратора таймера "1".

Этот код из генератора AVR Studio.
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0xCD;
OCR1AL=0x6E;
OCR1BH=0x00;
OCR1BL=0x00;
Ещё был excell с расчётом таймера... поищу, но вряд ли найду. Можно реверснуть, конечно, точнее заново рассчитать делитель таймера.

А в цикле main опрос кнопок пульта. Если его нет, то main и вовсе может оставаться пустой функцией. Весь код будет работать из прерывания таймера.
Этот метод не самый точный, я не помню точно, но кажется есть ошибка порядка единиц процента скорости. Но периодика EQ1 такая, что эта ошибка тонет в ошибках механики червячной пары.... и этого мотор-редуктора.
« Последнее редактирование: 25 Янв 2016 [21:13:34] от moscow »
モ - mo

Оффлайн mo

  • *****
  • Сообщений: 17 498
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Таймер в этом примере тикает на частоте 250 МГц. Как только наберётся значение compare A, то счётчик таймера сбрасывается, таймер начинает тикать заново. Одновременно с этим сбросом вызывается функция

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)

Которая устанавливает текущее положение мотора, исходя из текущего номера шага
        RA(step);

Моргает светодиодом
        LED = step & 1;

И, в соответствии с настройкой направления движения по RA
        if (RA_direction == RA_DIR_LEFT)

делает шаг назад или вперёд
                step++;
モ - mo

Оффлайн mo

  • *****
  • Сообщений: 17 498
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
        delay_ms(50);
Ежли делать в основном цикле через delay, то сложно рассчитать сколько времени займёт выполнение кода в цикле, так как на сях непонятно в какие именно команды процессора выльется код. Можно было бы написать на ассемблере, просчитав время выполнения каждой команды в тактах... Но я тааааааааааааааак рад, что он для меня умер лет так этак хххх назад :)
Таймером ... современней. Да и задача не столь ресурсоёмкая.
モ - mo

Оффлайн Александр ИвановАвтор темы

  • *****
  • Сообщений: 14 705
  • Благодарностей: 608
  • МРС - C40, МРС - D04
    • Skype - ial1963
    • Сообщения от Александр Иванов
    • НАА
Олежка, ну так пришёл телескоп то?
Делись результатами наблюдений. :)
Храни Вас Господь!

Оффлайн mo

  • *****
  • Сообщений: 17 498
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Олежка, ну так пришёл телескоп то?
Делись результатами наблюдений. :)
Не... выслали только вчера. Ждём-с. Дело-линии прогнозируют 31го. Надеюсь, не ошибаются. Если питерские соберутся первого в Мезмай, хотелось бы погонять трубу под тёмным небом.
モ - mo

Оффлайн Александр ИвановАвтор темы

  • *****
  • Сообщений: 14 705
  • Благодарностей: 608
  • МРС - C40, МРС - D04
    • Skype - ial1963
    • Сообщения от Александр Иванов
    • НАА
Олежка, ну так пришёл телескоп то?
Делись результатами наблюдений. :)
Не... выслали только вчера. Ждём-с. Дело-линии прогнозируют 31го. Надеюсь, не ошибаются. Если питерские соберутся первого в Мезмай, хотелось бы погонять трубу под тёмным небом.

Понял. Питер пока в раздумиях. :)
Храни Вас Господь!

Оффлайн mo

  • *****
  • Сообщений: 17 498
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Понял. Питер пока в раздумиях. :)

Погода, похоже, тоже.
モ - mo

Оффлайн Александр ИвановАвтор темы

  • *****
  • Сообщений: 14 705
  • Благодарностей: 608
  • МРС - C40, МРС - D04
    • Skype - ial1963
    • Сообщения от Александр Иванов
    • НАА
Понял. Питер пока в раздумиях. :)

Погода, похоже, тоже.

Это да. Печалька.
Храни Вас Господь!

Оффлайн Azatot (Павел Николаев)

  • *****
  • Сообщений: 718
  • Благодарностей: 58
  • Мне нравится этот форум!
    • Skype - azatot77
    • Сообщения от Azatot (Павел Николаев)
Таймер в этом примере тикает на частоте 250 МГц. Как только наберётся значение compare A, то счётчик таймера сбрасывается, таймер начинает тикать заново. Одновременно с этим сбросом вызывается функция

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)

Которая устанавливает текущее положение мотора, исходя из текущего номера шага
        RA(step);

Моргает светодиодом
        LED = step & 1;

И, в соответствии с настройкой направления движения по RA
        if (RA_direction == RA_DIR_LEFT)

делает шаг назад или вперёд
                step++;

Ну а как же реализовать это на Ардуино с привязкой к тактам (шагам) двигателя? Если учитывать, что съемка будет на фокусе от 18 до 55мм и продолжительностью не более 5 минут, то точность нужна в этих параметрах.У меня есть расчет вращения шестерни. Надо задать вращение двигателя с учетом редукции 3,33.
Canon 500Da
EXOS-2 OnStep V4
SW 150/750, Sharpstar 2" 0,95
https://deepskyhosting.com/id46
https://dso-browser.com/profile/Azatot

Оффлайн mo

  • *****
  • Сообщений: 17 498
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Ну а как же реализовать это на Ардуино
Arduino - это тот же процессор (atmega8), используемый мною в этом проекте. Плюс довески в виде библиотек, usb-uart и загрузчика по этому usb-uart. Ах да, ещё не шибко удобный IDE (среда разработки).

Можно просто скопировать этот код в "ардуино скетч" и загрузить его в плату.

А вот с пересчётом придётся чуть повозиться. Нужно вычислить время одного шага. Разделить его на частоту таймера (250 МГц в этом примере), выставить необходимое число в настройки компаратора, переведя в калькуляторе виндовз, например, это число в шестнадцатеричное.

OCR1AH=0xCD;
OCR1AL=0x6E;

0xCD6E для eq1.

Если не хватит int16 диапазона, то нужно перенастроить таймер на частоту вдвое ниже, например. При этом, как в фотографии, нужно стараться придерживаться правила ETTR (exposure to the right), то есть стараться значение компаратора держать максимальным. Это немного увеличивает точность.

Время шага в мс можно вычислить, исходя из необходимой скорости движения монтировки (примерно 15 угловых секунд за секунду) и количества шагов всех редукторов, в т.ч. мотора.
モ - mo

Оффлайн Azatot (Павел Николаев)

  • *****
  • Сообщений: 718
  • Благодарностей: 58
  • Мне нравится этот форум!
    • Skype - azatot77
    • Сообщения от Azatot (Павел Николаев)
Боюсь, что через компаратор я не осилю. А нет более простых способов? Тем более, что точность сильная не нужна.
Canon 500Da
EXOS-2 OnStep V4
SW 150/750, Sharpstar 2" 0,95
https://deepskyhosting.com/id46
https://dso-browser.com/profile/Azatot

Оффлайн mo

  • *****
  • Сообщений: 17 498
  • Благодарностей: 1073
  • Олег Милантьев - L71 Vedrus Observatory
  • Награды Призер конкурса астрофото
    • Сообщения от mo
Боюсь, что через компаратор я не осилю. А нет более простых способов? Тем более, что точность сильная не нужна.
1. вычистить все упоминания про таймер и прерывание.

2. в main вписать

RA(step++);
delay_ms(30);

Скомпилировать, запустить.
Засечь скорость мотора. Подобрать число "30" до приемлимой скорости ведения.
Скажем, 30 окажется в 10 раз быстрее чем нужно. Тогда ставим 300. Но 300 окажется на 5% медленнее, чем нужно, тогда уменьшаем число на 5%. Всё это через перекомпилирование и заливку проекта в проц.
モ - mo

Оффлайн Александр ИвановАвтор темы

  • *****
  • Сообщений: 14 705
  • Благодарностей: 608
  • МРС - C40, МРС - D04
    • Skype - ial1963
    • Сообщения от Александр Иванов
    • НАА
Ну пока Питер не куют не мелит, я выдвинусь на Мезмай чуть позже.
А то после снегопадов, там пока без цепей делать нефига. :)
Храни Вас Господь!