ARDUINO Часы на ГРИ v2. Обсуждение проекта

seva150785

✩✩✩✩✩✩✩
13 Ноя 2020
20
0
@psyx86, аааа, вон как и получается в разрыв провода резистор к 5 вольтам например со входа?
Нашел только 5.6 кОм, пойдет же?
 

psyx86

★★★★✩✩✩
31 Янв 2020
420
238
@psyx86, аааа, вон как и получается в разрыв провода резистор к 5 вольтам например со входа?
Нашел только 5.6 кОм, пойдет же?
Подойдёт. Я делал так: брал резистор, один конец подпаял к 3 ножке микросхемы, аккуратно укладывал до контакта NC модуля мини, окусил. К нему же один конец ( ранее обрезанный) резистора, а второй к + модуля часов. Всё, теперь подтяжка есть, контакта NC получился SQW, его ведем к D2 ардуино
 

seva150785

✩✩✩✩✩✩✩
13 Ноя 2020
20
0
@psyx86,все сделал, не хочет соединяться - Время ожидания ответа истекло.
Версия программы 1.1 на гитхабе взял.
А что за прошивка или скетч в ардуине должен быть?
 

psyx86

★★★★✩✩✩
31 Янв 2020
420
238
@psyx86,все сделал, не хочет соединяться - Время ожидания ответа истекло.
Версия программы 1.1 на гитхабе взял.
А что за прошивка или скетч в ардуине должен быть?
Последние версии у меня так же писал. А скетч как я понял нужен для работы с программой для корректировки. Проверьте все папки на гитхабе, я там брал. Либо в личку ящик напишите, вечером как буду за компом вышлю
 

seva150785

✩✩✩✩✩✩✩
13 Ноя 2020
20
0
@psyx86, написал в ЛС.
Кстати, сейчас попробовал версию 1.1.5 - соединяется, но делать ничего не дает, сразу дисконнект и время ожидания истекло, инфо о модуле тоже не дает.
 

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
попробовал версию 1.1.5 - соединяется, но делать ничего не дает, сразу дисконнект и время ожидания истекло, инфо о модуле тоже не дает
Попробуйте отключить фичу Status Control . Заходите в настройки программы: Tools->Port Settings и снимаете галочку с чекбокса [] Status Control
Если же это не поможет, закомментируйте 110 стоку в скетче, а в следующую строку добавить остаток от 1000, как ниже:
C++:
//    while ( millis() - tickCounter > 998 );
    t.milliSecs = (millis() - tickCounter) % 1000;
@seva150785
Если вы используете RTC MINI модуль, то не все функции программы будут доступны. Но получить текущую информацию и выставить время с комьютера все же можно, несмотря на то, что программа будет ругаться: Request for adjusment failed.

Для калибровки придеться чуток повозиться, а именно 1) подпояться к третьей ножке DS3231 как писалось выше; 2) изменить немного скетч для ардуино.

@seva150785, UPDATE
только что проверил. Время можно выставить и без подключения прерывания на D2. Достаточно отключить Контроль Статуса и закомментированъ 110-ю строку в скетче ардуино.
 

Вложения

Изменено:

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
@poty,
И эта функция тоже работает. В ручном режиме (Set Register) можно загнать значения в Aging регистор и вернуть дефолтное значение кнопкой Reset. Для это соединять прерывание нет необходимости. Оно нужно только для калибровки и корректного подсчета миллисекунд.
 

poty

★★★★★★✩
19 Фев 2020
3,257
949
@SergejEU, интересно, а без прерывания "корректный подсчёт миллисекунд" не может осуществляться? Обязательно использовать SQW?
Я поясню: есть проблема в разных чипах, которые китайские друзья умудряются влепить в DS3231 (M, S, SN...). И эти чипы имеют несколько разные возможности и биты регистров для генерации синхронизации на SQW. Во многих конструкциях здесь SQW никак не используется - лишние телодвижения для простых, в общем-то, вещей. Сама "калибровка" - лишь деление времени на период, т.е. не требует ни прерываний, ни расходов на внешнюю программу. Зачем тогда использование прерывания?
Установка регистра коррекции:
// Выставить регистр коррекции!!!
#define R_CORR            0

Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0x10);
Wire.write(R_CORR);
Wire.endTransmission();
 
Изменено:

Sergo_ST

★★★★★★✩
15 Мар 2020
992
831
@poty, скорее всего для авто-коррекции, но тогда было бы логичнее использовать выход 32K который для замера частоты и предназначен.
Как вы верно и подметили, некоторые регистры у разных чипов отличаются, в частности отсутствием битов RS1 и RS2 которые отвечают за установку частоты на выходе SQW, в этих чипах на выходе SQW доступна частота только в 1Гц.
 

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
@poty, за меня уже ответили, но в принципе можно и повторить, для авто коррекции без синхронизации по SQW не обойтись. Мы имеем два осциллятора. Один в ардуино, другой в модуле DS3231. Как иначе заставить их синхронно работать? Есть две возможности. Либо делить частоту с выхода 32kH, либо синхронизируемся по SQW. По затратам - Что в лоб, что по лбу. Да, чипы могут быть разными, но согласно спецификации, выхлоп: 1Hz предусмотрен у всех без исключения
 

poty

★★★★★★✩
19 Фев 2020
3,257
949
@SergejEU, мне кажется, что Вы не понимаете принцип работы программы. Никакие "осцилляторы" мы таким образом не синхронизируем, тем более, что сравнивается время не с Ардуино, а с компьютером. В описании модуля имеется единственная нормируемая величина - стабильность частоты внутреннего компенсированного генератора, причём вывод этой частоты гарантируется только на SQW-выводе. 32кГц в младших моделях выводится без коррекции, так что тоже непригодно для каких-либо манипуляций. Однако на выходе SQW задержки и джиттер, а также скважность импульсов (вернее - соблюдение точной скважности) - не нормируется. На сайте microchip имеются бюллетени, которые явно указывают, что не следует рассчитывать время по длительности импульса. Кроме того, эта величина сильно зависит от реализации подключения SQW к приёмнику (в данном случае - Ардуино) в связи с непредсказуемостью искажений фронтов/срезов импульсов (где-то в ветке уже было обсуждение этого вопроса).
Исходя из вышеописанного, с точки зрения точности расчёта ухода RTC нет никакой разницы в том, каким образом получать текущее время и сравнивать с эталонным, на относительно длительных отрезках времени: с помощью прерывания от SQW или прямым получением времени по I2C интерфейсу. Но разница есть для пользователя: нужно контролировать подключение SQW как минимум (и подтяжку тоже), при этом подключение должно осуществляться, почему-то, только к конкретному выводу Ардуино, который может к тому же быть занят.
Вывод: автокоррекция может осуществляться и без привлечения прерывания. Тем не менее, программа имеется, пользоваться ей можно. А мои рассуждения, в целом, направлены на то, что если авторы будут когда-либо обновлять программу, то есть возможность значительно упростить жизнь пользователям.
 

DeFoliante

✩✩✩✩✩✩✩
29 Апр 2019
2
0
Всем привет. Такой вопрос. Головой вроде понимаю, но хочется уточнить. Что бы получить питание в 60 - 70В. Мне нужно заменить индуктивность и конденсатор?
 

poty

★★★★★★✩
19 Фев 2020
3,257
949
@DeFoliante, если говорить о конструкции версии 2, то там нет конденсаторов, влияющих на напряжение. Что касается индуктивности, то всё зависит от тока в нагрузку. В принципе, ничего не меняя можно добиться напряжения 60-70В только изменив duty в ШИМ.
 
  • Лойс +1
Реакции: DeFoliante

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
@SergejEU, мне кажется, что Вы не понимаете принцип работы программы. Никакие "осцилляторы" мы таким образом не синхронизируем...
не нужно приписывать мне свои мысли. Я это не утверждал.
Исходя из вышеописанного, с точки зрения точности расчёта ухода RTC нет никакой разницы в том, каким образом получать текущее время и сравнивать с эталонным, на относительно длительных отрезках времени: с помощью прерывания от SQW или прямым получением времени по I2C интерфейсу.
вот это да! Вы понимаете, что пишите? В первом случае мы получаем сигнал по прерыванию (т.е. автоматически), а во втором - по запросу (т.е. зависит от времени, когда был послан по I2C запрос) и время считывается с регистров с точностью до секунды. В первом случае еще есть возможность дергать millis и получить нужные доли секунды, а во втором точность до +- секунды, вовсе не пригодна для расчетов.
Вывод: автокоррекция может осуществляться и без привлечения прерывания.
Покажите каким образом :)
 

poty

★★★★★★✩
19 Фев 2020
3,257
949
Я это не утверждал.
Мы имеем два осциллятора. Один в ардуино, другой в модуле DS3231. Как иначе заставить их синхронно работать?
(выделено мной)
В первом случае мы получаем сигнал по прерыванию (т.е. автоматически), а во втором - по запросу (т.е. зависит от времени, когда был послан по I2C запрос) и время считывается с регистров с точностью до секунды. В первом случае еще есть возможность дергать millis и получить нужные доли секунды, а во втором точность до +- секунды, вовсе не пригодна для расчетов.
Вы невнимательно прочитали введение к моим выводам. Нам не нужны доли секунды на длительных промежутках времени. И в программе, насколько я помню, нет ориентации на millis, иначе точность измерений будет зависеть от точности хода часов в Ардуино, а они, увы, значительно менее точные, чем в DS3231. Программа просто подсчитывает количество секундных (или полусекундных) импульсов в заданное компьютером время и получает "разбег", который компенсирует простым расчётным способом. Это раз.
Но даже если бы они и были нужны, то их легко получить и без прерывания. С учётом скорости передачи данных по I2C (400кГц) и количества передаваемых в запросе бит (установка указателя на нужный регистр + чтение регистра) 20+20=40, длительность запроса равна 100мкс. Пусть ещё столько же оставим на работу самого процессора Ардуино, это я от широты души, так сказать, чтоб не было обвинений в предвзятости, (итого = 200мкс). Т.е., за одну миллисекунду мы можем как минимум 5 раз опросить DS3231 и получить точность = половине этого периода, т.е. 100мкс. В 10 раз точнее millis, не находите? Это два.
 

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
(выделено мной)

Вы невнимательно прочитали введение к моим выводам. Нам не нужны доли секунды на длительных промежутках времени. И в программе, насколько я помню, нет ориентации на millis, иначе точность измерений будет зависеть от точности хода часов в Ардуино, а они, увы, значительно менее точные, чем в DS3231. Программа просто подсчитывает количество секундных (или полусекундных) импульсов в заданное компьютером время и получает "разбег", который компенсирует простым расчётным способом. Это раз.
Но даже если бы они и были нужны, то их легко получить и без прерывания. С учётом скорости передачи данных по I2C (400кГц) и количества передаваемых в запросе бит (установка указателя на нужный регистр + чтение регистра) 20+20=40, длительность запроса равна 100мкс. Пусть ещё столько же оставим на работу самого процессора Ардуино, это я от широты души, так сказать, чтоб не было обвинений в предвзятости, (итого = 200мкс). Т.е., за одну миллисекунду мы можем как минимум 5 раз опросить DS3231 и получить точность = половине этого периода, т.е. 100мкс. В 10 раз точнее millis, не находите? Это два.
посмотрите как следует сам код программы. Он находится в открытом доступе, тогда все ваши предположения отпадут сами собой.

Мое утверждение, подразумевает совместную работу двух осцилляторов - RTC и ардуино над формированием миллисекунд с точностью +-1мс, более ничего. Надеюсь это ясно.

Но это не самая большая цена точности. Поверьте, гораздо большую погрешность получаем при синхронизации с серверами точного времени по NTP протоколу, да вытесняющая мультизадачность операционных систем тоже вносит свой рассинхрон. Тут уж как в том старом анекдоте: Экономите на спичках - пропиваете на шампанском..
 

poty

★★★★★★✩
19 Фев 2020
3,257
949
посмотрите как следует сам код программы. Он находится в открытом доступе, тогда все ваши предположения отпадут сами собой.

Мое утверждение, подразумевает совместную работу двух осцилляторов - RTC и ардуино над формированием миллисекунд с точностью +-1мс, более ничего. Надеюсь это ясно.
Ну, я не стал надеяться на свою память и потратил-таки время, чтобы освежить, что же там всё-таки написано в "программе"... Нет там никакой совместной работы "двух осцилляторов". Эталонное время в UNIX-формате получается через serial из компьютера, записывается в структуру ref (замечу, в описании проекта напрямую указано, что необходимая точность зависит от правильности настройки NTP, и здесь - моё второе несогласие, на этот раз с точностью работы этого протокола, так получилось, что много лет работал с глобальными компьютерными сетями и знаю множество измерительных систем, основанных на NTP; про "вытесняющую мультизадачность операционных систем" вообще умолчу, дабы не расстраивать). Время из RTC с точностью до секунд записывается в t.utc, а фракция миллисекунд (внимание!) измеряются с помощью millis в прерывании! :) Можно, конечно, millis связать с "осциллятором Ардуино", но я бы не стал (по сравнению с длительностью эталонного интервала - это вообще "копейки"). Фактически, можно убрать прерывание и поставить в цикл while опрос RTC до смены секунды, сохранив значение millis во временной переменной (например, mSec). t.milliSecs тогда будет рассчитываться как millis()-mSec. Всё!
Расчёт коррекции производится между ref (переданным временем компьютера) и временем t (полученным от RTC) с учётом интервала обсчёта (достаточно длительного для устранения неточностей вычислений до секунды и записанного в diff eeprom). Вот и весь "алгоритм".
 
Изменено:

Sergo_ST

★★★★★★✩
15 Мар 2020
992
831
Вот мб кому пригодится.
Замер мс с пина SQW настроенного на 1Гц.
Если не использовать пин SQW можно в ручную запускать/останавливать счёт.
Также если сильно нужна функция "millis", можно использовать 2-й таймер, но лучше во время замера исключить все прерывания кроме счета мс.
C:
volatile uint16_t _millis = 0;
volatile boolean state = 0;
uint16_t msInSec = 0;

#define INT_START  state = 0; EIMSK = 0b00000001 //вызывается один раз для начала замера
#define MLS_START  state = 1; _millis = 0; TCNT0 = 0; TIMSK0 = 0b00000001 //начать замер мс
#define ALL_STOP   TIMSK0 = 0b00000000; EIMSK = 0b00000000 //завершить замер мс

int main(void)
{
  TCCR0A = 0b00000000; //отключаем OC0A/OC0B
  TCCR0B = 0b00000011; //пределитель 64
  TIMSK0 = 0b00000000; //отключаем прерывания Таймера0
  EICRA = 0b00000010; //настраиваем внешнее прерывание по спаду импульса на INT0
  for (;;) {
    //INT_START; //первый запуск замера мс(вызывается один раз для начала замера)
    if (!EIMSK) msInSec = _millis; //если замер завершён, можно забрать результат в мс
  }
  return 0;
}
ISR(INT0_vect, ISR_NOBLOCK) //внешнее прерывание на пине INT0
{
  switch (state) {
    case 0: MLS_START; break;
    case 1: ALL_STOP; break;
  }
}
ISR(TIMER0_OVF_vect) //счет мс
{
_millis++;
}
Также можно добавить коэффициент коррекции, тк если брать идеальные 16МГц, то одно переполнение таймера будет длиться 1024мкс.
C:
msInSec = (float)_millis * 1.024;
 
Изменено:

seva150785

✩✩✩✩✩✩✩
13 Ноя 2020
20
0
@SergejEU,да, спасибо, мне уже подсказали, что куда паять, но все равно не калибруется. За выходные отстали на 33 секунды. Строку закомментировал, не помогло.
 

DeFoliante

✩✩✩✩✩✩✩
29 Апр 2019
2
0
У меня не так много опыта, я хотел часть схемы питания взять, изменить компоненты и использовать в часах на индикаторах ИВ-6
 

Sergo_ST

★★★★★★✩
15 Мар 2020
992
831
Кто что думает об линейном регулировании напряжения(без обратной связи) в зависимости от яркости/включен ли индикатор?
Пока удалось добиться точности удержания напряжения +-5в(160-170в)...
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,257
949
@SergejEU,да, спасибо, мне уже подсказали, что куда паять, но все равно не калибруется. За выходные отстали на 33 секунды. Строку закомментировал, не помогло.
А что пишет программа калибровки?
@DeFoliante, не очень понятно, что Вы спрашиваете? Потенциально ответ может быть: работать будет. Но мне лично вытягивать детали, чтобы попытаться помочь, не очень хочется. Если Вы столкнулись с конкретной проблемой (чуть выше Вы писали о получении напряжения 70В, это не получается?), то опишите её, приведите шаги, которые уже сделали. Если Вы в принципе не знаете, что и как делать, то либо берите готовый вариант, либо изучайте вопрос. Просто взять готовую конструкцию, скетч, под неё написанный, изменить "часть схемы питания" и получить работающий вариант - мне кажется невозможным. Хотя бы по причине того, что ИВ-6 управляются совсем по-другому, то есть схема их подключения и бОльшая часть скетча - будут совсем другими.
 

EvgehaGl

✩✩✩✩✩✩✩
18 Ноя 2020
26
0
Доброго вечера. Часы не первые собираю, было все в норме собрал корпус и на любом из четырех индикаторов при горящей 2 фантомит 3, или при горящей 3 фантомит 2. Ид менял, все прозвонил, отмыто все как положено. В чем может быть проблема?
 

Вложения