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

Часы-Будильник-Таймер-Секундомер на МК ATtiny85VХорошая задачка — лучший учитель! Каждый джедай, в ученичестве, должен: «помигать 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 недели…


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

 

Про подробности схемотехнической реализации: о том, как подбирались параметры в схеме? и почему всё сделано именно так, а не иначе? — читайте вторую часть статьи: «Отработка узлов»…

Комментарии закрыты.