Динамическая подсветка приборной панели
Всем привет.
Как-то ехав в темное время суток в голову пришла идея, было бы интересно, если цвет подсветки приборной менялся бы от скорости или от оборотов двигателя. Т.к. тахометра на приборке у меня нет, то решено было реализовать именно второй вариант, за одно можно будет и обороты примерно определять.
Если кто-то захочет повторить, скажу сразу, работы с электрикой в авто вы проводите на свой страх и риск.
Умельцы резонно могут сказать о пушечных выстрелах по воробьям и о моём великолепном умении программировать, однако цель достигнута, задуманное реализовано и вполне себе работает :). В общем случае вам понадобится: Ардуино, пара RGB светодиодов, несколько резисторов и парочка микросхем стабилизации напряжения, крепления для светодиодов. Заинтересовавшихся прошу под кат.
Беглый поиск по интернетам дал информацию о том, что тахометр получает информацию импульсами. Точной информации о форме и длительности импульсов не нашлось. Меняется ли длительность его или она статична, а меняется время между импульсами. Что ж, придется научить ардуину считать импульсы, да и определять за одно и время когда на контакте »+» и когда »0».
Подключаем RGB диод. Не забываем ставить на каждый светодиод по ограничительному резистору.
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;
Использовать будем метод attachInterrupt. Метод вызывает функцию, когда на пине появляется и/или исчезает напряжение. В нашем случае нужно реагировать в обоих случаях, ибо мы не знаем об импульсе ничего кроме его наличия. Как выяснилось позже при увеличении оборотов уменьшается и длительность + и длительность 0.
long micro_prev=0; //счетчики времени
long micro_now=0;
long razn;
long impulse; //длительность 1 (+)
long silence; //длительность 0
В Setup подключаем пин, к которому будет подключен импульсный провод. Это цифровой пин 2. 0 в коде.т.к. это нумерация пинов, которые умеют работать в таком режиме. Соответствует ему пин 2.
attachInterrupt(0, blink, CHANGE );
micro_now=micros(); //текущее время от запуска
razn=micro_now-micro_prev; //разница с прошлым значением
a++;
if(digitalRead(2)==LOW){ //если на пине 0, значит пишет разницу в длинну +, если нет, значит мы измерили время когда на пине ничего нет.
impulse=razn;
} else {
silence=razn;
}
if(a==2){ //если мы измерили уже два раза, то может чтонибудь делать с этими данными
Serial.println(String(impulse)+" "+String(silence)); //выводим в СОМ
obr_v_min=30000000/(impulse+silence); //считаем обороты в минуту.
a=0; //скидываем счетчик
Дальше проверяем что данные адекватны: длительность импульсов, а соответственно и обороты соответствуют физическим нормам и начинаем управлять светом.
Обороты менять будет от синего к зеленому и через желтый в красный. Схема зависимости цвета от оборотов ниже. По горизонтали шкала оборотов. По вертикали уровень яркости от 0 до 255. Чистый синий и красный не достаточно ярко освещали панель, поэтому пришлось разбавить их немного другими. Зато синий стал отливать бюрюзовым, очень красиво :)
Для каждого из участков нужно составить формулу по которому будет рассчитываться яркость. По факту это уравнение прямой по двум точкам. Считается легко.
Так например для участка 800–1300 яркость будет считаться как
g=0.21*obr_v_min-18;
b=-0.51*obr_v_min+663 ;
r=0;
Не забываем, считать ошибки, если адекватные данные перестали поступать. Более 100 подряд идущих ошибок (опыту если провод оторвется то эта сотня налетает за долю секунды), то уходим в статичный цвет. При появлении данных возвращаемся обратно.
error++;
if(error>=100){
k = go_to_color(0,255,255);
}
Ну и наконец плавность смены цветов.
int go_to_color(int r, int g, int b){
while(r_current!=r || g_current!=g || b_current!=b) //если текущие значения не совпадают с теми которые нужно установить то начинаем работу
{
if(r_current>r){ //если текущее значение яркости строго больше той что нужно установить
r_current=r_current-1;
}
if(r_current
При включении системы плавно зажигаем подстветку. Для этого заведем переменную first_loop, которая у будет говорить ардуине что еще пока не надо обращать внимания на импульсы.
if(first_loop==1){
int i;
for(i=0;i<255;i++){
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, i);
delay(5);
}
b_current=255;
r_current=0;
g_current=0;
delay(500);
first_loop=0;
}
Так, все, пора тестировать. На улице январь, холодно, чтоб идти на мороз и просто потестить на авто. Нужен симулятор. Берем вторую ардудинку и делаем из него генератор импульсов.
В общем виде так. При отладке добавлял сюда управление по COM, чтоб менять длинны.
digitalWrite(8, HIGH);
delay(10);
digitalWrite(8, LOW);
delay(10);
По счастливому стечению обстоятельств в руках оказался USB осциллограф, который здорово помог при разработке. Подключаем и видим на выходе примерно такую картинку.
Поигравшись убеждаемся что все вроде работает. Вот теперь идем и ищем импульсы в авто. Забегая вперед скажу, что в приборной панели я вывода провода для тахометра не нашел, потому пришлось включаться в OBDII разъем. Включаем и…
Это что еще такое?!
Газуем.
Ну емае, такие то считать вообще не умеет. Придется все переделывать, подумал я. А чуть позже заметил что второй провод щупа осциллографа отвалился от массы. Тьфу ты.
Вух, все нормально. Вот только амлитуда не 5В ардуинских. Рисковать не будем. Придется понижать.
Кстати еще момент. Частота в два раза больше, чем обороты двигателя. Я так понял что тахометр показывает количество циклов в минуту, т.е. количество например вспышек в цилиндре. А вот коленвал за один цикл оборачивается два раза. А импульсы берут именно с него. Впрочем я могу быть не прав. Но при холостых оборотах, остывшего немного авто у меня осцил показывал 34,4 Гц. Что соответствует 2000 оборотам. Даже на слух это было не так. А вот 1000 — самое оно. Учитывать в формулах при расчете оборотов.
При тестах питания ардуины 12В вела себя не всегда адекватно, поэтому ее будем питать от бортовой сети, но понизив до 5В.
Общая схема системы. Через стабилизаторы L7805C питаем ардуино и уменьшаем амплитуду импульсов. Считал что данные стабилизаторы могут изменить форму импульсов, однако проверка осциллографом не показала хоть какое-то изменение кроме амплитуды. На выходе с ардуины через резисторы подключаем параллельно пару светодиодов. Именно столько ламп подсветки у меня в приборной панели.
Так-с, ну теперь пора сделать патроны для диодов.
Родной патрон справа. В магазине такие не нашел, пришлось взять стандарные. Вытаскиваем клеммы с патронов, ибо питание мы брать будем не с них. Высверливаем снизу отверстия для подведения проводов в патрон. Напаиваем провода к диоду, хорошенько изолируем используя термоусадочные трубки.
Долго искал чем нарастить такую длину патрона, по диаметру ничего не подходило. В итоге использовал плотную изоляцию от кабеля. Подтягиваем и закрепляем с торца патрона капелькой термоклея.
Пытался сделать на отдельной плате стабилизаторы и 6 резисторов для светодиодов, однако текстолит почему-то в процессе вытравился только на половину. На одной части платы он просто остался нетронутым, на второй половине полностью растворился. А между ними ровная граница, будто разные металлы. Поэтому остальное собиралось не очень эстетичным видом, фотографий нету. Но все согласно приведенной выше схемы. Пока искал чем нарастить патрон нашел практически идеальный корпус :).
Дабы приборную панель в будущем можно было снять без проблем решено сделать разъемное соединение. Сгоревший блок питания помог найти фишку. один конец к ардуине, второй конец к бортовой сети авто.
С обратной стороны панели выкручиваем один винт из корпуса и прикручиваем обратно уже с частью компьютерной розетки, выполняющей роль корпуса.
Защелкиваем корпус, собираем провода, чтоб не болталось и устанавливаем все назад. Питание для ардуины брал с проводки, которая идет к панели. Прозвонил контакты отвечающие за питание штатных ламп подсветки и нашел соответствующие провода на фишке. В итоге ардуина включается с включением света, а не работает постоянно. Тахометра не нашел, пришлось увести проводок к OBDII разъему.
В общем-то все готово. Видео работы. Конечно же видео не передает всю глубину и контрастность при ночной съемке светящихся элементов.
Катаюсь уже неделю. Думал будет напрягать. Однако нет, мне нравится. Нуу, пока не надоело по крайней мере:). Меняется не резко, порой боковым зрением изменение и не успеваешь заметить. Заметно только когда переходит на красный, зато очень эффектно когда авто начинает разгоняться набирая обороты и переходит в красную зону при обгоне:).
Скетч для Arduino