Речь пойдет о светодиодных часах, построенных на чипе 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 отверстия, если честно забыл зачем оставил... Думаю, можно на стоечках закрепить тонкое оргстекло для защиты деталей.
Функция просмотра платы (см.на рисунке) позволяет оценить, как изделие будет выглядеть в реальности и даже прикинуть цвет маски. Мне понравился синий. По итогу, затратил много времени на разработку платы, результатом доволен.
Далее, я экспортировал печатную плату в формате гербер. Именно в этом формате нужно отправлять на изготовление.
Заказ печатной платы
Я воспользовался сервисом PCBWay, который является одним из самых известных изготовителей печатных плат в Китае. PCBWay дарит новому пользователю купон на 5 долларов. Забегая вперед скажу, что именно столько стоили мои печатные платы и получается я заплатил только за доставку, плюс небольшая комиссия, вышло очень выгодно.
Раскрыв скрин вы увидите выбранные мной параметры платы, которые содержат информацию о габаритах, количестве слоев, толщине платы, ширине проводников и зазоров между ними и многое другое. Это детально было описано в видеоролике. Обратите внимание, что изменение некоторых пунктов отразится на цене, например слишком маленькая ширина дорожек или отверстий, золочение контактов и т.п. Таким образом сайт сформировал стоимость заказа и доставки. После добавления заказа в корзину появляется окно, где нужно загрузить созданные ранее гербер-файлы. Плата еще раз пройдет проверку, после чего нужно заполнить адрес доставки, естественно не русскими буквами, а транслитом. Применил купон на 5 долларов и осталось к оплате всего 6. На тот момент это было чуть больше 400 рублей.
Через некоторое время приехала посылка и кроме печатных плат, PCBWay - спонсор этого проекта, прислал кучу подарков в честь 6-ти летнего юбилея. Наклейки, футболка, две линейки с полезной информацией, размеры, посадочные места, отверстия и прочее. Фирменная ручка и прикольная светящаяся штука.
И самое главное, печатные платы.
Они сделаны очень качественно, идеально обработаны, придраться не к чему. Возможно, мне следовало плату сделать немного меньше, но не хотелось использовать слишком маленький типоразмер элементов, их сложнее паять.
Для сборки я закупил все необходимые детали с запасом, в том числе новый контроллер. А также светодиоды разного цвета. Но решил использовать красные, т.к. они сочетаются с синей платой и имеют низкое падение напряжения.
Собранное устройство.
Плата полностью припаяна. Отсутствует лишь кварц, помеченный как X1 около контроллера, потому что первоначально хочу запустить часы на внутреннем генераторе.
Программирование.
Для программирования данных часов по бокам отведены контакты. Слева SPI, который необходим для заливки загрузчика (bootloader), но также можно использовать для прошивки.
А справа контакты UART.
Контроллер я припаял новый, чистый, а значит первым делом нужно записать загрузчик. И в качестве программатора был использован USBasp, но ничто не мешает использовать в роли программатора плату arduino uno, nano или другую (Arduino as ISP).
Сначала я хочу проверить как поведут себя часы без внешнего кварца. Контроллер будет настроен для работы от внутреннего осциллятора, частотой 8 МГц.
Если вкратце, то была использована среда разработки ArduinoIDE в которую добавлен пакет MiniCore, чтобы для примененного контроллера можно было выставить тактовую частоту, указать параметры питания и кое что еще не прибегая к ручному выставлению фьюзов. Подсказка: скачанный архив MiniCore распаковать в папку C:\Users\User\Documents\Arduino\hardware\
Итак я записал загрузчик и теперь контроллер будет работать от внутреннего генератора 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 мА, это небольшая цифра, но если вспомнить примененный источник питания, то понятное дело, надолго его не хватит. Уменьшить потребление программно у меня пока не хватило навыков.
В будущем хочу продолжить данную тему и сделать новую улучшенную версию часов.
Смотрите видео на ПаяльникTV.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
U1 | МК AVR | ATmega328P-AU | 1 | TQFP32 | Поиск в магазине Отрон | |
R1-R12 | Резистор | 200-300 Ом | 12 | SMD0805 | Поиск в магазине Отрон | |
R13 | Резистор | 5.1 кОм | 1 | SMD0805 | Поиск в магазине Отрон | |
R14 | Резистор | 10 кОм | 1 | SMD0805 | Поиск в магазине Отрон | |
R15, R16 | Резистор | 5.1 кОм | 2 | SMD0805 | Поиск в магазине Отрон | |
C1 | Конденсатор | 10 мкФ | 1 | SMD0805 | Поиск в магазине Отрон | |
C2, C3, C4 | Конденсатор | 0.1 мкФ | 3 | SMD0805 | Поиск в магазине Отрон | |
LED1-LED12 | Светодиод | Vf не более 2.5В | 12 | SMD0805 (применен красный) | Поиск в магазине Отрон | |
X1 | Кварц | CSTCE16M0V53Z-R0 | 1 | Использован на 16МГц, но можно на 8МГц | Поиск в магазине Отрон | |
Скачать список элементов (PDF)
Прикрепленные файлы:
- Gerber_CxemWatch-v1.zip (90 Кб)
- CxemWatch-v1.rar (2 Кб)
Комментарии (20) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Но разрешите парочку замечаний. Нужно было замутить асинхронный таймер на часовом резонаторе, а cpu тактировать от внутреннего rc. Тогда отставания бы не было вообще.
Сам контроллер загонять в спячку, чтобы выходил из неё только чтобы плюсовать секунды и показывать время. А кнопку для этого повесить на внешнее прерывание. Батарейки в таком режиме хватит года на 3-4
[Автор]
CPU тактируется при этом от внутреннего rc на 8МГц, он почти все время спит. В спящем режиме есть возможность просыпаться по переполнению таймера. Проводите расчет секунд, минут и часов и сразу снова спать. Это десяток тактов- копейки для батарейки и контроллера.
А вот как вывести контроллер из спячки для индикации, если кнопка висит не на внешнем прерывании, это надо подумать.
[Автор]
[Автор]
По итогу, программное уменьшение частоты в 8 раз понизило потребление до 2-2,4 мА. Отставание часов составило 40 сек в час )) Для интереса влупил максимальное деление частоты в 256 раз, но там вообще неадекватно работает.
По поводу подтяжек верно замечено. Обычно свободные выводы я стягиваю на землю при разводке платы. Внутренние подтяжки дали уменьшение потребления еще на 0,3 мА.
[Автор]
[Автор]
[Автор]
[Автор]
[Автор]
2. ATmega8 подойдет с индексом "A", иначе не пройдет по напряжению питания, а ATmega8L тоже подходит, но если кварц не будет превышать 8МГц.
ATmega88 имеет 5 модификаций, вышеназванных особенностей среди них нет.
3. Есть отличия в регистрах. В прошивке я обращался к ним лишь при управлении портами (но они совместимы). Про другие сказать не могу, надо читать.
4. Наконец, главное отличие - память.
Но и здесь несчастные 8 Кбайт ATmega8 смогут вывезти предложенную мной программу (занимает около 2,5).
Может я что-то забыл. Поправьте, знающие..
[Автор]
IDE подкупляет огромным количеством библиотек. Нужно чтобы контроллер выполнял поставленную задачу, я не хочу для этого перебирать сотни страниц даташита, разбираться куда какой байт отправить, как получить и расшифровать код для того чтобы, например, измерить температуру цифровым датчиком. Для работы с дисплеем в atmel studio (avrstudio) нужно написать под 500 строчек кода, а здесь с готовой библиотекой на это уходит несколько строк.. Но это не значит, что программа будет весить меньше. Наоборот. Вот мы и пришли к проблеме оптимизации. Профессионал "прямым языком" прописывает действия, исключая не нужное, а когда применяются библиотеки, компиллятор собирает салат из того что прописано в них, на выходе получаем размер программы в несколько раз больше. Контроллер может работать медленнее, или вообще не правильно.
Кстати нет проблем, чтобы писать в ArduinoIDE чистым языком, обращаясь к регистрам (таймеры, порты..) и использовать потенциал МК.
Также Arduino IDE больше заточен под atmega328/168 и т.д. То есть под "камешки", которые обычно установлены на платах ардуино. А что делать если применен atmega8535 (или схожий), у которого портов больше.