Проекционные часы. ( с пультом ду)
- Войдите на сайт для отправки комментариев
Всем привет. Хочу представить вам мой проект Проекционные часы.
Идея пришла достаточно давно до знакомства с Arduino. Когда то в детстве я увидел огромные часы из обычных 100 ваттных лампочек, которые были собраны в четыре восьмерки и о чудо показывали время! То что обычные лампочки такое могут, меня в то время очень поразило и хотелось повторить такое чудо.
Служа в армии я пытался сделать что то подобное на реле, но успехов особых не достиг.
И вот спустя какое-то количество лет, увидев эксперимент с семисегментным индикатором, мне захотелось воплотить в жизнь детскую мечту.
Конечно не о каких 100 ваттных лампочках не могло идти и речи. Но и не хотелось громоздить огромную панель из светодиодов. По этому было решено сделать не большие матрицы из ярких светодиодов и применить линзы для проекции.
Ну хватит пред историй. Сразу видео как все работает, а потом если кому интересно, фото как я это все делал.
http://www.youtube.com/watch?v=GrwoI-a7JfI
Вот еще несколько фото примеров работы днем при солнечном свете и в темноте.
на последней фото чуть смазано. Фотик отказывался фокусироваться на цифры вблизи.
Приступая к созданию часов я наивно предполагал что это проект на три - четыре дня. На самом деле все затянулось почти на месяц из-за того что столкнулся с различными сложностями некоторые из которых только раззадоривали, а некоторые бесили на столько что хотелось все бросить.
Были приобретены макетные платы, четыре сдвиговых регистра, 120 сопротивлений 220 Ом. Светодиодов, как я уже писал у меня великое множество(остались после какой-то шабашки).
С распайкой регистров проблем не возникло. Может получилось чуть не аккуратно но я утешал себя тем что все будет в коробке и не кто этого не увидит
С матрицами получилось все сложнее. Сначала был спаян первый вариант:
Но плата стала занимать много места и все было переделано.
Далее все было собрано и прикручено на орг стекло. Тут было много интересного. С начала было поломано несколько стекол при сверлении отверстий, затем было решено перенести плату с регистрами на другую сторону для уменьшения длины, потом оказалось что платы с светодиодами должны быть под углом и в конце оказалось что длины проводов не хватает и их нужно дорастить.
Ну в целом все получилось.
После долгих и безрезультатных хождений по супермаркетам и хозтоварам в поисках подходящего корпуса (в порыве безумия я даже поглядывал на xbox 360 думая о том что если вытащить все запчасти то коробочка мне отлично подойдет) было решено сделать корпус самому из оргстекла.
За оргстекло отдельное спасибо коллеги Роману.(оказалось что оргстекло большая редкость и купить его бесполезно).
Нужно было решить чем питать всю эту конструкцию. Если arduino и регистры не очень прихотливы по питанию то светодиодам и аккумулятору для работы в буферном режиме требовалось уделить внимание.
На блок питания тратиться не хотелось. Благо на работе целые стеллажи нужного и не очень барахла. Сделал блок питания сам, на основе какого-то интегрального стабилизатора(к сожалению названия не помню) который грелся как собака и пришлось ставить радиатор и охлаждение.
ну и собственно все было собрано в корпус и закреплено
Очень переживал за пожаробезопасность , все-таки устройство будет всегда включено в сеть даже когда не кого не будет дома. По этому поставил предохранители где только можно, перекрестил,
и повесил на стену.
А да конечно код.
В программировании я делаю еще только первые шаги так что прошу сильно не ругать а посмотреть как мой кот играет в танки.
#define LED_PIN A1 // Светодиод секунд. #define latch_Pin 9 #define CLOCK_PIN 13 #define data_Pin 11 #include <IRremote.h> int RECV_PIN = 2; IRrecv irrecv(RECV_PIN); decode_results results; void dump(decode_results *results) { int count = results->rawlen; } int x = 0; // Вторая цифра минут. int z = 0; // Первая цифра часов. int a = 0; // Вторая цифра часов. int p = 1; // Переменная режима работы. int i = 1; // Переменная точек секунд. byte segments[11] = { 0b01110111, 0b00100100, 0b01011110, 0b01101110, 0b00101101, // Масив цифр. 0b01101011, 0b01111011, 0b00100110, 0b01111111, 0b01101111, 0b00000000 }; void setup() { pinMode(latch_Pin, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(data_Pin, OUTPUT); pinMode(LED_PIN, OUTPUT); irrecv.enableIRIn(); } void loop() { for (int y = 0; y < 10; y++) { // Цикл первой цифры минут. for (int b = 0; b < 60; b++) { // Цикл секунд. if (p == 1){ // Режим работы. digitalWrite(latch_Pin, LOW); // Открываем регистр. shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[y]); // Загружаем байты первой цифры минут. shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[x]); // Загружаем байты второй цифры минут. shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[a]); // Загружаем байты второй цифры часов. shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[z]); // Загружаем байты первой цифры часов. digitalWrite(latch_Pin, HIGH); } // Закрываем регистр. if (p == 0){ // Режим выключения светодиодов. digitalWrite(latch_Pin, LOW); // Открываем регистр. shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[10]); // Загружаем нули светодиоды выключены. shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[10]); // Загружаем нули светодиоды выключены. shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[10]); // Загружаем нули светодиоды выключены. shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[10]); // Загружаем нули светодиоды выключены. digitalWrite(latch_Pin, HIGH); } // Закрываем регистр. if (irrecv.decode(&results)) { irrecv.resume(); } if (results.value == 33441975){ // Кнопка включения табло. p = 1; results.value = 0;} if (results.value == 33446055){ // Кнопка выключения табло. p = 0; results.value = 0;} if (results.value == 33456255){ // Кнопка включения светодиода секунд. i = 1; results.value = 0;} if (results.value == 33439935){ // Кнопка выключения светодиода секунд. i = 0; results.value = 0;} if (results.value == 33431775){ // Здесь и далее кнопки установки времяни. a = a + 1; results.value = 0;} if (results.value == 33464415){ a = a - 1; results.value = 0;} if (results.value == 33480735){ z = z + 1; results.value = 0;} if (results.value == 33427695){ z = z - 1; results.value = 0;} if (results.value == 33444015){ x = x + 1; results.value = 0;} if (results.value == 33478695){ x = x - 1; results.value = 0;} if (results.value == 33435855){ y = y + 1; results.value = 0;} if (results.value == 33468495){ y = y - 1; results.value = 0;} if (i == 1){digitalWrite(LED_PIN, HIGH);} // Включаем светодиод секунд. delay(500); // Ждем пол секунды. if (i == 1){digitalWrite(LED_PIN, LOW);} // Выключаем светодиод секунд. delay(500); // Ждем пол секунды. } // Закрываем цикл секунд. if(y == 9) x = x + 1; // При достижении первой цифры минут 9 прибавляем к второй цифре минут 1. if(x > 5){x = 0; z = z + 1;} // При достижении второй цифры минут 5 прибавляем к первой цифре часов 1 а второй присваиваем 0. if(z > 9){z = 0; a = a + 1;} // При достижении первой цифры часов 9 прибавляем к второй цифре часов 1 а первой присваиваем 0. if(a > 1 && z == 4) {a = 0; z = 0;} // Если вторая цифра часа больше 1 а первая равна 4 (т.е 24 часа) сбрасываем все в 0. } }
Всем спасибо за внимание!
Креативненько))). Интересный вопрос не осветил, как фокусировку всего этого делал на стену?
Спасибо.
Изначально часы делались под определенную комнату то есть растояние знал заранее. Брал один светодиод светил через линзу на противоположную стену и по этим замерам уже делал коробку. Так же в коробке оставил место для доп. линз для фокусировки, но обошелся без них.
Пасиб.
отлично получилось)
а вообще можно было обойтись без резисторов, достаточно поставить стабилизатор на 3.3В и все) сам так недавно делал. все отлично. напряжение рабочее для светодиодов около 3.2В. падение на микрухе и вуаля, резисторы не нужны)
также удобно использовать Tm1637
Спасибо.
Думал о том чтобы обойтись без резисторов, но думал уже после того как сделал :). Переделовать лень да и не нужно я думаю. Если еще буду делать нечто подобное обязательно попробую. Только интересует вопрос 74HC595 хватит ли питания 3.3 вольта для полноценной работы?
с точки зрения "собрать любую фигню, ибо нет идей" конечно замечательно...
с практической точки зрения... этакая хренотень на стене.. еще и комнату освещает... в общем придет жена и устроит сексуальные ролевые игры, причем скорее всего жена будет в роли злого полицейского, пытающегося засунуть вам эту бандуру в неподходящие, темные места..
Жене кстати часы очень понравились. Комнату освещает - так это еще один плюс своеобразный ночник. Еще при отключении электроэнергии ( что в моем доме происходит с подозрительной регулярностью) получаеться аварийное освещение. А когда надоедает свет от часов всегда можно выключить пультом. А вот то что какаято хрень на стене - это конечно печаль. Но тешу себя мыслями что если бы это был к примеру видеопроектор то это была бы точно такая же хрень на стене и от этого не уйти.
По поводу "собрать любую фигню, если нет идей" то мне наоборот казалось что я сделал (из всей фигни которые делал до этого) первое что то полезное :) Часы висят уже три месяца и отлично справляються со своей задачей.
Кстати чуть не забыл: Спасибо за конструктивную критику.
хватит. говорю же у меня работает прямо сейчас
Здравствуйте olegoriy.Давно поглядываю в сторону таких часов.Ваши понравились.Трудностей со сборкой и программированием не должно возникнуть но напрашивается вопрос.А где схема?Может я что-то пропустил?Буду признателен за ответ.
Здравствуйте у меня есть кое какой вопрос. Я бы хотел собрать проекционные часы на контроллере Arduino как у вас. Не могли-ли бы вы отправить схему подключения часов, и подробную информацию о деталях?
Часы делаю для дипломного проекта)