Речь пойдет о светодиодных часах, построенных на чипе ATmega328p. Это первая модель, пока не имеет каких либо дополнительных функций, однако проста для повторения и собрана на доступных деталях.
Электрическая схема.
Основой схемы является контроллер ATmega328p-au. В левой части обвязка незамысловатая, состоит лишь из необходимых деталей. Конденсаторы C1, C2 - фильтры питания. Источником является 3-вольтовая батарейка CR2032. В нижней части слева предусмотрены контакты для настройки часов, M - минуты, H - часы (замыкать на контакт V). Номиналы подтягивающих резисторов R13, R15, R16 допускается отклонять.
Почти ко всем цифровым выводам (PD2-PD7, PB0-PB5) подключены светодиоды (LED1-LED12), которые будут осуществлять индикацию часов и минут. По задумке, индикация происходит при нажатии на тактовую кнопку (Key1). Всё остальное время светодиоды будут выключены, чтобы не потреблять энергию.
Тактирование решил сделать также, как на многих платах ардуино - от керамического резонатора (X1 на схеме). Он имеет очень маленькие размеры и работает без внешних конденсаторов.
На схеме предусмотрено два разъема для программирования - UART и SPI (сверху и снизу соответственно).
Печатная плата.
Плата разрабатывалась в EasyEDA.
Часы построены на чип-элементах, Конденсаторы и резисторы в корпусе SMD0805. Более мелкие использовать не стал, т.к. их сложнее паять, а еще перестраховался на случай если детали не приедут. 0805 продаются в местном радиомагазине. По краям сделал вырезы под ремешок, надежно усилив металлизацией. 4 отверстия, если честно забыл зачем оставил... Думаю, можно на стоечках закрепить тонкое оргстекло для защиты деталей.
Функция просмотра платы (см.на рисунке) позволяет оценить, как изделие будет выглядеть в реальности и даже прикинуть цвет маски. Мне понравился синий. По итогу, затратил много времени на разработку платы, результатом доволен.
Далее, я экспортировал печатную плату в формате гербер. Именно в этом формате нужно отправлять на изготовление.
Собранное устройство.
Плата полностью припаяна. Отсутствует лишь кварц, помеченный как X1 около контроллера, потому что первоначально хочу запустить часы на внутреннем генераторе.
Программирование.
Для программирования данных часов по бокам отведены контакты. Слева SPI, который необходим для заливки загрузчика (bootloader), но также можно использовать для прошивки.
А справа контакты UART.
Контроллер я припаял новый, чистый, а значит первым делом нужно записать загрузчик. И в качестве программатора был использован USBasp, но ничто не мешает использовать в роли программатора плату arduino uno, nano или другую (Arduino as ISP).
Сначала я хочу проверить как поведут себя часы без внешнего кварца. Контроллер будет настроен для работы от внутреннего осциллятора, частотой 8 МГц.
Если вкратце, то была использована среда разработки ArduinoIDE в которую добавлен пакет MiniCore, чтобы для примененного контроллера можно было выставить тактовую частоту, указать параметры питания и кое что еще не прибегая к ручному выставлению фьюзов. Подсказка: скачанный архив MiniCore распаковать в папку
Итак я записал загрузчик и теперь контроллер будет работать от внутреннего генератора 8 МГц и настроен на питание от трехвольтовой батарейки.
Записать программу можно было этим же программатором, но контроллер с уже залитым загрузчиком мы можем прошивать с помощью USB-TTL конвертера.
У меня их два: на базе CH340 и на PL2303 (они были показаны на картинке выше). Выполняют одну и ту же функцию, служат для связи контроллера с компьютером. Жалко, что у них нет контакта DTR, который бы автоматически дергал reset при прошивке. Придется вручную. Для корректной прошивки, нужно кратковременно подключить контакт сброс (RST) на минус (GND) в тот момент, когда завершится компиляция скетча и на экране появятся надписи. В противном случае IDE выдаст ошибку. Точно такая же печаль происходит и с покупными платами arduino pro mini, там при загрузке нужно нажать кнопочку на плате.
CxemWatch-v1_Test - это простейшая тестовая программа созданная для этих часов предназначена для того чтобы проверить все ли светодиоды исправны и оценить ход часов. После подачи питания засветятся все светодиоды по кругу, а потом начнется отсчет секунд. Через каждые пять секунд включается следующий светодиод. Если всё нормально можно заливать рабочую программу.
CxemWatch-v1 - программа была детально описана в видеоролике. Если вкратце то управление портами производится через прямое обращение к регистрам. Часы построены на функции millis, которая отсчитывает количество миллисекунд с момента начала выполнения программы.
Отрывок:
Проходит 1000 мс, переменная перезаписывается, ко времени добавляется 1 секунда. При достижении 60 секунд, секунды обнуляются, ко времени прибавляется 1 минута. Также 60 минут превращаются в один час. Выводится естественно в 12 часовом формате, потому что на плате 12 светодиодов.
Далее, как вы уже поняли, индикация времени происходит только при нажатии кнопки. Нам же не нужно, чтобы светодиоды постоянно светились и тратили энергию батарейки. Поэтому мы будем проверять значение переменной, она соответствует нашей кнопке.
Если наступает один час и кнопка нажата, то включается светодиод подключенный ко второму пину - PD2. Такая запись может показаться странной, но на самом деле всё просто. Взгляните на рисунок ниже.
Каждый порт имеет 8 выводов. Отсчет идет справа-налево.
Обработка минут расписана немного сложнее. Во первых, чтобы отличить на часах минутный светодиод от часового я решил сделать индикацию минут миганием. Часы просто светятся, а минуты мигают. В этом участвует всё та же функция millis. Светодиод мигает каждую секунду, погасая на 50 мс.
Учитывая повторяемость этой конструкции, доработка прошивки приветствуется. Любой из вас может предложить свою улучшенную версию.
Случилась проблема.
Далее я измерил точность, и что и требовалось ожидать, часы сильно отставали, т.к. напомню контроллер работал от внутреннего генератора. Потом я перешел на внешний кварц, поначалу все было хорошо. Я много раз перепрошивал часы, по ходу дела немного корректировал и дорабатывал программу. Вскоре мне надоело вручную делать сброс, я стал прошивать устройство программатором USBasp используя программу для заливки ProgISP (т.е. сохранял hex-файл из ArduinoIDE, а заливал через ProgISP). После десятка успешных загрузок, в какой то момент, по непонятной причине контроллер накрылся. Потом я припаял новый контроллер и ситуация повторилась. Две атмеги закирпичились... Получил сообщение Chip Enable Program Error и что то связанное с частотой. На форумах описывалась подобная ситуация и выход заключался в перепрошивке самого программатора, но он не поддался... Отбросив танцы с бубном с программатором за 1$ я решил поступить проще. Просто позаимствовал готовый контроллер с платы arduino и кварц тоже взял от туда. Хоть это и не совсем правильно, потому что ардуинка 5-вольтовая с частотой 16 МГц.
Последний штрих.
Далее я нашел тянущийся материал и пришил к нему липучки.
Если продеть его таким образом как на фото, то ремешок будет закрывать батарейку и руке будет приятнее.
На руке сидят довольно неплохо. Конечно, я не собираюсь ходить в них по улице, но показать такую самоделку друзьям не стыдно.
Как было сказано ранее, чтобы посмотреть время нужно нажать кнопку (при отпускании сразу выключаются).
На фото не понятно, где часы, а где минуты, т.к. в кадр попало одновременное свечение светодиодов, но для наглядности ниже прилагаю гифку.
Минутный светодиод мигает, пятнадцать минут второго.
Настройка.
Для настройки времени на плате присутствует 3 контакта.
H-часы, M-минуты. Нужно пинцетом замкнуть нужный из них на плюсик.
Переключение происходит с небольшой задержкой, это сделано специально.
Что вышло, то вышло..
По итогу часы всё равно отстают. Керамический резонатор оказался не точным, осциллограф показал частоту чуть меньше чем 16 МГц (~15.9 МГц). Из за этого часы отстают на 5 минут в сутки. Но самый главный недостаток в большом энергопотреблении. В холостую без светодиодов часы кушают 5 мА, это небольшая цифра, но если вспомнить примененный источник питания, то понятное дело, надолго его не хватит. Уменьшить потребление программно у меня пока не хватило навыков.
В будущем хочу продолжить данную тему и сделать новую улучшенную версию часов.