Київський клуб аматорів астрономії "Астрополіс"

astromagazin.net
* *
Ласкаво просимо, Гість. Будь ласка, увійдіть або зареєструйтеся.
19 Вересня 2024, 18:26:56

Увійти

google


Автор Тема: Помогите с моторизацией EQ2  (Прочитано 8086 раз)

0 Користувачів і 1 Гість дивляться цю тему.

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094
Re: Помогите с моторизацией EQ2
« Відповідь #200 : 30 Серпня 2015, 07:11:13 »
. - .

Да, действительно моргает, и даже не 60 гц, а 13 гц.
Явный конфликт между analogWrite(10,...) и TimerOne.
Обе функции используют один и тот же таймер.

Два решения:
1) Перепаять провод с pin10 на другой свободный, управляемый другим таймером

Цитувати
   
Pins 5 and 6: controlled by Timer0
Pins 9 and 10: controlled by Timer1
Pins 11 and 3: controlled by Timer2

И соответственно поменять номер пина в analogWrite

2) использовать программный PWM c использованием другого таймера. Например:
- Скачать и установить библиотеку FlexiTimer2
- добавить в начало своего скетча
Код: [Select]
#include <FlexiTimer2.h>

void simulatePWM()
{
  static unsigned char pwm = 0;
  pwm++;
  digitalWrite(10, pwm<30);
}

Добавить внутрь функции setup() строки
Код: [Select]
  pinMode(10, OUTPUT);   
  FlexiTimer2::set(1, 1.0/30000, simulatePWM);
  FlexiTimer2::start();

Число 30 поменять на другое, это яркость, от 0 до 255.
Записаний
Подякували

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #201 : 30 Серпня 2015, 11:19:39 »
. - .

М_М, я правильно понимаю, надо переставить проводок с 10го пина на ардуине на пример на А1 (свободный сейчас), на дисплее с кнопками ничего менять не надо? Ну и изменить функцию до такого вида  analogWrite(15,значение яркости), так?
Использовать другой таймер и менять код мне бы не хотелось, опять могут повылазить какие-то бока и конфликты.

Вчера опять проводил съемку неба, что могу сказать, две минуты, если хорошо выставить полярку, вполне по силам данной связке, вот только нормально выставить полярку у меня не очень получается. Пару кадров с экспозицией в 2 минуты получились совсем не плохо, остальная бОльшая часть снимков пока в мусор. Так же скажу, что частенько на двух кадрах подряд получается разный результат. И ещё, по поводу возможности оперативно менять значение задержки а соответственно и скорость ведения, в некоторых случаях помогает немного скомпенсировать неточность выставленной полярной оси и улучшить результат, так что функция не совсем бесполезная.

P.S. полностью заряженные аккумуляторы высасывает за 3-3,5 часа, зимой хоть бы на час их хватило.
Если получится снизить яркость дисплея, батареи чуть медленнее будут разряжаться?
Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094
Re: Помогите с моторизацией EQ2
« Відповідь #202 : 30 Серпня 2015, 13:20:26 »
. - .

Аппаратный PWM на A1  (он же pin15) не доступен

Доступны на перечисленных ранее pin 3, 5, 6, 9, 10, 11

Из них 9 и 10 заняты таймером 1.

Если всё занято, второй способ - всего несколько строк, на логику программы не должно повлиять. И это проще попробовать чем перепаивать провод. Вернуться в исходное состояние тоже проще.
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #203 : 30 Серпня 2015, 13:57:30 »
. - .

М_М, у меня ничего не припаяно так, что перекину с 10 на 11 пин. :)
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #204 : 30 Серпня 2015, 14:15:52 »
. - .

Сменил, теперь похоже на правду. Спасибо М_М!
Ответьте кто-то, уменьшив яркость дисплея, батареи жрать будет меньше или так же?
Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094
Re: Помогите с моторизацией EQ2
« Відповідь #205 : 30 Серпня 2015, 15:28:48 »
. - .

Есть две новости.
Хорошая: будет жрать меньше.
Плохая: ненамного.
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #206 : 30 Серпня 2015, 15:50:09 »
. - .

Я догадывался об этом! :'(
Записаний


CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #207 : 30 Серпня 2015, 16:03:06 »
. - .

Ребят, а пошлите меня по ссылке где я смогу нейтрализовать ликбез по поводу скоростей и методов их расчета для объектов СС (Луна, Солнце, Юпитер, Сатурн).
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #208 : 09 Вересня 2015, 13:32:58 »
. - .

При работе движок теплый, но когда остановлен - начинает прилично греться, наверное надо подать на обмотки LOW, что и где в скетче надо дописать?
Записаний

alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295
Re: Помогите с моторизацией EQ2
« Відповідь #209 : 09 Вересня 2015, 14:15:47 »
. - .

При работе движок теплый, но когда остановлен - начинает прилично греться, наверное надо подать на обмотки LOW, что и где в скетче надо дописать?
Более всего, что нужно подать LOW на контакт ENABLE.
Для этого сначала контакт ENABLE нужно соединить с Ардуино. В процедуре setup() подать на него HIGH.
А в основной процедуре присваивать LOW/HIGH в зависимости от состояния кнопки СТОП.
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #210 : 09 Вересня 2015, 16:55:25 »
. - .

Контакт ENABLE соединить с любым свободным пином ардуино?
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #211 : 04 Грудня 2015, 19:26:52 »
. - .

Как заставить двигатель вращаться в обратную сторону?

#include <TimerOne.h>
#include <LiquidCrystal.h>

int NUM_KEYS = 5;
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
int adc_key_val[5] = {50, 200, 400, 600, 800};
int dirPin = 3;
int stepperPin = 2;
unsigned long motorPeriod = 81305;
int adc_key_in;
int key = -1;
int isRun = 0;

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
  digitalWrite(dirPin, LOW);

  Timer1.initialize(motorPeriod);
  //Timer1.attachInterrupt(EventTimer);
 
  lcd.clear();
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("    Stopped     ");
  lcd.setCursor(0,1);
  lcd.print("Speed ");
  lcd.print(motorPeriod);
  lcd.print("   ");
  analogWrite(11, 9);
}

void EventTimer()
{
  digitalWrite(stepperPin, !digitalRead(stepperPin));
}

int get_key(unsigned int input)
{
    int k;
    for (k = 0; k < NUM_KEYS; k++)
    {
      if (input < adc_key_val[k])
            return k;
    }
       if (k >= NUM_KEYS)
      k = -1;  // No valid key pressed
    return k;
}

void loop() {
  adc_key_in = analogRead(0);   // read the value from the sensor
  key = get_key(adc_key_in);   // convert into key press
 
  if (key >= 0)   // if keypress is detected
   {
      if (key == 1)
      {
         motorPeriod += 10;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
      if (key == 2)
      {
         motorPeriod -= 10;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
      if (key == 0)
      {
         motorPeriod += 100;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
      if (key == 3)
      {
         motorPeriod -= 100;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
      if (key == 4)
      {
        isRun = 1 - isRun;
        lcd.setCursor(0,0);
        if (isRun == 1)
       {
          lcd.print("+++ Running +++ ");
          Timer1.attachInterrupt(EventTimer);
       }
        else
        {
          lcd.print("    Stopped     ");
          Timer1.detachInterrupt();
        }
       delay(250);
      }
      lcd.setCursor(0, 1);
      lcd.print("Speed ");
      lcd.print(motorPeriod);
      lcd.print("       ");
      delay(50);
   }
}
Записаний

alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295
Re: Помогите с моторизацией EQ2
« Відповідь #212 : 04 Грудня 2015, 19:34:37 »
. - .

Нужно в обработчик нажатий кнопок добавить еще одну ветку
Код: [Select]
if (key == 5)
{
  digitalWrite(dirPin, !digitalRead(dirPin));
}
При нажатии кнопки "5" будет меняться сигнал на выходе dirPin.
Это и есть тот выход, который управляет направлением вращения ШД.
Для чего вывод №3 из Ардуины должен быть соединен с входом DIR на драйвере ШД.

Ну, и саму кнопку физически подключить... правильно...
И "добавить" ее в этот массив: 
Код: [Select]
int adc_key_val[5] = {50, 200, 400, 600, 800};
« Останнє редагування: 04 Грудня 2015, 19:39:38 від alex~ »
Записаний
Подякували

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #213 : 04 Грудня 2015, 19:40:36 »
. - .

Алекс, может можно как-то проще, мне не надо вращать то в одну то в другую сторону (пока), мне надо вращать только в одну сторону, не в ту в которую он сейчас по умолчанию вращает, просто сейчас надо сменить направление.
Записаний

alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295
Re: Помогите с моторизацией EQ2
« Відповідь #214 : 04 Грудня 2015, 19:45:49 »
. - .

 ;D
тогда просто заменить
digitalWrite(dirPin, LOW);
на
digitalWrite(dirPin, HIGH);
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #215 : 04 Грудня 2015, 19:54:19 »
. - .

Алекс, тысяча раз Вам спасибо!
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #216 : 09 Лютого 2016, 11:59:00 »
. - .

Всем здравствуйте!
Добавил я промежуточный редуктор с передаточным отношением 136,71875, так как на морозе крутящего момента движка не хватает даже переделанного в биполярный режим. Посчитал задержку между шагами как указано в посте №140, получилось:
130(уже EQ3-2)*136,71875*4076 = 72444531,25
86164/72444531,25 = 0,001189378942
0,001189378942/2 = 0,000594689471
т.е. 594,69 мксек округлил до 595 мксек
Это значение и присвоил переменной unsigned long motorPeriod, надеюсь правильно посчитал, по звездам ещё не проверял, но похоже на правду, вал движка крутится быстро, выходной вал редуктора медленно со звездной скоростью.

В связи с добавлением промежуточного редуктора подвести объект с помощью ручки тонких движений уже нельзя, поэтому это надо делать движком, но при уменьшении задержки меньше значения 300 мксек, движок жужжит но не крутится, почему так происходит, он не может работать с такой маленькой задержкой, или физически не способен крутиться быстрее? Как-то можно решить такую проблему? Скорость подведения с задержкой 300 мксек маловата, хотелось бы быстрее.
И ещё просьба, добавить в скетч возможность при которой по нажатию и удержанию кнопки key == 3 значение задержки устанавливалось бы 300 (надеюсь пока 300), а при отпускании возвращалось к исходному 595. Спасибо!

Скетч:
#include <TimerOne.h>
#include <LiquidCrystal.h>

int NUM_KEYS = 5;
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
int adc_key_val[5] = {50, 200, 400, 600, 800};
int dirPin = 3;
int stepperPin = 2;
unsigned long motorPeriod = 595;
int adc_key_in;
int key = -1;
int isRun = 0;

void setup() {
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
  digitalWrite(dirPin, HIGH);

  Timer1.initialize(motorPeriod);
  //Timer1.attachInterrupt(EventTimer);
 
  lcd.clear();
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("    Stopped     ");
  lcd.setCursor(0,1);
  lcd.print("Speed ");
  lcd.print(motorPeriod);
  lcd.print("   ");
  analogWrite(11, 9);
}

void EventTimer()
{
  digitalWrite(stepperPin, !digitalRead(stepperPin));
}

int get_key(unsigned int input)
{
    int k;
    for (k = 0; k < NUM_KEYS; k++)
    {
      if (input < adc_key_val[k])
            return k;
    }
       if (k >= NUM_KEYS)
      k = -1;  // No valid key pressed
    return k;
}

void loop() {
  adc_key_in = analogRead(0);   // read the value from the sensor
  key = get_key(adc_key_in);   // convert into key press
 
  if (key >= 0)   // if keypress is detected
   {
      if (key == 1)
      {
         motorPeriod += 10;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
      if (key == 2)
      {
         motorPeriod -= 10;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
      if (key == 0)
      {
         motorPeriod += 100;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
      if (key == 3)
      {
         motorPeriod -= 100;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
      if (key == 4)
      {
        isRun = 1 - isRun;
        lcd.setCursor(0,0);
        if (isRun == 1)
       {
          lcd.print("+++ Running +++ ");
          Timer1.attachInterrupt(EventTimer);
       }
        else
        {
          lcd.print("    Stopped     ");
          Timer1.detachInterrupt();
        }
       delay(250);
      }
      lcd.setCursor(0, 1);
      lcd.print("Speed ");
      lcd.print(motorPeriod);
      lcd.print("       ");
      delay(50);
   }
}
Записаний

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #217 : 10 Лютого 2016, 16:22:57 »
. - .

Никто не подскажет?  :-\
Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094
Re: Помогите с моторизацией EQ2
« Відповідь #218 : 10 Лютого 2016, 17:53:59 »
. - .

Код: [Select]
....
 if (motorPeriod == 300 && key<0)
 {
         motorPeriod = 595;
         Timer1.setPeriod(motorPeriod);
         delay(200);
  }

 if (key >= 0)   // if keypress is detected
...

...
      if (key == 3)
      {
         motorPeriod = 300;
         Timer1.setPeriod(motorPeriod);
         delay(200);
      }
...
Записаний
Подякували

CasterV

  • Offline Offline
  • Повідомлень: 223
  • Подяк: 8
Re: Помогите с моторизацией EQ2
« Відповідь #219 : 10 Лютого 2016, 21:27:03 »
. - .

М_М, спасибо! По поводу скорости вращения вала движка с задержкой меньше 300, что-то можете сказать?
Записаний