Altinkaya: турецкие корпуса для РЭА

Солнечные часы 21 века с лазерным лучом в роли стрелки

Это простой проект солнечных часов, в которых в роли стрелки выступает лазерный луч. Сам лазер устанавливается на сервоприводе с дистанционным управлением, который в свою очередь управляется микроконтроллером. Микроконтроллер ведет отсчет времени и соответствующим образом дает команды на поворот сервопривода.

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

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

В роли микроконтроллера выступает Atmel Attiny24 с кристаллом для большей точности. Внутренний RC-генератор можно откалибровать, однако в конечном итоге точность зависит сугубо от кристалла кварца.

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

Солнечные часы 21 века

Микроконтроллер ведет отсчет реального времени. Время конвертируется из минут в формат 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-ую секунды выполняется следующая операция:

ISR(TIM1_OVF_vect) { … }

Эта операция выполняет целый ряд действий:

Отсчитывает реальное время, 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 – по умолчанию.

Перевод: Сашич по заказу РадиоЛоцман

На английском языке: XXI Century Sundial - Now for Arduino also

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • Я делал обычные солнечные часы, которые показывали время с точностью в 5 мин, правда всего в течении недели :) дальше нужно более точно рассчитывать угол наклона земли. Они представляли гораздо больший интерес, чем эти. Сам дизайн не интересен, даже не хочется вдаваться в схему.
  • [URL="http://mobbit.info/item/2009/4/10/solnechnye-chasy-s-led-lampochkami-vmesto-solnca-8-foto"]http://mobbit.info/item/2009/4/10/solnechnye-chasy-s-led-lampochkami-vmesto-solnca-8-foto[/URL] Не знаю какого века эти часы, но тоже о-о-очень оригинальные!
  • Представляет интерес, как элемент дизайн помещения в виде готового изделия.
  • Первый вариант часов: простенько, но вполне приемлемо. По ссылке от YAA, конечно очень красиво и оригинально, но конструкция не из простых.