Говорящие 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 секунды температуру
Видео с демонстрацией работы:
Собственно, на этом все, спасибо за внимание!))
Источник
Говорящие часы своими руками
Вставленный MisicShield полностью перекрывает доступ к Arduino, производители в этой ситуации предлагают использовать дополнительный «переходной» шилд. Но нужно же срочно! Поэтому переключаем паяльную станцию на режим безсвинцовой пайки и смело паяемся к нужным PINам MusicShield (а, следовательно, и Arduino).
И питание платы от него же. И проводники аккуратно закрепить.
В библиотеке MusicShield отключаем любые обращения к встроенным кнопкам управления и LED.
Аудио-переход от MusicShield в аудиочасть на плате – 3.5мм Jack и экранированный провод.
СОДЕРЖАНИЕ КАРТЫ: ОЗВУЧИВАНИЕ ВРЕМЕНИ, ПЕСНИ
Для записи голоса часов/минут использован этот бесплатный редактор: Power Sound Editor Free (большое спасибо, класс!).
Наговариваем сразу все часы в один файл ,затем нормализуем, убираем шумы, кому интересно – добавляем эффекты. Потом режем на отдельные файлы для каждого часа – 0h.wav, 1h.wav…23h.wav. Можно перевести и в MP3 (платной версией редактора либо другой утилитой).
P.S. Для удобства я между «часами» легко щелкал пальцами («ноль часов щелк один час щелк . «) — получаются отличные маркеры на осцилограмме, резать гораздо легче.
Так же и с минутами – 0m.wav…59m.wav.
Это не так долго как кажется.
Из разных источников набираем песни .MP3, которые могут понравиться папе, переименовываем в вид 1s.MP3, 2s.MP3.
P.S.Для этого пишем маленькую программку, которая быстро копирует файлы с переименованием из указанных папок в конечную, сохраняя в отдельной таблице старые и соответствующие новые имена записанных файлов (на будущее). Такая программка в виде EXCEL-макроса – в пакете.
Формат карты – FAT16.
Все файлы — в корневой каталог. Поздравление (при включении питания) — Intro.WAV, ?a.WAV – приглашения, ??h.WAV – часы, ??m.WAV – минуты, . s.MP3 – песни.
Логика программы очевидна. Практически все есть в указанных библиотеках либо на просторах.
P.S. В библиотеке для MisicShield исключил операции с play-листами, в библиотеке MAXxxx, пока разбирался, в знакогенераторе добавил кириллические символы, позволяющие бегущей строкой отображать на 7-сегментном индикаторе, например, «ПАПЕ УРА!». На будущее.
Текст программы писался быстро, не содержит нестандартных решений и поэтому не является ярким образцом для повторения.
И ВОТ ПОДАРОК ПАПЕ К ДНЮ РОЖДЕНИЯ 12 АПРЕЛЯ.
P.S. Когда FEDOR стоял в тестовом режиме, однажды ночью отключили-включили электричество, и он начал “Папа, поздравляю тебя…”. В последней версии поздравление включается только с 10:00 до 20:00.
Устройство было подарено вовремя и эксплуатируется достаточно интенсивно. Были проблемы с нестабильностью работы с китайской карточкой — решилось заменой. Имеет место замечание по работе генератора псевдослучайных чисел — некоторые композиции звучат чаще других. Будет исправлено в следующей версии.
Обсуждение, как всегда, в форуме, вопросы можно в личку.
Источник
Говорящие часы на Arduino
В молодости не думаешь о времени, кажется, что оно идёт очень медленно, и хочется ускорить время, в пожилом возрасте появляется желание замедлить время.
Французский писатель, лауреат Нобелевской премии Альбер Камю писал «Время идет медленно, когда за ним следишь».
Для слежения за временем человек придумал великое разнообразие часов, в том числе и говорящих.
Я решил сделать для себя говорящие с некоторым набором фраз, как мне казалось, нужных для отслеживания времени:
- Объявление наступления часа круглосуточно от 8 до 23
- Объявление наступления минут от 1 до 30 в режиме утренней зарядки
- Объявление наступления/окончания академического часа в 45 минут для 6-и занятий в режиме «Акадчас»
- Объявление наступления/окончания перерыва в 15 минут для 6-и занятий в режиме «Акадчас»
- Срабатывание будильника звуком лесной птицы кукушки.
Железо
Часы выполнены в фанерном корпусе голубого цвета на 6-и семисегментных индикаторах ярко-
Часы в момент съёмки отображают 15 часов, 17 минут, 38 секунд. Слева, напротив 15 часов отображается OLED дисплей с надписью МИНУТЫ — для корректировки минут (об этом чуть позже).
Схема реализована на 2-х микроконтроллерах ATMEGA328P(клиент) и ATMEGA8A(сервер). Сервер формирует код времени и режима, клиент отвечает за отображение информации на OLED-дисплее и управлением звуковых сообщений.
Отображение времени состоит из 3-х пар семисегментных индикаторах ярко-зелёного цвета. 3-х ватный динамик подключён к плееру DFPlayer_Mini_Mp3. Микро-SD на 4 гБ с записанными мелодиями встроена в плеер.
OLED дисплей по 2-м линиям связи SDA и SQL отображает текущий режим часов.
Используемый сервис
При разработке программы клиента использовалась популярная оболочка Arduino – Environment версии 1.8.5 . Для формирования звука использовался контроллер DFPlayer Mini c библиотекой DFPlayer_Mini_Mp3.h. Для отображения информации в формате чч:мм:сек на индикаторе используется программа написанная на языке С с использованием оболочки CodeVisionAVR версии V2.05.0. Для отображения информации о режимах, времени будильника на OLED-дисплее использовалась библиотека iarduino_OLED_txt.h и шрифт uint8_t MediumFontRus[].
Схемотехника управления индикатором
На Рис. 1 изображён индикатор FJ8201DG. Сегменты обозначены как a,b,c,d,e,f,g.Символом zX обозначен 8-й элемент – точка. Символом А обозначены аноды сегментов. Символами 1-18 обозначены номера контактов индикатора.
Для активации сегмента необходимо подать нулевой потенциал на сегмент и положительный потенциал на анод. Для ограничения тока через диод сегмента вводится сопротивление от 600 Ом до 3к в зависимости от требуемой яркости сегмента.
На Рис. 2 показана схема управления индикатором состоящая из собственно индикатора и контроллера ATMega8A. Ограничивающие ток сегментов сопротивления в 600 Ом R1-R8 присоединяются к сегментам индикатора с одной стороны, с другой к контактам контроллера 2-6,11,12. Аноды сегментов А1-А6 управляются контактами контроллера 13,14,15,26-28.
В Табл.1 показано кодировка символов для выбранной конфигурации. Так для активации символа «0» необходимо подать нулевой потенциал на контакты контроллера PD0, PD1, PD2, PD3, PD5, PD6, PD7, а на PD4(выключение сегмента g) подать логическую единицу. Таким образом для активации символа «0» необходимо на указанных контактах контроллера сформировать код 16 в десятичном представлении. При этом не забыть активировать анод логической единицей.
D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | КОД | СИМВОЛ | |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 16 | «0» | a b c d e f |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 117 | «1» | b c |
1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 9 | «2» | a b g e d |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 65 | «3» | a b g c d |
0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 100 | «4» | f g b c |
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 66 | «5» | a f g c d |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | «6» | a f g c d e |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 113 | «7» | a b c |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | «8» | a b c d e f g |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 64 | «9» | a b g f c d |
Режимы работы часов
Формируются переменным сопротивлением R10 с движка которого аналоговое напряжение 0-5 В подаётся на вход АЦП (DC2). АЦП конвертирует его в цифровой код в диапазоне 0-1023 и присваивает его переменной Regim. Затем разбивается на 19 диапазонов(Фрагмент 1)
if(Regim 50) && (Regim 100) && (Regim 150) && (Regim 200) && (Regim 250) && (Regim 300) && (Regim 350) && (Regim 400) && (Regim 450) && (Regim 500) && (Regim 550) && (Regim 600) && (Regim 650) && (Regim 700) && (Regim 750) && (Regim 800) && (Regim 850) && (Regim 900) && (Regim 950) && (Regim 59)
Функция работает по прерыванию от таймера 1 (См.Микроконтроллеры AVR семейства Tiny и Mega фирмы Atmel, глава 13 Таймеры Стр.255). Сервер на ATMega8 тактируется от кварцевого резонатора в 16 мГц(Рис.3). Записываем в регистры счётчика Т1 значения TCCR1B=0x0D;OCR1AH=0x3D при достижения которых происходит прерывание и далее переменная SPI_sek увеличивается на 1. Далее в функции проверяется ряд условий по которым происходит увеличение/обнуление переменных минут, часов по алгоритму суточного астрономического времени.
Корректировка текущего времени и установка будильника
В режиме 1-8 часы и будильник можно корректировать с точностью до минут с использованием кнопки 2 (Рис.3) и сформированной переменной val (Фрагмент 1)
Источник