Мои поделки: Часы-Будильник-Таймер-Секундомер на МК ATtiny85V [май-октябрь 2013]

Хорошая задачка — лучший учитель! Каждый джедай, в ученичестве, должен: «помигать LED-иком», «собрать Часики/Таймер» и «сделать Термометр» — это уже, практически, сложившаяся традиция! :) Все мы начинали с КРЕНок…
Здесь, представлена моя первая электронная разработка на микроконтроллере: в которой я «собрал Часы-Таймер».

Внешний вид Устройства

Содержание:

Далее, будет много фоток (все кликабельны и ведут на полноразмерное изображение)...

Схема принципиальная (Hardware)


Поскольку это устройство учебное, то схемотехника в нём выбрана умышленно неоптимальной (много избыточных компонентов и «узких мест») — это чтобы создать себе «полигон граблей» и героически их преодолеть, для опыта…

В схеме использован микроконтроллер «ATtiny85V» — низковольтный, с напряжением питания от 1.8V до 5.5V, чтобы устройство могло питаться от двух пальчиковых батареек или аккумуляторов. Это оптимальный выбор: поскольку батареи или аккумуляторы, при разряде, могут выдавать минимум по 0.9V. Все узлы и цепи схемы — также рассчитаны на работу при широком разбросе напряжения питания: 2..3V.

Микроконтроллер «ATtiny85» нафарширован очень функциональной начинкой, обладает большим объёмом памяти, а также, серия имеет низковольтные модификации (как и все «tiny»). Хотя, он ощутимо дорогой (в 2-3 раза дороже, чем «ATmega8»!) и редкий (трудно купить) — непопулярен, вследствие того, что у него мало выходов-ножек, несбалансированный. Но мне, для обучения, он здорово помог создать «узкое горлышко»: на взаимодействие со всей периферией ввода-вывода — у меня осталось всего три вывода!
Таким образом, я получил возможность вплотную заняться задачами
мультиплексирования выводов и наращивания функционала, за счёт внешних цифровых микросхем. Замечу, что походу решения, внезапно возникла необходимость использования даже нетривиальных способов наращивания портов! Всё это было очень забавно…

Схема принципиальная

Идея!Примечание: странная байда в правом нижнем углу схемы (с моторчиком, двумя релюшками и дополнительными кнопочками) — это реализация Модели инкрементального Энкодера, чисто для Proteus — в целевом устройстве этого нет...

Хотя, изначально, когда компоновал плату, то собирался сделать девайс на «ATtiny13». (Хотел попробовать «предельное решение»: взять самый слабый микроконтроллер и решить на нём «сложную задачу», в учебных целях.) Мда, я был «молод и наивен»! ;-)
  • Впоследствии, при программировании, оказалось, что прошивка не влазит в память (сейчас, со всеми фичами, прошивка занимает до 4Кб).
  • Но ещё, что главнее: я недосмотрел, по неопытности, что «ATtiny13» не поддерживает подключение внешнего Кварца! А так хотелось, чтобы «Часы Реального Времени» шли точно...
  • К моему счастью, нашлась серия микроконтроллеров «ATtiny25/45/85», в точности совпадающая по распиновке с «ATtiny13», и предназначенная для апгрейда последнего в дизайнах.


Прошивка (Firmware)


FIRMWARE для «Мои поделки: Часы-таймер-секундомер на МК ATTiny85V [май-октябрь 2013]» опубликован на GitHub (это веб-сервис для хостинга IT-проектов и их совместной разработки), на условиях лицензии GNU GPLv3 (копилефтной opensource, несколько ограничивающей коммерческое применение). Код прошивки предназначен для образовательных целей. Ответвляйтесь!

Архитектура программы: Суперцикл + Прерывания.
Поддержка режимов интерфейса реализована: [Недетерминированным] Конечным Автоматом, машину состояний которого реализует «модель прикладных данных», хранимая в ячейках ОЗУ (в DSEG)…
Код прошивки снабжён многочисленными самопоясняющими комментариями — поэтому, в данной статье, дополнительно разбираться не будет.

Замечу, что в ходе разработки именно этого Устройства, были созданы вспомогательные ассемблерные библиотеки, опубликованные ранее:


Технология изготовления


Паяем

Устройство собрано на двух «универсальных односторонних
макетных платах».
Вместо дорожек — все соединения выполнены перемычками из проводов МГТФ.
Примечание: Платы запилил, точно под размер, с помощью своего «станочка»...

Устройство собрано на макетной плате (соединения)

Для сборки устройства, был куплен вариант исполнения микросхемы микроконтроллера: «ATTiny85V-10SU», в корпусе SOIC-8 (5.3mm width). Поскольку, в какой-то момент, я затруднился найти в продаже, на Украине, «ATTiny85V-10PU» (низковольтный, в DIP-8 корпусе) — редко используется, вот магазины и редко возят.

Для корпуса SOIC-8 был спаян самодельный переходник-адаптер на DIP-8, вставленный в панельку DIP-8 на плате. На фото, ниже, под бузером, белеет тонкая фторопластовая плёнка, в которую укутан корпус SOIC-8 микроконтроллера, с подпаянными к его ножкам МГТФ отводами. Укутан — для электрической и механической защиты. Получился довольно компактный переходник, в итоге — не выше, чем оригинальный DIP-8 корпус! А для меня это было очень критично, чтобы всё устройство влезло в корпус: там, в крышке, выпилены соответствующие утопы, на доли миллиметров всё подогнано...

Устройство собрано на макетной плате (компоненты)
Здесь, «колбаса в чёрной термоусадке», рядом с батарейным отсеком — это брейкаут со схемой прерывания питания индикаторов (семисегментных индикаторов и бузера). Данный узел был введён уже после того, как основная схема была распланирована и компоненты запаяны — на плате уже совсем не осталось места! А учитывая что корпус маленький, компоновка очень плотная, всё впритык… Пришлось выкрутиться таким брейкаутом: спаять элементы объёмным монтажом и запаять в термоусадку. Примечание: В составе этой связки присутствует МОП-транзисторный ключ (Q2 на схеме принципиальной), исполненный в корпусе SOT-23 (Micro3), для его монтажа — придумана специальная технология...

Разъём ISP-программатора на плате выполнен в виде: однорядной цанговой панели (низкопрофильной и малогабаритной!)...

Пакуем в корпус

Устройство упаковано в корпус:
Kradex Z-8A.

Сначала платы складываются «гармошкой», с батарейным отсеком и брейкаутом — получается вот такой «бутерброд»:

Бутерброд из гармошки

В передней панели корпуса пропилены отверстия под органы управления (сначала, наметил по трафарету; затем, просверлил Дремелом отверстия меньшего диаметра; наконец, распилил надфилями вручную, подогнал точно под размеры — штучная работа, не серийная). Также, в толстой передней стенке корпуса выбраны ниши (Дремелом с гравировальной насадкой), около 1мм глубиной, под микроконтроллер и энкодер — едва-едва по высоте уместил…

Готовим корпус

Когда всё устройство помещается в корпус, то батарейный отсек, как раз, находится под крышкой корпуса — удобно менять батарейки, концепция юзабельности соблюдена. (Примечание: на этом фото представлена ещё предыдущая итерация устройства — с батарейным отсеком 2xAA. Но после введения дополнительных компонентов, размер устройства увеличился — пришлось уменьшить батарейный отсек, до 2xAAA.)

Устройство упаковано в корпус (вид снизу)

Поскольку конструкция корпуса не предполагает штатного вскрытия: здесь, для крепления крышки, не предусмотрены ни шурупы, ни защёлки — всё минималистично. Предполагается, что крышку готового устройства посадят на клей… В этом же прототипе: крышка батарейного отсека фиксируется скотчем.

Устройство упаковано в корпус (вид сверху)

Устройство упаковано в корпус (вид сбоку)

Устройство упаковано в корпус (вид спереди)

Идея!Так вышло, что в природе, не существует тактовых кнопок: размером 6x6mm, с двумя выводами, общей высотой более 9.5мм — "кетайцы не делать, в природе нет..." (максимум: KFC-A06-02 2pin H9.5) А в данной конструкции, на макетке, удобно использовать только 2-выводные тактовые кнопки. Однако, 9.5мм получается, практически, на одном уровне с панелью — кнопки очень плохо нажимаются, надо что-то решать!
Было решено: доточить толкатели тактовых кнопок, используя резиновые колпачки от гелевых стержней (но только, от тех, что подороже — они идут с резиновыми колпачками; в то время как, замечено, самые дешёвые гелевые стержни — продаются с пластиковыми заглушками). Отверстия в панели, также, были слегка расширены, под резиновые колпачки… В итоге, получилось простое и эргономичное решение: на ощупь, кнопки нажимаются мягко и вязко.


Устройство доведено до совершенства



Пользовательский Интерфейс


Функционально, Устройство содержит:
  1. одни Часы Реального Времени (отсчитывают «часы-минуты-секунды», с периодичностью в сутки; но на индикаторе отображаются всегда только «ЧЧ-ММ»; ход секунд отражается мигающей чёрточкой, на среднем индикаторе; Дата не обрабатывается вовсе)
  2. один Суточный Будильник (классика: пользователь устанавливает заданное время «ЧЧ-ММ»; вкл/выкл «звонка»; при наступлении заданного времени на Часах — включается звуковая и световая индикация)
  3. два одинаковых Таймера/Секундомера, направление счёта которых переключается: либо сверху вниз, либо от нуля до бесконечности (текущий режим работы этой функции отражается положением дополнительной чёрточки на среднем индикаторе — сверху или снизу, соответственно).
    • Таймер — счётчик обратного счёта. Работает так: пользователь устанавливает заданное время (часы-минуты-секунды); стартует счётчик — и он отсчитывает заданное время, по убыванию; когда досчитает до нуля — счёт останавливается, включается Зуммер («Яйца сварились! Пора снимать кастрюльку с огня!»).
    • Секундомер — счётчик прямого счёта. Работает так: пользователь может только сбросить показания на секундомере в ноль; затем, стартует счётчик — и он начинает отсчитывать пройденное время (ЧЧ-ММ-СС) от нуля и до «бесконечности» (с периодом в сутки, разумеется).
    • Для Таймера/Секундомера реализована фича «дисплей с динамической разрядностью»: пока на счётчике часы==0, то они не отображаются — индикатор показывает «ММ-СС»; как только счётчик набирает первый час — индикатор сдвигается и показывает уже «ЧЧ-ММ», при этом, секунды больше не отображаются...
  4. Знакоместо «точки», на семисегментных индикаторах, показывают: с которой из четырёх функций пользователь оперирует в данный момент. А когда срабатывает «сигнал», для любой из функций — то соответствующая точка помигивает, и дисплей автоматически переключается на последнюю сработавшую функцию (прелести эргономики)...


Ввод

Управление устройством реализовано с помощью 5шт. Тактовых Кнопок и одного инкрементального Энкодера. Из них: три отдельно стоящие кнопки — только переключают разные функции; две оставшиеся кнопки — управляют самой функцией; а энкодер используется для подстройки значений в «счётчиках времени» (ЧЧ/ММ/СС).

Идея!Где же пятая кнопка? Замечу, что вал
Энкодера «RE1203XC1-H01» также оборудован тактовой кнопкой — таков его конструктив. Поэтому, ручку для энкодера я выбирал ещё и «с плоским передним торцом» — чтобы удобно нажималась...

Для описания модели интерфейса и режимов работы устройства, вместо пространного UserManual, приведу здесь только технические UML-диаграммы (описывающие схему и условия переключения режимов):

Переключение функций (интерфейс)

Настройка функции Часов (интерфейс)

Настройка функции Будильника (интерфейс)

Управление функцией Таймера (интерфейс)

Управление функцией Секундомера (интерфейс)

Принципы написания прикладного кода, реализующего обработку событий от «органов пользовательского ввода» и переключения режимов интерфейса — описаны в разделе «Методика проектирования прикладного кода (обработчики событий)» статьи про «Библиотеку процедур для интеллектуальной обработки ВВОДА в МК»
Рекомендую вам обратить внимание на эту методику, поскольку с ней, написание кода, обслуживающего интерфейс — у меня заняло всего пару вечеров. Это реальный профит! В то время как, саму библиотеку я разрабатывал около двух месяцев. А разработка «модели данных» самого ядра Устройства (счётчики времени, регистры флагов, процедуры счёта и индикации, обработка Таймеров и Будильников) — заняла больше трёх месяцев...

Вывод

Вывод Устройства осуществляется через: 5-разрядный семисегментный светодиодный индикатор (набранный из пяти отдельных
«SM420361N/8»); и через один Звукоизлучатель (Бузер с генератором «KPX1201B»). Индикация: статическая, на сдвиговых регистрах.

Идея!Как показали тесты, LED-индикаторы, оказывается, жрут очень много электроэнергии! На новых батарейках, при напряжении питания 3V: один сегмент потребляет до 5мА, что вроде бы не много… но сегментов-то всего 5*8=40шт. Итого, потребление полностью засвеченного индикатора: до 200мА! Хотя, все сегменты одновременно не зажигаются, но в целом, максимальное потребление рабочего устройства достигает 150мА на новых батарейках (и снижается, по мере разряда батарей, снижения напряжения питания, и потускнения индикаторов). Таким образом, комплект из 2шт. новых алкалайновых батареек Duracell LR03 (AAA) — выжирается в хлам, всего за 3-4 суток! Что несколько обескураживает...

Против природы не попрёшь: светит — значит, кушает… Но Устройство «кухонный таймер» (а глубоко в основе идеи — лежало именно это назначение) эксплуатируется ведь не круглые сутки, не так ли? Поэтому Устройство, срочным образом, было дооборудовано «спящим режимом»:

Спящий режим (интерфейс)

Теперь, Устройство питается от комплекта из двух аккумуляторов (2xAAA: NiMH 1000mAh 1.2V). При неинтенсивном использовании, одной зарядки хватает больше, чем на 2 недели…



Отработка узлов


К статье приложен
рабочий проект Proteus для моделирования Устройства. А также, тех.паспорта электронных компонентов, использованные при разработке Устройства.

Про подробности схемотехнической реализации? о том, как подбирались параметры в схеме? и почему всё сделано именно так, а не иначе? — читайте вторую часть статьи: «Отработка узлов»...
  • +5
  • 22 декабря 2013, 05:56
  • Celeron
  • 2
Файлы в топике: proteus.zip, datasheet.zip

Комментарии (24)

RSS свернуть / развернуть
OMG! O_O
0
Тебе не кажется, что в твоих статьях слишком много выделений и ссылок? Читаемости статьи это совсем не способствует.
+1
  • avatar
  • Vga
  • 22 декабря 2013, 13:06
Нормально. Зато подробностей вагон без раздувания статьи. А те кто читает все подряд еще поди и помнит что под каждой ссылкой прячется, а благодаря человечным названиям даже открывать их не надо.
0
Зато подробностей вагон без раздувания статьи
Честно говоря, статьи автора и так раздуты до состояния tl;dr. При этом состоят на 90% из воды.
А те кто читает все подряд еще поди и помнит что под каждой ссылкой прячется
Ну я читаю все подряд и помню, но от того не легче. И какой смысл давать ссылки, например, на конкретную модель батареек (при том, что по ссылке даже даташита нет), энкодера и так далее? Или на статью про гитхаб в вики. Или на достаточно широко известные термины вроде «макетная плата».
+1
Возможно, он — википедист? «Болезни википедиста»: [1], [2], [3].
На мой взгляд, пусть лучше ссылок будет больше, чем их будет меньше или совсем не будет.
0
Я так мыслю: пишу фразу, но подразумеваю — концепцию, образ, модель…
Связь кодирую гиперссылкой.

"… гиперссылка является уникальным компонентом новостного Интернет-дискурса, обеспечивающим его целостность на нескольких уровнях." (с) Е.А. Кротова / статья «Функциональный потенциал гиперссылочного аппарата электронной новости»


А выделения фраз в тексте (жирный, курсив, подчёрк, абзацы, списки, врезки) — это как полифония в музыке: для донесения до читателя «отдельных голосов» (мыслей) в общей «симфонии»…
0
В таком количестве выделения перестают быть выделениями и становятся визуальным мусором. Посмотри хотя бы статьи в печатных изданиях — там никогда не злоупотребляют форматированием и выделениями.
0
Согласен, с форматированием я перегибаю. Стараюсь быть проще, но выходит сложно…
+1
за сцылки не скажу (инфы мало не бывает:), а вот выделение обычного текста таким же цветом, как и ссылок, действительно раздражает и отвлекает.
0
Поэтому выделение подчёрком я, практически, не использую.

А выделение цветом же невозможно настраивать, здесь, при вёрстке статьи?
Хотя, было замечено, что сложно-форматированный текст, в статьях, иногда произвольно менял свой цвет, от абзаца к абзацу — предполагаю, что это CSS данного сайта глючит.

Ещё пробельные отступы, между фрагментами текста, плохо контролируются при вёрстке. (а это тоже, было бы, мощное стредство структурирования текста)
0
Так хорошо, и я бы сказал, тщательно написана статья и такая плата на проводках — сплошная порнография!
0
Все мы начинали с КРЕНок…
0
О причинах выбора такого способа компоновки элементов?
Дык, придерживаюсь современных трендов: оптимальная компоновка и миниатюризация… ;-)
0
Такой ворох проводов выглядит просто ужасно! Неужели трудно было нормальную плату сделать?! Время изготовления платы 1дм х 1дм со сверловкой занимает не больше часа: утюг, раствор, сверло — ВСЕ!.. а в остальном клево получилось, что бы тут ни говорили.
+1
Вот это тру-монтаж
А вообще зачет…
0
Простите мне мою грубость, но WTF????
Я полюбому покажусь грубым, злым человеком, но для начала скажу, за огромный труд, вам спасибо (без сарказма, потрудились со статьей и еще больше, с устройством)
а теперь мои плохие впечатления, я с удовольствием читаю длинные статьи, но при одном условии, когда название, картинки и содержание (порядок этих слов отражает порядок просмотра мной статьи) имеет для меня интерес. Название — как автор собирал то, что собирали все, картинки — автор собрал пипец трудоемкую вещь, на текст меня не хватило, поглядел мельком схему и принял для себя решение, я это читать не буду.
Автор, исходя из того что я увидел (название и картинки), вы трудолюбивый человек, но путь которым вы пошли, лично у меня вызывает негативные эмоции… простите…
+3
Корнеев груб…
Но я не нашёл иного пути.
0
Охохо, зачем так сложно то? Можно было бы динамическую индикацию прикрутить, да и кнопки на АЦП повесить больше свободных ног бы было. Меньше деталей — меньше ошибок: проще к повторению.
0
  • avatar
  • Hoshi
  • 22 декабря 2013, 21:38
Чтото погорячился я по поводу лишних ног, но вот выкинуть из схемы 3 регистра точно можно. достаточно заставить один из оставшихся регистров коммутировать земли индикаторов.
0
В данной конструкции, использование клавиатуры на резистивных делителях — недопустимо, поскольку требуется различать одновременное нажатие нескольких кнопок сразу. «Кнопочные аккорды» — широко используются в интерфейсе данного Устройства.
0
Согласен, ответил выше.
0
Но, кстати, замечу: опрашивать Энкодер, через сдвиговый регистр, как я это сделал в данной конструкции — вам, в реальных устройствах, настоятельно НЕ рекомендую! Обнаружил, что это сильно замедляет опрос Энкодера!
Особенно, на частоте работы микроконтроллера 32кГц, как здесь — ручку энкодера приходится вращать уже настолько медленно, чтобы тики фиксировались, что юзабилити такого решения — полностью несостоятельна.
(поэтому, рассматривайте данную схему — как учебный пример, и как иллюстрацию идей)
0
вопрос в другом — какой смысл использовать tiny85? и тини вообще? есть мега8 и мега48 за те же деньги, но с бОльшим количеством ног и нормальных аппаратных интерфейсов. если юзать ее — все регистры можно выкинуть.
0
Да, ATmega48A (низковольтная) была бы рациональнее для промышленного решения…

Но здесь, в учебных целях, я хотел попробовать «предельное решение»: взять самый слабый микроконтроллер (изначально, ATtiny13) и решить на нём «сложную задачу». И походу, поиграться периферией: цифровыми микросхемами… Не ради выгоды, а ради науки! (цель другая)
0
Автор топика запретил добавлять комментарии