Приборная панель для авто на андроид

Приборная панель для авто на андроид ОБД2
Содержание
  1. Разработка панели приборов на основе raspberry pi и 7″ дисплея
  2. Описание программы
  3. Aleksandr-99999 › блог › создаем универсальную панель приборов из планшета
  4. Car dashboard obd2 купить по низкой цене на aliexpress
  5. Ford galaxy — пепелац с гравицапой ㋡ › бортжурнал › как закрепить планшет и не испортить торпеду
  6. Ppyple cdview m
  7. Vw transport protocol 2.0
  8. Автоматическое включение планшета
  9. Диагностический сканер elm327
  10. Изучение возможностей
  11. Как добавить строку инициализации
  12. Как из телефона сделать панель приборов
  13. Нюансы установки планшета вместо магнитолы своими руками
  14. Подключение планшета через автомобильный усилитель
  15. Покраска
  16. Посчитайте, сколько вы платите за обслуживание
  17. Посчитайте, сколько денег уходит на ремонт
  18. Приложение на телефон виртуальная панель приборов
  19. Работа
  20. Разработка приложения под iphone
  21. Сниффер шины can
  22. Сопряжение с адаптером elm327 и автомобилем
  23. Софт панели приборов на python и kivy (ui framework)
  24. Хакаем can шину авто. виртуальная панель приборов

Разработка панели приборов на основе raspberry pi и 7″ дисплея

В качестве аппаратного обеспечения я выбрал Raspberry Pi. Хотя я рассматривал возможность использования планшета Android, я решил, что Raspberry Pi будет проще и быстрее. В итоге я купил официальный 7-дюймовый дисплей и изготовил CAN-модуль из модуля TJA1050 Niren.

Разъем OBD2 использовался от старого адаптера ELM327

https://www.youtube.com/watch?v=7JLJa5FOnTU

Используются контакты CAN_L, CAN_H, 12, GND.

Испытания на автомобиле прошли успешно. Теперь оставалось только собрать детали. Raspberry Pi, плата дисплея и блок питания были установлены на куске черного пластика, а уплотнители не давали всему перемещаться.

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

Я вырезал лист черного пластика под крышку бардачка и прикрепил к нему сэндвич и дисплей. Я уже разработал 3D-модель с крышкой дисплея и необходимыми креплениями, так что это подойдет для прототипа.

Описание программы

Программа Torque (Торкуе) работает совместно с адаптерами ELM327. Возможно использование ELM327 Bluetooth, WiFi, USB. Приложение совместимо с автомобилями Toyota, BMW, Ford, GM, Mercedes, Vauxhall, Nissan, Daewoo, Opel, Chrysler, Volkswagen, Audi, Jaguar, Citroen, Peugoet, Skoda, Kia, Mazda, Lexus, , Renault, Mitsubishi, Honda, Hyundai, Seat, Dodge, Jeep, Pontiac, Subaru и многими другими.

Это своего рода бортовой компьютер вашего смартфона.

Aleksandr-99999 › блог › создаем универсальную панель приборов из планшета

Универсальная приборная панель VENATOR представляет собой программно-аппаратный комплекс, позволяющий дублировать показания штатной приборной панели автомобиля и отображать их в графическом виде на дисплее CAR PC под управлением Windows (на отдельном, или в составе фронтенда к основному) или различных ANDROID устройств.

По сравнению с аналогичными решениями, блок сбора данных не использует CAN, K-line, OBD и т.д. Все штатные датчики подключаются непосредственно к устройству. Каждый датчик опрашивается с частотой 50 мс, и данные передаются в программу визуализации в цифровом виде.

Опрос датчиков независимо позволяет увеличить частоту опроса, а также использовать систему с автомобилями без ЭБУ (карбюраторными, дизельными, электрическими). В комплект поставки входят источники питания Venator, программное обеспечение Venator и устройство отображения (либо ПК с ОС Windows, либо устройство с ОС Android).

Venator использует платформу Adobe AIR. Помимо обеспечения высококачественной графики, это приложение совместимо с устройствами Windows и Android. Имеются различные типы оформления активных элементов пользовательского интерфейса и возможность настройки фона (скины).

В настоящее время доступны следующие функции: 1. Индикация скорости 2. Индикация оборотов двигателя 3. Сигнал SHIFT (устанавливается пользователем) для зеленой и красной зон скорости двигателя. Общий пробег, введенный пользователем. Одометр с ежедневным сбросом (сбрасывается кнопкой) 6.

Обратный отсчет счетчика обслуживания (интервал обслуживания устанавливается пользователем) 7. Индикация напряжения бортовой сети (калибруется пользователем) 8. Индикаторы температуры двигателя (калибруются пользователем) 9. Индикатор топлива (калибруется пользователем) 10.

Базовая версия программы в настоящее время включает в себя 5 скинов:

Источник

Car dashboard obd2 купить по низкой цене на aliexpress

Автомобильная приборная панель obd2 хорошего качества и по доступной цене? Мы знаем, где искать! Найдите что угодно с помощью поисковой системы AliExpress по ключевым словам, например, автомобильная приборная панель obd2 – вы получите отличные предложения и сэкономите деньги. Узнайте, как найти лучшие цены и качественные товары в этом кратком руководстве.

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

Изучите бренды. автомобильная приборная панель obd2 от надежных и известных брендов, которые вам нравятся – просто нажмите на логотип бренда на левой боковой панели. Вы можете отфильтровать результаты поиска с помощью этого фильтра.

Читайте отзывы. Изучите реакцию других покупателей на автомобильную приборную панель obd2. Изучите реальные товары, чтобы получить полезную информацию и советы по совершению покупок.

Это облегчает поиск автомобильной приборной панели obd2 по сниженным ценам и позволяет воспользоваться преимуществами быстрой доставки и бесплатного возврата. Новые пользователи также получат специальные предложения и подарки! Посетите AliExpress, чтобы просмотреть и купить еще больше товаров в этой категории.”

Ford galaxy — пепелац с гравицапой ㋡ › бортжурнал › как закрепить планшет и не испортить торпеду

Во время установки дополнительного оборудования встал вопрос о том, как закрепить планшет над радио. Было решено оставить магнитолу SONY с премиум звуком, однако, я не мог отказать себе в удовольствии смотреть фильмы за рулем. Поэтому и планшет должен быть. Суммы не будут установлены, утверждают чиновники. Пластик, например, хрупкий. С мегаприсоской на лобовом стекле у меня нет никакого желания. Пришлось крепко задуматься.

Самый компактный держатель – это:

Давайте сделаем небольшой замер и алюминиевую полосу:

Работа занимает пять минут. Она легка, как банная простыня, не повреждает детали интерьера и выдерживает любой вес. Если приклеить на концы полосок кусочки двустороннего скотча 3М, крепление получается просто невероятным.

Это планшет SAMSUNG Galaxy Tab 7.7 (P6800). На фото видно, что даже вид не закрыт. Bluetooth передает звук на магнитолу. Третий ряд – как в кинотеатре. Есть WI-FI SEAGATE, прилагающийся к фильмам. Видеороликов для просмотра нет.

Вообще у меня три ГАЛАКТИКИ – планшет, телефон и машина. Вот такой я весь галактический.)))

Цена вопроса: 1 000 ₽ Пробег: 1 050 км

Ppyple cdview m

Все началось с самого крутого продукта линии View: этот магнитный держатель шириной всего 7,5 см, глубиной 6 см и диаметром 4 см легко помещается в слот CD-привода радиоприемника и удерживает любой смартфон или планшет весом до 700 граммов.

Самый большой Pro 12.9′′ весит 692 грамма, а обычный iPad – 478 граммов.

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

В описании этого простого держателя слово “дизайнер” звучит как маркетинговая кампания? А ведь это не так! Ppyple CDView M разработан уникальным образом: во-первых, особенно интересен принцип крепления – ничего не нужно прикручивать или собирать/разбирать.

Один цвет в ассортименте. Цена: 1 290 рублей. Ppyple CDView M ждет своего владельца здесь.

Другим преимуществом является то, что основание держателя и металлическая “голова” соединены шаровым шарниром, так что одним движением руки его можно крутить как угодно, поворачивать под разными углами и переводить из портретного режима в ландшафтный.

Vw transport protocol 2.0

В качестве транспортного уровня используется V WTP 2.0, а данные передаются в формате KWP2000. Стандартом для бортовой диагностики автомобилей под названием Keyword Protocol 2000 является ISO 14230. В стандарте ISO 14230-3 описан прикладной уровень. Более подробную информацию см. в Википедии.

Поскольку KWP2000 использует сообщения переменной длины, а шина CAN принимает только 8 байт, VW TP 2.0 разлагает длинное сообщение KWP2000 при отправке по шине CAN и собирает его при получении снова.

Диагностические данные от двигателя по протоколу KWP2000 (Skoda Octavia A5)
Диагностические данные от двигателя по протоколу KWP2000 (Skoda Octavia A5)

Автоматическое включение планшета

Если вы хотите автоматизировать процесс активации и деактивации, я рекомендую загрузить приложение Tasker для Android. Это экономит ваше время, позволяя избежать ненужных нажатий на кнопки.

Универсальная приборная панель VENATOR – это программно-аппаратный комплекс, позволяющий дублировать показания штатной приборной панели автомобиля, и отображать их в графическом виде, на дисплее CAR PC под управлением Windows (на отдельном, или как часть фронтенда к основному) или на различного рода ANDROID устройствах.

Код ошибки:  Что такое OBD коррекция ГБО

Поскольку блок сбора данных не совместим с протоколами CAN, K-line, OBD и подобными, он принципиально отличается от аналогичных продуктов. Обычные датчики подключаются непосредственно к блоку. Блок опрашивает датчики каждые 50 мс и передает цифровую информацию в программу визуализации.

Благодаря независимому опросу датчиков можно увеличить частоту опроса, а также использовать систему на автомобилях без ЭБУ (карбюраторных, дизельных, электрических). По сути, система состоит из блока питания Venator, программного обеспечения Venator и дисплея (ПК с Windows или устройство Android).

В Venator используется платформа Adobe AIR. Помимо высококачественной графики, это приложение совместимо с устройствами Windows и Android. Кроме того, активные элементы пользовательского интерфейса доступны во многих стилях оформления, и есть возможность создавать пользовательские фоны (скины).

В настоящее время доступны следующие функции: 1. Индикация скорости 2. Индикация оборотов двигателя в минуту 3. Зеленый и красный сигналы зоны скорости двигателя, называемые SHIFT (задаются пользователем). Общий пробег вводится пользователем. Сбрасываемый суточный одометр (сбрасывается кнопкой) 6.

7. Отсчет сервисного счетчика (программируется пользователем) 8. Измерение напряжения бортовой сети (калибруется пользователем) 8. Отображение температуры двигателя (калибруется пользователем). Отображение остатка топлива (калибруется пользователем) 10.

В настоящее время базовая версия включает пять скинов:

Подобную приборную панель можно установить на любой автомобиль, поскольку она универсальна. В результате мы собрали приборную панель под названием Venator.

Вот предметы, которые вам понадобятся

Контроллер для Arduino управляет всеми датчиками в автомобиле. При установке нашей коробки передач нам также пришлось установить трос спидометра вместо датчика спидометра. Необходимо было проложить провод в салон автомобиля от замка зажигания, чтобы контроллер мог отображать обороты двигателя (в OKE не было тахометра).

Диагностический сканер elm327

Все автомобили с 1996 года выпуска должны соответствовать спецификации OBD2, которая предполагает наличие 16-контактного разъема. Разъем OBD2 должен находиться рядом с рулевым колесом или где-то поблизости. В рамках спецификации каждый автомобиль должен поддерживать набор стандартных команд.

Многие автолюбители знают о недорогом диагностическом сканере ELM327, который позволяет для любого автомобиля – по протоколу OBD2 – провести первичную диагностику, прочитать ошибки, сбросить ошибки, а также запросить некоторую информацию из блока управления двигателем: скорость, обороты, температуру, пропуски зажигания.

Существует несколько программ, позволяющих работать с основными функциями ELM327. Только разработчики знают потенциал ELM327. Он поддерживает двенадцать протоколов, включая ISO 15765-4 CAN. Таким образом, диагностический сканер может получить доступ и взаимодействовать с шиной CAN.

Чтобы ELM327 мог отправлять запросы и принимать данные по шине CAN, его необходимо сконфигурировать. В документации ELM327 объясняется, как это сделать, подключившись к UART-консоли сканера через Wi-Fi, Bluetooth или провод, а затем отправив набор AT-команд.

Одно сообщение CAN передается со скоростью 500 кбод, что очень быстро. В отличие от него, ELM327 работает гораздо медленнее, среднее время ответа на один запрос составляет всего 50 мс, а в секунду может быть обработано только двадцать запросов. Если приложение опрашивает датчики и выводит информацию на экран, необходимо учитывать это.

Изучение возможностей

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

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

Чтобы узнать, как работают системы автомобиля, необходимо подключиться к CAN. Существует несколько вариантов подключения.

Разъем OBD2 подключен к шине CAN через шлюз в автомобилях Volkswagen, Audi, *koda, Seat; прямого доступа к нему нет. Вы не сможете прослушивать команды через разъем OBD2, поэтому избегайте этого. Диагностические разъемы не получают команды из основной сети.

Говоря простым языком, каждое устройство VCDS запрашивает у шлюза информацию о состоянии датчика, которая затем передается в OBD2.

Таким образом, если вы послушаете, что запрашивает VCDS, вы можете получить список команд, которые можно задать датчикам.

Как добавить строку инициализации

Дополнительную информацию можно получить здесь.

Если ваша машина использует нестандартный протокол OBDII, вам может понадобиться эта строка инициализации. Для связи с блоком управления программе необходимы дополнительные команды инициализации. Строка инициализации отправляется перед попыткой соединения.

  1. Возьмите линию инициализации из вашего ЭБУ.
  2. Перейдите в редактор профиля автомобиля в программе torque. Нажмите кнопку “Show Advanced Settings”
  3. Внизу найдите “ELM327 Custom Configuration String” и введите нашу строку инициализации.
  4. Сохраните профиль автомобиля.

Итак, теперь вы готовы к самодиагностике своего автомобиля и контролю его параметров. Используйте функциональность программы по максимуму, добавляйте датчики по мере необходимости, записывайте поездки, тестируйте скорость автомобиля и расход бензина. Ошибки считываются и стираются из Check Engine.

Как из телефона сделать панель приборов

Цифровые приборные панели вытесняют классические приборные панели в автомобилях. Автомобиль с впечатляющим сенсорным дисплеем, как, например, у Tesla, вероятно, является самым популярным с такой приборной панелью. Приложение позволяет просматривать диагностическую информацию, следить за маршрутом и управлять музыкой.

До сих пор на приборной панели отображалась только самая важная информация: скорость, обороты и температура. Теперь ваш смартфон может отображать любые данные, включая видео с камеры под бампером, дорожные знаки и графики расхода топлива.

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

Электронные устройства

В более холодном автомобиле полезнее выводить больше информации на экран бортового компьютера.

Нюансы установки планшета вместо магнитолы своими руками

Использование планшета в качестве бортового компьютера в автомобиле вполне логично, учитывая распространенность этих устройств сегодня. Он позволяет водителю получить доступ к широкому спектру дополнительных функций в дополнение к штатной стереосистеме. Обычные автомобильные системы сегодня поставляются с GPS.

Те, кто владеет бюджетными автомобилями в базовой комплектации, остаются без этой возможности. Устройство Android предлагает продвинутую систему GPS. Контакты Google можно сохранить на планшете Android, GPS доступен напрямую, предусмотрен календарь событий.

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

К сожалению, стоимость этих стыкуемых моделей начинается от 300 долларов. Например, рассмотрим такие модели, как док-станция ASUS Transformer Book T100TA 64 ГБ и HP SlateBook x2 32 ГБ. Универсальной док-станции не существует, для каждой модели планшета она разработана специально.

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

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

Здесь возможны два варианта:

Я использовал первый вариант

Подключение внешнего усилителя к планшету необходимо для замены штатной стереосистемы. Прямого соединения между планшетом и динамиками нет. Аудиовыход предназначен только для наушников. Поэтому необходим усилитель. 4-канальный лучше всего подходит для моего автомобиля, в котором есть четыре динамика.

В настоящее время усилитель установлен под передним пассажирским сиденьем, но его можно установить практически в любом месте, например, в багажнике автомобиля, хотя я считаю, что это слишком далеко от аккумулятора. Он установлен под пассажирским сиденьем, чтобы уменьшить длину кабеля. Придется снять сиденье, но это несложно сделать. Погуглите, как это сделать в вашем автомобиле.

Питание усилителя осуществляется непосредственно от аккумулятора. Аккумулятор должен быть подключен к достаточно толстым кабелям. Для получения дополнительной информации обратитесь к руководству по эксплуатации усилителя. Вы можете подключить усилитель с помощью кабелей. Вы также можете приобрести кабели самостоятельно и сэкономить таким образом деньги.

Как можно дешевле, я выбрал усилитель. Я редко слушаю музыку, в основном аудиокниги, поэтому качество звука меня не сильно беспокоило.

Покраска

Торпеду можно покрасить специальными красками для пластика или кузовными красками для автомобилей. Краска распыляется краскопультом с расстояния 20 см от поверхности детали. Использование баллончиков с краской для восстановления торпедо автомобиля встречается редко, так как невозможно добиться равномерного окрашивания. Подобные составы используются для улучшения внешнего вида отдельных элементов.

Код ошибки:  Расшифровка индикаторов приборной панели Nissan Murano Z51

Во время покраски используется проветриваемое помещение, защищенное от пыли и солнечного света. Мы наносим краску в три слоя:

Приборная панель может быть матовой или глянцевой. Рекомендуется не покрывать приборную панель лаком, так как блики света могут создавать дополнительную нагрузку на зрение водителя.

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

Для полного высыхания приборной панели требуется несколько дней. Затем приборная панель осматривается, устраняются все дефекты, вызванные покраской, и она устанавливается на место.

Посчитайте, сколько вы платите за обслуживание

Прежде всего, вы должны задать себе следующий вопрос: Сколько вы тратите на обслуживание и ремонт?

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

Когда вы не полностью расплатились за имеющийся автомобиль, картина становится более туманной. Чем больше вы выложили за него и считаете, что эксплуатационные расходы будут выше, чем у другого (нового) автомобиля с такими же платежами, тем больше вероятность того, что вы купите новый автомобиль. Единственным недостатком является то, что вы потеряете деньги, которые вы заплатили за свой нынешний автомобиль.

Вы можете попытаться сэкономить на стоимости обслуживания, если это решение соответствует вашему бюджету (но у вас также будут некоторые расходы, связанные с обслуживанием новой машины).

Если вы ищете способ сэкономить на техническом обслуживании, то нет лучшего способа, чем выполнять основные действия самостоятельно. К числу вещей, которые вы можете сделать самостоятельно, относятся замена масла, проверка уровня жидкостей (их регулировка и/или замена), замена свечей зажигания, замена воздушных фильтров и многое другое.

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

Посчитайте, сколько денег уходит на ремонт

Большинство вопросов ремонта лучше доверить механику, особенно если вы чувствуете, что затраты времени и труда непропорционально высоки, и лучше заплатить профессионалу, на которого вы можете положиться.

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

Несколько вещей, которые вы не должны пропустить, если обновление будет официальным:

    Смело ремонтируйте свой автомобиль, если ремонт проводится реже одного раза в месяц и у вас нет обязательств по оплате старого автокредита.

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

    Примерно раз в два месяца вам потребуется дорогостоящий ремонт. Тратить $40 000 каждые четыре месяца на ремонт старого автомобиля и платить $10 000 в месяц за новый автомобиль вполне сопоставимы.

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

  • Стоимость ремонта меньше, чем половина рыночной стоимости автомобиля?Если ответ на этот вопрос «Да», то лучше сделайте ремонт (в случае единичного капитального ремонта).
  • Подумайте, насколько ремонт продлит время жизни вашего авто.
    Имеет смысл тратить 38 000 на ремонт машины стоимостью в 65 000 только, если вы точно знаете, что этот ремонт продлит жизнь машины надолго, так что вам это будет выгоднее, чем та же самая выплата в 38 000, размазанная на более короткий временной период и потраченная на новое или подержанное авто.
  • Приложение на телефон виртуальная панель приборов

    Приборная панель для авто на андроид
    Приборная панель для авто на андроид
    Если есть желание поддержать проект, то вот ссылка на приложение, принимаю любые замечания и предложения!
    VAG Virtual Cockpit
    Приборная панель для авто на андроид

    Работа

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

    Несмотря на свои небольшие размеры, iPad прекрасно подходит для офисной работы. Его клавиатура удобна и отзывчива, а экран адаптирован не хуже.

    На самом деле, на сегодняшний день мы испробовали только самые очевидные способы использования планшета в автомобиле – существует также множество других способов. Для таких устройств написано множество полезных вспомогательных программ. Этой теме мы посвятим отдельное исследование. Пока же можно утверждать, что планшетные компьютеры станут хорошими помощниками: помогут найти нужную дорогу, объехать пробки, скоротать время и даже разрешить деловые ситуации без необходимости останавливать автомобиль.

    Разработка приложения под iphone

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

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

    Приложение разрабатывается для iOS, но алгоритмы работы с ELM327 такие же, как и для Android. Чтобы разрабатывать приложения для iOS, вам нужен Xcode. Сейчас разработчик может выбирать между Objective-C и Swift, двумя официально поддерживаемыми языками программирования. Более новым, простым и менее подверженным ошибкам является последний.

    В первой версии приложения основной целью было создание стабильной основы для взаимодействия со сканером Wi-Fi ELM327, что облегчало расширение приложения за счет дополнительных функций.

    Он работает непосредственно через сокеты по TCP и UDP, что делает CocoaAsyncSocket простым в использовании и стабильным. Вы можете использовать его для запуска соединения, отправки и получения данных, а также для закрытия соединения.

    После отладки кода связи с ELM327 можно переходить к разработке интерфейса самой виртуальной панели. В придорожном приложении дизайн не должен отвлекать от дороги. Однако он также должен быть информативным и легко читаемым.

    Вам нужно будет подключить виджеты датчиков к коду после того, как вы разместите их на Storyboard. Этим занимаются соединительные линии в Xcode. После этого каждый раз при обновлении датчика его значение будет записываться в переменную и отображаться на виджете.

    Сниффер шины can

    На основе Arduino Uno и модуля Niren TJA1050 с контроллером MCP2515 CAN я построил сниффер, который подключается в любое место шины CAN и прослушивает проходящий трафик. Сниффер никак не вмешивается в работу системы. Чтобы прослушать, что посылает VCDS, необходимо подключить собственный диагностический кабель к контактам CAN-High и CAN-Low.

    Подключив кабель OBD2 к шлюзу, вы сможете просматривать весь трафик между шлюзом и VCDS с помощью программы CANHackerV2. CANHackerV2 – это скетч для Arduino, который принимает данные по CAN и отправляет их через UART * USB конвертер. На GitHub размещен скетч, который находится в открытом доступе.

    В результате прослушивания команд, отправленных VCDS, я создал список команд, которые может запросить машина.

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

    Сопряжение с адаптером elm327 и автомобилем

    1. Возьмите адаптер ELM327, если у вас его нет, купите его.
    2. Найдите разъем OBD2 автомобиля и подключите к нему адаптер. Запустите двигатель. Должен загореться индикатор питания сканера, если он, конечно, есть.
    3. Зайдите в настройки Bluetooth вашего телефона и включите их. Выполните поиск устройств Bluetooth.
    4. Найдите наш адаптер, он будет называться OBD2, CHX или аналогично. Введите PIN-код: 1234, 0000 или 6789.
    5. Откройте программу Torque, перейдите в раздел “Настройки”, затем “Настройки адаптера OBD”. Выберите “Тип соединения: Bluetooth”, нажмите “Выбрать устройство Bluetooth” и выберите наш адаптер OBD2, CHX или другой.
    6. Если соединение с адаптером прошло успешно, значок должен перестать мигать и стать одноцветным.
    7. После сопряжения с ELM327 происходит автоматическое подключение к блоку управления автомобиля. Если все правильно, появится сообщение “Подключение к ЭБУ успешно”, а значок автомобиля перестанет мигать и станет сплошным.

    Софт панели приборов на python и kivy (ui framework)


    Параллельно со сборкой самой панели приборов я вел разработку приложения для отображения информации с датчиков. В самом начале я не планировал какой либо дизайн.

    Код ошибки:  Application Notes – Elm Electronics

    Приборная панель для авто на андроид
    Первая версия панели приборов

    Работая над этим проектом, я решил визуализировать данные более наглядно. Я хотел создать гоночный дизайн, но он получился в стиле 80-х годов.

    Приборная панель для авто на андроид
    Вторая версия панели приборов

    Пока я все еще искал более современный дизайн, я посмотрел на цифровые приборные панели производителей автомобилей и попытался сделать нечто подобное.

    Приборная панель для авто на андроид
    Третья версия панели приборов

    Я никогда раньше не разрабатывал графические приложения в Linux, поэтому не знал, с чего начать. Веб-вариант было легко разработать, но было слишком много дополнительных компонентов: иконки, браузер, nodejs, а мне нужна была быстрая загрузка. Попробовав Qt PySide2, я понял, что это займет у меня много времени, поскольку у меня мало опыта.

    Kivy позволяет запускать приложения без X, непосредственно с консоли, используя OpenGL в качестве механизма рендеринга. Это позволяет полностью загрузить систему за 10 секунд.

    import can
    import os
    import sys
    from threading import Thread
    import time
    
    os.environ['KIVY_GL_BACKEND'] = 'gl'
    os.environ['KIVY_WINDOW'] = 'egl_rpi'
    
    from kivy.app import App
    from kivy.properties import NumericProperty
    from kivy.properties import BoundedNumericProperty
    from kivy.properties import StringProperty
    from kivy.uix.label import Label
    from kivy.uix.image import Image
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.widget import Widget
    from kivy.uix.scatter import Scatter
    from kivy.animation import Animation
    
    messageCommands = {
        'GET_DOORS_COMMAND': 0x220D,
        'GET_OIL_TEMPERATURE' : 0x202F,
        'GET_OUTDOOR_TEMPERATURE' : 0x220C,
        'GET_INDOOR_TEMPERATURE' : 0x2613,
        'GET_COOLANT_TEMPERATURE' : 0xF405,
        'GET_SPEED' : 0xF40D,
        'GET_RPM' : 0xF40C,
        'GET_KM_LEFT': 0x2294,
        'GET_FUEL_LEFT': 0x2206,
        'GET_TIME': 0x2216
    }
    
    bus = can.interface.Bus(channel='can0', bustype='socketcan')
    
    Полный код панели в одном python файле

    # -*- coding: utf-8 -*-
    
    import can
    import os
    import sys
    from threading import Thread
    import time
    
    os.environ['KIVY_GL_BACKEND'] = 'gl'
    os.environ['KIVY_WINDOW'] = 'egl_rpi'
    
    from kivy.app import App
    from kivy.properties import NumericProperty
    from kivy.properties import BoundedNumericProperty
    from kivy.properties import StringProperty
    from kivy.uix.label import Label
    from kivy.uix.image import Image
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.widget import Widget
    from kivy.uix.scatter import Scatter
    from kivy.animation import Animation
    
    messageCommands = {
        'GET_DOORS_COMMAND': 0x220D,
        'GET_OIL_TEMPERATURE' : 0x202F,
        'GET_OUTDOOR_TEMPERATURE' : 0x220C,
        'GET_INDOOR_TEMPERATURE' : 0x2613,
        'GET_COOLANT_TEMPERATURE' : 0xF405,
        'GET_SPEED' : 0xF40D,
        'GET_RPM' : 0xF40C,
        'GET_KM_LEFT': 0x2294,
        'GET_FUEL_LEFT': 0x2206,
        'GET_TIME': 0x2216
    }
    
    bus = can.interface.Bus(channel='can0', bustype='socketcan')
    
    class PropertyState:
        def __init__(self, last, current):
            self.last = last
            self.current = current
    
        def lastIsNotNow(self):
            return self.last is not self.current
    
    class CanListener(can.Listener):
        def __init__(self, dashboard):
            self.dashboard = dashboard
            self.speedStates = PropertyState(None,None)
            self.rpmStates = PropertyState(None,None)
            self.kmLeftStates = PropertyState(None,None)
            self.coolantTemperatureStates = PropertyState(None,None)
            self.oilTempratureStates = PropertyState(None,None)
            self.timeStates = PropertyState(None,None)
            self.outDoorTemperatureStates = PropertyState(None,None)
            self.doorsStates = PropertyState(None,None)
            self.carMinimized = True
    
        def on_message_received(self, message):
    	 messageCommand = message.data[3] | message.data[2] << 8
    
            if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_SPEED']:
                self.speedStates.current = message.data[4]
                if self.speedStates.lastIsNotNow():
                    self.dashboard.speedometer.text = str(self.speedStates.current)
                    self.speedStates.last = self.speedStates.current
    
            if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_RPM']:
                self.rpmStates.current = message.data[5] | message.data[4] << 8
                if self.rpmStates.lastIsNotNow():
                    self.dashboard.rpm.value = self.rpmStates.current/4
                    self.rpmStates.last = self.rpmStates.current
            if message.arbitration_id == 0x35B:
                self.rpmStates.current = message.data[2] | message.data[1] << 8
                if self.rpmStates.lastIsNotNow():
                    self.dashboard.rpm.value = self.rpmStates.current/4
                    self.rpmStates.last = self.rpmStates.current
    
            if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_KM_LEFT']:
                self.kmLeftStates.current = message.data[5] | message.data[4] << 8
                if self.kmLeftStates.lastIsNotNow():
                    self.dashboard.kmLeftLabel.text = str(self.kmLeftStates.current)
                    self.kmLeftStates.last = self.kmLeftStates.current
    
            if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_COOLANT_TEMPERATURE']:
                self.coolantTemperatureStates.current = message.data[4]
                if self.coolantTemperatureStates.lastIsNotNow():
                    self.dashboard.coolantLabel.text = str(self.coolantTemperatureStates.current-81)
                    self.coolantTemperatureStates.last = self.coolantTemperatureStates.current
    
            if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_OIL_TEMPERATURE']:
                self.oilTempratureStates.current = message.data[4]
                if self.oilTempratureStates.lastIsNotNow():
                    self.dashboard.oilLabel.text = str(self.oilTempratureStates.current-58)
                    self.oilTempratureStates.last = self.oilTempratureStates.current
    
            if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_TIME']:
                self.timeStates.current = message.data[5] | message.data[4] << 8
                if self.timeStates.lastIsNotNow():
                    self.dashboard.clock.text = str(message.data[4])   ":"   str(message.data[5])
                    self.timeStates.last = self.timeStates.current
    
            if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_OUTDOOR_TEMPERATURE']:
                self.outDoorTemperatureStates.current = float(message.data[4])
                if self.outDoorTemperatureStates.lastIsNotNow():
                    self.dashboard.outDoorTemperatureLabel.text = str((self.outDoorTemperatureStates.current - 100)/2)
                    self.outDoorTemperatureStates.last = self.outDoorTemperatureStates.current
    
            if message.arbitration_id == 0x77E and messageCommand == messageCommands['GET_DOORS_COMMAND']:
                self.doorsStates.current = message.data[4]
                if self.doorsStates.lastIsNotNow():
                    self.doorsStates.last = self.doorsStates.current
                    self.dashboard.car.doorsStates=message.data[4]
    
                    # all doors closed -> minimize car
                    if self.doorsStates.current == 0x55:
                        self.dashboard.minimizeCar()
                        self.carMinimized = True
                    else:
                        if self.carMinimized:
                            self.dashboard.maximizeCar()
                            self.carMinimized = False
              
    class Dashboard(FloatLayout):
        def __init__(self,**kwargs):
            super(Dashboard,self).__init__(**kwargs)
    
            # Background
            self.backgroundImage = Image(source='bg.png')
            self.add_widget(self.backgroundImage)
    
            # RPM
            self.rpm = Gauge(file_gauge = "gauge512.png", unit = 0.023, value=0, size_gauge=512, pos=(0,0))
            self.add_widget(self.rpm)
            self.rpm.value = -200
    
            # Speedometer
            self.speedometer = Label(text='0', font_size=80, font_name='hemi_head_bd_it.ttf', pos=(0,-15))
            self.add_widget(self.speedometer)
    
            # KM LEFT
            self.kmLeftLabel = Label(text='000', font_name='Avenir.ttc', halign="right", text_size=self.size, font_size=25, pos=(278,233))
            self.add_widget(self.kmLeftLabel)
    
            # COOLANT TEMPEARATURE
            self.coolantLabel = Label(text='00', font_name='hemi_head_bd_it.ttf', halign="right", text_size=self.size, font_size=27, pos=(295,-168))
            self.add_widget(self.coolantLabel)
    
            # OIL TEMPERATURE
            self.oilLabel = Label(text='00', font_name='hemi_head_bd_it.ttf', halign="right", text_size=self.size, font_size=27, pos=(-385,-168))
            self.add_widget(self.oilLabel)
    
            # CLOCK
            self.clock = Label(text='00:00', font_name='Avenir.ttc', font_size=27, pos=(-116,-202))
            self.add_widget(self.clock)
    
            # OUTDOOR TEMPERATURE
            self.outDoorTemperatureLabel = Label(text='00.0', font_name='Avenir.ttc', halign="right", text_size=self.size, font_size=27, pos=(76,-169))
            self.add_widget(self.outDoorTemperatureLabel)
    
            # CAR DOORS
            self.car = Car(pos=(257,84))
            self.add_widget(self.car)
    
        def minimizeCar(self, *args):
            print("min")
            anim = Animation(scale=0.5, opacity = 0, x = 400, y = 240, t='linear', duration=0.5)
            anim.start(self.car)
    
            animRpm = Animation(scale=1, opacity = 1, x = 80, y = -5, t='linear', duration=0.5)
            animRpm.start(self.rpm)
    
        def maximizeCar(self, *args):
            print("max")
            anim = Animation(scale=1, opacity = 1, x=257, y=84, t='linear', duration=0.5)
            anim.start(self.car)
    
            animRpm = Animation(scale=0.5, opacity = 0, x = 80, y = -5, t='linear', duration=0.5)
            animRpm.start(self.rpm)
    
    
    class Car(Scatter):
        carImage = StringProperty("car362/car.png")
    
        driverDoorClosedImage = StringProperty("car362/driverClosedDoor.png")
        driverDoorOpenedImage = StringProperty("car362/driverOpenedDoor.png")
    
        passangerDoorClosedImage = StringProperty("car362/passangerClosedDoor.png")
        passangerDoorOpenedImage = StringProperty("car362/passangerOpenedDoor.png")
    
        leftDoorClosedImage = StringProperty("car362/leftClosedDoor.png")
        leftDoorOpenedImage = StringProperty("car362/leftOpenedDoor.png")
    
        rightDoorClosedImage = StringProperty("car362/rightClosedDoor.png")
        rightDoorOpenedImage = StringProperty("car362/rightOpenedDoor.png")
    
        doorsStates = NumericProperty(0)
    
        size = (286, 362)
    
        def __init__(self, **kwargs):
            super(Car, self).__init__(**kwargs)
    
            _car = Image(source=self.carImage, size=self.size)
    
            self.driverDoorOpened = Image(source=self.driverDoorOpenedImage, size=self.size)
            self.passangerDoorOpened = Image(source=self.passangerDoorOpenedImage, size=self.size)
            self.leftDoorOpened = Image(source=self.leftDoorOpenedImage, size=self.size)
            self.rightDoorOpened = Image(source=self.rightDoorOpenedImage, size=self.size)
    
            self.driverDoorClosed = Image(source=self.driverDoorClosedImage, size=self.size)
            self.passangerDoorClosed = Image(source=self.passangerDoorClosedImage, size=self.size)
            self.leftDoorClosed = Image(source=self.leftDoorClosedImage, size=self.size)
            self.rightDoorClosed = Image(source=self.rightDoorClosedImage, size=self.size)
    
            self.add_widget(_car)
            self.add_widget(self.driverDoorOpened)
            self.add_widget(self.passangerDoorOpened)
            self.add_widget(self.leftDoorOpened)
            self.add_widget(self.rightDoorOpened)
    
            self.bind(doorsStates=self._update)
    
        def _update(self, *args):
            driverDoorStates = self.doorsStates&1
            passangerDoorStates = self.doorsStates&4
            leftDoorStates = self.doorsStates&16
            rightDoorStates = self.doorsStates&64
            if driverDoorStates != 0:
                try:
                    self.remove_widget(self.driverDoorOpened)
                    self.add_widget(self.driverDoorClosed)
                except:
                    pass
            else:
                try:
                    self.remove_widget(self.driverDoorClosed)
                    self.add_widget(self.driverDoorOpened)
                except:
                    pass
            if passangerDoorStates != 0:
                try:
                    self.remove_widget(self.passangerDoorOpened)
                    self.add_widget(self.passangerDoorClosed)
                except:
                    pass
            else:
                try:
                    self.remove_widget(self.passangerDoorClosed)
                    self.add_widget(self.passangerDoorOpened)
                except:
                    pass
            if leftDoorStates != 0:
                try:
                    self.remove_widget(self.leftDoorOpened)
                    self.add_widget(self.leftDoorClosed)
                except:
                    pass
            else:
                try:
                    self.remove_widget(self.leftDoorClosed)
                    self.add_widget(self.leftDoorOpened)
                except:
                    pass
            if rightDoorStates != 0:
                try:
                    self.remove_widget(self.rightDoorOpened)
                    self.add_widget(self.rightDoorClosed)
                except:
                    pass
            else:
                try:
                    self.remove_widget(self.rightDoorClosed)
                    self.add_widget(self.rightDoorOpened)
                except:
                    pass
    
    class Gauge(Scatter):
        unit = NumericProperty(1.125)
        zero = NumericProperty(116)
        value = NumericProperty(10) #BoundedNumericProperty(0, min=0, max=360, errorvalue=0)
        size_gauge = BoundedNumericProperty(512, min=128, max=512, errorvalue=128)
        size_text = NumericProperty(10)
        file_gauge = StringProperty("")
    
        def __init__(self, **kwargs):
            super(Gauge, self).__init__(**kwargs)
    
            self._gauge = Scatter(
                size=(self.size_gauge, self.size_gauge),
                do_rotation=False, 
                do_scale=False,
                do_translation=False
                )
    
            _img_gauge = Image(source=self.file_gauge, size=(self.size_gauge, self.size_gauge))
    
            self._needle = Scatter(
                size=(self.size_gauge, self.size_gauge),
                do_rotation=False,
                do_scale=False,
                do_translation=False
                )
    
            _img_needle = Image(source="arrow512.png", size=(self.size_gauge, self.size_gauge))
    
    
            self._gauge.add_widget(_img_gauge)
            self._needle.add_widget(_img_needle)
    
            self.add_widget(self._gauge)
            self.add_widget(self._needle)
    
            self.bind(pos=self._update)
            self.bind(size=self._update)
            self.bind(value=self._turn)
    
        def _update(self, *args):
            self._gauge.pos = self.pos
            self._needle.pos = (self.x, self.y)
            self._needle.center = self._gauge.center
    
        def _turn(self, *args):
            self._needle.center_x = self._gauge.center_x
            self._needle.center_y = self._gauge.center_y
            a = Animation(rotation=-self.value*self.unit   self.zero, t='in_out_quad',duration=0.05)
            a.start(self._needle)
    
    class requestsLoop(Thread):
        def __init__(self):
            Thread.__init__(self)
            self.daemon = True
            self.start()
    
        canCommands = [
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_DOORS_COMMAND'] >> 8, messageCommands['GET_DOORS_COMMAND'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_SPEED'] >> 8, messageCommands['GET_SPEED'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_KM_LEFT'] >> 8, messageCommands['GET_KM_LEFT'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_RPM'] >> 8, messageCommands['GET_RPM'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_OIL_TEMPERATURE'] >> 8, messageCommands['GET_OIL_TEMPERATURE'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_FUEL_LEFT'] >> 8, messageCommands['GET_FUEL_LEFT'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_OUTDOOR_TEMPERATURE'] >> 8, messageCommands['GET_OUTDOOR_TEMPERATURE'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x746, data=[0x03, 0x22, messageCommands['GET_INDOOR_TEMPERATURE'] >> 8, messageCommands['GET_INDOOR_TEMPERATURE'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_COOLANT_TEMPERATURE'] >> 8, messageCommands['GET_COOLANT_TEMPERATURE'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False),
            can.Message(arbitration_id=0x714, data=[0x03, 0x22, messageCommands['GET_TIME'] >> 8, messageCommands['GET_TIME'] & 0xff, 0x55, 0x55, 0x55, 0x55], extended_id=False)
        ]
    
        def run(self):
            while True:
                for command in self.canCommands:
                    bus.send(command)
                    time.sleep(0.005)
    
    class BoxApp(App):
        def build(self):
            dashboard = Dashboard();
            listener = CanListener(dashboard)
            can.Notifier(bus, [listener])
    
            return dashboard
            
    if __name__ == "__main__":
        # Send requests
        requestsLoop()
    
        _old_excepthook = sys.excepthook
        def myexcepthook(exctype, value, traceback):
            if exctype == KeyboardInterrupt:
                print "Handler code goes here"
            else:
                _old_excepthook(exctype, value, traceback)
        sys.excepthook = myexcepthook
    
        # Show dashboard
        BoxApp().run()
    

    Для работы используются три нитки:

    1. В основном потоке на экране отображаются графические элементы (спидометр, тахометр, часы, температура и т.д.)
    2. Во втором потоке каждые 5 мс опрашивается очередной датчик
    3. В третьем потоке прослушивается шина CAN, принимается ответ, анализируется и обновляется соответствующий графический элемент.

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

    Проект “Цифровая приборная панель” открыт. Жду ваших предложений и комментариев!

    Хакаем can шину авто. виртуальная панель приборов

    В первой статье “Перехват CAN-шины автомобиля для голосового управления” я подключился непосредственно к CAN-шине Comfort в двери своего автомобиля и изучил проходящий трафик, что позволило мне определить команды управления стеклоподъемниками, центральным замком и т.д.

    В этой статье вы узнаете, как создать собственную цифровую или виртуальную приборную панель и собирать данные с любого датчика вашего автомобиля VAG (Volkswagen, Audi, Seat, Skoda).

    Объединив сниффер CAN и чип CAN для Raspberry Pi на основе модуля MCP2515 TJA1050 Niren, я разработал цифровую приборную панель, использующую 7-дюймовый дисплей Raspberry Pi. Помимо отображения информации, цифровая панель реагирует на кнопки рулевого колеса и другие события в автомобиле.

    Устройства рисования можно создать с помощью Kivy для Python. Для вывода графики вместо X используется GL.

    Оцените статью
    OBD
    Добавить комментарий

    Adblock
    detector