Говорящие LED-часы — часть 3: Схема

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

Изначально, при проектировании часов, я не рисовал ни какие схемы. Были только небольших наброски в Proteus-е. Поэтому, пришлось заняться ее воссозданием по имеющемуся железу и программному обеспечению. Ссылка на схему в формате DipTrase и PDF будет в конце статьи.

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

«Мозгом» конструкции является микроконтроллер DD1 ATMega16. К нему подключена микросхема Flash-памяти DS1 на 4 метра для хранения семплов из предыдущей статьи, термометр DD4 DS18B20, буферы LED-дисплея DD2, DD3 с кнопками SB1-SB4 и внешний R-2R ЦАП. Питается конструкция от 5-и вольт через разъем XP2. Через XP1 производится заливка прошивки в микроконтроллер.

Микросхема флеш-памяти DS1 питается от отдельного линейного стабилизатора DD5 на 3.3 вольта. Судя по даташиту на флешку, все ее входы толерантны к 5-и вольтам, а это значит, что ее можно напрямую подключать к 5-и вольтной AVR-ке, не боясь что-либо сжечь.

 

Индикация производится с помощью 2-х строенных семисегментных индикаторов HG1 и HG2. Индикация динамическая. Для конкретных индикаторов токоограничивающие резюки R25-R32 поставил по 300 Ом.

Сигнал с ЦАП-а, выполненного на резисторах R1-R16, через потенциометр R33 подается на усилитель DA1 LM386N. R33 служит для подстройки громкости речевого информатора, чтоб он не орал и не будил окружающих, если те спят)) Обвязка LM-ки взята прямиком из datasheet-та, без изменений. И не забываем про цепочку Цобеля на С4-R34, иначе будем долго чесать репу и искать причину самовозбуда усилка высоких частотах. Ну и конденсаторы С6, С7 надо ставить поближе к микросхеме.

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

На рисунке изображена упрощенная схема внутренней части микроконтроллера и внешней обвязки. Она не совсем соответствует реальной, но для нашей задачи это не критично.

Переключатель PORTB управляет пином PBx микроконтроллера, настроенного на выход. В нижнем положении переключателя PORTB на выводе PBx выдает ноль, в верхнем — единица. Переключатель DDRD управляет направлением вывода PDx, в нижнем положении PDx является выходом, в верхнем положении переключателя — входом. Когда PDx настроен как выход, логическим уровнем на нем модно управлять с помощью переключателя PORTD, по аналогии с PBx. Резистор R2 — внутренний подтягивающий резистор, PIN:D — внутренний буфер, с выхода которого из программы в МК можно прочитать значение логического уровня на PDx, когда он настроен на вход. Буферы LED_BUFF:A и LED_BUFF:B — буферы LED-дисплея DD2 и DD3 соответственно, LED_SEGMENT — один сегмент одного светодиодного индикатора.

Начнем с простого — управление свечением светодиода. Для этого переключатель PORTB переведем в нижнее положение, там самым подадим на катод светодиода минус источника питания, DDRD так же в нижнее положение, и PDx у нас работает как выход. После этого с помощью переключателя PORTD мы сможем зажигать и гасить светодиод.

Переведем PORTD в верхнее положение. Черными стрелками указано направление обхода интересующей в данный момент части контура. Это не в коем случае не направление течения тока, скорее, это наглядное представление наличия «электрического» контакта; стрелка начинается на плюсе, проходит через светодиод и кончается на массе, при этом потенциал на аноде светодиода больше, чем на катоде, следовательно, он будет гореть:

Если в этот момент юзер нажмет на кнопку BUTTON, то ни чего страшного не произойдет, так как резистор R1 предотвратит КЗ, а за счет того, что выходное сопротивление вывода PDx в этом режиме очень мало, то наш резистор R1 ни как не повлияет на значение логического уровня на PDx.

Чтобы погасить светодиод, достаточно перевести переключатель PORTD в нижнее положение:

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

Все сказанное выше по своей сути является примером реализации динамической индикации для индикаторов с общим катодом: на PBx вешаются катоды индикаторов, на PDx аноды сегментов.

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

Для начала переключателем PORTB установим на PBx логическую единицу. Это делаем для того, чтобы светодиод не светился при любом логическом значении на PDx. Далее, настроим PDx на вход, переведя DDRD в верхнее положение. Через резистор подтяжки логическая единица поступает и на вход внутреннего буфера PIN:D, и на PDx. Значение на выходе буфера PIN:D можно прочитать программно.

И вот, юзер решил нажать на кнопку BUTTON. Так как сопротивление резистора R1 намного меньше резистора подтяжки R2, на выводе PDx установится низкий уровень, который можно прочитать на выходе буфера PIN:D.

Таким образом реализуется временнОе мультиплексирование кнопок и LED-индикатора, висящих на одном и том же выводе порта. При частоте обновления индикатора, равной около 100 Hz, видимых задержек реагирования на кнопки не будет, а драгоценные выводы микроконтроллера мы сэкономим)) Правда при этом усложняется программа опроса кнопок и вывода значения на индикатор, по сути будет один программный модуль, который занимается и тем, и другим, но об этом как-нибудь потом.

Про схему собственно все))

Теперь немного о функционале. На данный момент часы умеют отсчитывать текущее время, что не удивительно, ведь это же часы)), имеют календарь, учитывающий високосный год, отображают температуру за окном и снижают яркость индикаторов в период с 23:00 до 7:00, чтоб ночью не мешали спать. Так же можно настроить диапазон часов, когда работает речевой информатор. У меня он объявляет каждый час начиная с 7:00 и до 22:00. Будильника нет. Не стал его делать по одной причине: если ночью «моргнет» свет, то время собьется, и будильник зазвенит не тогда, когда нужно, следовательно, есть опасность проспать. Когда были у меня китайские LED радио-часы, натыкался несколько раз на такой казус. Так что лучше на телефоне поставлю будильник, когда он нужен.

Немного фоток.

В качестве корпуса выбрана пластиковая китайская коробка

Печатную плату не делал, все собрано на макетке типа «решето»

Индикатор поближе: 5 секунд показывают текущее время, 2 секунды температуру

Видео с демонстрацией работы:

Собственно, на этом все, спасибо за внимание!))

Архив со схемой и фотками

Метки: , , , . Закладка Постоянная ссылка.

4 комментария: Говорящие LED-часы — часть 3: Схема

  1. valivass пишет:

    Сколько стоит прошивка ?

  2. valivass пишет:

    Возможна ли коррекция функционала ?
    Убрать температуру
    Разделитель сделать мигающим 1 Гц
    Ввести будильник

Добавить комментарий