Подсветка на ардуино в авто
Динамическая подсветка приборной панели
Всем привет.
Как-то ехал в темное время суток и в голову пришла идея, было бы интересно, если цвет подсветки приборной менялся бы от скорости или от оборотов двигателя. Т.к. тахометра на приборке у меня нет, то решено было реализовать именно второй вариант, за одно можно будет и обороты примерно определять.
Если кто-то захочет повторить, скажу сразу, работы с электрикой в авто вы проводите на свой страх и риск.
Умельцы резонно могут сказать о пушечных выстрелах по воробьям и о моём великолепном умении программировать, однако цель достигнута, задуманное реализовано и вполне себе работает :). В общем случае вам понадобится: Ардуино, пара RGB светодиодов, несколько резисторов и парочка микросхем стабилизации напряжения, крепления для светодиодов. Заинтересовавшихся прошу под кат.
Беглый поиск по интернетам дал информацию о том, что тахометр получает информацию импульсами. Точной информации о форме и длительности импульсов не нашлось. Меняется ли длительность его или она статична, а меняется время между импульсами. Что ж, придется научить ардуину считать импульсы, да и определять за одно и время когда на контакте «+» и когда «0».
Подключаем RGB диод. Не забываем ставить на каждый светодиод по ограничительному резистору.
Использовать будем метод attachInterrupt. Метод вызывает функцию, когда на пине появляется и/или исчезает напряжение. В нашем случае нужно реагировать в обоих случаях, ибо мы не знаем об импульсе ничего кроме его наличия. Как выяснилось позже при увеличении оборотов уменьшается и длительность + и длительность 0.
В Setup подключаем пин, к которому будет подключен импульсный провод. Это цифровой пин 2. 0 в коде.т.к. это нумерация пинов, которые умеют работать в таком режиме. Соответствует ему пин 2.
Дальше проверяем что данные адекватны: длительность импульсов, а соответственно и обороты соответствуют физическим нормам и начинаем управлять светом.
Обороты менять будет от синего к зеленому и через желтый в красный. Схема зависимости цвета от оборотов ниже. По горизонтали шкала оборотов. По вертикали уровень яркости от 0 до 255. Чистый синий и красный не достаточно ярко освещали панель, поэтому пришлось разбавить их немного другими. Зато синий стал отливать бюрюзовым, очень красиво 🙂
Для каждого из участков нужно составить формулу по которому будет рассчитываться яркость. По факту это уравнение прямой по двум точкам. Считается легко.
Так например для участка 800-1300 яркость будет считаться как
Не забываем, считать ошибки, если адекватные данные перестали поступать. Более 100 подряд идущих ошибок (опыту если провод оторвется то эта сотня налетает за долю секунды), то уходим в статичный цвет. При появлении данных возвращаемся обратно.
Ну и наконец плавность смены цветов.
При включении системы плавно зажигаем подстветку. Для этого заведем переменную first_loop, которая у будет говорить ардуине что еще пока не надо обращать внимания на импульсы.
Так, все, пора тестировать. На улице январь, холодно, чтоб идти на мороз и просто потестить на авто. Нужен симулятор. Берем вторую ардудинку и делаем из него генератор импульсов.
В общем виде так. При отладке добавлял сюда управление по COM, чтоб менять длинны.
По счастливому стечению обстоятельств в руках оказался USB осциллограф, который здорово помог при разработке. Подключаем и видим на выходе примерно такую картинку.
Поигравшись убеждаемся что все вроде работает. Вот теперь идем и ищем импульсы в авто. Забегая вперед скажу, что в приборной панели я вывода провода для тахометра не нашел, потому пришлось включаться в OBDII разъем. Включаем и…
Это что еще такое!?
Газуем.
Ну емае, такие то считать вообще не умеет. Придется все переделывать, подумал я. А чуть позже заметил что второй провод щупа осциллографа отвалился от массы. Тьфу ты.
Вух, все нормально. Вот только амлитуда не 5В ардуинских. Рисковать не будем. Придется понижать.
Кстати еще момент. Частота в два раза больше, чем обороты двигателя. Я так понял что тахометр показывает количество циклов в минуту, т.е. количество например вспышек в цилиндре. А вот коленвал за один цикл оборачивается два раза. А импульсы берут именно с него. Впрочем я могу быть не прав. Но при холостых оборотах, остывшего немного авто у меня осцил показывал 34,4 Гц. Что соответствует 2000 оборотам. Даже на слух это было не так. А вот 1000 — самое оно. Учитывать в формулах при расчете оборотов.
При тестах питания ардуины 12В вела себя не всегда адекватно, поэтому ее будем питать от бортовой сети, но понизив до 5В.
Общая схема системы. Через стабилизаторы L7805C питаем ардуино и уменьшаем амплитуду импульсов делителем. На выходе с ардуины через резисторы подключаем параллельно пару светодиодов. Именно столько ламп подсветки у меня в приборной панели.
Так-с, ну теперь пора сделать патроны для диодов.
Долго искал чем нарастить такую длину патрона, по диаметру ничего не подходило. В итоге использовал плотную изоляцию от кабеля. Подтягиваем и закрепляем с торца патрона капелькой термоклея.
Дабы приборную панель в будущем можно было снять без проблем решено сделать разъемное соединение. Сгоревший блок питания помог найти фишку. один конец к ардуине, второй конец к бортовой сети авто.
С обратной стороны панели выкручиваем один винт из корпуса и прикручиваем обратно уже с частью компьютерной розетки, выполняющей роль корпуса.
Защелкиваем корпус, собираем провода, чтоб не болталось и устанавливаем все назад. Питание для ардуины брал с проводки, которая идет к панели. Прозвонил контакты отвечающие за питание штатных ламп подсветки и нашел соответствующие провода на фишке. В итоге ардуина включается с включением света, а не работает постоянно. Тахометра не нашел, пришлось увести проводок к OBDII разъему.
В общем-то все готово. Видео работы. Конечно же видео не передает всю глубину и контрастность при ночной съемке светящихся элементов.
Катаюсь уже неделю. Думал будет напрягать. Однако нет, мне нравится. Нуу, пока не надоело по крайней мере :). Меняется не резко, порой боковым зрением изменение и не успеваешь заметить. Заметно только когда переходит на красный, зато очень эффектно когда авто начинает разгоняться набирая обороты и переходит в красную зону при обгоне :).
UPD
Схема не претендует на правильность и идеальность. Умельцы не советуют использовать стабилизатор напряжения для понижения амплитуды импульсов, а задействовать обычный делитель напряжения. Замечания можете увидеть в комментариях ниже.
UPD2
Изменил схему в связи с замечаниями. Старая схема по ссылке
Ну и повторюсь, ответственность за воспроизведение данной схемы лежит только на вас. Удачи в техническом творчестве! 🙂
Вежливое освещение салона, ног, а также багажника Arduino DIY
Всем привет.
После установки салонного плафона от ланоса захотелось еще чуть «комфорта».
Была идея заказать готовое изделие»вежливое освещение салона от NIGHTON», но потом подумал: «А почему бы не сделать его самому?». Так и сделал.
Контролер на данный момент управляет светом салона, ног и багажника.
Идею почерпнул у производителя NIGHTON.
На данный момент реализованы такие функции:
— задержка выключения освещения в салоне после закрытия всех дверей 10 сек.
— задержка выключения подсветка ног после закрытия всех дверей 30 сек.
— автоматическое выключение после 30 минут работающего освещения (если не закрыл двери).
— отключение без задержки при включении зажигания.
— плавное включение/выключение света салона и подсветки ног.
— управление светом багажника без плавного включения.
— автоматическое выключение после 10 минут освещения багажника (если не закрыл ляду).
В качестве контроллера используется Arduino Pro Mini.
Для контролера необходимо подключение к проводке авто, а именно:
— питание +12v;
— масса;
— +12v от зажигания;
— концевик багажника (-12v);
— концевики дверей (-12v);
— вход от сигнализации (на данный момент не реализовано);
У контроллера есть 3 выхода:
— управление основным светом (подключается к плафону вместо концевика);
— управление подсветкой ног;
— управление светом багажника.
Все три выхода управляют минусом.
Контроллер установлен под торпедой. Работает на протяжении 2х месяцев. Все ок.
Для сборки контроллера понадобилось:
— Arduino Pro Mini (можно любую ардуину);
— Преобразователь понижающий DC/DC;
— Транзистор (MOSFET) N-Канальный IRF3205 — 3 шт (можно взять IRF510 и подобные);
— Транзистор SS8050 (или аналог) — 2 шт;
— Диод выпрямительный 1N4007 — 3 шт;
— Резистор 1К — 1 шт;
— Резистор 2К — 1 шт;
— Резистор 100К — 2 шт (не нашел резисторы 100К, поэтому поставил 220К по 2 шт);
— Резистор 10К — 8 шт;
— Резистор 100Ом — 3 шт;
— Клеммник на 3 контакта (шаг 3,5мм) — 3 шт;
— Клеммник на 2 контакта (шаг 3,5мм) — 5 шт.
Еще провода, клеммы, термоусадка и тд.
Плату разводил под корпус, который был в наличии (от китайского регулятора яркости для светодиодной ленты). Получилась плата в 2 яруса.
Вежливая подсветка в зеркалах на Ардуино своими кривыми руками
Купил я однажды светодиоды на великом и могучем сайте, уже давно. И все никак не доходили руки их внедрить. Потому что сигналка у меня не связана с плафоном внутри салона, иногда я пользуюсь штаткой, а это все предполагало корявый режим работы моих фонариков.
Изначально все думал слепить на таймере NE555. Но знаний и умений, на тот момент, не хватило победить эту схему (вернее заставить ее работать как мне надо), т.к. я больше программист чем элетронщик)
А мне собственно надо было:
1. плавное включение
2. работа диодов определенное время
3. плавное выключение
4. реакция на открытие и закрытие по сигналке
5. реакция на открытие и закрытие от штатной сигнализации
6. отсутствие реакции при включении освещения в салоне рукой (например, на ходу или при стоянке)
И вот неожиданно для себя я открыл микроконтроллеры AVR, а именно атмегу328 и понеслось.
Сначала хотел все уместить на Attiny13, потом перешел на Attiny45, позже понял что не хватает ног и нужна 2313 =))) но эта почта Россиюшки оставляет желать лучшего. И ждать небыло времени, все мои посылки из поднебесной идут минимум 1.5мес. т.к. стоят копейки и доставка халявная. Ну и я смысла не вижу ее ускорять когда мк сам стоит например 40р., а быстрая доставка 300р, брать пачку тоже не хочется из-за того, что я не знаю буду ли заниматься этим дальше. Но интерес очень большой. И кстати в процессе создания велосипеда моего все время чето нового хотелось. Так и пришлось покупать некоторые компоненты в Чип И Дип в тридорога.
Итак хватит воды. Дальше все будет как в комиксах, одни картинки. Что умеет моя нано разработка Сколково?!
1. Плавно включает и выключает светодиоды в зеркалах.
2. Реагирует на отдельные раздражители в виде сигналки и штатного брелка.
3. включает иллюминацию только вечером (потому что днем не видно же)
4. можно отрегулировать скорость включения и выключения.
5. можно отрегулировать порог чувствительности фоторезистора
6. можно отрегулировать время работы подсветки
7. не реагирует на включение света в салоне, если я захочу его сам пальцем включить.
Начало процесса освоения этого микроконтроллера наверное было как у всех. Что бы я не делал на ардуино все равно получалась метеостанция.
Тут я уже пытаюсь все смастерить на Attiny45. т.е. по сути для того чтобы светодиоды по команде включались и выключались достаточно вот этого маленького микроконтроллера (в центре) и полевого транзистора (по центру сверху).
А по итогу пришел к готовой микросхеме Ардуино.
Дальше так и не дождавшись из соседней страны своего чипа прнял решение спаять все из того что было. Ну это какбы тоже нормальный вариант. Но просто хотелось все прям с нуля самому сделать и даже обвязку атмеги. Ну да ладно.
Использовал подстроечные резисторы для регулировок скорости разгорания и затухания, времени работы, и порога включения по освещенности на улице. Управляющие сигналы я брал через оптопары. Ну вдруг че я накосячу и не страшно будет спалить всего лишь оптрон =) точнее светодиод встроенный в него. И также мне душу греет гальваническая развязка сигнала от машины с моей приблудой=)
Итак. Закончил я паять. И тут подумал, что хорошо бы это все запихнуть в корпус како-то. Не долго думая решил распечатать его на 3D принтере. Это кстати тоже моя первая поделка. Ооооооочень порадовало это дело. Так все просто оказывается. Подумываю даже теперь самостоятельно собрать 3Д-принтер или на крайняк купить у наших азиатских друзей. Кстати многие принтеры и сделаны тоже на камне от AVR. Так что собрать ЧПУ сейчас не так уж и сложно.
Дальше внедряем сами светодиоды. Если бы я знал, что там столько гемора я бы бросил эту затею)))))
Чтобы врезать сами светодиоды в корпус достаточно только снять зеркальный элемент. Я это сделал когда зеркала были на машине. Там ничего сверхсложного. Самое сложное оказалось протянуть провод от диода в салон. Тут без снятия вообще никак точно не обойтись. И разобрать зеркало придется практически полностью.
На ютубе есть много видео как снимать зеркальный элемент на Ховере. Тут рассказывать нечего. Главное посмотрите, чтобы не сломать защелки.
После того как зеркало установил, провел провод через стойку в дверь. Кстати тоже процесс не из легких. Иногда казалось даже, что это невозможно.
Ну как всегда правим нюансы и шьем МК прям на машине. =)
Результатом остался очень доволен. Светят диоды очень ярко. Подумываю даже может быть заматовать и сделать шторку своеобразную чтобы меньше света попадало на дверь. Для этого хочу узнать ваше мнение.
Не знаю чето как тут спойлер сделать. Код приложу так, все закомментировал по максимуму, разберется кто угодно:
//18,06,2019г.
//Плавное включение и выключение светодиодов в автомобиле,
//при постановке авто в охрану или снятия с охраны, а также
//контроль салонного света
#include «LowPower.h» //библиотека для снижения энергопотребления
#define pwm_port 5 //пин ШИМ
#define go_on 2 //пин по которому включаем светодиоды. INTERUPT0
#define svet 3 //пин по которому проверяем салоный свет. INTERUPT1
#define go_off 8 //пин по которому выключаем светодиады
#define speed_led_delay A3 //установка скорости с помощью резистора подстроечного (аналог)
#define time_wrk A4 //установка времени работы светодиодов с помощью резистора подстроечного (аналог)
#define dt_sveta A5 //пин фоторезистора (аналог)
boolean leds_on = false; //флаг горят ли светодиоды
byte i; //переменная для цикла
volatile boolean s = false; //переменная для контроля салонного света
volatile unsigned long mil; //таймер задержки выключения
byte speed_led = 30; //скорость включения и выключения (по умолчанию 30)
unsigned long last_timer; //таймер задержки выключения
unsigned long time_goon = 40; //время работы светодиодов сек (по умолчанию 40)
// экспоненциальная коррекция яркости (чтобы глазу было заметнее плавность включения и выключения)
const byte tabl[255] = <
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3,
3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6,
6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9,
9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13,
13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17,
17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21,
21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26,
26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31,
32, 32, 32, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 37, 37, 37,
38, 38, 39, 39, 40, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 44,
45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53,
53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 61, 62, 62, 63,
64, 64, 65, 66, 67, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76,
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94,
96, 97, 98, 100,102,103,105,107,109,111,113,115,117,120,122,125,
127,130,134,137,141,145,149,154,159,165,173,181,191,204,223,255
>;
void wakeUp() // Обработчик прерывания от пина INT0
<
mil=millis();
>
void wakeUp2() // Обработчик прерывания от пина INT1
<
s=true; mil=millis(); // Сработало прерывание
>
void setup()
<
pinMode(go_on, INPUT_PULLUP); //вход для включения
pinMode(go_off, INPUT_PULLUP); //вход для выключения
pinMode(svet, INPUT_PULLUP); //вход для салонного света
pinMode(pwm_port, OUTPUT); //выход ШИМ
attachInterrupt(0, wakeUp, LOW); // Разрешаем внешние прерывание на пине 2 при низком уровне
attachInterrupt(1, wakeUp2, CHANGE); // Разрешаем внешние прерывание на пине 3 при изменении уровня сигнала
speed_led = map (analogRead(speed_led_delay), 0,1023,5,80); //скорость задержки в ШИМ (как быстро разговаться будут диоды)
time_goon = map (analogRead(time_wrk), 0,1023,5,200); //продолжительность работы светодиодов после включения
s=false; //
delay(20); //задержка для стабильности
>
void loop()
<
if (s==true && mil + 200 450) goto on_now; //включаем
else if (!digitalRead(svet)== false && leds_on == true) goto off_now2; //выключаем
>
if (!digitalRead(go_on)== true && leds_on == false && analogRead(dt_sveta)>450) //Если было прерывание и если светодиоды не горят и если уровень освещенности маленький то включаем
<
for (i = 0; i 0; i—) //плавно гасим
<
off_now2:
analogWrite(pwm_port, tabl[i]); //если использовать экспоненциальную коррекцию яркости раскомментировать, а следущую строчку убрать
//analogWrite(pwm_port, i); //если БЕЗ экспоненциальной коррекции яркости то использовать эту строчку
if (!digitalRead(go_on)== true) goto on_now; //проверяем порт, вдруг надо включить
delay(speed_led); //регулировка скорости угасания временем задержки
>
digitalWrite(pwm_port, LOW); //выключаем, чтоб наверняка, если вдруг что-то пошло не так
leds_on = false; //ставим флаг, что диоды выключены
>
if (!digitalRead(svet)== true) last_timer = millis(); //если салонный свет горит — не выключать. обновляем таймер
if (millis() — last_timer >= time_goon * 1000 && leds_on == true) goto off_now; //проверяем сколько времени горят диоды, если дольше заданного то, выключаем
if (leds_on == false && mil+1000
По началу код был один. Потом он дорабатывался. дополнялся датчиками и уже стало лень его оптимизировать что-то =) и так все отлично работает. Но нет предела совершенству. Буду признателен тому, кто его перепишет на Си. Или дополнит.
Может кому пригодится. Оставлю это здесь)
Ну и конечно же видос как это все работает в живую.
Совсем забыл сказать. Почему я собственно так хотел все сделать на Attiny изначально. Ну потому что компактно. Но самое главное это энергопотребление. Ковырялся я с тинькой хрен знает сколько времени. Библиотеки от атмеги на ней не пашут. Но после того как я замерил ток который потребляют разные DC-DC понижайки то понял мне это и не надо оказывается) потому что сама тинька в рабочем состоянии потребляет около 2-4мА. А например стабилизатор LM7805 больше 5мА (сейчас точно не помню) да еще и греется зараза. А AMS1117 не греется и потребляет около 3мА на холостом ходу в то время как сам камень потребляет микроамперы в режиме сна. Ну и не стал я дальше заморачиваться с этим вопросом. Оставил все на Ардуино.
Так что эта штука высадит аккум на машине, по моим расчетам, с учетом коэффициента разряда, где-то через 1.5 года=)))) это более чем меня устраивает. Такое не случиться) И неудобств с разрядом она мне не доставит.
Кстати если кто знает отпишитесь все равно. Как отправить тиньку в сон и будить по прерыванию. Нигде понятной для себя инфы найти не смог. А даташиты курить нет времени.
Arduino в быту, на работе, в машине
В последнее время все больше и больше постов посвящается поделкам на основе плат Arduino. Я тоже хочу рассказать о нескольких проектах, созданных на основе этих плат. Не являюсь автором этих проектов и имею к ним косвенное отношение. Но настоящие авторы дали мне добро на использование их разработок в этой публикации. Дело в том, что они не имеют никакого отношения к IT и, соответственно, не имеют аккаунтов на Хабре и его отпрыске Geektimes.
Привожу дословное описание проектов от авторов.
В быту
Управление кухонным освещением от Engineer200
Проект призван начать решать проблемы поиска выключателей, забывания отключения и необходимости зажмуривания. Первая часть реализует плавное включение подсветки рабочей поверхности на кухне и подсветки внутри шкафа, например, под мойку обычно приходится нырять с фонариком. Подсветка рабочего поверхности кухни реализуется размещением светодиодной ленты на нижней части верхних шкафов. Короткие нажатия на кнопку просто включают и выключают свет. Длительное нажатие включает режим изменения уровня света, постепенное притухание, по достижению ноля, снова включается ярко. Когда кнопка отпущена — уровень света запоминается и дальнейшие короткие нажатия на кнопку, включают свет до запомненного уровня. Внутри шкафа свет плавно включается-выключается по срабатыванию геркона, встраиваемого в стенку шкафа. Дальнейшее развитие предполагает подключение датчиков присутствия, освещённости, увеличение количества каналов управления, осуществление декоративной подсветки стеклянных полок и дверей.
Программа тестировалась на Arduino UNO с контроллером AFMega8A-PU, а реализована на Arduino PRO Mini.