HUD спидометр — от идеи до результата

    Всем привет!
    Давно ничего не писал, теперь это больше новостной ресурс, а не практический. Попробую подправить ситуацию. Расскажу про разработку HUD-спидометра. Хоть и не лазерная проекция, зато доступно и компактно.
    Введение
    Началось с того, что мне в руки попали большие 3.3" семисегментные индикаторы. Заказывали их для часов, которые так и не родились. Надо было 4 шт, в лоте 5, китаец положил шесть. Оценив размер, яркость и отражение от лобового стекла я решил — вот оно. Благодаря размеру не видно раздвоения изображения, а якрость позволяет использовать даже при прямом солнце. Сразу соглашусь, что у китайцев есть красивые готовые штуки, которые стоят совсем недорого (все цены на момент написания статьи) — от 1800р. Недостатков всего пара (закроем глаза на неспортивность такого решения):
    1. Надо клеить плёнку на стекло — она хоть и прозрачная, но всё ж перекрывает обзор, а я не люблю, когда на стекле что-то мешает. Чуть откинулся, сдвинул кресло — и плёнку надо переклеивать. Ну и даже с плёнкой почти ничего не видно в солнечный день.
    2. Можно плёнку не клеить, тогда циферки (они довольно мелкие) двоятся, а в солнце не видно вообще ничего.
    Для затравки, результат без плёнки в любом месте стекла и даже днём:


    Под катом обещаю много картинок, посредственное видео, код и текст — всё в лучших традициях.

    Теория
    Идея простая — за фиксированный промежуток времени считаем количество импульсов от датчика скорости. В качестве ЦП простой и доступный ATMega8.
    Первая сложность оказалась в согласовании МК 5 В и индикаторов 7.5 В. Фантазия рисовала схему из пачки транзисторов и резисторов (7 элементов при динамической индикации). Из всех гуглов мне помогла всего одна статья про замену индикаторов в часах, жаль потерял её адрес. Пользуясь возможностью, передаю благодарность автору за идею использовать TD62783 (от 5 шт в лоте). Собственно, это драйвер семисегментных индикаторов, внутри транзисторная сборка.
    Далее, DC/DC преобразователь. Сделал на MC34063, их у меня много, их я запас. Посчитал на калькуляторе, проверил тестером — 7.5 В. В полевых испытаниях оказалось мало, яркости не хватало, увеличил до 10 В.
    Яркость регулируется исходя из показаний датчика света, который обычный китайский фоторезистор.
    В итоге схема получилась такой:

    Практика
    Печатную плату мне развёл TopoR. Я воспользовался авторазмещением, хоть и зафиксировал большую часть элементов вручную. Должен же прогресс работать на меня, а не только я на прогресс. Получилась красота:

    С шириной корпуса U4 промахнулся, пришлось дорисовывать дорожки и не припаивать 11ю ногу.
    Как это выглядит в реале:



    Следующий нежданчик подкрался в софте (не буду рассказывать, как я забыл отзеркалить 2 и 5, 4 — тут нечем гордиться). Сложнее была проблема такая: счётчик насчитывал нужное количество импульсов слишком долго. К примеру, при 60 км/ч подсчёт 60 импульсов с датчика скорости занимал больше секунды. Такое редкое обновление показаний меня не устроило.
    Пришлось каждые пол измерения умножать на 2.
    Линейное изменение яркости по сравнению с освещённостью не подошло: когда было чуть темнее — яркость оказывалась недостаточной, когда было почти темно — яркости было чересчур. Запустил эксель, построил график для разных математических функций. В итоге выбрал квадрат.


    Код Bascom:
    Скрытый текст
    'HUD-speedometer
    '17/01/2016
    '21/01/2016
    'v1.1

    $regfile = "m8adef.dat"
    $crystal = 4000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32

    Config Portb = Output
    Config Portc = Output
    Config Portd = Output
    Config Portd.4 = Input
    Portd.4 = 1
    Config Timer0 = Counter , Edge = Falling
    Config Timer1 = Pwm , Pwm = 8 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up , Prescale = 8
    Config Timer2 = Timer , Prescale = 1024
    On Timer2 Mytimer2
    Enable Interrupts
    Enable Timer2
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Start Adc

    Dim I As Byte 'счётчик в основной цикл
    Dim N As Byte 'счётчик в таймер
    Dim Pwm_value As Integer 'яркость
    Dim Speed As Integer , Speed_half As Integer , First_symbol As Integer , Second_symbol As Integer
    Dim A As Integer 'разность Speed и Speed_half
    Dim R1 As Word
    Declare Sub Digit_indication(digit As Integer) 'вывод цифры

    Const P = 500
    Const T = 5000 'время горения одного индикатора
    Const T1 = 1000 'время паузы для срабатывания PWM
    Pwm_value = 5
    Tcnt0 = 0 'счётчик

    Do
    Incr I
    If I = 25 Then 'чтоб не перегружать МК
    R1 = Getadc(7)
    R1 = Sqr(r1) 'делаем гиперболу
    R1 = R1 * 8
    If R1 < 250 Then
    Pwm_value = 250 - R1
    Else
    Pwm_value = 3 'минимальная яркость
    End If
    I = 0
    End If
    Gosub Indication
    Loop

    Indication:
    If Speed < 3 Then 'если скорость 0 - не горит, 3 - защита от помех
    Pwm_value = 0
    End If
    While Speed > 99 'т.к. всего 2 знака
    Speed = Speed - 100
    Wend
    First_symbol = Speed / 10 'записали отдельно
    Second_symbol = First_symbol * 10 'десятки
    Second_symbol = Speed - Second_symbol 'отдельно еденицы
    Pwm1b = 0
    Pwm1a = 0
    Waitus T1 'без паузы подмигивает
    Call Digit_indication(first_symbol) 'и выводим цифры
    Pwm1b = Pwm_value
    Waitus T
    Pwm1b = 0
    Pwm1a = 0
    Waitus T1 'без паузы подмигивает
    Call Digit_indication(second_symbol)
    Pwm1a = Pwm_value
    Waitus T
    Return

    Sub Digit_indication(digit As Integer)
    Select Case Digit
    Case 0:
    Portd.0 = 0
    Portc.0 = 1
    Portc.1 = 1
    Portc.2 = 1
    Portc.3 = 1
    Portc.4 = 1
    Portc.5 = 1
    Case 1:
    Portd.0 = 0
    Portc.0 = 1
    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 0
    Portc.5 = 1
    Case 2:
    Portd.0 = 1
    Portc.0 = 0
    Portc.1 = 1
    Portc.2 = 1
    Portc.3 = 0
    Portc.4 = 1
    Portc.5 = 1
    Case 3:
    Portd.0 = 1
    Portc.0 = 1
    Portc.1 = 1
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 1
    Portc.5 = 1
    Case 4:
    Portd.0 = 1
    Portc.0 = 1
    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 1
    Portc.4 = 0
    Portc.5 = 1
    Case 5:
    Portd.0 = 1
    Portc.0 = 1
    Portc.1 = 1
    Portc.2 = 0
    Portc.3 = 1
    Portc.4 = 1
    Portc.5 = 0
    Case 6:
    Portd.0 = 1
    Portc.0 = 1
    Portc.1 = 1
    Portc.2 = 1
    Portc.3 = 1
    Portc.4 = 1
    Portc.5 = 0
    Case 7:
    Portd.0 = 0
    Portc.0 = 1
    Portc.1 = 0
    Portc.2 = 0
    Portc.3 = 0
    Portc.4 = 1
    Portc.5 = 1
    Case 8:
    Portd.0 = 1
    Portc.0 = 1
    Portc.1 = 1
    Portc.2 = 1
    Portc.3 = 1
    Portc.4 = 1
    Portc.5 = 1
    Case 9:
    Portd.0 = 1
    Portc.0 = 1
    Portc.1 = 1
    Portc.2 = 0
    Portc.3 = 1
    Portc.4 = 1
    Portc.5 = 1
    End Select
    End Sub

    Mytimer2:
    Incr N
    If N = 26 Then
    N = 0
    Speed = Tcnt0 'Speed = количество импульсов с датчика
    Tcnt0 = 0 'сброс счётчика импульсов
    End If
    If N = 13 Then 'т.к. количество импульсов набегает слишком долго (редко меняются показания)
    Speed_half = Tcnt0 * 2 'добавим удвоение
    A = Speed - Speed_half
    A = A And &B0111111111111111 'модуль
    If A > 2 Then
    Speed = Speed_half
    End If
    End If
    Timer2 = 135 'корректировочка 135 логан
    Return


    В конце 135 — поправочный коэффициент, подбирал его для каждой машины индивидуально (135 это для логана, для соляриса было меньше — у всех разные датчики скорости).
    Обещанное видео. За качество простите, снимал на кусок синей изоленты одной рукой, другой рулил:



    Индикаторы не горят, когда скорость меньше 3 км/ч. Если скорость больше 99, то отображает без первого знака.

    Бюджет:
    ATMega8 — 200р за 5 шт — 40р
    Индикаторы — 825р за 10 шт — 165р
    TD62783 — 250р за 5 шт — 50р
    Остальная рассыпуха у меня была, но в целом видно, что в 500р можно уложиться.

    Больше рассказать и нечего. Получился большой красивый счётчик. Тестировал на Солярисе. На фокусе не удалось, на фокусе не оказалось датчика скорости. Чуть допилю программу для работы с OBD2 через ELM327.
    Папка с проектом на Яндекс.Диске
    Всем спасибо за внимание!
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 48

      0
      Отлично!
        +2
        Эх, я думал будет как-то подключаться к OBDII, а в идеале через блютус…
          0
          В конце дописал, OBDII скоро доделаю. Это всего 2 провода до ELM327 через UART (блютуз не хочу, к блютузу любой может подключиться) и запрос вида >01 0D (согласно вики). Ответом придёт 2 байта скорости.
          +2
          Индикаторы не горят, когда скорость меньше 3 км/ч. Если скорость больше 99, то отображает без первого знака.
          Почему не сделали индикатор в три цифры?
            +1
            Я около 90% времени езжу со скоростью меньше 100 км/ч, а третий индикатор — это увеличение на 33% в ширину, посчитал нерациональным.
              0
              Можно задействовать точку.
            +1
            На видео сумерки, а как в солнечный день?
              0
              В солнце тоже видно. Видео снято с уровня груди. Когда смотришь глазами, цифры получаются как правило на тёмном фоне (дорога, дома и т.д.), ну и яркость у индикаторов отличная.
              0
              А не лучше ли было сделать измерение периода следования импульсов? Тогда бы обновление показаний было бы практически мгновенное.
                0
                Боюсь сильно пострадает точность, но идею при случае проверю, спасибо.
                0
                Действительно красота, интересная разводка дорожек на плате. Давно такой не видел.

                Советую добавить звуковую индикацию превышения (заданной водителем) скорости.
                  +1
                  С одной стороны добавить звук очень просто, с другой вроде и не зачем, ведь скорость всегда перед глазами.
                  0
                  А ночью высокая яркость не мешает?
                    0
                    Нет, не мешает, яркость меняется в зависимости от освещения.
                    0
                    Не двоится отражение цифр в стекле? По видео не очень понятно
                      0
                      Чуть двоится по краям, но благодаря большим индикаторам совсем не мешает.
                      0
                      Интересная задумка конечно, но такую систему сейчас можно сделать с приложением на смартфоне. Ожидал увидеть решение с проекцией в бесконечность, в будущем планируется?
                        +1
                        С моим смартом, как и с навигатором, отражение видно только в полной темноте, даже фонари мешают. Для проекции видимо нужна система оптики, нет, не планируется.
                          0
                          Аналогично, вот только хотел добавить. Со смарта видно только ночью, днём видно что что-то есть но неразличимо что именно.
                        +5
                        Надо бы козырёк поставить со стороны водителя, что бы не видеть сами индикаторы, а только отражение в стекле
                          +1
                          Согласен, это решает корпус. На видео испытания, поэтому корпуса пока нет.
                          0
                          А это не сильно отвлекает водителей встречных машин?
                            0
                            Нет, стекло ведь отражает вовнутрь салона.
                            0
                            подозреваю, что в сильно дождливую погоду водители встречных машин видят небольшое светящееся красное пятно на стекле и ничего более. В остальное время это место по определению должно быть чистым, а, значит, и не рассеивать ничего
                              0
                              зависимость яркости от освещенности нужно было сделать логарифмическую
                                0
                                Логарифмическая в другую сторону, получится сильное снижение яркости при незначительном уменьшении освещённости.
                                0
                                Когда это можно будет у Вас купить?
                                  0
                                  Коммерческую версию не планировал. Делал пару, раздарил по друзьям.
                                  0
                                  Очень круто! Вот гоняюсь между городами, иногда бывает что на пару тройку перепрыгиваешь ограничение. На спидометр же не постоянно смотришь. А навигатор за городом часто молчит про скорость, гад! Очень хотелось бы подобное, но в готовом виде!
                                    0
                                    По-моему это неправильная постановка задачи. Контролировать скорость и так несложно: у всех есть спидометр, бывает круиз или ограничитель. Все эти приборы немного завышают скорость, так что небольшие отклонения не позволят нарушить, плюс ещё допустимое превышение в 20км/ч.

                                    В общем, если водитель хочет соблюдать скорость в соответствии с ПДД, то ничего ему не мешает этого делать. А вот если хочется ехать быстрее, но не попадаться на камеры, тут ничего лучше mapcam droid ещё не придумали:)
                                      0
                                      Круиза нет, а на спидометр не смотришь достаточно часто, ехать я хочу по ПДД, но в пределах моя «скорость = платно — 5км/ч». И вот когда идёшь 85км/ч пару десятков километров легко можно пропустить момент, когда нога капельку прожала газ.
                                        0
                                        Обычно в навигаторах можно задать предел, после которого он будет пищать о превышении скорости.
                                    +1
                                    Известно что простой спидометр как правило врет на 10 процентов вверх, по диагностическому протоколу скорость уже будет считываться правильная но в случае если диски и резина стоит штатная, иначе скорость везде будет отличаться от реальной. Т.е. ваше устройство в описанном варианте не гарантирует реальные показания скорости на всех автомобилях.
                                    Простой выход — ставить GPS модуль в ваше устройство и считывать с него показания о скорости. Так делают если хотят добиться высокой точности показаний скорости.
                                      0
                                      Идея хороша, мне в голову отчего-то не пришла. Обязательно закажу датчик GPS и попробую. Единственное (я с ними не работал) — на навигаторе, например, скорость показывается с задержкой 2-3 секунды. Это беда софта или технологии в принципе?
                                        +1
                                        Это беда GPS модулей и софта в том числе, связано это с тем что многие GPS модули отдают координаты/скорость только раз в секунду. Если закажете с алиэкспресса модули на основе чипов ublox6 или ublox7 (neo-6M к примеру, на ублокс7 их меньше но тоже можно найти) то будут вам 5 и 10Гц соответственно. А так максимум что есть в продаже — 20Гц модули. Но для показометра скорости оптимальным по цене/скорости отображения я думаю будут 5Гц модули. Чтобы перевести модуль в этот режим нужно на небо подать спец. команду, ну это вы уже разберетесь потом :)
                                          0
                                          Я бы не рекомендовал полагаться только на GPS. Задержка, это не столько беда, сколько способ усреднить ошибки определения скорости. Измеряется же скорость позиционно. Точность зависит от сигнала, часто «забывают» считать вертикальные перемещения, из-за чего при движении вверх — скорость занижается, вниз — завышается. В отличии от спидометров, точность выше на больших скоростях, чем ниже скорость, тем выше ошибка. У GPS ошибка может быть в любую сторону, спидометры обычно завышают реальную скорость.
                                          Ну и плотная облачность, мосты, тоннели и устройство начинает врать или просто перестает отдавать данные.

                                          С другой стороны, можно использовать GPS-датчик для калибровки в условиях хорошего сигнала и прямолинейного движения без ускорений.
                                      0
                                      ну а снаружи фото есть?
                                      как будет видно на фотках гаишников?
                                        0
                                        Снаружи нет. Если стекло чистое — то ничего не будет видно на фотках гаишников.
                                        +2

                                        Удобнее все же все данные считывать с OBD2 или с CAN. Я для айфона пару лет назад написал прогу, показывает данные с OBD2.


                                          +1
                                          Допустим, на Gets, для которого я делал этот спидометр изначально (или Солярис, на котором тестировал), удобнее датчик скорости — он выведен прямо в диагностический разъём, не надо никаких согласующих интерфейсов, только импульсы считать. А так, если надо получить несколько видов данных, то, конечно, OBDII лучше и правильнее.
                                            0
                                            В appstore есть Ваша программка?
                                              0

                                              Так и не дошли руки выложить

                                            +1
                                            Я думаю, что-то родное есть в этом. Оказывается — Архангельск, пр. Ломоносова / ул. Суворова.
                                            0
                                            Вопрос к автору,

                                            Тут уже писали, что штатный спидометр всегда несколько завышает скорость. Интересно, это делается на уровне датчика скорости, или уже в «мозгах»?

                                            Показания этого спидометра совпадают с показаниями «штатного»?

                                            А вообще, устройство отличное! Я, честно говоря, очень впечатлился!
                                              0
                                              В программе есть поправочный коэффициент, можно настроить и в соответствии со спидометром, и с реальной скоростью. Лично я настраивал, чтобы совпадало со штатным.
                                              +1
                                              Классно!) Спрятать бы саму матрицу в панель, а то светится слишком ярко…
                                              Ночью глаза выжгет)
                                                0
                                                Просто убрать в корпус, который будет закрывать индикаторы спереди. А вообще, ночью оно светится еле-еле.

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое