Часы на городской ратуше
- Войдите на сайт для отправки комментариев
Здравствуйте! Делаю проект запуска часов на городской ратуше, использовал плату Arduino Mini и шаговый двигатель NEMA-17 с драйвером Easy driver 4.4
Вот скетч для работы движка:
#include <Stepper.h>
#define STEPS 200 // 1 шаг = 1 градус
Stepper stepper(STEPS, 3, 4); // пины на ардуино
void setup()
{
stepper.setSpeed(500); // скорость движения вала
}
void loop()
{
stepper.step(3200); // выполняет пол оборота вала согласно расчетам редуктора стрелок часов (секундной стрелки нет)
delay(58000);
}
Все было хорошо, часы шли более менее точно, но с приходом жары (а они стоят под металлической черепицей) температура внутри помещения достигает около 45 градусов и часы то дико начали спешить, то идут нормально, как вариант думаю добавить модуль реального времени, но как заставить двигатель каждую минуту согласно данных модуля часов делать пол оборота? Может есть какие-то другие варианты?
ак заставить двигатель каждую минуту согласно данных модуля часов делать пол оборота?
Странный вопрос. А как Вы его сейчас заставляете? Вы вызываете функцию stepper.step(3200);
Ну так и там делайте.
RTC (например DS3231) имеют специальное прерывание, которое Вы можете запрограммировать так, чтобы оно выдавалось точно при переходе минуты. Т.е. точно при переходе на новую минуту у Вас будет проскакивать HIGH на пине SQW RTC. Вот, в ответ на это прерывание и вызывайте stepper.step(3200); и всё будет нормально.
2 ЕвгенийП: А там разве не 1 Гц минимальная частота?
Все дело в том, что интервал между движением вала не всегда ровно минута как оказалось, это стало зависеть от температуры, и соответственно точность хода минутной стрелки нарушилась.
Как вариант можно следить за минутной стрелкой, на пример поставить датчики или кнопочки, на которые будет минутная стрелка нажимать на пример на каждом часе (смотря какая точность требуется) если стрелка прибежала (нажала кнопку раньше) то ждет когда нужно бежать дальше, если позже нажала то вперед, в догоняй время. А вообще маханические часы на ардуино... ну не знаю... у меня была идея сделать 2 циферблата ( часы и минуты отдельно), раскидать хаотично цифры на них и двумя сервами выставлять точное время каждые скажем 5 минут. Может реализую, наверное будет забавно выглядить...
2 ЕвгенийП: А там разве не 1 Гц минимальная частота?
Я не понимаю, о какой частоте речь, но DS3231 можно настроить, чтобы они выдавали прерывание при переходе на каждую новую минуту. Посмотрите даташит, там это есть.
ALARM 2 REGISTER MASK BITS (BIT 7)
Все дело в том, что интервал между движением вала не всегда ровно минута как оказалось, это стало зависеть от температуры, и соответственно точность хода минутной стрелки нарушилась.
Так а я Вам про что?
Ставьте DS3231, настраивайте, чтобы она выдавал Вам прерывание точно при переходе минуты и именно в этот момент, когда RTC скажет, двигайте стрелку.
Как один из вариантов - можно поискать кварцевый генератор на 16 МГц. На них в тех. описании указывается термостальность. Заменить кварцевый резонатор генератором.
Это может решить вопрос только ценой дополнительных ухищрений и расходов. Генератор должен быть термокомпнсированным, что увеличивает стоимость в разы. DS3231 теромкоменсирована от рождения и стоит меньше доллара. Точннее и сложнее в разы решение можно придумать, но просто и дешево -- это только DS3231. Причем, дешево тут не означает плохо. Точность у DS3231 очень приличная.
Мне с ардуино пришлось познакомиться по причине разработки проекта, но я не очень силен в программировании на этом языке, как максимум удалось написать данный скетч, есть у меня этот модуль, но как его прикрутить программно не знаю, с електроникой знаком очень хорошо, телефоны, планшеты, GPS навигаторы прошиваю и ремонтирую легко, но тут совсем другое, все на что меня хватило, так это написать елементарный код, который вы видите в первом топике. Поэтому очень прошу помощи. DS3231 купил, подключил, но дальше этого дело не дошло. Читал разные статьи и многие форумы, но собрать инфу во что-то логическое так и не получилось.
Часы на городской ратуше вешь можно сказать серьезная,
надо код выкладывать, что бы понятно было что сейчас у вас работает и как и как вы хотите сделать примерно.
Вообще к подобным часам GPS модуль прикручивают и синхронизируються часы по спутникам. Они уж точно дают точное время.
есть плата Arduino Leonardo и шаговый двигатель NEMA-17 с драйвером Easy driver 4.4 ну и часовой модуль, все уже установлено и прикручено, осталось код написать
Поэтому очень прошу помощи. DS3231 купил, подключил, но дальше этого дело не дошло.
Ну, попробуйте так. Есть несколько библиотек для DS3231. Я в своё время скачал вот эту и чуть-чуть её модифицировал. Привожу свой, модифицированный код.
DS3231.h
DS3231.cpp
Если Вы установите эту библиотеку, то Вам нужно будет сделать следующее:
1. Соединить пин SQW модуля часов (или микросхемы - не знаю, что у Вас) с пином 2 или 3 Ардуино.
2. В скетче прописать вот такие строки ...
с поправкой на Ваш код, разумеется.
По идее, всё должно заработать. Для проверки, сначала поставьте в то место, где собираетесь двигать стрелку вывод слова "privet" в Serial и убедитесь, что оно выводится точно раз в минуту.
P.S. Только сейчас заметил, что у Вас леонардо. Я их никогда не видел и не знаю, какие там пины за прерывания отвечают, так что может быть не 2 и 3, а что-то другое. Разберитесь сами. Идея простая- функцию everyMinuteAlarm необходимо повесить на прерывание по заднему фронту сигнала на пине SQW.
Большое спасибо за помощь, на данный момент использую этот код в качестве тестового, если не пройдет тест попробую Ваш. Сегодня как раз первый тестовый запуск, вроде работает, посмотрю сутку, как будет себя вести. Как по Вашему мнению он, имеет право на жизнь?
#include <Stepper.h>
#include <RTC.h>
#define STEPS 200 // 1 шаг = 1 градус
Stepper stepper(STEPS, 3, 4); // пины на ардуино
byte current_minute;
RTC time;
unsigned long timer;
void setup()
{
Serial.begin(9600);
stepper.setSpeed(500); // скорость движения вала
time.begin(RTC_DS3231); //Либо другой
current_minute = atoi(time.gettime("i"));
}
void loop()
{
if (atoi(time.gettime("i")) != current_minute) { //Сравниваем текущую минуту с записанной, если не сошлось
Serial.println("Pass a minute...");
Serial.println("timer start...");
timer=millis();
stepper.step(3200); // выполняет пол оборота вала согласно расчетам редуктора стрелок часов (секундной стрелки нет)
Serial.print("Timer value is ");
Serial.println(millis()-timer);
current_minute = atoi(time.gettime("i")); //Обновляем текущее значение минуты.
}
}
P.S. Леонардо очень хорошая платформа, изготовлена в Италии, с ней очень просто как оказалось, даже выведены специальные пины для подкючения модуля реального временни.
Да, иметь-то имеет, но там проще. Там loop у Вас вовсе пустой - всё прерывание делает. Да и формально точнее, хотя, это уже чисто формальная придирка. Точность и у Вас более чем достаточная.