Это старая версия поста, который я так и не опубликовал, хотя писал это еще летом. Постепенно к проекту интерес угас и я уже было хотел удалить пост из черновиков, но недавно к проекту опять возник некоторый интерес и я решил его опубликовать. Пост не полноценный, скорее это можно назвать черновиком, причину я немного ниже указал. Ну и потеря интереса к проекту тоже. Возможно я напишу продолжение с указанием, что все-таки у меня получилось и чего я достиг и почему я так поступил. Ну да ладно, все это лирика, приступаем к чтению:
Итак, вдоволь наигравшись со светодиодом, как сенсором освещенности на плате MSP430 Launchpad, решил двигать дальше. Надо переводить это в действующее устройство. Так как у меня есть в наличии только микроконтроллеры AVR (не считая MSP430, которые шли в комплекте с платой), то и устройство будет на AVR. Соответственно, разработаем и вытравим под это дело печатную плату. Итак, поехали…
Для начала прикинем, как должен работать контроллер вытяжного вентилятора в ванной комнате, с какой логикой. Для себя я вижу следующий алгоритм работы вытяжки:
- При включении света в ванной, ждем 2 мин, не включая вентилятор.
- Если 2 минуты истекли, а свет еще включен, запускаем вентилятор.
- Если свет был включен менее 3 мин и выключили свет, то выключаем и вентилятор.
- Если свет был включен более 3 минут, то после выключения света в ванной вентилятор работает пропорционально времени, пока был включен свет (например, за каждые 5 мин включенного света, +3 мин работы вентилятора)
- В любом случае через 30 мин выключаем вентилятор
Алгоритм работы, по прикидкам, довольно простой. Особых требований к «железу» микроконтроллера нет. Требования к схеме контроллера — минимальное количество деталей.
После того, как в голове сформировалось представление того, как должен работать контроллер вытяжного вентилятора, приступил к обдумыванию схемы будущего устройства. В качестве датчика света используем светодиод, как я говорил ранее. Микроконтроллер — ATtiny13. Я думаю, его хватит. Для его питания, что бы минимизировать количество деталей и что бы все уместилось в корпус вентилятора, применим конденсаторное питание. Итого, вот примерно то, что получилось:
Описывать особо нечего. Для питания микроконтроллера используется блок питания с гасящим конденсатором (C1) . При указанных номиналах на выходе блока питания (R2, C1, D2, D3, C2, D1, C3, C4) получаем около 5 вольт. Можно было бы применить интегральный линейный стабилизатор, типа LM7805, но у нас задача — минимальное количество деталей. В принципе, того блока питания, что есть, для питания микроконтроллера вполне достаточно.
При сборке и наладке устройства соблюдайте повышенную осторожность! Схема не имеет гальванической развязки от электрической сети! 5 вольт на микроконтроллер подается относительно самой схемы. Относительно вас там действует 220 вольт. Если вы коснетесь проводников платы во включенном устройстве, то можете получить поражение электрическим током! Ни в коем случае не программируйте микроконтроллер при включенном устройстве, если только ваш программатор не имеет гальванической развязки от сети. Соблюдайте осторожность! Я вас предупредил.
Для управления нагрузкой применяется симистор (триак) BT136. Это довольно мощный симистор ( вентилятор у нас потребляет всего 14ватт, ток 0.085A), но других у меня нет. Опять же, для минимизации количества деталей, симистор включен не как рекомендуют в даташите, а напрямую к ноге микроконтроллера. Даташит же рекомендует включать симистор через оптопару по типу MOC3032 и иже с ним (с детектором нуля или без, в зависимости от решаемых задач).
После этого я взял вентилятор и прикинул, куда я буду ставить плату, замерил размеры и т.д. Внутри вентилятора оказалось вполне возможно разместить плату контроллера. Затем я приступил к разводке платы. Залез в свое хозяйство, наковырял необходимых деталей и запустил Орла. Исходя из имеемых деталей и размеров будущей платы, получилось вот что:
Делал по своим размерам, у вас может быть другой вентилятор, другие детали, другие размеры и т.д.
Здесь должна была быть куча фоток процесса разработки и изготовления устройства. Заготовил много фото. Честно. Все было рассортировано/отобрано/разложено/обработано в отдельную папку на домашнем компьютере. Но по непредвиденным обстоятельствам, я эту папку (а там было и куча других проектов) случайно удалил. 🙁 А когда обнаружил, что ее нет, было уже поздно что-либо восстанавливать. Поэтому фотографий практически нет. И часть статьи пришлось поэтому покоцать.
В процессе изготовления контроллера постоянно вылезали косяки. То сначала отзеркалил плату. Вытравил, залудил. А когда начал собирать, тут то до меня и дошло, что накосячил… Вторую плату вытравил нормально, но когда запаивал, то перегрел дорожки под Тинькой и две дорожки отвалились. Тьфу ты блин. Начал травить третью плату. Вытравил, запаял. Все вроде бы хорошо. Подключаю программатор — мля, не видит Тиню13. Да что ж за беда-то…
Программатор я использую купленный на Ebay у кЕтайцев. USBasp. Вот такой:
Ну не хочет он с Тини13 работать. Хоть ты убей. До этого я раньше программил ATMega8, Attiny2313 и т.д., более старшие контроллеры. Все было нормально и без проблем. Здесь же с Тини13 не заработал. Причем, когда выпаиваешь стабилитрон, то программатор пытается что то увидеть, а когда стабилитрон стоит, то программатор вообще ничего не видит. Несколько раз попробовал зашить тестовую прошивку, после чего Тиня вообще перестала реагировать. И со стабилитроном, и без него. Перепаял другую Тиню13. Та же история. После нескольких попыток и она перестала реагировать. Третью Attiny13 постигла та же участь ( 🙁 ). После этого они у меня закончились.
Гугление по данной проблеме с программатором особо ничего не дало. Проблема такая существует, но решения пока нет. Каждый крутится как может. Я тоже решил очередной раз все переделать. Для этого, так как Тинек у меня не осталось, решил перейти на ATMega8, которых несколько штук у меня валялось. Опять запустил Eagle CAD и перерисовал схему.
Ну и соответственно, печатная плата по этой схеме.
Протравил, запаял, включил программатор… Вау! Заработало! Программатор исправно определяет микроконтроллер, прошивает его, шьет фьюзы. Ну надо же, сколько времени на это ушло…
[deleted] 🙁
Вот так выглядит собранное устройство, смонтированное в вентилятор.
Все, паяльник выключил убрал в сторону, пусть остывает. С ним работу закончил. Теперь достаем компьютер и приступаем к программированию быдлокодингу.
Для начала я накидал программульку, которая как «Hello world» для светодиода, только для вентилятора. Т.е. просто включает вентилятор, а через некоторое время выключает его. Что б проверить включение нагрузки. И тут меня ждал сюрприз.
Оказалось, что это если когда симистор включен по даташиту, через оптопару (с детектором «0», например MOC3062), то если на оптопару подается лог. «1», то пока она подается, нагрузка включена. Убрали единицу — нагрузка выключена. Удобно для меня в данном случае.
Но у меня же не по даташиту, у меня напрямую к ноге МК подключен симистор. А соответственно и управлять я им должен импульсами самостоятельно. Из плюсов — можно регулировать мощность, отдаваемую в нагрузку, т.е. регулировать скорость вращения вентилятора. Красота! Загорелся я идеей. Но не тут то было. Что бы регулировать мощность, нужно определять момент перехода напряжения в нагрузке через «ноль», а потом, в зависимости от необходимой мощности, через определенное время выдавать импульс на открытие симистора. Но у меня нет схемы детектирования нуля! Все уже собрано. А переделывать очередной раз схему и плату ой как не хочется…
В аппнотах на микроконтроллеры PIC вычитал, что детектировать переход через «ноль» можно, если просто подать сигнал с катода стабилитрона на ногу микроконтроллера через резистор. Ну что ж, решил попробовать. Как раз разводка платы позволяла взять сигнал с катода стабилитрона и через соответствующий SMD-резистор подать его на ногу микроконтроллера INT0 или INT1.
Достал паяльник, включил, повесил резистор на ИНТ1. Выключил паяльник, убрал.
Но вот же непруха…. Так у меня эта схема и не заработала. Я не смог определять переход через «ноль». Блин!… Я даже не знаю, какой формы там сигнал… 🙁 Как же плохо без осциллографа. Серьезно задумался о его покупке.
Надо было что то делать. И я решил отказаться от идеи регулировать обороты вентилятора. Нужно заставить просто работать вентилятор. Поэкспериментировав, понял, что если подавать на управляющий вход симистора импульсы раз в 500 микросекунд, то это обеспечит надежное включение и работу вентилятора. Если подавать импульсы раз в 1000 мкс, то вентилятор работает рывками, а напряжение на нем колеблется вольт по 20 в стороны от примерно уровня 146 вольт. Поэтому, оставил импульсы в 500 мкс.
Но в ручную считать задержки и т.д. не наш метод. Пусть это делает сам микроконтроллер. А как считать задержки? Правильно, с помощью таймера. Требования к таймеру и отсчитываемым им интервалам не критичны, поэтому нам хватит восьмибитного таймера 0. Ну что ж, сказано-сделано.
Так как в таймере 0 АТмеги8 нет режима сравнения, при котором вызывается прерывание по совпадению с числом, то поступим следующим образом. Будем загружать в счетчик заранее подготовленное значение, назовем его базой счетчика, и пусть счетчик считает дальше от этого числа до переполнения. Когда счетчик переполнится, будет вызвано прерывание по переполнению и мы можем в обработчике его обработать, в нашем случае, выдать импульс на симистор. Ну и заново загрузить в счетный регистр значение базы, что б он считал от базы счетчика а не от нуля, и чтоб у нас не поплыли интервалы.
Базу счетчика можно посчитать на калькуляторе, например, мне нравится «калькулятор для AVR» (см. в приложении). Если взять частоту микроконтроллера 2МГц, предделитель таймера 8, то база счетчика будет равна 8. Ошибка при этом будет равна нулю. Т.е. прерывание по переполнению счетчика будет происходить ровно каждые 500 микросекунд.
Для отсчета интервалов времени в задержках применим другой счетчик — таймер 2. Тоже восьмибитный. Его настроим аналогичным образом: прерывание по переполнению, перегрузка базы счетчика, обработка прерывания. Частоту настроим на 1мс, т.е. у нас будет происходить 1000 прерываний в секунду. Скажем так, приличная точность, хоть она такая и не требуется в этом проекте.
Так как для всех счетчиков AVR позволяет установить только один предделитель, то для того чтобы получить указанные параметры таймера 2 при частоте МК 2МГц и предделителе 8, нужно базу счетчика выставлять в 0x06.
В обработчике прерывания таймера 2 будем считать количество срабатываний прерывания. Для этого заведем глобальную 32-битную переменную uint32_t sys_time, которая будет у нас системным счетчиком времени (в микросекундах). Для наших нужд этого более чем достаточно. То есть, что бы узнать текущее системное время, мы читаем данные из sys_time. Вот примеры соответствия (для наглядности):
1000 — 1 сек.
3000 — 3 сек.
30000 — 30 сек.
60000 — 1 мин.
300000 — 5 мин.
1800000 — 30 мин.
[deleted] 🙁
В принципе, код прошивки хорошо и обильно прокомментирован. Разобраться в нем, я думаю, не составит особого труда. В том виде, который есть сейчас, откомпилированная прошивка занимает 1Кб. Т.е., если есть необходимость, то ее можно впихнуть в контроллеры Attiny13 и иже с ними.
Еще бы я кусок кода, который там есть:
if (sel_time>300000) load_timer = 180000; // если больше 5' то включить нагрузку на 3' if (sel_time>600000) load_timer = 360000; // если больше 10' то включить нагрузку на 6' if (sel_time>900000) load_timer = 540000; // если больше 15' то включить нагрузку на 9' if (sel_time>1200000) load_timer = 720000; // если больше 20' то включить нагрузку на 12' if (sel_time>1500000) load_timer = 900000; // если больше 25' то включить нагрузку на 15'
оптимизировал так:
load_timer = sel_time / 300000 * 180000;
[deleted] 🙁
To be continued… (May be)
Ах, да, забыл файлики приложить…
Исправляюсь.
venilator_v1.zip — проект в EagleCad с AtTiny13
venilator_v3.zip — проект в EagleCad с AtMega8
ventilator4.zip — последняя версия проекта (исходник и откомпилированная прошивка). Это копия папки с проектом для Eclipse IDE (да, для AVR пишу в Eclipse, ну не нравятся мне студии от Atmel).
Вливайтесь в обсуждение
  20 комментариев
lexresident
11 лет назадСобрал на макетке, зашил, включается как положено через 15 секунд, а вот выключается только через 15 минут. Чёт не догоняю короче…
Chiper
11 лет назадВсе дела в датчике. Он у вас получается все время показывает наличие света. Применение светодиодов в качестве датчика света — тот еще геморрой…
Владимир
10 лет назадAtTiny13 прекрасно прошивается USBasp в avrdudeprog33
http://www.yourdevice.net/downloads/avrdudeprog33.rar
антон
10 лет назаднашел эту статью. схема очень понравилась, её и искал. только не разберусь, где прошивка на тини13, где фьюзы? скачал внизу файл ни хрена не открывается. я как понял это просто макет платы в программе EagleCad, а где сама прошивка и как выставлять фьюзы?
Chiper
10 лет назадЯ же написал в статье, что с Tiny13 у меня не пошло, я переделал все на ATMega8. Поэтому и прошивки на Tiny нет.
Но я привел исходник прошивки на Си. Ее можно откомпилировать как под ATMega8, так и под Tiny13 с небольшими изменениями. Модификации незначительные. Фьюзы по умолчанию.
Я об этом в статье говорил:
антон
10 лет назадСлишком «жирно» мега8 для такой конструкции.)))) Чесно сказать контроллерами занялся недавно. Сложно написать программу самому для тини13 что бы вытяжка включалась на час потом столько же «отдыхала» и так циклично? У меня общая вытяжка на частный дом, такой режим просто идеален. Программа то наверное не сложная? Радиотехникой то занимаюсь давно уже лет двадцать пять, а вот контроллеры как то обходил. Сейчас то уже собираю во всю, только вот использую программы которые идут с проектами. Но надо же с чего то начинать………..
Chiper
10 лет назадНу да, жирно. Но у меня с Тини13 не пошло и они у меня кончились. А Мега8 у меня кучка есть. Поэтому применил то, что было.
Это вообще просто. Десяток строк.
Да, начинать с чего то надо. Можно с этого проекта и начать. 🙂
антон
10 лет назадты сам как начинал програмировать? кто то подсказывал?
антон
10 лет назада вместо светодиода(датчика освещённости) нельзя обычный фотодиод или фоторезистор поставить?
Oleg
10 лет назадПодскажите, пожалуйста, начинающему. Меряя напряжение между GND и VCC мултиметр выдает 220В, это нормально? А то, что-то боязно подключать ATMeg-у к такому напряжению.
Chiper
10 лет назадЗдесь применен бестрансформаторный блок питания с гасящим конденсатором БЕЗ ГАЛЬВАНИЧЕСКОЙ РАЗВЯЗКИ от сети 220В. Для микроконтроллера относительно его «земли» будет подаваться 5В. Если вы коснетесь этих 5В, то относительно вашей «земли» на контакте будет 220В.
Oleg
10 лет назадИзвиняюсь за глупый вопрос. А прибором (вольтметром) эти 5В увидеть можно?
Anton
10 лет назадА можно прошивку для тини13 выложить в нех файле?и какой светодиод надо применять?можно его маркировку.
Anton
10 лет назадИ можно ли прошивку на тини 13 подогнать под фоторезистор?просто их в наличии хватает
Сергей Белицкий
9 лет назадтема живая ещё?
есть пару вопросов
Chiper
9 лет назадСмотря какие вопросы… 🙂
Jman
9 лет назадПривет всем! Автор по поводу программирования Тини. Я понимаю у вас USBBASP. Прикол в том, что в этом чипе с завода идет выставленный ФЬЮЗ CKDIV8. По дефалту 9,6 МГц/8 = 1,2МГц. У меня как — то была похожая ситуация, когда стоял фьюз делителя и частота RC 128КГц. 128 000/8 = 16 КГц… И программатор не видит. Я установил на USBASP перемычку SLOW Programming и в Khazama выставил минимальную скорость SPI — чип считался и перепрограммировался. Идея класс, взял за основу своего девайса. ПС: Семистор не греется?
Chiper
8 лет назадДа, именно он.
Похоже, что и у меня так. Проверить пока не могу, далеко от него нахожусь.
Спасибо за информацию, как только вернусь, попробую тоже так сделать.
Абсолютно холодный.
Jman
9 лет назадМожете скинуть сорс с Attiny13 на digital_inventor(ав-ав)mail.ru? Хочу посмотреть, как таймер организовали.
Chiper
8 лет назадИзвините, но исходников не осталось… 🙁 Они умерли вместе с фотками в той папке, которую я случайно удалил. И резервных копий нет.