Leitor OBD2 - diagnóstico automóvel

Ao criar o aplicativo, fomos confrontados com muitas opções, problemas e assim por diante, com os quais tentaremos familiarizá-lo neste artigo. Como se viu, você pode dialogar com o carro e bastante produtivo. Naturalmente, para organizar a comunicação com o carro, você precisa "estabelecer contato", "fazer a pergunta certa" e entender corretamente a "resposta" recebida do carro. Assim, o artigo terá como objetivo explicar a organização do diálogo em um idioma acessível, além de informar quais erros você pode encontrar ao longo do caminho e como lidar com eles.

Escolha de conexão


Inicialmente, é necessário esclarecer que um adaptador ELM327 será usado para conectar ao carro. O ELM327 é um microcircuito que permite converter os protocolos usados ​​nos barramentos de diagnóstico de automóveis no protocolo RS232, para o qual transferiremos dados. Devido ao fato de a transmissão de dados via protocolo RS232 ocorrer seqüencialmente, surge o primeiro problema - a velocidade de transferência de dados, que tentaremos contornar em um dos parágrafos a seguir.

Existem várias variações do adaptador ELM327, que são classificadas pelo método de transferência de dados - Bluetooth, WIFI, USB. Com base no fato de que o objetivo de desenvolvimento é um dispositivo móvel com Android, você pode escolher as duas versões mais adequadas do ELM327, como Bluetooth e WIFI. Como existe apenas uma maneira de receber e processar dados, e eles diferem apenas nas opções de conexão com o adaptador, você pode escolher apenas uma, organizar um diálogo com ele e adicionar as opções de conexão restantes.

ELM327 1.5 vs ELM327 2.1




Um dos primeiros problemas que você pode encontrar foi o problema de escolher o adaptador diretamente, no nosso caso, o Bluetooth. Acontece que, se você precisar oferecer suporte a todos (pelo menos a maioria) dos carros, precisará escolher a versão v1.5 em vez da v2.1, que de fato precisa ser esclarecida várias vezes ao comprar um adaptador, porque os vendedores tentam fornecer a versão do adaptador não para a que é de fato, porque eles não são particularmente diferentes. De fato, na versão v2.1 não há suporte para os protocolos J1850 PWM e J1850 VPW, o que significa que você não poderá se conectar aos carros que usam esses protocolos.

Ligação


A conexão ao adaptador ocorre em vários estágios:

  • Conectando a um adaptador (Bluetooth, WIFI)
  • Enviando comandos de inicialização (sequência de inicialização)

Se tudo estiver claro com a organização da conexão. O princípio de operação é o mesmo de qualquer bate-papo Bluetooth / WIFI. Para entender como enviar a string de inicialização, é necessário estudar quais comandos existem, bem como quais funções eles executam.

AT Z [redefinir tudo]
Redefina as configurações do adaptador para os padrões de fábrica.
AT L1-0
Ativar / desativar feeds de linha.
AT E1-0
Eco ligado - desligado
AT H1-0
Cabeçalhos ativados - desativados
AT AT0-1-2
Tempo adaptativo desativado - Tempo adaptativo Auto1 - Tempo adaptativo Auto2
AT ST FF
Defina o tempo limite para o máximo.
AT D [defina tudo como padrão]
Redefina as configurações para o estado inicial configurado pelo usuário.
AT DP [Descreva o protocolo atual]
O scanner é capaz de determinar independentemente o protocolo do veículo ao qual está conectado.
AT IB10 [defina a taxa de transmissão ISO para 10400]
O comando define a taxa de transmissão para ISO 9141-2 e
ISO 14230-4 10400
AT IB96 [defina a taxa de transmissão ISO para 9600]
O comando define a taxa de transmissão para ISO 9141-2 e
ISO 14230-4 9600 para protocolos 3,4,5.
AT SP h [Definir protocolo h]
O comando de seleção de protocolo h, onde h:

0 - Automático;
1 - SAE J1850 PWM (41,6 Kbaud);
2 - SAE J1850 VPW (10,4 Kbaud);
3 - ISO 9141-2 (5 baud init, 10,4 Kbaud);
4 - ISO 14230-4 KWP (5 baud init, 10,4 Kbaud);
5 - ISO 14230-4 KWP (inicialização rápida, 10,4 Kbaud);
6 - ISO 15765-4 CAN (11 bits ID, 500 Kbaud);
7 - ISO 15765-4 CAN (ID de 29 bits, 500 Kbaud);
8 - ISO 15765-4 CAN (11 bits ID, 250 Kbaud);
9 - ISO 15765-4 CAN (ID de 29 bits, 250 Kbaud);
AT SP Ah [Definir protocolo h com Auto]

O comando define o protocolo padrão h, se a conexão usando o protocolo h falhar, o adaptador inicia a seleção automática do protocolo.

Com base nos comandos descritos acima, formamos a string de inicialização.

initializeCommands = Arrays.asList("ATZ", "ATL0", "ATE1", "ATH1", "ATAT1", "ATSTFF", "ATDP", "ATSP0"); 

É aconselhável permitir que o usuário altere os comandos de inicialização, pois, para selecionar a “chave” de alguns carros, é necessário escolher configurações mais adequadas do adaptador. No nosso caso, são usadas configurações adequadas para a maioria dos protocolos padrão.

Também é aconselhável prestar atenção ao comando APSP0; portanto, definimos a seleção automática de protocolo padrão, isso pode levar algum tempo.

Portanto, se o usuário souber qual é o seu protocolo automático, então, usando a capacidade de alterar o protocolo de conexão, ele poderá alterar 0 para o número do protocolo.

Ler dados de diagnóstico


Os comandos especiais do PID são usados ​​para ler dados de diagnóstico.
PID (IDs de parâmetro - identificadores de parâmetro de diagnóstico a bordo) - códigos usados ​​para consultar o desempenho de sensores específicos do veículo.

Os principais pids podem ser encontrados na Wikipedia, existe um conjunto completo de comandos básicos que todos os carros devem suportar. Também existem conjuntos de comandos para determinadas marcas e tipos de carros; esses conjuntos são fornecidos por uma taxa. No nosso caso, o aplicativo é focado no diagnóstico básico de carros, respectivamente, usamos o conjunto básico de comandos.

Também é possível receber dados atuais do carro, enquanto o comando para receber dados do carro terá 01 no início, indicando que queremos obter dados reais. Se queremos obter os dados salvos do carro, no início do comando, você deve especificar 02 . Por exemplo, o comando para obter a velocidade atual do carro é 010D e obter a velocidade salva - 020D .

Se você observar atentamente o número de comandos fornecidos por recursos abertos, poderá observar o problema que escrevi no início, a saber, o problema da velocidade de resposta do adaptador. Como o envio e o recebimento de comandos é seqüencial, para receber as leituras do sensor no momento atual, é necessário aguardar uma resposta para todos os comandos anteriores. Portanto, se você solicitar o recebimento de todos os comandos, há uma alta probabilidade de que a atualização de dados reais ocorra muito lentamente. Mas esse problema pode ser resolvido se você usar os comandos que exibem apenas as equipes que existem no carro. Por exemplo:

0100 - PIDs suportados [01 - 20]
0120 - PIDs suportados [21 - 40]
0140 - PIDs suportados [41 - 60]
0160 - PIDs suportados [61 - 80]
0180 - PIDs suportados [81 - A0]
01A0 - PIDs suportados [A1 - C0]

Vou demonstrar como determinar quais sensores estão presentes no carro usando um dos pids. Por exemplo:

  • 0100 \\ solicitação
  • BB1E3211 \\ resposta do carro

Traduzimos a resposta do carro para um sistema de números binários

 BB1E3211(16) > 10111011000111100011001000010001(2) 

Usando a placa a seguir, podemos determinar quais pids são suportados pelo nosso carro, começando de 01 a 20:



Com base nos dados obtidos, podemos determinar que nosso carro suporta os seguintes pids:

  01, 03, 04, 05, 07, 08, 0C, 0D, 0E, 0F, 13, 14, 17, 1C, 20 

Agora, em vez de enviar todas as 32 equipes e esperar por uma resposta, apesar de algumas estarem ausentes, usaremos apenas 15 equipes. Mas esse não é o limite da chamada otimização. Para que os dados sejam atualizados ainda mais rapidamente, recomendamos que você solicite apenas dados sobre os sensores que são exibidos na tela. Embora isso limite algumas funcionalidades do aplicativo. Por exemplo, um registro histórico.

Leitura e decodificação de erros do carro


Os erros do carro também podem ser diferentes e existem comandos separados para eles também. Por exemplo:

  • 03 - Para exibir códigos de erro salvos
  • 0A - Para exibir códigos de erro persistentes.

Como em outros comandos, os erros do carro vêm na forma codificada, respectivamente, como em outros comandos, eles precisam ser decodificados para obter as informações necessárias. Deixe-me dar um exemplo de como a decodificação de erros funciona. Código:

 private final static char[] dtcLetters = {'P', 'C', 'B', 'U'}; private final static char[] hexArray = "0123456789ABCDEF".toCharArray(); private void performCalculations(String fault) { final String result = fault; String workingData = ""; int startIndex = 0; troubleCodesArray.clear(); try { if (result.contains("43")) { workingData = result.replaceAll("^43|[\r\n]43|[\r\n]", ""); } else if (result.contains("47")) { workingData = result.replaceAll("^47|[\r\n]47|[\r\n]", ""); } for(int begin=startIndex; begin < workingData.length(); begin += 4) { String dtc = ""; byte b1 = Utility.hexStringToByteArray(workingData.charAt(begin)); int ch1 = ((b1 & 0xC0) >> 6); int ch2 = ((b1 & 0x30) >> 4); dtc += dtcLetters[ch1]; dtc += hexArray[ch2]; dtc += workingData.substring(begin + 1, begin + 4); if (dtc.equals("P0000")) { continue; } troubleCodesArray.add(dtc); } } catch (Exception e) { Log.e(TAG, "Error: " + e.getMessage()); } } 

E agora para a explicação.

Com base na resposta recebida, podemos obter um código de erro, para isso decodificamos a mensagem recebida usando as seguintes placas.

Primeiro personagem:



Segundo caractere:



3, 4, 5 caracteres são formados de acordo com esta tabela:



Com base nisso, podemos tentar analisar a resposta a seguir 0001000000111110



Código de erro: P103E

Epílogo


Nesse estágio, descobrimos como organizar um diálogo com o adaptador, enviar comandos a ele, receber e descriptografar suas respostas. Essa é uma grande parte do trabalho, se você considerar quanto tempo leva para estudar o material, mas ao mesmo tempo bastante interessante. Fora deste artigo, existem muitos problemas associados à interface visual, além de muitas funções adicionais, como adicionar novos pids de um arquivo, uma maneira padrão e avançada de conectar-se ao adaptador e criar gráficos.

Matvienko Alexander, Hossein Fakhr.

Source: https://habr.com/ru/post/pt444726/


All Articles