Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Делаем светодиодные часы CxemWatch-v1 на ATmega328p

Речь пойдет о светодиодных часах, построенных на чипе ATmega328p. Это первая модель, пока не имеет каких либо дополнительных функций, однако проста для повторения и собрана на доступных деталях.

CxemWatch

Электрическая схема.

Электрическая схема часов

Основой схемы является контроллер 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 МК AVRATmega328P-AU1 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-R01 Использован на 16МГц, но можно на 8МГцПоиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 3
Я собрал 0 2
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 2 чел.

Комментарии (20) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
+2
Александр #
Идея супер! И внешний вид шикарный.
Но разрешите парочку замечаний. Нужно было замутить асинхронный таймер на часовом резонаторе, а cpu тактировать от внутреннего rc. Тогда отставания бы не было вообще.
Сам контроллер загонять в спячку, чтобы выходил из неё только чтобы плюсовать секунды и показывать время. А кнопку для этого повесить на внешнее прерывание. Батарейки в таком режиме хватит года на 3-4
Ответить
0

[Автор]
rafo #
Спасибо за замечания! В принципе, при отсутствии индикации секунд можно и не просыпаться каждую секунду, а плюсовать значительно реже. К сожалению, для внешнего прерывания тут придется менять разводку платы. По поводу часового кварца, если я правильно понимаю нужно МК перевести на внутреннее тактирование, вместо штатного припаять 32768 Гц и настроить Таймер 2.
Ответить
+2
Александр #
Обычно делается так: таймер (не помню какой у этой Меги) запускается в асинхронном режиме. В этом случае он тактируется от своего резонатора. Кварц 32768, с делителем 128 этот таймер будет переполняться ровно за секунду. Поэтому и секунда, а не минута.
CPU тактируется при этом от внутреннего rc на 8МГц, он почти все время спит. В спящем режиме есть возможность просыпаться по переполнению таймера. Проводите расчет секунд, минут и часов и сразу снова спать. Это десяток тактов- копейки для батарейки и контроллера.
А вот как вывести контроллер из спячки для индикации, если кнопка висит не на внешнем прерывании, это надо подумать.
Ответить
0
AlexQ #
То есть, разъём акума будет упираться в руку, создавая дискомфорт?
Ответить
0

[Автор]
rafo #
То есть именно так. Вот такая непродумка. Но если продеть ремешок как показано на фото, руке нормально. Я не спец по корпусам, тут только 3D принтер поможет.
Ответить
+2
verbkinm #
5мА это очень много! У меня контроллер вместе с модулем tm1637 ест 1,5 мА, но там всё время горят индикаторы (тоже часы). Для экономии энергии уменьшите частоту МК. Это можно делать програмно, что бы не менять фьюзы. Ещё советуют, чтобы ноги МК не оставались в неопределённом состоянии, я их подтягиваю внутренним резистором. А по поводу прерывания - посмотрите в сторону прерывания PCINT, может поможет!
Ответить
+2

[Автор]
rafo #
Я сегодня попробовал уменьшить частоту программно. Если это делать через функцию clock_prescale_set() из библиотеки "power.h", то нарушается работа таймера и millis() отсчитывается неверно. Нашел специальную библиотеку "Prescaler.h", которая решает эту проблему, т.к. содержит функцию trueMillis(). Она отсчитывает время с учетом пониженной частоты.
По итогу, программное уменьшение частоты в 8 раз понизило потребление до 2-2,4 мА. Отставание часов составило 40 сек в час )) Для интереса влупил максимальное деление частоты в 256 раз, но там вообще неадекватно работает.
По поводу подтяжек верно замечено. Обычно свободные выводы я стягиваю на землю при разводке платы. Внутренние подтяжки дали уменьшение потребления еще на 0,3 мА.
Ответить
+2
verbkinm #
Я тоже часики делаю, но на ассемблере, правда у меня отдельный RTC, но суть не в этом. Я для задержек использую прерывания от таймеров на прямую, в котором рассчитывается всё вручную! Это, конечно, дебри, но нужно понижать потребление!
Ответить
+1

[Автор]
rafo #
Читал Вашу статью. Кстати, вторая версия моих часов будет тоже на 7-сегментных, естественно с RTC, а то не серьезно как то получается.
Ответить
+2
Pauk #
Ребята, если не критично, то не нужно менять разводку платы и применять дополнительное прерывание на выводе. Можно считывать состояние кнопки во время короткого пробуждения микроконтроллера, и если зафиксируется нажатие, то можно отображать текущее время. Думаю можно так же увеличить частоту мигания минутного светодиода.
Ответить
+1

[Автор]
rafo #
Отличная мысль. Только нужно пробуждать не реже, чем через каждую секунду, максимум полторы. Иначе долго удерживать кнопку придется.
Ответить
+1

[Автор]
rafo #
Знаю, что мало кто заглядывает в тему обсуждения статьи на форуме. Там выложили оптимизированную прошивку для этих часов (прикрепляю). Улучшена производительность и объем занимаемого места (хотя это и не так важно в таком простом устройстве). Но главное это более корректная индикация. В моей версии светодиоды светили не в полную силу (я не программист, в прошивке есть костыли). Тут всё исправлено, светятся ярко (см.фото). Да, и вроде улучшилась точность хода часов.
Прикрепленный файл: CxWtch1_Mod.rar
Прикрепленный файл: IMG_20201106_1.jpg
Прикрепленный файл: IMG_20201106_2.jpg
Ответить
+2
Pauk #
Выполнено очень грамотно и аккуратно, а круглые отверстия пригодятся для армирования как сверху, так и со стороны элемента питания. И главное преимущество идеи как раз в том, что не применён модуль реального времени, а весь функционал выполняется непосредственно микроконтроллером. Главное снизить энергопотребление и повысить точность. Во многих устройствах необходим учёт определённых событий по времени, но применять часы реального времени нецелесообразно. Здесь как раз и пригодится подобная идея.
Ответить
+1

[Автор]
rafo #
Спасибо за комментарий!
Ответить
0
andro #
Как на счёт замены микроконтроллера на ATmega8 или ATmega88 ?
Ответить
+2

[Автор]
rafo #
1. Расположение выводов у них точно такое же. В замене проблем быть не должно.
2. ATmega8 подойдет с индексом "A", иначе не пройдет по напряжению питания, а ATmega8L тоже подходит, но если кварц не будет превышать 8МГц.
ATmega88 имеет 5 модификаций, вышеназванных особенностей среди них нет.
3. Есть отличия в регистрах. В прошивке я обращался к ним лишь при управлении портами (но они совместимы). Про другие сказать не могу, надо читать.
4. Наконец, главное отличие - память.
Но и здесь несчастные 8 Кбайт ATmega8 смогут вывезти предложенную мной программу (занимает около 2,5).
Может я что-то забыл. Поправьте, знающие..
Ответить
0
andro #
Спасибо за ответ и за обширную информацию. Очень интересует вопрос - если всё равно происходит прямое обращение к регистрам, то почему для разработки выбиралась Arduino IDE? Дело в том, что Я сам разрабатываю в среде Ардуино, и никак не могу окончательно решится, переходить на Atmel Studio, или нет. Напишите пожалуйста Ваши соображения по этому поводу.
Ответить
+1

[Автор]
rafo #
Для начала скажу, что я схемотехник, больше по "железу". В программирование пришел недавно.
IDE подкупляет огромным количеством библиотек. Нужно чтобы контроллер выполнял поставленную задачу, я не хочу для этого перебирать сотни страниц даташита, разбираться куда какой байт отправить, как получить и расшифровать код для того чтобы, например, измерить температуру цифровым датчиком. Для работы с дисплеем в atmel studio (avrstudio) нужно написать под 500 строчек кода, а здесь с готовой библиотекой на это уходит несколько строк.. Но это не значит, что программа будет весить меньше. Наоборот. Вот мы и пришли к проблеме оптимизации. Профессионал "прямым языком" прописывает действия, исключая не нужное, а когда применяются библиотеки, компиллятор собирает салат из того что прописано в них, на выходе получаем размер программы в несколько раз больше. Контроллер может работать медленнее, или вообще не правильно.

Кстати нет проблем, чтобы писать в ArduinoIDE чистым языком, обращаясь к регистрам (таймеры, порты..) и использовать потенциал МК.

Также Arduino IDE больше заточен под atmega328/168 и т.д. То есть под "камешки", которые обычно установлены на платах ардуино. А что делать если применен atmega8535 (или схожий), у которого портов больше.
Ответить
+1
andro #
Да Я тоже "схемотехник", всегда всё собирал на логике и очень боялся микроконтроллеров, года два как решился взяться за это дело и начал с Ардуино. Теперь так привык к микроконтроллерам, что использую их в 2/3 проектах и разработках.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
USB осциллограф DSO-2090 Тестер ESR, полупроводников, резисторов, индуктивностей
вверх