Искусственный рассвет

:

Началось всё год назад. Перед Новым 2014 годом несколько пришел в упадок жизненный тонус. Процесс самокопания привел к следующей мысли:

— А, что ж так темно-то, Господи? © День радио.

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

Идея


Не имея возможности переставить время я решил попробовать изменить ощущения посредством изменения освещения. Ход мыслей был примерно следующий: естественный свет попадает в квартиру естественно через окно, а когда света нет — темно. Зажечь свет за окном затруднительно, но можно создать иллюзию того, что там за окном светло. Глядя ночью в окно мы видим темноту — это не изменить, но ночью люди обычно включают свет и закрывают шторы — так светлее и более комфортно. А чем отличается зашторенное окно ночью и днем? А тем, что свет пробивается через шторы. Так, собственно, и родилась сама идея: надо подсветить пространство между окном и шторами!

Для общей принципиальной проверки концепции была куплена белая светодиодная лента и приклеена (оказалось, что на этих лентах есть клеящий слой) к карнизу кухни, причем таким образом, что самих светодиодов нельзя было увидеть даже случайно — это же иллюзия, её нельзя разрушать. Я, конечно, отдаю себе отчет, что здесь во многом присутствует элемент психологии — но это реально сработало.

Нужные для белой пятиметровой ленты 2A на 12V были взяты были взяты от БП сдохшего переносного диска. Впрочем, 12V от компьютерного БП будет ничем не хуже (только надо знать как его запустить и не стоит включать совсем без нагрузки).

К сожалению, сохранились только три снимка от того первого исторического эксперимента (снятые на миксер), но думаю общее представление они передают.

Да… ну и бардак в общем-то так себе… Но! Не будем забывать, что это вечер. А вот зимним утром, да по летнему времени — весьма бодрит!

Окрыленный первой удачей, я решил продолжать эксперимент теперь уже не на себе, а на собственных детях. Ведь одно дело самому вставать по будильнику и совсем другое — будить несчастных ребёнков, в школу, когда ни зги не видно; зная отлично, что один из них точно жаворонок который, будь за окном светло, давно бы уже сидел за столом и тихонечко собирал какое-нибудь LEGO… Но, тут — понятное дело — уже нужна настоящая иллюзия. Нужен рассвет! Настоящий. И не в 7 утра, когда папа включил (папа тоже, кстати, поспал бы еще). И не сразу, а постепенно. И свет должен быть не белый, а красно-оранжево-желтый.

Очевидно, нужна RGB-лента управляемая по расписанию. А значит — микроконтроллер и часы реального времени. И появившееся свободное время удачно совпало с уже имеющимся желанием сделать что-нибудь полезное на AVR'ке.

Реализация


Та-дам. Встречайте — Voskhod1b! Прибор для имитации естественного рассвета, он же нежный будильник, он же органайзер, он же ночник, он же — все, что угодно если добавить нужные датчики и модифицировать код. Например: светофор сборки, офисные часы с индикацией опоздания и перерывов или подсветка для аквариума или светомузыкальное оформление и т. д. и т. п.


Рассвет


Дети в школу собирайтесь (т. н. 'зеленый свисток')


Дневная подсветка, продлеваем 'солнечный' день


Ночник

Расписание программируется с использованием текстового интерфейса. Доступные команды можно получить запросив подсказку командой — h, возможные режимы работы по расписанию можно узнать командой — ha. Подключаться можно как напрямую по UART, так и по bluetooth. Цвета кодируются тремя шестнадцатеричный байтами. Для подбора значений цветов, есть возможность использовать интерактивный режим. В интерактивном режиме можно управлять как RGB так и HSV составляющими цвета. Расписание работы запоминается в EEPROM памяти контроллера. Устройство можно в любой момент выключить. Состояние после включения — 'как бы и не выключалось'.

Вот пример расписания, которое я использовал для моих измученных школой третьекласcников год назад:

00:00:00 => 06:40:00: dark спим
06:40:00 => 06:55:00: rgb 08 05 03 искуствен-...
06:55:00 => 07:00:00: rgb 40 25 15 … ный...
07:00:00 => 07:05:00: rgb 80 50 39 … восход
07:05:00 => 07:55:00: rgb ff 91 1d теплый белый свет
07:55:00 => 08:00:00: rgb 00 55 00 5 минут до выхода в школу — 'зеленый свисток'
08:00:00 => 08:05:00: rgb 55 55 00 выходим в школу — 'желтый свисток'
08:05:00 => 08:20:00: rgb 55 00 00 уже опаздываем в школу — 'красный свисток'
08:20:00 => 11:00:00: dark дети в школе
11:00:00 => 13:30:00: rgb ff 91 1d теплый белый
13:30:00 => 14:30:00: rgb 80 50 39 небольшая дневная...
14:30:00 => 15:00:00: rgb 20 12 07 … подсветка
15:00:00 => 16:57:00: dark дневной сон
16:57:00 => 16:58:00: rgb 20 12 07 просы-...
16:58:00 => 16:59:00: rgb 40 25 14 … паем-...
16:59:00 => 17:00:00: rgb 80 50 30 … ся
17:00:00 => 21:00:00: rgb ff 91 1d вечерняя подсветка
21:00:00 => 22:00:00: rgb 40 25 15 искусственный...
22:00:00 => 23:00:00: rgb 08 05 03 …закат
23:00:00 => 23:30:00: rgb 01 01 03 сумерки
23:30:00 => 00:00:00: rgb 00 00 01 ночник до полуночи

Схема:

Используется МК ATmega168. Подойдет ATmega328 или ATmega88/ATmega8, но команд у последних будет чуть поменьше и подсказка покороче. Не проверял, но уверен, что и ATmega16 будет работать. Часы реального времени — DS1307. Светодиоды зажигаются MOSFET'ами IRF540N. Разумеется, настолько мощные транзисторы не нужны, они просто были под рукой, зато распространенные и не дорогие — не жалко. Есть запас по мощности, можно работать с лентами на 24V, а при наличии защиты по току в блоке питания не страшны короткие замыкания в ленте.

Необходимые 5V для меги и 3.3V для bluetooth модуля HC-05 — производят линейные стабилизаторы L7805 и L78L33. Модуль bluetooth (U5) не обязателен, как и резисторы R11, R12, R13 (согласующие 5V МК с 3.3V контроллера bluetooth) как стабилизатор U4. Схема будет запускаться и работать и даже без U2, но, разумеется, только в интерактивном режиме.

Программа. На ассемблере писать мне не хотелось, видимо поэтому в ATtiny2313 программа не влезла, да я особо и не упирался. Было интересно оценить возможность использования С++ для программирования микроконтроллеров. Оказалось, что вполне реально, с помощью абстрактных интерфейсов написать код, собираемый как для МК (Atmel Studio 6.1), так и для Windows (Microsoft Visual Studio 2012). Под Windows проект собирается с использованием программой эмуляции RTC, UART, EEPROM и PWM. Уверен, что код без проблем соберется и под Linux, если исключить единственную windows-api функцию SetConsoleTitleA(), которая выводит в заголовок окна текущие значений ШИМа.

Библиотека для работы с UART взята из Application Note AVR303 — буферизированный аппаратный UART на прерываниях. Код слегка модифицирован для поддержки ATmega8/16, ATmegaX8 и ATiny2313 (USART2.сpp, USART2.h).

Для работы с I2C интерфейсом DS1307 используется библиотека Павла Бобкова ChipEnable.Ru (за что ему большое спасибо) основанная в свою очередь на AVR315 (twim.cpp, twim.h).

Хм, получается так, что проект собран «с мира по нитке». Впрочем, чему удивляться — так оно и есть. Из того, чем могу похвастаться сам — это, пожалуй, реализация быстрого преобразование HSV->RGB, в которой не используется операция деления (см. HSV2RGB.cpp, HSV2RGB.h).

Работа с UART и I2C производится по прерываниям, и чтобы процессор не скучал: ШИМ — программный. То есть почти программный — завязан на 8-битный таймер. Эксперименты показали, что чисто программный ШИМ в основном цикле, несмотря на максимум частоты, смотрится плохо, мерцает. Подозреваю, что причина связана с небольшими флуктуациями частоты, которые становятся заметны глазу. Мой же ШИМ хоть и программный, не совсем прост: светодиоды зажигаются со сдвигом на треть периода. Например, если R = G = B = 25, то периоды свечения светодиодов R[0,24], G[85,109], B[170,194]. По моим ощущениям, в таком режиме работы, лента смотрится лучше.

Печатная плата разведена в программе DipTrace на одном слое. Размер ПП опреден размерами купленной пластмассовой коробочки. Транзисторы и стабилизаторы пришлось положить, а от удобных зажимных разъемов пришлось отказаться — не хватило места.

Блок питания — любой, подходящий по мощности, для питания LED-лент. Для обычной пятиметровой 12-вольтовой RGB-ленты (60 светодиодов на метр) нужен блок питания на 6A. Разумеется, компьютерный БП тоже подойдет. Если использовать БП от компьютера, нет необходимости в стабилизаторах U3, U4, так как 5V и 3.3V можно брать прямо с него. У компьютерного БП только два недостатка: размер и вентилятор.

Принципиальная схема, рисунок печатной платы (есть версия для ЛУТ и версия для ЛУТ с заливкой), исходный код, прошивки для ATMega8/88/168/328 и windows-эмулятор приложены.
Процесс программирования и различные варианты программаторов здесь не рассматриваются. Я использую программатор usbasp: www.fischl.de/usbasp
И программу: www.khazama.com/project/programmer/KhazamaAVRProgrammer162.rar

Про фьюзы. Заводские AtmegaX8 продаются с установленных битом «Divide clock by 8 internally», который надо снять. Также надо перенастроить МК на использование высокочастотного кварца и обязательно использовать «Brown-out detector level at VCC=4.3V», иначе могут быть проблемы с содержимым EEPROM. В программе khazama AVR Programmer используемые фьюзы выглядят так:


Немного о некоторых технологических аспектах радиоэлектронного производства ПП в домашних условиях


Стружка стеклотекстолита — очень вредная вещь, желательно минимизировать ее количество. Для вырезания заготовки рекомендую использовать не ножовку, а ножницы по металлу — это и точнее, и быстрее, и много удобнее. Сверлить текстолит лучше под слоем воды, но это этом чуть позже.

Печатная плата ЛУТ — наше все. Фотопроцесс — не пробовал, пока не было необходимости в настолько тонких производствах, чтобы возиться с УФ-лампами и злыми щелочами. Итак, ЛУТ. Перепробовано много чего: и множество глянцевых журналов, и пресловутую фотобумагу известной фирмы различной плотности и фольгу (совать в принтер страшно, однако — реально работает), НО мой текущий выбор — виниловая пленка.

Куплена в хозмаге, дешево. Нужна гладкая, фактурная не годится, цвет значения не имеет. Ну, это же прелесть, что такое! Печатаем рисунок ПП на бумаге, отрезаем кусочек виниловой пленки по размеру рисунка, клеим на рисунок сверху, печатаем еще раз. Вырезаем, проглаживаем утюгом, остужаем под прессом (перевернутая табуретка подойдет) и просто аккуратно снимаем пленку с платы. Еще раз — ничего отмачивать и скатывать не нужно — просто медленно отрываем, как скотч. В качестве демонстрации, моя плата залита мелкой сеткой, в оригинальной ЛУТ технологии удалять бумагу из отверстий — очень хлопотно.

Да, плату надо предварительно зачистить от окисла и обезжирить. Любители могут, конечно, использовать мелкую шкурку и ацетон, но мой выбор, и уже давно — порошковый Comet и бумажные полотенца для просушки.

Травим в абсолютно безопасном растворе лимонной кислоты в перекиси водорода. При комнатной температуре процесс занимает 15 минут. Все происходит без пятен и запаха, как от хлорного железа. (100мл перекиси водорода, 40г лимонной кислоты, 1 чайная ложка соли). По окончании раствор безопасно сливается в канализацию.

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




Обратите внимание на муть — часть этой пыли могла оказаться в легких.

Удаление тонера производится без химии. Ацетон? Нет, не слышали. Мочалкой из металлической стружки можно удалить тонер меньше чем за минуту.


Лужение. Старый добрый паяльник уже поднадоел. Как и этот вечный вопрос, что раньше лудить или сверлить? Лудим сплавом РОЗЕ в воде с лимонной кислотой и солью. Процесс занимает несколько минут. Никакого глицерина! И никаких резиновых шпателей — неудобно же и горячо. Мой выбор — малярная кисточка и деревянные палочки для фиксации платы на дне посудины. Лимонная кислота удаляет пленку окисла с поверхности платы. Соль нужна для повышения температуры кипения, да и вода с солью кипит как-то спокойнее.



Естественно, что посуда для лужения не должна использоваться для пищи

После лужения плата моется, сушится (бумажные салфетки) и покрывается слоем жидкого флюса (канифоль в спирте).

Вот какая красота!

Сборка


Как говорится в таких случаях — «хорошо зафиксированный пациент в наркозе не нуждается» «правильно собранная схема в наладке не нуждается». Однако могу порекомендовать некоторый порядок сборки: устанавливаем все резисторы и конденсаторы, панельки для микросхем и стабилизаторы U3, U4. Подаем питание и убеждается, что на 7 выводе МК 5V, и 3.3V тоже на месте. Дальше устанавливаем транзисторы, кварцы, подключаем LED ленту и программируем МК либо на плате, либо в программаторе, и ставим на место. После подачи питания светодиоды на ленте должны в течении 5 секунд пройти по всем цветам от красного через зеленый и синий до красного. Если процесс смены цветов занимает 20 секунд — скорее всего неправильно установлен фьюз «Divide clock by 8 internally». Дальше подключаемся по UART (9600 / 8 data / no parity / 1 stop) и играемся с цветами в интерактивном режиме. Устанавливаем DS1307, ставим время командой ts и убеждаемся, что часы идут… или не идут??? Тут есть тонкий момент: DS1307 запускается не всегда. Не паникуем, отмываем от флюса, сушим плату, пробуем притянуть корпус кварца к земле, поменять кварц или уже на худой конец саму DS1307. Часовая микросхема — очень чувствительная, работает фактически на микротоках — немножко аккуратности и все получится.

Ленту крепим на карниз и/или потолок — главное, что бы был виден только свет от диодов, а не сами диоды.


Соединение ленты с платой удобно делать обычной витой парой, коричневый и коричневый с белым — 12V, остальные цвета соответственно — R, G, B. Если используется модуль bluetooth устройство, можно закрепить где-нибудь на карнизе, тогда придется тянуть только 12V или 220V если там же разместить и блок питания.

О модуле bluetooth — HC-05 – платка мелка и для установки удобно сначала подпаять к ней ножки, а потом уже установить на плате.

Собранное устройство:

Обратите внимание на перемычки. Они соединяют модуль bluetooth с микроконтроллером: 3.3V — 3.3V1; URX — UTXb; UTX — URXb. Если модуль blutooth не используются UART адаптер подключается к гнездам URX, UTX, GND.
И да, каюсь, положил стабилизатор питания модуля bluetooth на бок ой, некрасиво как — самому не нравится только для того чтобы влез в коробочку разъем Molex.

Точки роста


  • SMD
  • разные расписания по дням недели
  • аппаратный ШИМ
  • датчик освещения
  • другие исполнительные устройства
  • GUI
  • ARM32 — особенно интересно (несколько STM32F030F4P6 дожидаются своего времени)

Схема, прошивки, плата, исходники

Итого


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

Спасибо за внимание. Надеюсь, устройство будет кому-нибудь полезно.