Например TDA7294

РадиоКот > Схемы > Цифровые устройства > Бытовая техника

Не очень простые часы на матричных индикаторах, зато с музыкой

Автор: AndyKorg
Опубликовано 24.04.2014.
Создано при помощи КотоРед.

Все началось с того, что на кухне сломались механические часы. По утрам стало неудобно пить кофе. Часов под рукой нет, и непонятно - можно еще посидеть или уже пора быстро бежать? Варка яиц в мешочек превратилась в поиски часов по квартире. Вообщем куча мелких неудобств. Были, конечно, и всякие встроенные часы в бытовой технике, но очень уж неудобные. К тому же они без батареек и каждое выключение электроэнергии превращается в аварию. В результате год назад было решено сделать часы, по-быстрому, ага.

Технические требования сформировала женская часть коллектива пользователей. Во-первых они должны быть с большими цифрами. Во-вторых, они должны быть. Остальные требования по вкусу разработчика.

Исследование интернет магазинов радиодеталей показало наличие довольно больших светодиодных матриц, а более углубленное гугление и яндексение привело на статью «Простые часы на светодиодных матрицах» Конструкция из трех матриц была опробована и одобрена главным пользователем, но было высказано пожелание сделать днем поярче, вечером потемнее и что б со звуком.

Исходя из этих предпосылок и был нарисован свой вариант часов представленный на схеме ниже.


Что умеют часы с текущей версией прошивки:
- отображать текущее время само собой;
- показывать минуты, секунды;
- периодически пробегает строка с названием дня недели, датой и температурой;
- автоматически регулировать яркость дисплея в зависимости от освещенности;
- выдавать звуковой сигнал в виде боя курантов каждый час с заранее заданной громкостью;

- имеет три будильника ежедневных и шесть будильников по дням недели;


- можно загрузить на SD карту свою мелодию как для будильника, так и для ежечасного проигрывания;
- есть три варианта регулировки громкости звучания сигнала будильника – нарастающий до определенного уровня, нарастающий до максимума и постоянный настроенный уровень громкости;
- можно настроить громкость звучания кнопок;
- управление часами можно производить с пульта ДУ от телевизора (пока только пультом от телевизора типа Samsung);
- все настройки часов сохраняются в энергонезависимой памяти;
- отсчет времени то же защищен с помощью резервного питания.

А теперь о том, как это все реализовано.

Дисплей организован на светодиодных матрицах 8х8 выстроенных в одну линейку. Для обеспечения достаточного тока питания светодиодных матриц используются специальные драйвера MBI5039 (первые варианты были на сдвиговых регистрах с мощными выходами TPIC6B595, тоже вполне работоспособно). Драйвера MBI5039 16-и разрядные, поэтому две микросхемы как раз хватило для управления всеми столбцами матрицы, и еще осталось восемь линий для управления строками. К этим восьми линиями через балластные резисторы подключены восемь транзисторных ключей на pnp-транзисторах.

На приведенной схеме представлен вариант с общими анодами в столбцах и катодами в строках, но в приложенном архиве имеется вариант и для общих анодов в строках и катодов в столбцах. Схема и разводка печатной платы нарисованы в DipTrace 2.3

Что бы, не возиться с долгим процессом калибровки часового кварца была использована микросхема RTC DS3231SN - в нее уже встроен кварц и обеспечена термокомпенсация. Это позволило добиться достаточной точности хода часов без корректировок и подстроек. Кроме того, дополнительные плюшки DS3231SN оказались очень полезны при реализации ШИМ-звука, а еще термодатчик у нее есть.

Непрерывность хода часов обеспечивает банальный ионистор на полторы фарады. Как показала практика, его энергии хватает как минимум на 10 суток работы микросхемы RTC. Кроме того, для обеспечения срабатывания будильника даже при отсутствии основного напряжения предусмотрена возможность питания всего тракта обеспечивающего звук от того же ионистора, правда пока не реализована поддержка в прошивке. Поэтому перемычку R2 ставить не надо, а вот R1 как раз таки нужна.

Принцип управления двумя кнопками нагло скопирован из вышеупомянутой статьи, но добавлена возможность управления пультом ДУ от телевизора, для чего был прикошачен ИК приемник TSOP.

Теперь об основном отличии от вышеупомянутой схемы «Простые часы…» - о поддержке вывода звука. Было добавлено гнездо для микро-SD и обвязка для его питания от 3.3 В и преобразования уровней. Быстро выяснилось, что вывод звука конфликтовал с процессом регенерации дисплея, поэтому пришлось использовать прерывания генерируемые микросхемой RTC, но об этом ниже.

Сам звук генерируется с помощью ШИМ на выводе таймера 0. Далее несущая срезается с помощью RC-цепочки и подается на цифровой потенциомер. Применение цифрового потенциомера позволило избежать некоторого утреннего недовольства за счет плавного нарастания уровня громкости будильника. Звуковой сигнал после регулирования усиливается микросхемой УНЧ LM386L и подается на контактные площадки для динамика. Хотя LM386L включена по даташиту, тут необходимы небольшие пояснения. Из-за того, что я не ахти какой схемотехник (собственно как и программист) то предусмотрел кое-какие варианты включения УНЧ. Во-первых можно уменьшить амплитуду входного сигнала увеличивая сопротивление резистора R39. Во-вторых можно изменять коэффициент усиления LM386L подключая цепочку R38C20. У меня довольно громко звучало без установки R38C20, а вот диапазон регулировки громкости получился не очень большим. Так, что если есть предложения по этому поводу – велкам.

Фоторезистор R5 измеряет освещенность для расчета уровня яркости дисплея. Поскольку в предполагаемом месте установки часов свет на них будет падать со стороны кнопок, то фоторезистор разместился между кнопками. Правда, это не лучший вариант из-за того, что иногда попадаешь пальцами по фоторезистору вместо кнопок.

Програмирование МК и отладка прошивки прводилась прямо в готовом устройстве, поэтому предусмотрен разъем для программатора, а так же контактные площадки для usart интерфейса и jtag. Еще один дополнительный разъем оставлен для внешнего датчика температуры на шине I2C или на I-Ware.

Вот собственно и все о принципиальной схеме. Переходим ко второй части марлезонского балета, а именно к прошивке.

Прошивку старался писать с соблюдением разделения файлов по функциям и уровням. Поэтому получилось довольно много файлов, зато относительно независимых друг от друга. Например, вывод на индикатор разбит на три уровня. Нижний уровень обеспечивает обновление изображения на индикаторе и ничего не знает о всяких там кодах символов, позиции в строке и прочем. Средний уровень контролирует вывод отдельных символов в необходимое место, перекодировку символов в изображение, а так же обеспечивает горизонтальную и вертикальную прокрутку. И только верхний уровень собственно и выводит строки и символы содержащие информацию. Получается три файла DisplayHAL, Display и ClockMatrix, каждый отвечает за свой уровень. Не везде так красиво получилось, но я старался.

Стержнем на котором все держится, является простейший планировщик, нагло стыренный у DI-HALT (че-то не найду ссылку у него на сайте). Планировщик использует таймер 2. Остальные два таймера заняты генератором звука: таймер 0 обеспечивает собственно сам сигнал ШИМ, а таймер 1 отсчитывает битрейт.

C микросхемой RTC микроконтроллер разговаривает через шину I2C. Управление шиной обеспечивается файлом, утащенным опять же у DI-HALT. Весь обмен построен на прерывании и потому не требует много времени процессора. Запланирован и внешний датчик температуры работающий по этому же протоколу, для него выведены нужные пины на дополнительный разъем.

Помимо того, что микросхема RTC занята отсчетом времени, она генерирует прерывания с частотой 32 768 Гц и 1 Гц. Обработчики этх прерываний разнесены по разным файлам: прерывания с частотой 32 768 Гц обрабатываются в файле регенерации дисплея DisplayHAL.c, а прерывания 1 Гц в том же файле, что и обслуживание RTC. Может это и неправильно, но пока так.

Прерывания с частотой 32 768 Гц используются для регенерации изображения на дисплее. Такое решение обеспечило равномерную яркость свечения индикатора при воспроизведении звука, поскольку чтение информации с SD карты довольно длительный процесс. А раз уж прерывания возникают строго через 30,5 мкс, то их можно использовать для определения периодов сигналов поступающих от приемника инфракрасного излучения, что и было реализовано через переменную PeriodIR.

Обработчик прерывания 1 Гц обеспечивает обновление информации на индикаторе через вызов функции, адрес которой переопределяется в зависимости от режима работы часов. Кроме того каждую нулевую секунду в минуте обработчик вызывает функцию проверки будильников и функцию необходимости возврата в основной режим работы часов.

Немного пробегусь по файлам.

Настройки на конкретную схему, а так же кое-какие определения вынесены в файл Clock.h

В файле ClockMatrix.c описана функция main. Её работа заключается в начальной инициалиации перефирии и периодическом вызове диспетчера задач. Так же в этом файле находятся функции обеспечивающие вывод информации на индикатор в различных режимах и переключатель режимов работы часов SetClockStatus. Особняком стоит ссылка на функцию Refresh. Она используется для немедленного обновления информации на индикаторе после различных событий, например изменения настроек. 

Файл CalcClock.c содержит функции для различных расчетов и перекодировок, например перевод из десятичной системы в двоично-десятичную.

В файле keyboard.c размещена обработка нажатий клавиш на уровне сигналов, а интерпретация в команды меню производится в файле MenuControl.с

Вывод звука обеспечивается группой файлов. В файле Sound.c размещен основной алгоритм генерации ШИМ. Чтение звуковых файлов реализовано с помощью библиотеки поддержки FAT PetitFatFs от известного товарища ChaN и состоит из собственно файла бибиотеки pff.c и файлов низкоуровневого доступа к SD-карточке - diskio.h и mmc.c Файлы Volume.c и VolumeHAL.c обеспечивают регулировку громкости.

В текущей версии определены следующие имена файлов на SD-карте: Alarm.wav – файл воспроизводимый при срабатывании будильника. Each.wav – файл начала ежечастного боя часов. One.wav – один удар курантов, повторяется в зависимости от количества часов. Можно подключить другие файлы. Главное что бы формат файлов был PCM, 8 бит без знака, частота дискретизации 22 кГц. Частоту можно и другую, например 44 кГц, но возможны всякие глюки. Все файлы должны лежать в корневом каталоге SD-карты.

Инфракрасный приемник поддержан файлами IRrecive.c и IRreciveHAL.с. В текущей версии файла IRreciveHAL.с реализован протокол ИК-пультов от телевизора Samsung, просто потому что он у меня есть, но ничего не мешает сделать свою обработку. Как уже сказано выше более-менее отсчет периодов сигналов с ИК-приемника обеспечивается через специальнцю переменную PeriodIR В прерывании от RTC эта переменная увеличивается на еденицу каждые 30,5 мкс. По подсчитанному количеству определяются длительности импульсов от ИК-приемника.

Для работы с шиной I2C предназначены файлы IIC_ultimate.c, i2c.h и i2c_RTC.c Файл IIC_ultimate.c это полностью готовый конечный автомат работы с шиной I2C созданный уважаемым DIHALTом. В файле i2c.h описаны адреса и настройки микросхемы RTC, а в файле i2c_RTC.c сам алгоритм чтения и записи микросхемы RTC. В дальнейшем предполагается добавить датчик температуры либо на шине I2C, либо на 1-Ware.

И наконец, спасение настроек часов и будильников обеспечивает файл работы с EEPROM с оригинальным названием eeprom.c Условно весь массив ячеек eeprom поделен на части. Каждая часть содержит пакеты настроек и метку актуальности. Перед записью формируется пакет данных, включающий в себя настройки например всех будильников. Затем пакет пишется в eeprom в ту часть которая помечена как неактуальная. После того как записаны все пакеты старая часть помечается как неактуальная, а только что записанная как актуальная. Не помню, зачем я так сделал, но было интересно отлаживать.

Архив с исходными текстами прошивки лежит внизу статьи, там же пара файлов с откомпилированной прошивкой для схемы с общим катодом и для схемы с общим анодом.

При компиляции, возможно, будут вылазить предупреждения о неправильном разименовании указателя, плюньте на них, и так все работает. Компилировал в AtmelStudio 6.1, но прекрасно компилируется и в версии AtmelStudio 4.

Микроконтроллер шился прогрмамтором на FT2232HL с помощью averdude. Соответственно полная команда для программатора на FT2232HL: 

avrdude.exe -p m32 -c 2ftbb -P ft1 -B 57600 -D -U lfuse:w:0xff:m -U hfuse:w:0xd9:m

Конечно есть недостатки и недоработки, куда ж без них.

Во-первых качество звука не очень. Меня пока устраивает, но если есть предложения – милости просим.

Во-вторых громкость как-то то же не очень хорошо регулируется, нужно что-то с этим сделать, но идей пока нет.

Еще в тракт усиления лезет помеха от динамической индикации, наверно надо еще какие-то меры предпринять с экранировкой. Земляную шину вот свел в одну точку с цифровой, но видно как-то не так.

Жду отзывов и предложений на том же месте.


Файлы:
Схема, плата и прошивка
Исходники


Все вопросы в Форум.


ID: 1916

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

40 8 2
2
Подробно