Стеклоочистители, также именуемые дворниками - незаменимое устройство в любом автомобиле. В большинстве автомобилей у них есть 3 режима работы - прерывистый, постоянный и быстрый постоянный. Но что делать, если не работает прерывистый режим стеклоочистителей, как было у меня? Или, например, он работает, но вас не устраивает жёстко заданная задержка (пауза) между взмахами дворников на прерывистом режиме? В таких случаях вам поможет эта статья, так как сейчас я расскажу, как легко и недорого сделать на Arduino реле стеклоочистителей с регулируемой паузой, а если быть точнее - полноценную систему управления стеклоочистителями для вашего авто на примере моей ненаглядной Opel Vectra B.
Предыстория
Если честно, я бы не особо заморачивался с регулируемой паузой дворников на своём пепелаце, если бы у меня через некоторое время после его покупки не начал глючить прерывистый режим. В чём это выражалось? Честно говоря, я уже и не особо помню, ведь это было более 5 лет назад. Что я тогда ни делал - перебирал сам механизм стеклоочистителей, пробовал заменить реле на заведомо рабочее с другой машины: ничего не помогало. Я тогда не так глубоко шарил в электрике своего автомобиля, у меня не было Opel TIS (советую всем опелеводам обзавестись этим крайне полезным комплексом), поэтому в конце концов я просто плюнул на это дело и отключил на время прерывистый режим как таковой, поставив вместо штатного реле простую перемычку, возвращающую щётки стеклоочистителей в исходное положение.
Так я ездил какое-то время, но отсутствие прерывистого режима доставляло неудобства, поэтому я решил всё-таки взяться за эту проблему и, наконец, решить её. Но просто починить прерывистый режим было уже не интересно, да и зачем заморачиваться со штатной системой, когда можно пустить в дело любимую Ардуину и сделать нечто большее - так я и пришёл к идее реализовать реле управления стеклоочистителями с регулируемой паузой на Arduino.
Единственная потенциальная проблема была лишь в одном - на Вектры Б штатно не устанавливалась подобная опция, но она устанавливалась на Omega B, поэтому осталось лишь обзвонить местные разборки и купить заветную ручку с Омеги с нужным мне регулятором. Благодаря высокой унификации моделей одного поколения Опелей, обе ручки не только имеют одинаковые размеры и крепления, но даже и разъёмы (дополнительные кнопки и регулятор выведены на дополнительный разъём), поэтому новая омежная ручка встала на мою машину как родная. Осталось только придумать и собрать сами мозги для неё.
Схема
Разумеется, разработку устройства я начал не с пайки и не сборки на макетке, что отняло бы гораздо больше времени на конструирование и экспериментирование. Я открыл любимую систему автоматизированного проектирования Proteus 8 и набросал там такую вот схему:
Так как Proteus позволяет эмулировать не только обычные электронные схемы, но также и микроконтроллеры, в том числе платформу Arduino, я сразу же делал макет полноценного готового устройства с прошивкой. Но начну с объяснения самой схемы.
На входе, как известно, мы имеем бортовую сеть автомобиля номиналом 12 вольт. Так как МК работает от 5ти вольт, в схеме используется обычный стабилизатор напряжения U2 типа 7805 (а на практике - любой стаб с фиксированным выходом 5 вольт (AZ1085, КРЕН5 и т.д.) или даже банальная LM317 с подобранным делителем: пофигу), благодаря которому мы получаем пятивольтовую шину, от которой у нас и будет запитываться микроконтроллер Atmega328P и переменный резистор в купленной ручке. На схеме Атмега не запитана ни от чего (Протеусу это не нужно), но посмотреть, как её запитывать в такой ситуации, вы можете на ещё более подробной схеме в моей статье про зарядное устройство для автомобильных аккумуляторов на Arduino. Там всё понятно нарисовано, в том числе и необходимая обвязка для микроконтроллера из двух кондёров и кварца на 16 МГц.
Как видно на схеме, у нас есть 3 органа управления:
- Кнопка "Нажатие омывашки" - виртуальная кнопка; на самом деле вместо неё мы имеем сигнал с ручки о включении насоса омывателя (тянем ручку на себя). Т.к. уровень этого сигнала - 12 вольт, в схеме реализован делитель напряжения 2:1 на резисторах R4 и R3, то есть на пятивольтовый АЦП Arduino через этот делитель приходит уменьшенный в три раза сигнал: при 14V на входе получается 4,67V на выходе.
- Переключатель "Включение прерывистого режима" - аналогично первому пункту, в делителе используются резисторы R5 и R2, даёт микроконтроллеру понять, что в данный момент ручкой включён прерывистый режим и надо, непосредственно, работать.
- Переменный резистор RV1 - это то самое колёсико в ручке, которым и задаётся продолжительность паузы (задержки) между взмахами щёток стеклоочистителя. Т.к. в моём случае колёсико это не подключено к бортовой сети автомобиля - на вход переменника подаётся 5 вольт, а выход притянут к земле 4,7К резистором (это зависит от сопротивления самого переменника). Нижний выход на схеме не подключён, т.к. его в реале вообще нет, он и не нужен.
Коммутация происходит с помощью реле RL1 с катушкой на 12 вольт, поэтому Ардуина рулит им через NPN-транзистор, в данном случае мой любимый КТ315, как и в статье про зарядное (ссылка выше). Используются три контакта на месте штатного реле:
Как видно из схемы, на Опелях (по крайней мере, этого поколения) для управления стеклоочистителями в данном случае используется 3 контакта: один - питание мотора, два других - постоянные 12 вольт и 12 вольт только когда дворники не в изначальном положении. Соответственно, соединяя выход на питание мотора стеклоочистителей с одним из этих контактов, мы обеспечиваем либо постоянную его работу, либо работу до установки щёток в изначальное (парковочное) положение. Если на вашей машине не так - разницы нет, под любой вариант работы прерывистого режима стеклоочистителей данная схема и нижеописанная прошивка легко корректируются!
Вот, собственно, и вся незамысловатая схема устройства. Реально, тут нечего собирать.
Прошивка (скетч) Arduino
Для вашего удобства я прокомментировал все строчки скетча так, чтобы в нём разобрался даже далёкий от программирования человек:
int pos,val; //Служебные переменные bool kp; //Служебная переменная, если тру - прерывистый режим только что включили. int buttVal=500; //Аналоговое значение нажатой кнопульки int values[]={488,510,557,604,659,743,835,890}; //Средние значения с аналогового входа, соответствующие позициям переменника в ручке. Калибруется индивидуально под каждую ручку!!! unsigned int intervals[]={4,6,8,10,14,20,28,38}; //Интервалы задержки между взмахами стеклоочистителей, в секундах int ths[7]; //Тут будут просчитанные пороги для значений, полученных с переменника в ручке unsigned long lastWipe; //Время последнего осуществлённого взмаха стеклоочистителями void setup() { pinMode(13, OUTPUT); //Устанавливаем 13й пин как выходной - именно через него мы будем управлять релюхой for (int i=0;i<7;i++) { //Заполняем массив пороговых значений с переменника в ручке на основе калиброванных значений. ths[i]=values[i]+(values[i+1]-values[i])/2; } for (int i=0;i<=7;i++) { //Т.К. delay() у нас работает в миллисекундах, все значения массива intervals мы должны помножить на тыщу. intervals[i]=intervals[i]*1000; } lastWipe=0;//Сбрасываем время последнего взмаха в 0, т.к. кто его знает, что там у МК в памяти по этому адресу kp=true;//Т.к. следующий взмах дворниками полюбасу будет первым - указываем это в соответствующей переменной } void loop() { val=analogRead(A3); //Проверяем, что у нас выбрано на ручке. //В зависимости от этого определяем текущую задежрку if (val<ths[0]) {pos=1;} else if (val<ths[1]) {pos=2;} else if (val<ths[2]) {pos=3;} else if (val<ths[3]) {pos=4;} else if (val<ths[4]) {pos=5;} else if (val<ths[5]) {pos=6;} else if (val<ths[6]) {pos=7;} else {pos=8;} if (analogRead(A4)<500) {lastWipe=0; kp=true;} //Если прерывистый режим выключен - сбрасываем время последнего взмаха, пишем в kp true. while (analogRead(A4)>500 && (millis()>lastWipe+intervals[pos-1] || kp)) { // Если включён прерывистый режим и (либо по текущему интервалу пришло время махнуть, либо это вообще будет первый взмах) kp=false; //Всё, следующий взмахи уже не будут первыми до момента выключения прерывистого режима digitalWrite(13,HIGH); //Включаем дворники delay(1000); //Ждём секунду digitalWrite(13,LOW); //Даём команду на парковку lastWipe=millis(); //Запоминаем текущее время } if (analogRead(A5)>500) { //Брызнули омывашкой delay(2000); //Ждём две секунды, чтобы дать воде долететь то стекла digitalWrite(13,HIGH); //Запускаем дворники while (analogRead(A5)>500) { } //Ждём, пока рычак не будет отпущен (может, стекло сильно грязное и пользователь долго на него льёт) delay(6000); //Ещё шесть секунд даём дворникам поработать digitalWrite(13,LOW); //И паркуем их. lastWipe=millis(); //Запоминаем текущее время, чтобы следующий автоматический взмах, если в данный момент включён прерывистый режим, не произошёл раньше, чеи через выбранное время от текущего момента. } }
Собственно, никакого смысла пересказывать всё вышенаписанное ещё раз я не вижу, но если у вас остались вопросы - не стесняйтесь задавать их в комментариях, я стараюсь мгновенно на них отвечать и попытаюсь вам помочь!
Компоненты
Для сборки данного устройства мне понадобились следующие компоненты (по ссылкам - поиск наиболее выгодных предложений на Aliexpress для вашего удобства):
- Ручка управления стеклоочистителями от Opel Omega B. Если не найдёте ручку с колёсиком под ваше авто - можете воспользоваться обычным переменным резистором. Правда, не знаю как у других ручек, но в этой стоит переменник с фиксированными положениями (всего 8), а не обычная крутёлка. Прошивка, разумеется, заточена именно на такой переменник, но это не принципиально, можно и под обычный переделать, схема, при этом, не изменится.
- Микроконтроллер Atmel Atmega328P. Вообще, можно и маленькую Atmega8 вместо большой диповской использовать - без разницы, кто что паять умеет. Памяти, разумеется, и 8 килобайт под такой простейший проект хватит.
- Обвязка для МК - кварц на 16 мГц и 2 керамических кондёра на 22 пФ. Вы не смотрите, что я использовал трубочные - это было ошибкой, т.к. на солнце в сильную жару машина нагревается, и у них, видимо, уходит ёмкость, ардуина перестаёт работать. Уже купил керамику, как руки дойдут - поменяю.
- Опционально - панелька для МК. Для Atmega328P-PU я использовал ZIF-сокет, можно обычный диповский. Ну и, конечно, как эконом-вариант (хотя сколько вы тут сэкономите?) или если вы будете юзать SMDшный МК - можно тупо впаять его в плату.
- Любая другая Ардуина с шилдом - чтобы можно было "на лету" перепрошивать всю эту систему для калибровки после сборки. Ну или пустой шилд, в который можно будет перекидывать саму микруху МК для прошивки, если вы, конечно, не пожалели и впаяли в устройство сокет, а не саму микросхему.
- Макетка - я использовал дешманскую картонную, как и для других своих проектов.
- Резисторы разных номиналов - ставьте что есть, в данной схеме допустима разбежка номиналов, главное соблюдать порядок и отношение в делителях.
- Реле с катушкой на 12 вольт ампер на 10. Я использовал советское РЭС-6, оно рассчитатно на коммутацию цепей с токами до 6А, работает как надо. Можно приспособить и пятивольтовое, но у него катушка будет жрать больший ток, поэтому нужен будет более мощный транзистор, плюс всё это будет питаться через стаб, он будет сильнее греться - нахрена вам это надо?
- Транзистор для управления вышеуказанной релюхой. Должен выдерживать пиковый ток катушки выбранной вами релюхи. Схема рассчитана на использования транзистора NPN, но можно и PNP туда присобачить с незначительными коррективами. Хотя, можно не парится с транзистором и взять готовое реле для Arduino.
- Стабилизатор на 5 вольт и пара электролитических кондёров к нему в соответствии с его даташитом. Можно, конечно, и без них, но вам чё, жалко эту мелочёвку? У меня лично от распаянных материнок валяется куча этой мелочёвки, девать некуда. Вместо стаба, конечно, можно и dc-dc преобразователь использовать на LM2596s, но это как по воробьям из зенитки палить - не стоит оно того.
Вот, вроде, и все основные компоненты устройства. Как видите, большинство из них - обычная, ничего не стоящая, рассыпуха. Так что всё весьма бюджетненько.
Сборка
Сначала была ручка:
Далее был тупой монтаж всех компонентов на макетку в соответсвии с разработанной и протестированной эмулятором схемой:
Красиво, да? А с обратной стороны просто жуть жуткая:
Тем не менее, всё припаяно надёжно и качественно, а это для меня самое главное!
Важнейшим этапом сборки, разумеется, является калибровка и испытание устройства в условиях, максимально приближенных к боевым:
Вместо бортовой сети я использовал 12V свинцовый аккум от ИБП, вместо мотора стеклоочистителей - мощную автомобильную лампу. Таким образом были скорректированы те самые средние значения с аналогового входа, соответствующие позициям переменника в ручке и ещё раз пересмотрены все запрограммированные паузы. Как видите, перепрошивал я всё на горячую другим шилдом, для чего достаточно было вытащить МК из прошивающего шилда и подсоединить пины TX, RX, Reset и землю прошиваемого МК вместо соответствующих пинов вытащенного, вот и всё!
Установка
Подключив устройство к автомобилю (те самые три контакта с фото в начале + установка самой ручки) и убедившись в полной работоспособности...
...я тщательно его упечатал во избежание всяких возможных коротких замыканий:
После этого аккуратно убрал всё это в пространство за блоком предохранителей и реле под крышку (на моей Вектре сзади блока есть отсек, куда отлично засовываются подобные штуки и там они защищены от шкомотания внутри торпедо, т.к. надёжно прижаты и зафиксированы).
В итоге всё, что напоминает о наличии в моей машине новой удобной функции - это новая ручка с колёсиком регулировки паузы прерывистого режима дворников:
Заключение
Как видите, всё оказалось максимально просто, самые большие затраты в данном проекте - это покупка самой ручки с регулятором. Остальное - банальная мелочёвка, стоящая копейки. Проект был разработан за вечер, собран за день, установлен за пару часов, я очень доволен. Если остались вопросы - пишите в комментариях: помогу, чем смогу!
Прикольно конечно, но....
Мне это напомнило появление тяги во всё пихать ПЛИС.
Где-то в конце 70-х на Байконуре монтировали автоматику для пускового стола.
Тогда разъяренный инженер орал на техников -мол какого х..на этот шкаф..., когда всё можно было собрать
на одном Z80 и реле...
Но здесь все забывают о ещё одной компоненте любой конструкции - НАДЁЖНОСТЬ.
"Шкаф", как выяснилось позже, был куда надёжнее заморских процессоров в наших реалиях: мороз под 40, ветерок и т.п.
Увы, я не схемотехник, мне, как программисту, проще логику написать кодом... Я вам больше скажу: я не знаю, как такое решение сделать на простых компонентах - просто не умею. Но я уверен, что это будет, хоть и надёжнее, но 100% дольше по времени и тяжелее по трудозатратам.
Но тем не менее, БОЛЬШОЕ СПАСИБО, за развёрнутый пример применения микросхем класса ПЛИС (atmega, платформы arduino, и т.п.)
Я сам как-то придумал в свою "тринашку" плавный регулятор оборотов мотора печки.
Дарю - управление кнопкой шуруповёрта на 12-16 вольт.
Схема отлично подходит для работы.
Но монтировать всё-же не рискнул.
"Дубовая" отечественная система управления из переключателей и нихромовых спиралей надёжнее.
В "шуруповёртной" схеме есть SMD-деталюхи.
А как они поведут себя при -35 ?
А ехать надо срочно?
У вас отличные задатки конструктора.
Успехов!
И вам большое спасибо за тёплые слова!
Вы будете смеяться, но у меня уже готова схема управления шуруповёртом на Atmega8 (пост с фотками в моём Instagram), осталось лишь собрать шурик и откалибровать прошивку!
Потом обязательно про неё напишу!
День добрый.
Не кидайтесь помидорами, но что это за кругляши на схеме с надписями "Volts"? Это вольтметр и в реальной схеме его нет?
И где можно скачать скетч?
Спасибо.
Привет!
Ну как тут не кидаться, если скетч, блин, в самой статье вставлен!
И да, это виртуальные вольтметры, для отладки схемы в самой программе.
Ха, в том-то и дело, что у меня скетч в виде картинки отображается. И соответственно длинные строки не читаются. И скопировать нельзя.
Точняк, в хроме эта хрень не работала. А я Файрфоксом пользуюсь, так и не знал. Всё пофиксил, можно забирать!
Спасибо. Помидоры были не лишними
В фоксе и хроме до сих пор отображается в виде картинки. Решил, скопировав в хром мобайл.
Вот блин, спасибо! Это всё плагин кэширующий слишком сильно всё кешировал)). Вроде опять исправил.
P.S. Го дружить в Инстаграме!
Доброго времени... Отличное реле. Поставил на Ваз 2104 - работает отлично. Только на омывайку сделал два хода - пауза- ход... Спасибо за труды...
Здравствуйте и спасибо за комментарий! Очень приятно, что кто-то повторил это "изобретение"!