Часы на шаговом двигателе.

Tild
Offline
Зарегистрирован: 16.08.2021

Просьба сильно не пинать - слишком много идей, но нет ни навыков быстро перепробовать все, ни возможности накупить кучу деталей, которые потом не понадобятся.

В настоящее время уже есть:

-желание заставить показывать время уличные часы с "физическими стрелками"

-уже существующая "внешняя часть" (циферблат и стрелки, связанные редуктором 12:1)

-навыки в ардуино вида "пишу со словарем", но долго читая инструкцию к примерам разобраться пока получалось

-ардуино нано + плата 3231 + шаговик с 3д-принтера (плату драйвера заказал, но пока жду)

Самый первый вопрос - как просто и надежно (и очень желательно недорого) контролировать реальное положение стрелок? Сделать выступы под концевики на обоих валах можно, но вот их надежность при перепадах температуры и влажности мне не нравится. Приклеить магниты и использовать герконы - боюсь будет определение положения вала "1 см +- пару метров". Вроде как можно приспособить оптические концевики от 3д-принтеров, но их стойкость к температуре и влажности тоже никто не обещает. 

На данный момент самым простым способом получить результат выглядит вариант запустить на ДС3231 ежесекундный будильник и вращать по нему двигатель на фиксированное число шагов. Но так и не придумал как при таком подходе сделать возможность "догнать реальное время" при сбоях питания, кроме варианта запустив второй будильник на каждые 12 часов, в полночь и полдень докручивать до срабатывания датчиков положения на обоих валах (или ждать будильника, если датчики сработали, а время еще не настало).

Или лучше все таки постоянно читать время из ДС3231 и при его изменении вращать мотор? Реализация вроде как муторнее, но может быть надежнее.

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Присобачить на валы абсолютные энкодеры, например.

rkit
Offline
Зарегистрирован: 23.11.2016

Сколько проблем, сколько проблем. Прямо как будто делать часы на шаговике это кошмарная затея, а китайский часовой механизм с батарейкой можно купить за 200 рублей.

Tild
Offline
Зарегистрирован: 16.08.2021

На вал часовой стрелки сложно прилепить чего-либо недорогое фабричное, т.к. он не имеет только один выход с редуктора и тот в виде трубы, внутри которой проходит вал минутной стрелки.

Пока в голову приходит "аварийный вариант", на случай если не найду подходящий способ определять прохождение стрелки через 12: после подачи питания просто ждать пока кнопками "+" и "-" не выставится нужное положение стрелок и не нажмется "старт".

Или вообше забить на "автоподвод" - короткие исчезновения питания просто будут давать отставание, но не полную остановку.

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

 Возможно датчик Холла поможет

Pyotr
Offline
Зарегистрирован: 12.03.2014

Знаем сколько шагов на 1 минуту. При отключении питания пишем в EEPROM время в секундах с 00:00 два байта - максимум 12*60*60. При вкл. питания считаем сколько времени отсутствовало питание, и делаем соответствующее количество шагов - подводим стрелки.

SAB
Offline
Зарегистрирован: 27.12.2016

Думаю, не надо ни чего запоминать. Ставим концевики, и пляшем от них. Таким образом, при подаче питания всегда выставляем стрелки сначала на 00:00:00 запрашиваем время и устанавливаем 

Tild
Offline
Зарегистрирован: 16.08.2021

SAB пишет:

Думаю, не надо ни чего запоминать. Ставим концевики, и пляшем от них. Таким образом, при подаче питания всегда выставляем стрелки сначала на 00:00:00 запрашиваем время и устанавливаем 

Как раз такой ход мыслей у меня. Но смущает надежность механических концевиков. Думаю буду пробовать оптические от 3д принтеров - если никто не посоветует другое. Но решил делать по этапам.

Сначала дождусь драйвер мотора, шкивы и ремень и попробую просто собрать механику с шагами по будильнику и парой парой кнопок "вперед" "назад".

Заодно придумал как проверить стабильность питания: при старте зажигать светодиод и гасить его при любом нажатии на кнопку. Будет индикатором отключений.

Пошел дальше читать инструкции.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Tild пишет:
Как раз такой ход мыслей у меня. Но смущает надежность механических концевиков. Думаю буду пробовать оптические от 3д принтеров

Лучше советские купи, ВП-16.  Ими вполне можно, при необходимости, уничтожать живую силу противника или поезда под откос пускать. 

Tild
Offline
Зарегистрирован: 16.08.2021

DetSimen пишет:

Лучше советские купи, ВП-16.  Ими вполне можно, при необходимости, уничтожать живую силу противника или поезда под откос пускать. 

Боюсь вес размер и, главное, усилие нажатия будут перебором.

Тут глядя в инструкцию нацарапал текст... Вроде на макетке все работает:


#include <GyverStepper.h>
#include <DS3232RTC.h>

# define secST 64 // шаги в секунду поменять как будет драйвер с мотором!!!
# define moovST 192 // шаги на кнопку

GStepper<STEPPER4WIRE> stepper(2048, 5, 3, 4, 2); // настройка драйвера, поменять как будет драйвер с мотором!!!
bool ledG, flU, flD = 0;
void setup() {
  //  RTC.set(compileTime());
  stepper.setRunMode(FOLLOW_POS);
  stepper.setMaxSpeed(400); // ускорение и скорость из примера! проверить нагрев мотора!!!
  stepper.setAcceleration(500);
  RTC.setAlarm(ALM1_EVERY_SECOND, 0, 0, 0, 0);
  RTC.alarm(ALARM_1);
  RTC.alarmInterrupt(ALARM_1, false);
  RTC.squareWave(SQWAVE_NONE);
  pinMode(A1, INPUT); // кнопка "+"
  pinMode(A2, INPUT); // кнопка "-"
  pinMode(6, OUTPUT); // мигающий диод
  pinMode(7, OUTPUT); // индикатор перебоя питания
  digitalWrite (7, 1);
}

void loop() {
  stepper.tick();

bool btnU = digitalRead(A1);
  if (btnU && !flU) {  // нажат +
    flU = true;
    stepper.setTarget(moovST, RELATIVE);
    while (stepper.tick()) {} //переход на позицию по кнопке, иначе будильник перебивает
    }
  if (!btnU && flU) {  // отпущен +
    flU = false; 
    digitalWrite (7, 0);
    }

bool btnD = digitalRead(A2);
  if (btnD && !flD) {  // нажат -
    flD = true;
    stepper.setTarget(-moovST, RELATIVE);
    while (stepper.tick()) {}//переход на позицию по кнопке, иначе будильник перебивает
    }
  if (!btnD && flD) {  // отпущен -
    flD = false; 
    digitalWrite (7, 0);
    }
  
  if ( RTC.alarm(ALARM_1) )
  {
    ledG = !ledG;
    digitalWrite (6, ledG);
    stepper.setTarget(secST, RELATIVE);
   }
}

Сильно криво или "для сельской местности пойдет"?