Идея появилась (примерно в начале апреля), после очередной ревизии неисправных материнских плат. На одной из таких плат был обнаружен сдвоенный семисегментный индикатор. Такие индикаторы (с общим катодом), как выяснилось позже, весьма распространены. И когда друзья подогнали целую плату (бог знает от чего), на которой таких индикаторов была целая россыпь, естественно возникло желание о их применении. Первое, что пришло на ум — ЧАСЫ.
Хм, часы?!?! Вроде как и банально, а с другой стороны, почему бы и нет?
Прикинул, всяческие «ЗА» и «ПРОТИВ«.
Самые веские «ЗА«:
1) Не пропадать же выпаянным деталькам впустую 🙂
2) Этот шилд, по моему мнению, может стать неплохим подарком. (я в некоторой степени «курирую» ардуиновское направление у одного знакомого подростка, и у него, кстати, в начале мая ДР).
3) Часы относятся к «вечным» ценностям и являются очень полезным и всегда актуальным прибором!
4) Процесс изготовления — хороший материал для статьи на конкурс «Кибервесна 2014» 🙂
5) Полученный код я планирую использовать в следующих проектах (это будут часы на блинкерных индикаторах).
6) Данный проект просто обязан поднять мой собственный LEVEL в части программирования.
Как корабль не может быть без имени, так и проект должен как-то называться. Проект я назвал WALL-E Clock Arduino Shield. Почему так? Ну, во первых, большинство деталей — взяты с мусора (мат. платы, списанные принтера и т.д.). А во вторых, что бы хоть как-то оправдать нахождение этого проекта на ресурсе, посвященному роботам 🙂
Итак, сформированные требования к будущему шилду-часам (как говорят, «ХОТЕЛКИ»):
1) это должны быть часы реального времени, не зависящие от пропадания электроэнергии, фазы луны, приливов на Марсе (т.е., обязательно с использованием микросхем RTC)
2) как минимум, 2 семисегментных индикатора
3) пусть это будет еще и будильник
4) размер готовой платы не должен превышать размеры стандартного шилда для Arduino
5) предусмотрим кнопки для НОРМАЛЬНОЙ установки времени/будильника/задания режима работы (а не через Serial port и тому подобные извраты)
7) «полуавтономный» вариант. (Клевая штука, для людей, у которых Ардуиновские платы просто валяются без дела.)
8) готовая плата должна быть односторонней, чтобы можно было бы изготовить в домашних условиях.
9) Готовый шилд должен выглядеть более-менее красиво 🙂
Итак, с этой же материнской платы дополнительно были извлечены: часовой кварц (32.768 kHz), буззер (пищалка) и батарейный отсек (для батарейки CR2032).
Собираем схему на макетке. Причем, сборка проходила покаскадно 🙂
«Оп-Оп! Ардуино-стайл!!!»
Не знаю почему, но в мире Arduino, самой ходовой микросхемой RTC (Real Time Clock) является DS1307. Не будем оригинальничать и отступать от традиционного. (Тем более, что эта микросхема еще и легкодоступна. Даже наш минский завод «Интеграл» выпускает ее аналог, с названием IN1307).
Итак, основа наших часов — микросхема DS1307 (в качестве «обвеса» установлены: кварц на 32,768Кгц, батарейка и 2-а подтягивающих резистора на линиях SDA и SCL). Благодаря батарейке они продолжают идти при отключении внешнего питания. Также у DS1307 есть свободные 56 байт энергозависимого статического ОЗУ, которые можно использовать в своих целях (например, хранить настройки будильника).
По поводу этой микросхемы и Arduino, интернет просто кишит материалом и примерами работы. Так, что сильно расписывать не буду. Отмечу только важные моменты.
Регистры микросхемы DS1307.
— Для включения часов следует установить бит CH в ноль, это следует сделать принудительно, т.к. часы после включения по умолчанию выключены.
— Часы хранят информацию в двоично-десятичном виде – для получения данных достаточно прочитать соответствующий им регистр. (Пример, 25 минут хранятся по адресу 1. И записаны в виде: «0010 0101″=37 или HEX=25. Для перевода в нормальный вид нужно (37/16)*10+остаток от деления на 16 => 2*10+(37-32)=25).
— 7 регистр отвечает за выходной тактовый генератор часов, SQW вывод. Бит OUT инвертирует выходной сигнал, бит SQWE включает тактовый генератор, а биты RS0 и RS1 устанавливают частоту тактовых импульсов.
Для работы с клавиатурой на скорую руку была сделана такая вот платка
Такой вариант клавиатуры нужно подключать к пину, с поддержкой АЦП (читай, «аналоговые» входы).
После долгих изысканий, приходим к некому консенсусу в распределении ресурсов и основных элементов будущего шилда, и окончательно наша схема стала выглядеть так:
DS1307 подключается по протоколу I2С Bus, а это значит, что уже задействованы пины А4 и А5.
Тактирующий выход DS1307 мы подключим к одному из пинов Arduino, которые поддерживают внешние прерывания.
Подключение индикаторов достаточно простое. Все аноды индикаторов (8 штук у каждого) соединяются параллельно и подключаются к выводам сдвигового регистра 74HC595, а выводы катодов (по два на каждый индикатор) — в нужный момент «садятся на землю» с помощью транзисторных ключей. Очень хорошо подошла для этого сборка Дарлингтона MP4020 (коих я навыпаивал с принтеров в большом количестве).
Цифровые пины Arduino №3,4,5,6 — подключение баз транзисторной сборки. (Из-за нюансов при разводке печатной платы, подключение немного не логичное. В плане, 6 пин управляет первым сегментом и т.д.)
Как говорят знающие люди: «Что не допаяно паяльником — скорректируем софтом!»
Окончательно распределение пинов Arduino выглядит следующим образом:
Схема готова.
Следующим этапом — разводка печатной платы.
(Огромное спасибо Александру, за неоценимую помощь в этом процессе! Особенно мне понравился «финт» с кнопками).
Обратите внимание!!
->Кнопки должны быть с 4-мя выводами (Дело в том, что попарно замкнутые выводы кнопки используются как перемычки на плате)!!!
->Холдер батарейки накрывает DS1307!!! Примерьте заранее!!!
-> Номиналы деталей можно узнать при наведении курсора в SprintLayout.
->Я использовал в SprintLayout возможность заполнения медью неиспользуемой площади (Темно-зеленые участки). Без всяких замыслов, банально, чтобы быстрее вытравливалась плата.
Однако, я РЕАЛЬНО не понимаю, как указать, что это площадь — «земля». Поэтому, при запайке я объединил их с помощью перемычки (резистор 0R).
ЛУТ, традиционный ЛУТ. Хороший утюг Вам в помощь 🙂
(Честно говоря, мелкие дорожки под индикаторами заставили меня переутюживать плату несколько раз. Так, что не говорю, что процедура простая. Запасайтесь терпением).
Собственно, лицевая сторона платы — тоже ЛУТ. Со слоями в SprintLayout надеюсь разберетесь 🙂
Собираем до кучи все необходимое.
А именно:
--------- Bill Of Materials (BOM) ----------- - микросхема DS1307 -1шт - микросхема 74HC595+ колодка -1шт - часовой кварц на 32768 kHz -1шт - сдвоенный 7-сегментный индикатор(с общим катодом. LTD322P, С-362G или аналогичные)-2шт - сборка MP4020 -1шт - SMD резистор 270 Om (маркировка 271) -9шт - SMD резистор 1 kOm (маркировка 102) -4шт - SMD резистор 4.7 kOm (маркировка 472) -4шт - SMD резистор 10 kOm (маркировка 103) -4шт - SMD конденсатор 0.1 (маркировка 104) -2шт - электролит. конденсатор 100x10V -1шт - кнопка (четыре вывода!!!) -3шт - светодиод 3мм (цвет по вкусу) -1шт - буззер -1шт - холдер для батарейки -1шт - стандартная полоска штырьков --------- End Bill Of Materials (BOM) -----------
Ну и пару часов уходит на запайку деталек…
Маленький нюанс. Чтобы изображение (на лицевой стороне) не испортилось, я покрыл его прозрачным лаком для печатных плат. Однако, это лак портится от воздействия спирта. А без спирта — очень тяжело отмыть плату от разводов канифоли. В этот раз (по совету друзей) я паял с помощью глицерина, который ОЧЕНЬ замечательно отмывается простой водой. Приобретается глицерин в аптеке, без всяких проблем.
Личные ощущения. Процесс пайки с помощью глицерина менее «комфортный», чем с флюсом, но вполне приемлем.
Нижняя сторона платы:
Лицевая сторона:
Если добрались до этого момента — мои поздравления!!! С «железячной» частью закончили 🙂
К этому моменту написания статьи, я понял, что опус получается очень «громоздким» и решил разбить его на две части. В следующей части, внимательно рассмотрим программную составляющую проекта.
Так, что чуть-чуть терпения …
To be continued… (или по нашему) Продолжение следует…