Переходник GM 12pin – OBD2 16pin по доступной цене

Переходник GM 12pin - OBD2 16pin по доступной цене ОБД2

Автомобильная промышленность

Современный автомобиль может иметь до 70 электронных блоков управления (ЭБУ) для различных подсистем. Традиционно самым большим процессором является блок управления двигателем . Другие используются для автономного вождения, расширенной системы помощи водителю (ADAS), трансмиссии , подушек безопасности , антиблокировочной системы тормозов / ABS , круиз-контроля , электроусилителя руля , аудиосистем, электрических стеклоподъемников , дверей, регулировки зеркал, аккумуляторной батареи и систем подзарядки для гибридных / электрических автомобили и т. д.

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

Одним из ключевых преимуществ является то, что взаимосвязь между различными системами транспортного средства может позволить реализовать широкий спектр функций безопасности, экономии и удобства с использованием только программного обеспечения – функциональность, которая увеличила бы стоимость и сложность, если бы такие функции были «жестко подключены» с использованием традиционной автомобильной электрики. Примеры включают:

  • Автоматический запуск / остановка : различные входные сигналы датчиков со всего транспортного средства (датчики скорости, угла поворота рулевого колеса, включение / выключение кондиционера, температура двигателя) сопоставляются через шину CAN, чтобы определить, можно ли остановить двигатель в неподвижном состоянии для повышения экономии топлива и выбросы.
  • Электрический стояночный тормоз : функция “удержания на холме” принимает входные данные от датчика наклона автомобиля (также используемого системой охранной сигнализации) и датчиков скорости движения (также используемых системой ABS, системой управления двигателем и противобуксовочной системой) по шине CAN, чтобы определить, автомобиль остановлен на склоне. Точно так же сигналы от датчиков ремня безопасности (часть органов управления подушками безопасности) поступают от шины CAN, чтобы определить, пристегнуты ли ремни безопасности, так что стояночный тормоз автоматически отпускается при трогании с места.
  • Системы помощи при парковке : когда водитель включает передачу заднего хода, блок управления трансмиссией может послать сигнал по шине CAN для активации как системы датчика парковки, так и модуля управления дверью, чтобы зеркало на боковой двери переднего пассажира наклонилось вниз, чтобы показать положение бордюр. Шина CAN также принимает входные сигналы от датчика дождя для включения стеклоочистителя заднего стекла при движении задним ходом.
  • Системы автоматического ассистента движения по полосе / предотвращения столкновений : входные сигналы от датчиков парковки также используются шиной CAN для передачи данных о внешнем приближении в вспомогательные системы водителя, такие как предупреждение о выезде с полосы движения, а в последнее время эти сигналы проходят через шину CAN для активации тормоза. по проводам в системах активного предотвращения столкновений.
  • Автоматическая очистка тормозов: сигнал поступает от датчика дождя (используется в основном для автоматических дворников ) через шину CAN на модуль ABS, чтобы инициировать незаметное торможение во время движения для удаления влаги с тормозных роторов. Некоторые высокопроизводительные модели Audi и BMW включают эту функцию.
  • Датчики могут быть размещены в наиболее подходящем месте, а их данные используются несколькими ЭБУ. Например, датчики наружной температуры (традиционно размещаемые спереди) можно разместить в наружных зеркалах, чтобы избежать нагрева двигателем, и данные, используемые двигателем, климат-контролем и дисплеем водителя.

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

Правильная распиновка или как проверить переходник obd2 gm12 pin для ваз

Купив Переходник OBD2 GM12 pin для ВАЗ не спешите подключать его к своему автомобилю Прежде всего проверьте распиновку.

Не подключаетсяK— Lineадаптер (VAGCOM)

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

Данная проблема имеет два подвида:

— Проблема при подключении адаптера к ПК (с нашим адаптером K-Line 409, в комплекте идет видео инструкция по работе с прибором, рекомендуем ознакомится с ней если у Вас возникают вопросы)

— Проблема подключения адаптера K Line 409 (VAG COM) к автомобилю

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

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

Подключение obd2 к gm12

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

Код ошибки:  Может ли гореть чек из за генератора

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

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

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

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

Возможно провод просто немного отошел из колодки (колодки АПС иммобилизатора) и нормальный контакт отсутствует. Если Вы проверили контакты на автомобиле и все в порядке, а кабель по-прежнему не заработал, то Вам необходимо выполнить следующие действия:

— Проверить напряжение на К-линии. Для этого, выставите на мультиметре режим для измерения постоянного напряжения, после чего красный щуп подключите к проводу К-линии, а черный щуп подсоединяем на “массу” к любой точке кузова. Посмотрите на показания прибора, прибор должен отобразить напряжениеоколо 12 В плюс минус 2В.

Распиновка колодкиOBD2Распиновка колодкиGM12PinOBD1

Подключение obd2 к gm12

2) Если на Вашем автомобиле ВАЗ разъем с АПС отключен, Вам необходимо проверить наличия перемычки в колодке АПС между 9 и 18 контактами колодки.

Подключение obd2 к gm12

4) Если Вы используете переходник на GM 12 pin для старого разъема OBD1 используемого на автомобилях ВАЗ по 2004 г.в., а так же nexia n100 и matiz, у Вас может быть, не разведено питание с бензонасоса, в этом случае Вам необходимо доработать Вашу проводку на разъеме.

3) Проблема может быть в иммобилайзере (сигнал К-линии приходит, но после иммобилайзера пропадает). Проверьте наличие сигнала К-линии на 18 контакте колодки АПС. Этим же способом можно проверить, есть ли обрыв между колодкой АПС разъемом диагностической колодки. (при некорректном отключении иммо, к линия до диагностической колодки может не доходить.)

При использовании адаптера так же не забудьте о базовых правилах:

— подключение и выключение адаптера в диагностический разъем необходимо выполнять при отключенном зажигании.

-диагностировать автомобиль необходимо на включенном зажигании или заведенном двигателе (отдельные модели вроде Январь 5.1 диагностируются только на заведенном двигателе )

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

— не допускается совместное использование встроенного БК автомобиля и K-line адаптера т.к. связь по одному проводу для двух устройств, как правило, вызывает ошибки подключения, отключите БК на время тестирования автомобиля K-Line адаптером после чего подключите вновь.

Эти правила сохранят работоспособность Вашего ЭБУ и K Line адаптера.

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

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

Переходник GM 12pin - OBD2 16pin по доступной цене
Первая версия панели приборов

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

Переходник GM 12pin - OBD2 16pin по доступной цене
Вторая версия панели приборов

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

Переходник GM 12pin - OBD2 16pin по доступной цене
Третья версия панели приборов

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

Kivy позволяет запускать приложение без Иксов, прямо из консоли, в качестве рендера используется 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()

Код ошибки:  115 объявлений - Купить квартиру в ЖК Кубанский в Краснодаре от застройщика, официальный сайт жилого комплекса Кубанский, цены на квартиры, планировки - ЦИАН

Алгоритм работы следующий, используется 3 потока:

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


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

Проект цифровой панель приборов открытый. Рад буду предложениям и комментариям!

Физическая организация

CAN – это стандарт последовательной шины с несколькими ведущими устройствами для подключения электронных блоков управления (ЭБУ), также известных как узлы ( автомобильная электроника является основной областью применения).

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

Такой компьютер также может быть шлюзом, позволяющим компьютеру общего назначения (например, портативному компьютеру) обмениваться данными через порт USB или Ethernet с устройствами в сети CAN.

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

Эта шина использует дифференциальные сигналы проводного И. Два сигнала, CAN high (CANH) и CAN low (CANL), либо переводятся в «доминирующее» состояние с CANH> CANL, либо не управляются и не переводятся пассивными резисторами в «рецессивное» состояние с CANH ≤ CANL.

Переходник GM 12pin - OBD2 16pin по доступной цене

Высокоскоростная сеть CAN. ISO 11898-2

ISO 11898-2 , также называемый высокоскоростной CAN (битовая скорость до 1 Мбит / с на CAN, 5 Мбит / с на CAN-FD), использует линейную шину, оконцованную на каждом конце резисторами 120 Ом.

Высокоскоростная сигнализация CAN направляет провод CANH к 3,5 В, а провод CANL к 1,5 В, когда какое-либо устройство передает доминантный (0), в то время как, если ни одно устройство не передает доминантный сигнал, согласующие резисторы пассивно возвращают два провода в рецессивный (1) состояние с номинальным дифференциальным напряжением 0 В.

(Приемники считают любое дифференциальное напряжение менее 0,5 В рецессивным.) Доминирующим дифференциальным напряжением является номинальное 2 В. Доминирующее синфазное напряжение (CANH CANL) / 2 должно быть в пределах от 1,5 до 3,5 В от общего, а рецессивное синфазное напряжение должно быть в пределах ± 12 от общего.

Переходник GM 12pin - OBD2 16pin по доступной цене

Низкоскоростная отказоустойчивая CAN-сеть. ISO 11898-3

ISO 11898-3 , также называемый низкоскоростной или отказоустойчивой CAN (до 125 кбит / с), использует линейную шину, звездообразную шину или несколько звездообразных шин, соединенных линейной шиной, и оканчивается на каждом узле на долю общее оконечное сопротивление. Общее оконечное сопротивление должно быть не менее 100 Ом.

Переходник GM 12pin - OBD2 16pin по доступной цене

Низкоскоростная сигнализация CAN. ISO 11898-3

Низкоскоростная отказоустойчивая сигнализация CAN работает аналогично высокоскоростной CAN, но с большими колебаниями напряжения. Доминантное состояние передается путем направления CANH к напряжению источника питания устройства (5 В или 3,3 В) и CANL к 0 В при передаче доминирующего (0), в то время как согласующие резисторы переводят шину в рецессивное состояние с CANH на 0.

Гостиница обд цены, фотографии, отзывы, адрес. россия

Услуги

:

Кофеварка/чайник, Ванна, Телевизор, Кондиционер, Мини-кухня, Балкон, Холодильник, Бесплатные туалетные принадлежности, Туалет, Микроволновая печь, Собственная ванная комната, Отопление, Кухня, Ванна или душ, Телевизор с плоским экраном, Отдельный вход, Вид из окна, Обеденный уголок, Электрический чайник, Кухонные принадлежности, Шкаф или гардероб, Духовка, Плита, Вид на город, Полотенца, Белье, Обеденный стол, Для доступа к верхним этажам работает лифт, Вешалка для одежды, Туалетная бумага, Корзины для мусора, Шампунь, Мыло, Розетка около кровати, Неперьевая подушка, Работает лифт, Датчик дыма, Вход по ключу

Размер номера:

40

Четырехместный номер с балконом, кондиционером и микроволновой печью.

Подробнее »


Услуги

:

Кофеварка/чайник, Ванна, Телевизор, Кондиционер, Мини-кухня, Балкон, Холодильник, Туалет, Микроволновая печь, Собственная ванная комната, Отопление, Кухня, Ванна или душ, Телевизор с плоским экраном, Отдельный вход, Вид из окна, Электрический чайник, Шкаф или гардероб, Духовка, Плита, Полотенца, Белье, Обеденный стол, Для доступа к верхним этажам работает лифт, Вешалка для одежды, Туалетная бумага, Корзины для мусора, Розетка около кровати, Неперьевая подушка, Работает лифт, Датчик дыма, Вход по ключу

Размер номера:

40

Подробнее »


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