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

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

Увійти

google


Автор Тема: «Тикалка» для шаговика (или как моторизовать монтировку-2)  (Прочитано 40153 раз)

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

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

Астротрекер за два вечера
http://habrahabr.ru/post/227499/
Записаний



vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

У меня есть амбарка, но с ручным приводом. Появилась мысль ее автоматизировать ;)
Вроде сейчас все для этого есть в продаже:

Вот двигатель: http://arduino-ua.com/prod216-Shagovii_dvigatel_5V_28BYJ-48
Вот его драйвер: http://arduino-ua.com/prod280-Draiver_shagovogo_dvigatelya_ULN2003
И контроллер: http://arduino-ua.com/prod166-Arduino_Nano_ATmega328

Проблема в том, что я совершенно не понимаю, как это дело программировать!  :insane:
От контроллера требуется всего лишь одно: при включении крутить двигатель по часовой стрелке с нужной мне скоростью. Ничего более.

Вопрос 1: есть ли в природе готовые проги для этих целей?
Вопрос 2: если готовых нет, может кто напишет?  :shuffle:

Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

Проги есть,  даже на этом форуме исходники пробегали. Поможем и адаптируем по необходимости.

Записаний

alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295

Проги есть,  даже на этом форуме исходники пробегали. Поможем и адаптируем по необходимости.
Aga (C)  Это вам к exez`у нужно. 
Он на этом собаку съел... ;)
Записаний

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

Проги есть,  даже на этом форуме исходники пробегали. Поможем и адаптируем по необходимости.

отлично! как соберусь, буду просить помощи! спасибо!
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

wanowar

  • Offline Offline
  • Повідомлень: 184
  • Подяк: 36
Записаний

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

В общем, после мозгового штурма была написана переработана программа для шаговика.
Напомню железо: мотор 28BYJ-48, драйвер ULN2003А, мозги Arduino Nano V3.0 AVR ATmega328 P-20AU (китайский клон).

Алгоритм работы:

1. Сразу после включения начинается вращение шаговика по часовой стрелке со скоростью 1 об/мин (привод на амбарку планирую прямой для простоты). При этом индикаторный светодиод мигает.
2. При нажатии и удержании кнопки "Назад" шаговик начинает вращаться в обратном направлении с более высокой скоростью. Светодиод при этом горит постоянно.
3. При отпускании кнопки "Назад" возобновляется вращение по часовой стрелке со скоростью 1 об/мин.
Все )

Код прилагаю и прошу небезразличных людей проверить его )

И теперь вопросы:
1) Мне нужна скорость 1 оборот в минуту (4075.77 тактов в минуту). Т.е. интервал между тактами 4075,77/60сек = 14,7мс. Поэтому параметр motorSpeed в коде ставлю равным 14.
2) Скорость обратного вращения наоборот нужна максимальная. Тогда может можно вообще убрать delay из функции counterclockwise?

И еще есть вопрос по питанию:
Питание планировал от 6В (4 батареи АА). Но вот вопрос: контроллеру надо или 5В стабилизированных, или 6-20В. А ведь батареи очень быстро станут давать чуть меньше 6В. Не годится? И мотору с драйвером пойдет 6В или это многовато будет?
Или не парится, а делать 9В (6 шт АА) и подключать всю схему через 7805 и не морочить голову?  И надо ли тогда на 7805 вешать радиатор?

Заранее всем благодарен за помощь!

Код: [Select]
//вывод D5 - кнопка "Назад" (пин 8)
//выводы D6,D7,D8,D9 - управление ШД (пины 9-12)
//вывод D10 - светодиод (пин 13)

const int ledPin =  13;      // the number of the LED pin
int ledState = LOW;          // ledState used to set the LED
long previousMillis = 0;     // will store last time LED was updated
long interval = 500;         // interval at which to blink (milliseconds)

const int buttonBack = 8;    // присвоение пина 8 кнопке "Назад"
int buttonStateBack = 0;     // переменная статуса кнопки "Назад"

const int motorPin1 = 12;    // Blue   - 28BYJ48 pin 1
const int motorPin2 = 11;    // Pink   - 28BYJ48 pin 2
const int motorPin3 = 10;    // Yellow - 28BYJ48 pin 3
const int motorPin4 = 9;     // Orange - 28BYJ48 pin 4
// Red - 28BYJ48 pin 5 (VCC)

const int motorSpeed = 14;     // задержка между шагами при вращении по часовой стрелке (ведение) ее и будем подбирать, чтобы был 1 об/мин
const int motorSpeedRev = 5;  // задержка между шагами при обратном вращении (возврат на исходную позицию)

void setup() {

  pinMode(buttonBack, INPUT); // initialize the button pin as an input
  pinMode(ledPin, OUTPUT);    // set the digital pin as output   

  //declare the motor pins as outputs
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin(9600);
}
void loop() {
 
  buttonStateBack = digitalRead(buttonBack); // read the state of the pushbutton value
     
 // если нажата кнопка "Назад", то включаем задний ход, если не нажата, то ведем трекер
  if (buttonStateBack == HIGH) {
    counterclockwise();         // включаем задний ход
digitalWrite(ledPin, HIGH); // светодиод горит постоянно пока работает задний ход
  }
  else
  {
    clockwise(); // ведем трекер
 
// во время ведения светодиод мигает
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; 
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
      digitalWrite(ledPin, ledState);
  }
  }
   
}

//функция трекера
void clockwise() {
  // 1
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay(motorSpeed);
  // 2
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay (motorSpeed);
  // 3
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay(motorSpeed);
  // 4
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delay(motorSpeed);
  // 5
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delay(motorSpeed);
  // 6
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  delay (motorSpeed);
  // 7
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delay(motorSpeed);
  // 8
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delay(motorSpeed);
}

//функция возврата в исходное положение
void counterclockwise () { 
  // 1
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(motorSpeedRev);
  // 2
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay (motorSpeedRev);
  // 3
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(motorSpeedRev);
  // 4
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(motorSpeedRev);
  // 5
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(motorSpeedRev);
  // 6
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, HIGH);
  delay (motorSpeedRev);
  // 7
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(motorSpeedRev);
  // 8
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(motorSpeedRev);
}
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56


Саша Наумов

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 1455
  • Подяк: 612
  • Refractorman

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

По питанию - не знаю, сколько там тока употребит ардуина, но уверен, что лучше бы поставить 7805 или 78M05.
Необходимость радиатора - опытным путём (это зависит и от тока потребления ардуины, и от величины входного напряжения).
Я бы запитал от Кроны...
Записаний
Agema SD 150 + WS-400

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

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

По питанию - не знаю, сколько там тока употребит ардуина, но уверен, что лучше бы поставить 7805 или 78M05.
Необходимость радиатора - опытным путём (это зависит и от тока потребления ардуины, и от величины входного напряжения).
Я бы запитал от Кроны...

Большое спасибо! Вообще-то это так сказать первая версия кода. В планах я хочу сделать коррекцию тангенциальной ошибки амбарки путем повышения скорости вращения шаговика каждые пару минут. Тогда точность должна повыситься. Но это уже детали. Главное начать!
По кроне - не будет ли дохнуть слишком быстро?
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

wanowar

  • Offline Offline
  • Повідомлень: 184
  • Подяк: 36

По поводу питания. Там вроде есть на плате регулятор на 3,3В, потому нет смысла ставить 7808, да и КПД у них низкий, для батарейного питания не подходит. Запитать можно от 3 батареек АА. Этого будет достаточно.  ATMega328А требует 2.7-5.5В. У "Кроны" емкость очень маленькая, долго не выдержит, а если еще через 7805 то еще быстее.
Записаний

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

По поводу питания. Там вроде есть на плате регулятор на 3,3В, потому нет смысла ставить 7808, да и КПД у них низкий, для батарейного питания не подходит. Запитать можно от 3 батареек АА. Этого будет достаточно.  ATMega328А требует 2.7-5.5В. У "Кроны" емкость очень маленькая, долго не выдержит, а если еще через 7805 то еще быстее.

Тут дело в том, что шаговику нужно 5В. Будет ли тянуть на 4,5В (реально то еще меньше будет через часок)?
Может пробовать вариант из 6 АА? По мощности будет получше кроны однозначно... Может есть аналоги 7805, но с лучшим КПД?
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

По поводу питания. Там вроде есть на плате регулятор на 3,3В, потому нет смысла ставить 7808, да и КПД у них низкий, для батарейного питания не подходит. Запитать можно от 3 батареек АА. Этого будет достаточно.  ATMega328А требует 2.7-5.5В. У "Кроны" емкость очень маленькая, долго не выдержит, а если еще через 7805 то еще быстее.
С тем кварцем что стоит на Ардуино с ATMega328 не будет запускаться на 3,3в, менять на меньшую частоту надо а там хз как оно с библами увяжется  :hz:
Короче 5в питания и не испытываем судьбу  ;D.
Записаний



vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

С тем кварцем что стоит на Ардуино с ATMega328 не будет запускаться на 3,3в, менять на меньшую частоту надо а там хз как оно с библами увяжется  :hz:
Короче 5в питания и не испытываем судьбу  ;D.

Спасибо! А по коду - тоже без замечаний?
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

я бы таймер задействовал и по прерыванию тикал бы (шагал шаговиком)

Код: [Select]
#include <TimerOne.h>


void setup()
{
Timer1.initialize(14700);
Timer1.attachInterrupt(EventTimer); // run every 14,7 ms
}

void EventTimer()
{
   //................................
}
« Останнє редагування: 25 Червня 2015, 19:18:21 від MAKsutik »
Записаний



Berg

  • Offline Offline
  • Повідомлень: 90
  • Подяк: 23
  • верхогляд-любитель

Тут дело в том, что шаговику нужно 5В. Будет ли тянуть на 4,5В (реально то еще меньше будет через часок)?
Шаговик то будет тянуть, но надо проверить рабочий диапазон напряжений ULN2003. Я обычно, питаю шаговик напряжением в 2-3 раза меньше паспортного - электричество экономлю.
Цитувати
Может пробовать вариант из 6 АА? По мощности будет получше кроны однозначно... Может есть аналоги 7805, но с лучшим КПД?
всё равно потеря электричества на стабилизаторе. Лучше взять шаговик на 12 вольт.
Я не люблю использовать униполярные моторы и переделываю их в биполярные.
 
Частота у Вас получилась очень большая. Вы правильно рассчитали? Для повышения скорости, убирать задержку совсем не получится. Хорошо, если этот дешёвый двигатель будет работать с задержкой 5 мс. Едва ли он сможет работать быстрее.
И зачем Вам полушаг при такой высокой частоте? Если использовать полный шаг и одну скорость, то программа получается совсем простой.
Вот только я не знаю, драйвер на ULN2003 инвертирует сигнал? Если не инвертирует, то две строчки надо поменять местами.
Код: [Select]
int speed =14 ;   //скорость
int n=8;

void setup()   {               
  // initialize the digital pin as an output:
  pinMode(8, OUTPUT);    // начало первой обмотки
  pinMode(9, OUTPUT);    // начало второй обмотки
  pinMode(10, OUTPUT);   // конец первой обмотки
  pinMode(11, OUTPUT);   // конец второй обмотки
}
void loop()                     
{
  if (n==11) n = 8;
  else n++;
   
  digitalWrite(n, HIGH);         // включить обмотку
  delay(speed);                  // пауза
  digitalWrite(n, LOW);          // выключить обмотку
}
« Останнє редагування: 25 Червня 2015, 19:48:47 від Berg »
Записаний
DeepSky 70400, DeepSky F70070,F30070M, ЗМ-5А, МАК-70, Sky-Watcher 705, Travel Scope 70, ТАЛ-120, DeepSky 90/700.

wanowar

  • Offline Offline
  • Повідомлень: 184
  • Подяк: 36

я бы таймер задействовал и по прерыванию тикал бы (шагал шаговиком)

Код: [Select]
#include <TimerOne.h>


void setup()
{
Timer1.initialize(14700);
Timer1.attachInterrupt(EventTimer); // run every 14,7 ms
}

void EventTimer()
{
   //................................
}
Смотрю это всем новичкам свойственно
Записаний

exez

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 1886
  • Подяк: 708
  • Астроманьяк

По поводу питания. Там вроде есть на плате регулятор на 3,3В, потому нет смысла ставить 7808, да и КПД у них низкий, для батарейного питания не подходит. Запитать можно от 3 батареек АА. Этого будет достаточно.  ATMega328А требует 2.7-5.5В. У "Кроны" емкость очень маленькая, долго не выдержит, а если еще через 7805 то еще быстее.

Тут дело в том, что шаговику нужно 5В. Будет ли тянуть на 4,5В (реально то еще меньше будет через часок)?
Может пробовать вариант из 6 АА? По мощности будет получше кроны однозначно... Может есть аналоги 7805, но с лучшим КПД?

Шаговик отменно работает при 6-7В. К стати при этом появляется дополнительная мощность. Рекомендую ставить 6В. Та же uln расчитана до 12В поэтому это вобще не проблема.

Ардуинка на вход 5В вполне сносно переживает подачу напряжения 5.98В, но так лучше не делать!
В идеале поставить перед входом диод. Это понизит напряжение на 0.7В (диод брать 1000В 1.5А)

и после этого спокойно все запитывать от 4ех аккумов 1.2В. В сумме заряженые аккумы дают 5.5В
« Останнє редагування: 25 Червня 2015, 19:51:39 від exez »
Записаний
чистого всем неба и длинных безлунных ночей...

Berg

  • Offline Offline
  • Повідомлень: 90
  • Подяк: 23
  • верхогляд-любитель

Я себе поставил переключатель 5В <-> 6-20В
Записаний
DeepSky 70400, DeepSky F70070,F30070M, ЗМ-5А, МАК-70, Sky-Watcher 705, Travel Scope 70, ТАЛ-120, DeepSky 90/700.

exez

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 1886
  • Подяк: 708
  • Астроманьяк

это чревато тем что кто то забудет переключить переключатель и подаст на 5В 12..
Записаний
чистого всем неба и длинных безлунных ночей...

Berg

  • Offline Offline
  • Повідомлень: 90
  • Подяк: 23
  • верхогляд-любитель

Можно сделать два разных разъёма.
Записаний
DeepSky 70400, DeepSky F70070,F30070M, ЗМ-5А, МАК-70, Sky-Watcher 705, Travel Scope 70, ТАЛ-120, DeepSky 90/700.