Всем привет.
Как-то ехал в темное время суток и в голову пришла идея, было бы интересно, если цвет подсветки приборной менялся бы от скорости или от оборотов двигателя. Т.к. тахометра на приборке у меня нет, то решено было реализовать именно второй вариант, за одно можно будет и обороты примерно определять.
Если кто-то захочет повторить, скажу сразу, работы с электрикой в авто вы проводите на свой страх и риск.
Умельцы резонно могут сказать о пушечных выстрелах по воробьям и о моём великолепном умении программировать, однако цель достигнута, задуманное реализовано и вполне себе работает :). В общем случае вам понадобится: Ардуино, пара 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. Чистый синий и красный не достаточно ярко освещали панель, поэтому пришлось разбавить их немного другими. Зато синий стал отливать бюрюзовым, очень красиво :)

image

Для каждого из участков нужно составить формулу по которому будет рассчитываться яркость. По факту это уравнение прямой по двум точкам. Считается легко.
Так например для участка 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<r){ //если текущее значение яркости строго меньше той что нужно установить
      r_current=r_current+1;
    } 

//и так по каждому цвету
....
delay(100);
  
analogWrite(RED_PIN, r_current);
analogWrite(GREEN_PIN, g_current);
analogWrite(BLUE_PIN, b_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

UPD
Схема не претендует на правильность и идеальность. Умельцы не советуют использовать стабилизатор напряжения для понижения амплитуды импульсов, а задействовать обычный делитель напряжения. Замечания можете увидеть в комментариях ниже.
UPD2
Изменил схему в связи с замечаниями. Старая схема по ссылке

Ну и повторюсь, ответственность за воспроизведение данной схемы лежит только на вас. Удачи в техническом творчестве! :)

Комментарии (30)


  1. aivs
    25.01.2016 21:32
    +4

    Класс мне нравится!
    Но если бы я себе делал такую подсветку, то цвет зависел бы от скорости, удобно, едешь 80 у тебя например желтый, чтобы в городе не превышать, 110 едешь оранжевай, 200 — красный.
    А скорость считывать можно с CAN шины.


    1. kost
      25.01.2016 22:39

      В городе ограничение 60 км/ч.


      1. aivs
        25.01.2016 22:46
        +5

        Спасибо кэп!


      1. inook
        25.01.2016 23:11
        -6

        Просто не все водители знают зачем эти 20 км/ч нужны сверх ограничения


  1. NetBUG
    25.01.2016 22:25

    Не так плохо, монтаж довольно аккуратный.
    Вопрос наводок, watchdog'ов и прочих промышленных решений для повышения надёжности не поднимался?
    P.S. Что-то крайне похожее есть в последнем поколении Honda Civic.


    1. Arezus
      26.01.2016 15:29

      Оно-то, конечно, не помешало бы, хоть watch-dog повесить, но тк это «домашняя заготовка», думаю, что автору достаточно будет включить-выключить габариты и ардуина перезагрузится.


      1. Arezus
        26.01.2016 15:34

        А виснуть, она имеет полное право — кондеров по питанию нет никаких ни перед стабилизатором, ни после, экрана платы нет, да еще и помеха до 8 кГц летит по неэкранированному проводу. Ну и 14в -> 5в преобразование имеет полное право на то чтобы быть теплым, хотя токи мизерные.


  1. gleb_l
    25.01.2016 23:27
    +4

    идея блестящая — цвет воспринимается практически подсознательно, на уровне BIOS'а гораздо более низком, чем положение стрелки прибора — а значит реакция на него будет тоже подсознательной, что сэкономит работу мозга для расчета текущей и прогнозирования будущей дорожной обстановки — что и есть основная сложность управления автомобилем

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

    Исполнение же, конечно, не совсем automotive :) — ардуине место в инсталляции художника, а не в автомобиле. И конечно, эти натурные схемы с изображением деталей — напоминают схему электрооборудования жигулей для автомехаников. От этого уровня надо бы поскорее перейти к абстракциям в виде условных обозначений элементов — здесь все-таки в основном сообщество инженеров


  1. R0mjke
    26.01.2016 00:25

    А ребята продают за денежку готовый контроллер


  1. istui
    26.01.2016 00:33
    -1

    Хорошая идея и реализация :)

    Мое первое крупное устройство также началось с идеи сделать разноцветную подсветку. Шкала тоже реализована аналогично, линейными функциями, только она еще проходит через бело-серые цвета в районе ноля градусов.

    ИМХО, в подобных вашей вещах обязательно нужен watchdog, включить его несложно.


  1. dimao79
    26.01.2016 09:31
    +3

    Схема эпична.

    Использовать стабилизатор напряжения для сигнальных цепей — это замечательно. Удивили.
    Где конденсаторы в обвязке? Где защита от выбросов напряжения в бортовой сети?

    Сама идея — я бы такое не делал, чем меньше отвлекающих факторов, тем лучше.


  1. AlexeyStn
    26.01.2016 16:21

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


    1. Mirn
      26.01.2016 16:29
      +1

      они пишут но подругому: коэф. подавления шумов или подавление переменки, что то около -40… -70дБ.
      Вся суть в том что в стабилизаторе напряжения это выходное напряжение не должно гулять со временем или при нагрузке, а должно быть СТАБИЛЬНЫМ на выходе, нередко в даташите внутри кренки так и рисуют ОУ во включении фильтра очень нижних частот.
      В связи и звуковой технике это используется например чтоб опору АЦП сделать очень тихой — просто подключаешь два 1117 стабилизатора последовательно (12 в 5В а потом 5 в 3.3В например) и становиться очень тихим питание.


    1. Ocelot
      26.01.2016 18:38

      Поставьте простой делитель напряжения из двух резисторов
      Или оптопару.


      1. AbramovKS
        26.01.2016 18:39

        Как уже писал чуть раньше.
        В тестовой сборке использовал для понижения простой делитель напряжения. Когда делал питание приобрел несколько стабилизаторов. Протестировав форму импульсов осциллографом сделал вывод что они никак не меняются.Только амплитуда с 12В на 5В. Потому решил поставить именно «магазинский» вариант. Почему нельзя так делать?


        1. Mirn
          26.01.2016 19:02
          +3

          Почему нельзя:
          1. Стабилизатор обязан обеспечивать постоянку и бороться с переменкой — с импульсами, делает он это в паре с конденсатором который может оказаться на некоторых ножек некоторых ардуин (так китайцы борются с шумами ацп на кривых двухслойных платах — на аналоговые входы видел вешают кондёры)
          2. Стабилизатор будет работать только когда будет импульс — он его пропустит и сделает 5В.
          Но когда импульса нет то два варианта:
          либо пропустит, но в 5/12 раз не уменьшит а пропустит 1 в 1 вместе с шумами, а это до 1.4В запросто, но логический нуль надёжно срабатывает от 0.5 до 1.2В а дальше — от фаз луны и рака и его свиста зависит, ну и от температуры и наводок. Очень жёсткий брайнфак можно словить короче
          либо не пропустит и тогда будет высокоомная подтяжка куда угодно — напряжение будет либо плавно стекать к земле либо к какой то средней или не очень точке, брайнфак вообще эпичный в этом случае можно словить

          но не факт что проблемы будут, их может и не быть на конкретном случае и экземпляре


          1. AbramovKS
            26.01.2016 19:05

            Развернуто, спасибо.)
            Добавлю строчку в статью.


            1. Mirn
              26.01.2016 19:22
              +5

              пункт №3: в таком включении стабилизатор НЕСТАБИЛЕН, по многим даташитам многих производителей обязан быть кондёр на входе и выходе стабилизатора, некоторые рекомендуют поставить хотя-бы 1-2 мегаом нагрузочного сопротивления на стаб. А в одном старом даташите даже есть предупреждение на первой же странице «don't use as logical levels shifter!».
              На моей практике стабилизаторы начинали сильно (2-3В размах) генерить даже если на входе просто один виток на колечко ферритовое, или выходной электролит отпал.


              1. AbramovKS
                26.01.2016 19:31
                +2

                Спасибо. Пожалуй обновлю схему. Старую оставлю по ссылке.


                1. Mirn
                  26.01.2016 20:20
                  +4

                  Вот это правильно. Спасибо. То что и хотел.
                  И остальным: ВОТ ТАК и надо объяснять людям и вести диалог, а не минусовать _новичка_ в _разделе_для_новичков_.
                  Особенно после того как про-электронщиков по вашим же возмущениям обратно на хабр перевели.


                  1. dimao79
                    26.01.2016 20:36

                    Новичкам надо сначала читать, а потом брать в руки Ардуины и паяльники.
                    Три недели назад.


                  1. AlexeyStn
                    26.01.2016 23:03
                    +1

                    От меня тоже спасибо за развёрнутое объяснение)
                    А какие хабы для про-электронщиков вернули на Хабр?


          1. Mirn
            26.01.2016 19:08

            поправка «либо пропустит» «либо не пропустит» — пропустит напряжение логического нуля (отсутствия импульса), которое ВСЕГДА не 0В и ЧАСТО выше 0.7В (как правило это защита открытого коллектора диодом втекания)


  1. IronHead
    26.01.2016 17:52
    +2

    Школьные недели на гиктаймс?
    А если по делу:
    1) 7805 вместо двух резисторов или резистора и стабилитрона на сигнальном выводе это адская адь, так делать не нужно.
    2) Про цветовую модель HSV почитайте, если менять параметр H от 0 до 360 при S=100 и V=0 получим изменение цвета от красного до хм… красного. В общем рисунок номер 1 на википедии в статье про HSV


    1. AbramovKS
      26.01.2016 18:32

      1. Почему нельзя? Не спорю что это может быть неправильным решением, но хотелось бы разобраться почему. В тестовой сборке использовал для понижения простой делитель напряжения. Когда делал питания приобрел несколько стабилизаторов. Протестировав форму импульсов после сделал вывод что они никак не меняются.Только амплитуда с 12В на 5В. Потому решил поставить именно «магазинский» вариант. Почему нельзя так делать?
      2. Не понятно ваше замечание. Причем тут HSV?


      1. istui
        26.01.2016 18:49

        Стабилизатор действительно не лучшее решение. См. комменты выше.

        HSV в микроконтроллере на мой взгляд излишнее. Задавать цвета удобнее, меня всего лишь одну переменную, но пересчитывать — не удобно. Кроме того, цветопередача RGB светодиодов далеко не эталонная. Цвета, видимые на мониторе, не соответствуют подсветке от светодиодов (монитор откалиброван), фактически мы работаем с другой цветовой моделью (я ее называю R'G'B'), цвета при этом необходимо подбирать вручную для каждого случая.


        1. Ocelot
          26.01.2016 19:11

          HSV — нормально, только так можно сделать чистый и красивый цветовой переход. К тому же, есть довольно быстрая целочисленная реализация.


      1. IronHead
        27.01.2016 10:09

        1. Если на входе 7805 — 12 вольт — на выходе 5, а если на входе 0 — куда притянута ножка порта? К VCC или GND?
        2. При использовании модели HSV можно получить чистый цвет на выходе с учетом полутонов. Тем более есть простые алгоритмы пересчета HSV — RGB, ну или можно написать свой с учетом S=100, V=0.


  1. GeMir
    27.01.2016 14:13

    В одном из гибридов Honda (CR-Z?) подсветка приборной панели меняется во время вождения, но связи со скоростью, по-моему, нет. Очень раздражает.


  1. yJluTbl4
    28.01.2016 11:59

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

    Поэтому скважность постоянная, меняется частота. Поделив частоту импульсов на число зубьев получим число оборотов в секунду.
    Бывает еще применяют маркер — один пропущенный зуб, указывает верхнюю мертвую точку. На осциллограмме будет виден как пропущенный импульс. Но это будет уже не датчик оборотов, а датчик коленвала.