- Солнечные часы 21 века с лазерным лучом в роли стрелки
- Часы с LED проекцией
- Самодельные электронные часы, элементная база — часть 2
- 1. Устройства вывода
- Сегментная индикация
- Матричные индикаторы
- ЖК-индикаторы
- OLED-индикаторы
- Газоразрядные индикаторы (ИН-14, ИН-18)
- 2. Выбор платформы
- Arduino
- 32-разрядные процессоры STM
- Raspberry PI
- ESP8266
- Вместо заключения
Солнечные часы 21 века с лазерным лучом в роли стрелки
Это простой проект солнечных часов, в которых в роли стрелки выступает лазерный луч. Сам лазер устанавливается на сервоприводе с дистанционным управлением, который в свою очередь управляется микроконтроллером. Микроконтроллер ведет отсчет времени и соответствующим образом дает команды на поворот сервопривода.
Будучи очень простым по дизайну, мое устройство делает именно то, что я хотел и содержит минимально возможное количество деталей.
В роли микроконтроллера выступает Atmel Attiny24 с кристаллом для большей точности. Внутренний RC-генератор можно откалибровать, однако в конечном итоге точность зависит сугубо от кристалла кварца.
Схема чрезвычайно проста, всего лишь микросхема с кристаллом и конденсаторами, сам лазер и транзистор для управления им, а также сервопривод. Питание идет от блока питания на 5 В.
Микроконтроллер ведет отсчет реального времени. Время конвертируется из минут в формат 1:00 часов и затем в ШИМ импульс, подходящий для управления сервоприводом. Исходный код снабжен полными комментариями и легок для понимания в плане принципа работы.
J4 необходим для программирования микроконтроллера с помощью внутрисхемного последовательного программирования. Если у вас уже есть запрограммированная микросхема (скажем, вашим другом), то этого делать не надо.
При подаче питания сервопривод начинает движение из среднего положения солнечных часов на 1:00 часов. Замкните ножки 5-6 J1 чтобы «стрелка» часов сдвигалась на 1 час за раз. Повторите эту процедуру несколько раз от 1:00 до 12:00 часов для определения диапазона поворота. Затем удалите перемычку, когда лазер укажет на точное время.
Проще установить минуты при установке «ровного» времени, потому что таймер минут сбрасывается на 0 всегда, когда устанавливаются часы. В ином случае, замкните ножки 3-4 J1, перебирая по 2 минуты каждую секунду, и удалите перемычку на нужном времени.
Замыкая ножки, 1-2 вы «оживите» солнечные часы, заставив их показывать секунды. Вначале это действует гипнотически, затем теряет смысл.
Замыкая ножки, 7-8, вы заставляете лазер быть постоянно включенным, иначе он мигает каждую секунду.
Цепь и ПО можно изменить для показа различных значений, например напряжения на аналоговом входе микропроцессора, превращая тем самым лазер в аналоговый измерительный прибор. Или можно сделать что-либо наподобие лазерного «хронулятора»
Вот сама конструкция.
Я использовал сервопривод Hitec HS-300BB – довольно хороший и к тому же случайно завалявшийся в моем ящике. Подойдет и любой другой сервопривод, только возможно диапазон перемещения будет немного иным. Его можно настроить с помощью значений SERVO_MIN и SERVO_MAX, однако будет необходима повторная компиляция.
Печатную плату я не использовал.
На картинках видно, как я прикрепил лазер к сервоприводу: L-образный кусок алюминия, несколько мелких шурупов и тефлоновый зажим легко справились с этой задачей. Сложным было выровнять нижний конец лазерной линии с центром сервопривода. В любом случае, ошибки в этом процессе могут породить некоторые интересные эффекты, когда лазерная линия движется не вокруг одного из своих концов, а вокруг некоей точки где-то посередине, подобно стрелке спидометра. Экспериментируйте
Программное обеспечение.
Написано на С, компиляция и отладка в AVR Studio. Отладку кода я производил с помощью AVR Dragon, которая использует встроенные в ATTiny24 возможности по отладке.
Код снабжен комментариями и должен быть вполне понятным, а также простым для изменений по вашему желанию. Но в любом случае, ниже приводятся несколько комментариев.
#define F_CPU 2457600UL // частота кристалла
#define PWM_TOP F_CPU/60 // = 40960 – МАКС значение для таймера 0 (идет в OCR0A)
Эти прекомпиляторные инструкции определяют частоту кристалла и значение, вносящееся в регистр OCR1A, которое будет максимальным значением для таймера1 перед сбрасыванием на ноль. Нам надо, чтобы частота ШИМ была 60 Гц. Эта импульсы также используются в качестве временной оси для часов реального времени.
Следующие строки настраивают Таймер1 на быструю ШИМ, без предделителя частоты (то есть частота кристалла напрямую идет на Таймер1), а ШИМ Compare Output на выводе ОС1В.
TCCR1A = _BV(WGM11) | _BV(WGM10) | _BV(COM1B1);
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10);
OCR1A = PWM_TOP; // ШИМ част = 60 Гц
Сейчас Таймер1 отсчитывает время от 0 до значения PWM_TOP, 60 раз каждую секунду (2457600/40960)
Вышеуказанные инструкции также делают выход OC1B высоким, когда счетчик меньше значения ОCR1A и 0 в обратном случае. Это и есть ШИМ – изменение значения OCR1B от 0 до PWM_TOP изменяет коэффициент заполнения от 0% до 100% на частоте ШИМ, которая не меняется: 60 колебаний каждую секунду, колебания просто уже или шире.
Точное значение станет понятнее после просмотра технической документации по ATTiny24.
Следующая инструкция помещает сервопривод на положение OCR1B – промежуточное положение между максимальным и минимальным положениями сервопривода.
OCR1B = (SERVO_MAX + SERVO_MIN) / 2 ;
Это значение не составляет 50% коэффициента заполнения ШИМ, так как сервопривод перемещается от минимального положения до максимального с импульсом менее 50%, поэтому я определил значения defined SERVO_MAX и SERVO_MIN, основываясь на длительности импульсов, которые перемещают сервопривод в максимальное или минимальное положение:
#define SERVO_MAX PWM_TOP*1.65/(1000/60) // макс. поворот – на 2,35 млс импульса
#define SERVO_MIN PWM_TOP*0.75/(1000/60) // мин. поворот – на 0,70 млс импульса
Теперь я хочу, чтобы переполнение таймера использовалось в качестве временной оси для часов реального времени:
TIMSK1 = _BV(TOIE1); // включить переполнение таймера (для часов реального времени)
sei(); // включить глобальные прерывания
Сейчас каждую 1/60-ую секунды выполняется следующая операция:
Эта операция выполняет целый ряд действий:
Отсчитывает реальное время, 60 умноженное на 1/60 секунды означает прошествие одной полной секунды, поэтому вместе с отсчетом минут и часов можно добавить и секундомер.
Заставляет лазер мигать каждую 1/10-ую секунду каждую секунду, если только не стоит соответствующая перемычка, в противном случае лазер включен постоянно.
Данная операция также определяет положение, в которое должен передвинуться сервопривод. Для выполнения этой задачи время конвертируется в общее количество минут, прошедших со времени 1:00, а полученный результат вписывается в диапазон
SERVO_MIN до SERVO_MAX
servo_pos = servo_min + ((hour-1)*60+min)*((servo_max-servo_min)/(11*60+59));
Замыкая JUMP_0 мы заставляем сервопривод отображать только секунды (от 9 до 59), тем самым вышеуказанное вычисление производится только по текущим секундам, минуты и часы не принимаются во внимание.
servo_pos = servo_min + sec*((servo_max-servo_min)/59);
Следующие команды помещают сервопривод в зеркальное положение, чтобы лазер двигался по часовой стрелке:
OCR1B = servo_min+servo_max-servo_pos; // по часовой стрелке
// OCR1B = servo_pos; // против часовой стрелки («закомментарено»)
Если необходимо, то можно превратить первую строчку в комментарий и убрать «//» со второй. Результатом этого станет (после компиляции и закачки в процессор) то, что сервопривод будет двигаться против часовой стрелки.
Наконец, эта операция также проверяет наличие перемычек для выставления времени и, если требуется, устанавливает часы и минуты. Минуты изменяются каждые полсекунды, тогда как часы – раз в секунду. Убрав перемычки, вы вернете стандартное отображение часов.
Если вы хотите модифицировать и перекомпилировать программу с помощью AVR Studio с AVRGCC, С компилятором, не забудьте установить FUSE на режим External Clock от 0,9 до 3 МГц, без сторожевого таймера, х8 делитель частоты – отключен. Все остальные FUSE – по умолчанию.
Перевод: Сашич по заказу РадиоЛоцман
Источник
Часы с LED проекцией
Привет всем любителям самоделок. В данной статье я расскажу, как сделать часы с LED проекцией своими руками, в сборке которой поможет кит-набор, ссылка на него будет в конце статьи. Данный радиоконструктор будет полезен для сборки радиолюбителям , а также тем, кто хочет впервые проверить свои силы в работе с паяльником. Такие часы будут отлично смотреться в любом месте, а вращающаяся проекция на светодиодах только добавит оригинальности.
Перед прочтением статьи предлагаю посмотреть видеоролик, где показан весь процесс сборки данного кит-набора, а также полноценное тестирование.
Для того, чтобы сделать часы с LED проекцией, понадобится:
* Кит-набор
* Паяльник, флюс, припой
* Приспособление для пайки «третья рука»
* Пинцет
* USB-свисток, купить можно тут
* Термопистолет
* Бокорезы
* Силиконовый коврик для пайки
* Блок питания с USB-портом
Шаг первый.
Для начала рассмотрим что входит в комплект кит-набора. Здесь имеется несколько пакетиков с платами, всего их три разных размеров, на них нанесена маркировка для удобства сборки, также есть SMD-резисторы и светодиоды, которых тут достаточно много.
Для подключения питания предусмотрен специальный кабель, а управлять часами можно при помощи пульта. Инструкция по сборке в комплекте не прилагается, но на странице продавца имеется ссылка, по которой можно скачать ее в электронной версии, где все достаточно подробно разобрано до мелочей, включая процесс прошивки. Разобравшись с комплектом, переходим к самой сборке.
Шаг второй.
Первым делом установим на самую большую из комплекта плату SMD детали, на ней уже предварительно припаяна микросхема, так как для ее установки понадобился бы паяльный фен. Определять сопротивление SMD-резисторов не нужно, так как здесь они имеют одинаковые номиналы, что очень удобно. При помощи пинцета раскрываем ленту резисторов и высыпаем их на силиконовый коврик для пайки.
Источник
Самодельные электронные часы, элементная база — часть 2
Привет, geektimes! В первой части статьи были рассмотрены принципы получения точного времени на самодельных часах. Пойдем дальше, и рассмотрим, как и на чем это время лучше выводить.
1. Устройства вывода
Итак, у нас есть некая платформа (Arduino, Raspberry, PIC/AVR/STM-контроллер, etc), и стоит задача подключить к нему некую индикацию. Есть множество вариантов, которые мы и рассмотрим.
Сегментная индикация
Тут все просто. Сегментный индикатор состоит из обычных светодиодов, которые банально подключаются к микроконтроллеру через гасящие резисторы.
Осторожно, траффик!
Плюсы: простота конструкции, хорошие углы обзора, невысокая цена.
Минус: количество отображаемой информации ограничено.
Конструкции индикаторов бывают двух видов, с общим катодом и общим анодом, внутри это выглядит примерно так (схема с сайта производителя).
Есть 1001 статья как подключить светодиод к микроконтроллеру, гугл в помощь. Сложности начинаются тогда, когда мы захотим сделать большие часы — ведь смотреть на мелкий индикатор не особо удобно. Тогда нам нужны такие индикаторы (фото с eBay):
Они питаются от 12В, и напрямую от микроконтроллера просто не заработают. Тут нам в помощь приходит микросхема CD4511, как раз для этого предназначенная. Она не только преобразует данные с 4-битной линии в нужные цифры, но и содержит встроенный транзисторный ключ для подачи напряжения на индикатор. Таким образом, нам в схеме нужно будет иметь «силовое» напряжение в 9-12В, и отдельный понижающий преобразователь (например L7805) для питания «логики» схемы.
Матричные индикаторы
По сути, это те же светодиоды, только в виде матрицы 8х8. Фото с eBay:
Продаются на eBay в виде одиночных модулей либо готовых блоков, например по 4 штуки. Управление ими весьма просто — на модулях уже распаяна микросхема MAX7219, обеспечивающая их работу и подключение к микроконтроллеру с помощью всего лишь 5 проводов. Для Arduino есть много библиотек, желающие могут посмотреть код.
Плюсы: невысокая цена, хорошие углы обзора и яркость.
Минус: невысокое разрешение. Но для задачи вывода времени вполне достаточно.
ЖК-индикаторы
ЖК-индикаторы бывают графические и текстовые.
Графические дороже, однако позволяют выводить более разнообразную информацию (например график атмосферного давления). Текстовые дешевле, и с ними проще работать, они также позволяют выводить псевдографику — есть возможность загружать в дисплей пользовательские символы.
Работать с ЖК-индикатором из кода несложно, но есть определенный минус — индикатор требует много управляющих линий (от 7 до 12) от микроконтроллера, что неудобно. Поэтому китайцы придумали совместить ЖК-индикатор с i2c-контроллером, получилось в итоге очень удобно — для подключения достаточно всего 4х проводов (фото с eBay).
ЖК-индикаторы достаточно дешевые (если брать на еБее), крупные, их просто подключать, и можно выводить разнообразную информацию. Единственный минус это не очень большие углы обзора.
OLED-индикаторы
Являются улучшенным продолжением предыдущего варианта. Варьируются от маленьких и дешевых с диагональю 1.1″, до больших и дорогих. Фото с eBay.
Собственно, хороши всем кроме цены. Что касается мелких индикаторов, размером 0.9-1.1″, то (кроме изучения работы с i2c) какое-то практическое применение им найти сложно.
Газоразрядные индикаторы (ИН-14, ИН-18)
Эти индикаторы сейчас весьма популярны, видимо из-за «теплого лампового звукасвета» и оригинальности конструкции.
(фото с сайта nocrotec.com)
Схема их подключения несколько сложнее, т.к. эти индикаторы для зажигания используют напряжение в 170В. Преобразователь из 12В=>180В может быть сделан на микросхеме MAX771. Для подачи напряжения на индикаторы используется советская микросхема К155ИД1, которая специально для этого и была создана. Цена вопроса при самостоятельном изготовлении: около 500р за каждый индикатор и 100р за К155ИД1, все остальные детали, как писали в старых журналах, «дефицитными не являются». Основная сложность тут в том, что и ИН-хх, и К155ИД1, давно сняты с производства, и купить их можно разве что на радиорынках или в немногих специализированных магазинах.
2. Выбор платформы
С индикацией мы более-менее разобрались, осталось решить, какую аппаратную платформу лучше использовать. Тут есть несколько вариантов (самодельные я не рассматриваю, т.к. тем кто умеет развести плату и припаять процессор, эта статья не нужна).
Arduino
Самый простой вариант для начинающих. Готовая плата стоит недорого (около 10$ на eBay с бесплатной доставкой), имеет все необходимые разъемы для программирования. Фото с eBay:
Под Arduino есть огромное количество разных библиотек (например для тех же ЖК-экранов, модулей реального времени), Arduino аппаратно совместима с различными дополнительными модулями.
Главный минус: сложность отладки (только через консоль последовательного порта) и довольно-таки слабый по современным меркам процессор (2КБайт RAM и 16МГц).
Главный плюс: можно сделать много чего, практически не заморачиваясь с пайкой, покупкой программатора и разводкой плат, модули достаточно соединить друг с другом.
32-разрядные процессоры STM
Для тех кто захочет что-то помощнее, есть готовые платы с процессорами STM, например плата с STM32F103RBT6 и TFT-экраном. Фото с eBay:
Здесь мы уже имеем полноценную отладку в полноценной IDE (из всех разных мне больше понравилась Coocox IDE), однако понадобится отдельный программатор-отладчик ST-LINK с разъемом JTAG (цена вопроса 20-40$ на eBay). Как вариант, можно купить отладочную плату STM32F4Discovery, на которой этот программатор уже встроен, и его можно использовать отдельно.
Raspberry PI
И наконец, для тех кто хочет полной интеграции с современным миром, есть одноплатные компьютеры с Linux, всем уже наверное известные Raspberry PI. Фото с eBay:
Это полноценный компьютер с Linux, гигабайтом RAM и 4х-ядерным процессором на борту. С краю платы выведена панель из 40 пинов, позволяющая подключать различную периферию (пины доступны из кода, например на Python, не говоря о C/C++), есть также стандартный USB в виде 4х разъемов (можно подключить WiFi). Так же есть стандартный HDMI.
Мощности платы хватит к примеру, не только чтобы выводить время, но и чтобы держать HTTP-сервер для настройки параметров через web-интерфейс, подгружать прогноз погоды через интернет, и так далее. В общем, простор для полета фантазии большой.
С Raspberry (и процессорами STM32) есть одна единственная сложность — ее пины используют 3-вольтовую логику, а большинство внешних устройств (например ЖК-экраны) работают «по старинке» от 5В. Можно конечно подключить и так, в принципе заработает, но это не совсем правильный метод, да и испортить плату за 50$ как-то жалко. Правильный способ — использовать «logic level converter», который на eBay стоит всего 1-2$.
Фото с eBay:
Теперь достаточно подключить наше устройство через такой модуль, и все параметры будут согласованы.
ESP8266
Способ скорее экзотический, но довольно-таки перспективный в силу компактности и дешевизны решения. За совсем небольшие деньги (около 4-5$ на eBay) можно купить модуль ESP8266, содержащий процессор и WiFi на борту.
Фото с eBay:
Изначально такие модули предназначались как WiFi-мост для обмена по serial-порту, однако энтузиастами было написано множество альтернативных прошивок, позволяющих работать с датчиками, i2c-устройствами, PWM и пр. Гипотетически вполне возможно получать время от NTP-сервера и выводить его по i2c на дисплей. Для тех кто хочет подключить много различной периферии, есть специальные платы NodeMCU с большим числом выводов, цена вопроса около 500р (разумеется на eBay):
Единственный минус — ESP8266 имеет очень мало памяти RAM (в зависимости от прошивки, от 1 до 32КБайт), но задача от этого становится даже интересней. Модули ESP8266 используют 3-вольтовую логику, так что вышеприведенный конвертор уровней тут также пригодится.
На этом вводный экскурс в самодельную электронику можно закончить, автор желает всем удачных экспериментов.
Вместо заключения
Я в итоге остановился на использовании Raspberry PI с текстовым индикатором, настроенным на работу с псевдографикой (что вышло дешевле чем графический экран той же диагонали). Сфоткал экран настольных часов во время написания этой статьи.
Часы выводят точное время, взятое из Интернета, и погоду которая обновляется с Яндекса, все это написано на Python, и вполне работает уже несколько месяцев. Параллельно на часах запущен FTP-сервер, что позволяет (вкупе с пробросом портов на роутере) обновить на них прошивку не только из дома, но и из любого места где есть Интернет. Как бонус, ресурсов Raspberry в принципе хватит и для подключения камеры и/или микрофона с возможностью удаленного наблюдения за квартирой, или для управлением различными модулями/реле/датчиками. Можно добавить всякие «плюшки», типа светодиодной индикации о пришедшей почте, и так далее.
PS: Почему eBay?
Как можно было видеть, для всех девайсов приводились цены или фото с ебея. Почему так? К сожалению, наши магазины часто живут по принципу «за 1$ купил, за 3$ продал, на эти 2 процента и живу». В качестве простого примера, Arduino Uno R3 стоит (на момент написания статьи) 3600р в Петербурге, и 350р на eBay с бесплатной доставкой из Китая. Разница действительно на порядок, безо всяких литературных преувеличений. Да, придется подождать месяц чтобы забрать посылку на почте, но такая разница в цене думаю, того стоит. Но впрочем, если кому-то надо прямо сейчас и срочно, то наверно и в местных магазинах есть выбор, тут каждый решает сам.
Источник