8-12-2019
SIMULADOR Diagnosis OBDII Diseño, construcción y programación.
Autor: Joaquin Berrocal Piris
ARDUINO MEGA, EAGLE, TORQUE PRO,
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
CONSTRUCCIÓN Y MONTAJE (Se montará la placa shield sobre la Arduino Mega 2560 R3) Diseño en el programa EAGLE 8.0 del circuito y de la placa shield a montar sobre la placa Arduino Mega 2560 R3
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
Llegada de la placa que se diseñó
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
MONTAJE DE COMPONENTES
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquÃn Berrocal Piris
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
Luz verde activa indica que hay entendimiento, vía bluetooth, entre el programa TORQUE PRO del móvil con la interfaz OBDII ELM327 de la placa. Tendremos la posibilidad de lectura de parámetros y lectura/borrado de averías,
3 rpm Motor
6 Temp Refrigerante
2 Velocímetro
5 Temp Ambiente
1 Pos Acelerador
Simulador Diagnosis OBDII con protocolo ISO 9141-2
4 Nivel Aforador
por Joaquín Berrocal Piris
La conexión inicial se hará con el protocolo OBDII ISO 9141-2 a 5 baud. Está programado para la lectura de 6 parámetros del vehículo: (debe encontrarse el SWICH 1 en ON, es decir, puesto a masa) 1-. Posición del acelerador 2-. Velocímetro (Speed) 3-. Rpm del Motor
4-. Nivel de combustible 5-. Temperatura del Aire ºC 6-. Temperatura del refrigerante motor ºC
Y para la lectura de 7 posibles averías: (debe encontrarse el SWICH 1 en OFF, es decir puesto a nivel 1) El Swich 4-7 y 8 provocan averías Graves y activan el led ambar. SWICH 1 SWICH 2 SWICH 3 SWICH 4 SWICH 5 SWICH 6 SWICH 7 SWICH 8
En OFF, es decir, a nivel 1 que corresponde a estar desplazado hacia el número DTC P0301 Fallo en el cilindro nº 1 DTC P0340 Mal functo del sensor de posición del árbol de levas DTC P0217 Engine Coolant Over Temperature condition DTC P0171 System too lean (exceso de oxígeno en los gases de escape) DTC P0500 Vehícle Speed Sensor (Sensor de velocidad) DTC P0420 Catalyst System Efficiency Below threshold DTC P0068 Diferencias entre el MAP/MAF Sensor de posición del acelerador
Off ^ On
8 -------1
3 rpm Motor
6 Temp Refrigerante
2 Velocímetro
5 Temp. Ambiente
1 Pos Acelerador
4 Nivel Combutible
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
CONFIGURACIÓN Y USO DEL PROGRAMA DE DIAGNOSIS TORQUE PRO V1.8.190 Debido a sus limitaciones no se podrán ver más de 3 ó 4 parámetros operativos a la vez. La conexión con la interfaz ELM 327 se hace vía bluetooth.
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
LECTURA DE PARÁMETROS DEL VEHÍCULO (La información son de los 6 potenciómetros que simulan sensores del vehículo)
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
LECTURA DE AVERÍAS. Switch 1 en OFF. (Switch 2 a 7 total hasta 6 averías) Por limitaciones del programa Torque Pro, seleccionar un máximo de 3 ó 4 averías a la vez.
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
LA PLACA ESTÁ PREPARADA PARA AÑADIRLE UN LCD 4X20 VÍA I2CLCD. PRESENTO IMÁGENES (En este proyecto lo descarto, pues me da problema en las lecturas OBDII)
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
DOS MANERAS DE PODER MONTAR LA LCDI2C 4X20 SOBRE LA PLACA SHIELD
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquÃn Berrocal Piris
La placa Shield construida se montará sobre la placa Arduino mega 2560 R3 (nota; no hago uso en este proyecto de la LCD por problemas en la comunicación con el torquepro)
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
PROGRAMACIÓN CON ARDUINO V1-6-4 1 /*"Simulador_OBDII_Joaquin_Berrocal_Piris_Marzo_2018.ino" 2 realizado por: JOAQUÍN BERROCAL PIRIS 3 El proyecto consiste en el diseño y fabricación de un Simulador capaz de comunicarse con un equipo de diagnóstico 4 de cualquier vehículo con el protocolo ISO 9141-2. Enviar y recibir tramas según el estándar. 5 Simular parámetros del vehículo en tiempo real, lectura-borrado de códigos de fallo motor, activación de 6 luz indicadora de avería "MIL". 7 Nos evita la necesidad de tener el vehículo y de trabajar con los propios sensores del mismo, teniendo que pinchar 8 en su cableado, lo que podría producir su deterioro. 9 Con este desarrollo se anulan estos problemas, al ser todo a nivel software y placa "shield" que tendremos que construir. 10 11 Es por ello, por lo que está muy indicado para cursos de formación sobre diagnosís de fallos de motor y, muy especialmente, 12 en la formación en los ciclos formativos pertenecientes a la familia profesional de 13 “Transporte y Mantenimiento de Vehículos" como son; Automoción / Electromecánica de Vehículos Automóviles etc. 14 15 La placa shield se montará sobre una tarjeta ARDUINO MEGA 2560 y de la que se alimentará a través de 16 su borne "Vin" a 11,3V, siendo la tensión de la Arduino Mega de 12V. 17 Dispondrá, para la simulación de: 18 -. 6 Potenciómetros, que harán las veces de sensores del vehículo 19 -. 8 Microinterruptores para distintas Funciónes como, detección de averías, lectura ECU, borrado.. 20 -. 1 led Rojo: para indicar que está alimentada. 21 -. 1 led Verde: para indicar que tiene comunicación correcta con la arduino mega y el OBDII 22 -. 1 led Rojo: para indicación de avería importante "MIL" 23 -. Conector OBDII para su conexión a la interfaz OBDII "ELM327" 24 -. Y como equipo de diagnostico se usará por su bajo precio, unos 4€, la interfaz "ELM327" 25 (El ELM327 hace de puente entre el lenguaje del sistema OBDII y el RS232) 26 -. Programa "TORQUE PRO.apk" para que, desde el tfno móvil, podamos controlar la interfaz "ELM327" vía bluetooth 27 -. También se podrán ver los datos a través del puerto serie (USB)de la placa arduino con un PC. 28 29 30 +++++++++++++++++CONEXIONES PLACA SHIELD CON ARDUINO E INTERFAZ ELM327++++++++++++++ 31 ----------- SHIELD con el CONECTOR OBDII-ELM327;----------32 + Lo primero que debemos hacer es insertar en la Arduino MEGA la placa shield fabricada en su posición adecuada 33 34 + Alimentar la Arduino MEGA a 12V DC. así obtendremos por su borne "Vin" los 11.3V necesario para alimentar. 35 la placa shield y, desde ahí, alimentar por el borne 16 del conector OBDII al ELM327. 36 Bornes del interfaz ELM327 usados: 37 borne 7 (K-Line del protocolo ISO 9141-2) esta línea es de doble dirección. 38 borne 5 GND 39 Borne 16 alimentación a través del borne VIN de la mega 11,3V.
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
40 41 + Acoplar el interfaz ELM327-OBDII. Abrir la app TORQUEPRO desde un teléfono android. Vincular el dispositivo 42 de diagnóstico por bluetooth y esperamos que se nos encienda el led Verde de inicialización. 43 44 En la inicialización el tester, primero se verifica la alimentación y la conexión bluetooth con el dispoitivo Android, 45 luego debe reconocer el protocolo que usa el simulador del vehículo y después enviar las tramas de petición de 46 los diferentes PIDs que se encuentran en la pantalla. Si éstos se reciben correctamente y en el tiempo establecido 47 se tendrá un resultado correcto. 48 49 ----------------------------------------------------------50 ------------- SHIELD con ARDUINO MEGA;---------------51 LED_MIL (R_MIL) al pin 50 52 LED_ready (V_PREPARADO_OK) al pin 52 53 54 POT16 al pin A0 Acelerador 55 POT17 al pin A1 Velocidad 56 POT18 al pin A2 Revoluciones motor 57 58 POT19 al pin A3 Nivel combustible 59 POT20 al pin A4 Temperatura aire 60 POT21 al pin A5 Temperatura refrigerante motor. 61 62 microinterruptores 63 SW1 pin 38 SW2 pin 36 SW3 pin 34 SW4 pin 32 SW5 pin 30 SW6 pin 28 SW7 pin 26 SW8 pin 24 64 65 66 Comunicación Pines: 14TX3 y 15RX3 67 NO USADOS EN ESTE PROYECTO: 68 Comunicación con LCD4x20-I2C Pines: SDA20 y SCL21 y pin +5V y GND 69 70 ----------------------------------------------------------71 72 */ 73 //---Variables Globales------74 75 //CONSTANTES 76 //INICIALIZACION 77 const int flanco_bajada = 0; 78 const int bit_start = 1; 79 const int up_bits_1 = 2; 80 const int low_bits_1 = 3; 81 const int up_bits_2 = 4; 82 const int low_bits_2 = 5; 83 const int margen_inf_200 = 195; 84 const int margen_sup_200 = 205; 85 const int margen_inf_400 = 395; 86 const int margen_sup_400 = 405; 87 const byte SINC = 0x55; 88 //const byte KW1 = 0x08; 89 //const byte KW2 = 0x08; 90 //const byte KW2_NEG = 0xF7; 91 const byte KW1 = 0x94; //KW para poner P2min a 0 (un solo ECU) 92 const byte KW2 = 0x94; 93 const byte KW2_NEG = 0x6B; //KW2_neg de 0x94 94 const byte DIR_NEG = 0xCC; 95 //PIDs 96 const byte PIDs_supported = 0x00; //PIDs soportados del 1 al 20 97 const byte MILyDTC = 0x01; //Estado del indicador MIL y numero de DTCs almacenados 98 const byte coolant = 0x05; //Temperatura del refrigerante 99 const byte rpm = 0x0C; //Revoluciones por minuto del motor 100 const byte vehicle_speed = 0x0D; //Velocidad del vehículo
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
const const const const const const const
byte byte byte byte byte byte byte
throttle_position = 0x11; //Posición del acelerador OBD_standard = 0x1C; //Posicion del acelerador total_time = 0x1F; //Tiempo desde el arranque PIDs_supported_20 = 0x20; //PIDs soportados del 21 al 40 fuel_level = 0x2F; PIDs_supported_40 = 0x40; //PIDs soportados del 41 al 60 air_temp = 0x46; //Temperatura ambiente
const byte fuel_type = 0x51; //Posicion del acelerador //MODOS DE OPERACION const byte mode1 = 0x01; const byte mode3 = 0x03; const byte mode4 = 0x04; //ESTADOS const int INICIALIZACION_1 = 0; const int INICIALIZACION_2 = 1; const int PETICIÓN_1 = 2; const int PETICIÓN_2 = 3; const int RESPUESTA = 4; //PINES const int obdpin = 15; //Posterior RX3 de la UART (Para INI a 5 baud) const int LED_ready = 52; const int LED_MIL = 50; const char throttle_pin = A0; const char speed_pin = A1; const char rpm_pin = A2; const char fuel_pin = A3; const char temp_pin = A4; const char coolant_pin = A5; const char sw1 = 38; const char sw2 = 36; const char sw3 = 34; const char sw4 = 32; const char sw5 = 30; const char sw6 = 28; const char sw7 = 26; const char sw8 = 24; //VARIABLES float A; int valor = 0; boolean ini5baud = false; boolean ini = false; boolean iter = false; int num_DTC = 0; boolean MIL = false; int estado = 0; int estado_ini_5baud = 0; boolean estado_ini_rapida = false; long tiempo_parado = 0; long previousMillis = 0; long principio_W4 = 0; byte trama_rx[11]; byte trama_tx[11]; byte pos_H[4]; byte pos_L[4]; byte sum = 0x00; int length_rx = 0; int length_tx = 0; byte mode = 0x00; byte PID = 0x00; byte byte_aux = 0x00; boolean manual_mode = false; int manual_flag = 0; float throttle_manual = 0; float speed_manual = 0; float rpm_manual = 0; float fuel_manual = 0; float temp_manual = 0; float coolant_manual = 0;
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
170 171 // ++++++++++++++++++++++++++++++++++++++++++++++++++ 172 void setup() { 173 Serial.begin(9600); //son los pines 0 y 1 174 Serial3.begin(10400); // son los pines 15RX3 y 14TX3 175 pinMode(obdpin, INPUT); //pin 15Rx3 de la placa ya esta declarado const int obdpin = 15; 176 pinMode(LED_ready, OUTPUT); 177 pinMode(LED_MIL, OUTPUT); 178 pinMode(sw1, INPUT); //sw1 = 38 sw2 = 36 ... sw8 = 24 van de par en par 179 pinMode(sw2, INPUT); 180 pinMode(sw3, INPUT); 181 pinMode(sw4, INPUT); 182 pinMode(sw5, INPUT); 183 pinMode(sw6, INPUT); 184 pinMode(sw7, INPUT); 185 pinMode(sw8, INPUT); 186 187 } //fin setup() 188 189 // ++++ CONJUNTO DE FUNCIÓNES UTILIZADAS +++ 190 191 //Función que va testeando los flancos de la señal en la línea K del protocolo 192 //ISO9141-2 a 5Baud/s para comprobar que recibimos 0x33 193 int fun_ini5baud(){ 194 unsigned long currentMillis = millis(); 195 valor = digitalRead(obdpin); //lectura digital de pin 196 197 switch (estado_ini_5baud) { 198 199 //Estado que comprueba si la línea pasa a nivel bajo 200 case flanco_bajada: 201 if (valor==LOW){ 202 estado_ini_5baud = bit_start; 203 previousMillis = currentMillis; //Se guarda el instante de inicio de estado 1 204 } 205 break; 206 207 //Estado que comprueba bit de start a 0, dura 200ms (ponemos un margen de 208 //5ms para evitar errores 209 210 case bit_start: 211 if ((valor==HIGH) && (currentMillis-previousMillis > margen_inf_200) && 212 (currentMillis-previousMillis < margen_sup_200)) { 213 estado_ini_5baud = up_bits_1; 214 previousMillis = currentMillis; 215 } 216 else if((valor==HIGH) && (currentMillis-previousMillis < margen_inf_200)) { 217 estado_ini_5baud = flanco_bajada; 218 } 219 else{ 220 estado_ini_5baud = bit_start; 221 } 222 break; 223 224 //Estado que comprueba 2 bits a nivel alto, dura 400ms (ponemos margen de 225 //5ms para evitar errores) 226 227 case up_bits_1: 228 if ((valor==LOW) && (currentMillis-previousMillis > margen_inf_400) && 229 (currentMillis-previousMillis < margen_sup_400)) { 230 estado_ini_5baud = low_bits_1; 231 previousMillis = currentMillis; 232 } 233 else if((valor==LOW) && (currentMillis-previousMillis < margen_inf_400)) 234 { 235 estado_ini_5baud = flanco_bajada; 236 } 237 else{
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
238 estado_ini_5baud = up_bits_1; 239 240 } 241 break; 242 //Estado que comprueba 2 bits a nivel bajo, dura 400ms (ponemos margen de 5ms para evitar errores) 243 case low_bits_1: 244 if ((valor==HIGH) && (currentMillis-previousMillis > margen_inf_400) && (currentMillis-previousMillis < margen_sup_400)) { 245 estado_ini_5baud = up_bits_2; 246 previousMillis = currentMillis; 247 } 248 else if((valor==HIGH)&& (currentMillis-previousMillis < margen_inf_400)) { 249 estado_ini_5baud = flanco_bajada; 250 } 251 else{ 252 estado_ini_5baud = low_bits_1; 253 } 254 break; 255 256 //Estado que comprueba 2 bits a nivel alto, dura 400ms (ponemos margen de 5ms para evitar errores) 257 case up_bits_2: 258 if ((valor==LOW) && (currentMillis-previousMillis > margen_inf_400) && (currentMillis-previousMillis < margen_sup_400)) { 259 estado_ini_5baud = low_bits_2; 260 previousMillis = currentMillis; 261 } 262 else if((valor==LOW) && (currentMillis-previousMillis < margen_inf_400)) { 263 264 estado_ini_5baud = flanco_bajada; 265 } 266 else{ 267 estado_ini_5baud = up_bits_2; 268 } 269 break; 270 271 //Estado que comprueba 2 bits a nivel bajo, dura 400ms (ponemos margen de 5ms para evitar errores) 272 273 case low_bits_2: 274 if ((valor==HIGH) && (currentMillis-previousMillis > margen_inf_400) && (currentMillis-previousMillis < margen_sup_400)) { 275 ini5baud=true; 276 delay(200); 277 } 278 else if ((valor==HIGH) && (currentMillis-previousMillis < margen_inf_400)) { 279 estado_ini_5baud = flanco_bajada; 280 } 281 else { 282 estado_ini_5baud = low_bits_2; 283 } 284 break; 285 }//fin de switch (estado_ini_5baud) 286 return ini5baud; 287 }//fin de int fun_ini5baud() 288 289 290 //Función que recibe señal INI a 5Baud/s y manda señales de sincronización y 291 //keywords correspondientes al protocolo ISO9141-2 292 293 int fun_ini() { 294 unsigned long final_W4 = millis(); 295 296 switch(estado_ini_rapida){
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
case false: delay(20); //W1 [20-300ms] Serial3.write(SINC); //Sincronización a 10.4 kbps (0x55) delay(5); //W2 [5-20ms] Serial3.write(KW1); //KeyWord 1 delay(5); //W3 [0-20ms] Serial3.write(KW2); //Al enviar el segundo KeyWord estamos asignando P2min=25ms; principio_W4=final_W4; estado_ini_rapida=true; break; case true: //Comprueba la señal recibida de KW2 invertida y manda señal de INI //invertida (después acaba la inicialización) if (Serial3.available() > 0){ byte_aux = Serial3.read(); if(byte_aux==KW2_NEG){ delay(25); Serial3.write(DIR_NEG); //0x33 (INI) invertido = 0xCC ini=true; //Listo para comunicarse estado_ini_rapida=false; } else{ //si pasan 5 seg de inactividad o cree que es el protocolo KWP2000 if((final_W4 - principio_W4 > 5000)||(byte_aux==0x16)){ estado=INICIALIZACION_1; } ini=false; } } break; } return ini; } void manda_resp(){ trama_tx[0] = trama_rx[0]-0x20; trama_tx[1] = 0x6B; trama_tx[2] = 0xD1; //dirección ECU 1 trama_tx[3] = mode + 0x40; //Hacemos el checksum de la trama a enviar for (int cont=0; cont<length_tx-1; cont++){ sum = sum+trama_tx[cont]; } trama_tx[length_tx-1]=sum; delay(25);//Esperamos tiempo P2 //Enviamos trama con tiempo P1=0s; for (int cont2 = 0; cont2<length_tx; cont2++){ Serial3.write(trama_tx[cont2]); } } //-------------------------------------------void fun_mode1(){ PID=trama_rx[4]; if (manual_mode==false){ Serial.println("PID="); Serial.println(trama_rx[4],HEX); } trama_tx[4]=PID; //Marcamos la longitud del mensaje a enviar para el cálculo del checksum length_tx=7; //Por defecto para un solo byte de dato switch(PID){ case PIDs_supported: Serial.println("PIDs soportados [1-20]\n"); length_tx=10;
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
366 trama_tx[5]=0x88; //Con estado MIL y num. DTCs y Temperatura del refrigerante. 367 trama_tx[6]=0x18; //Con rpm y velocidad 368 369 trama_tx[7]=0x80; //Con posicion acelerador 370 trama_tx[8]=0x13; //Con estándar OBD, tiempo desde arranque y 371 PIDs_supported_40; 372 manda_resp(); 373 break; 374 case MILyDTC: 375 Serial.println("Estado MIL y num. DTCs\n"); 376 length_tx=10; 377 if (MIL==true){ 378 trama_tx[5]=0x80 + num_DTC; //MIL ON y número de DTCs 379 } 380 else{ 381 trama_tx[5]=0x00 + num_DTC; 382 } 383 trama_tx[6]=0x00; 384 trama_tx[7]=0x00; 385 trama_tx[8]=0x00; 386 manda_resp(); 387 break; 388 case coolant: 389 if (manual_mode==true){ 390 trama_tx[5]=coolant_manual+40; 391 } 392 else{ 393 Serial.println("Temperatura del refrigerante\n"); 394 A=analogRead(coolant_pin); 395 A=A*(200.0/1023.0); 396 trama_tx[5]=A+40; 397 } 398 manda_resp(); 399 break; 400 401 case rpm: 402 length_tx=8; 403 if (manual_mode==true){ 404 trama_tx[5]=rpm_manual*4/256; 405 trama_tx[6]=rpm_manual-(A*4/256); 406 } 407 else{ 408 Serial.println("Revoluciones por minuto\n"); 409 A=analogRead(rpm_pin); 410 A=A*(8000.0/1023.0); 411 trama_tx[5]=A*4/256; 412 trama_tx[6]=A-(A*4/256); 413 } 414 manda_resp(); 415 break; 416 417 case vehicle_speed: 418 if (manual_mode==true){ 419 trama_tx[5]=speed_manual; 420 } 421 else{ 422 Serial.println("Velocidad del vehiculo\n"); 423 A=analogRead(speed_pin); 424 trama_tx[5]=A*(255.0/1023.0); 425 } 426 manda_resp(); 427 break; 428 429 case throttle_position: 430 if (manual_mode==true){ 431 trama_tx[5]=throttle_manual*(255.0/100.0); 432 } 433 else{
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
434 Serial.println("Posicion del acelerador\n"); 435 A=analogRead(throttle_pin); 436 trama_tx[5]=A*(255.0/1023.0); 437 } 438 manda_resp(); 439 break; 440 441 case OBD_standard: 442 Serial.println("Standard OBD\n"); 443 trama_tx[5]=0x09; //Soporta OBD, OBD2 y EOBD 444 manda_resp(); 445 break; 446 447 case total_time: 448 Serial.println("Tiempo desde el arranque\n"); length_tx=8; 449 A=millis()/1000; //Pasamos de milisegundos a segundos trama_rx[5]=A/256; 450 trama_rx[6]=A-A/256; 451 manda_resp(); 452 break; 453 454 case PIDs_supported_20: 455 Serial.println("PIDs soportados [21-40]\n"); 456 length_tx=10; 457 trama_tx[5]=0x00; 458 trama_tx[6]=0x02; //Con nivel combustible 459 trama_tx[7]=0x00; 460 trama_tx[8]=0x01; //Con PIDs_supported_40 461 manda_resp(); 462 break; 463 464 case fuel_level: 465 if (manual_mode==true){ 466 trama_tx[5]=fuel_manual*(255.0/100.0); 467 } 468 else{ 469 Serial.println("Nivel de combustible\n"); 470 A=analogRead(fuel_pin); 471 trama_tx[5]=A*(255.0/1023.0); 472 } 473 manda_resp(); 474 break; 475 476 case PIDs_supported_40: 477 Serial.println("PIDs soportados [41-60]\n"); 478 length_tx=10; 479 trama_tx[5]=0x04; //Con temperatura ambiente 480 trama_tx[6]=0x00; 481 trama_tx[7]=0x80; //Con tipo de combustible 482 trama_tx[8]=0x00; 483 manda_resp(); 484 break; 485 486 case air_temp: 487 if (manual_mode==true){ 488 trama_tx[5]=temp_manual+40; 489 }else{ 490 Serial.println("Temperatura ambiente\n"); 491 A=analogRead(temp_pin); 492 A=A*(40.0/1023.0); 493 trama_tx[5]=A+40; 494 } 495 manda_resp(); 496 break; 497 498 case fuel_type: 499 Serial.println("Tipo de combustible\n"); 500 trama_tx[5]=0x04; //Combustible diesel 501 manda_resp();
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
502 break; 503 } 504 } 505 //-----------------------------------------------506 void fun_mode3(){ 507 //Por simplicidad se contemplarán 4 DTCs a la vez como máximo Serial.println("Numero de DTCs: "); 508 Serial.println(num_DTC); 509 if (num_DTC==0){ 510 MIL=false; 511 } 512 else if (num_DTC < 3){ 513 trama_tx[4]=num_DTC; 514 trama_tx[5]=pos_H[0]; 515 trama_tx[6]=pos_L[0]; 516 if (num_DTC==2){ 517 trama_tx[7]=pos_H[1]; 518 trama_tx[8]=pos_L[1]; 519 manda_resp(); 520 } 521 else{ 522 trama_tx[7]=0x00; 523 trama_tx[8]=0x00; 524 manda_resp(); 525 } 526 } 527 else{ 528 if (iter==false){ 529 trama_tx[4]=num_DTC; 530 trama_tx[5]=pos_H[0]; 531 trama_tx[6]=pos_L[0]; 532 trama_tx[7]=pos_H[1]; 533 trama_tx[8]=pos_L[1]; 534 manda_resp(); 535 iter=true; 536 } 537 else{ 538 trama_tx[4]=num_DTC; 539 trama_tx[5]=pos_H[2]; 540 541 trama_tx[6]=pos_L[2]; 542 if (num_DTC==4){ 543 trama_tx[7]=pos_H[3]; 544 trama_tx[8]=pos_L[3]; 545 manda_resp(); 546 iter=false; 547 } 548 else{ 549 trama_tx[7]=0x00; 550 trama_tx[8]=0x00; 551 manda_resp(); 552 iter=false; 553 } 554 } 555 } 556 } 557 //------------------------------------------558 559 void comprueba_switch(){ 560 int pos=0; 561 if (digitalRead(sw1) == 1){ 562 manual_mode=true; 563 comprueba_manual(); 564 } 565 else{ //Si se desactiva se resetean las banderas de los PIDs usados manualmente 566 manual_mode=false; 567 manual_flag=0; 568 throttle_manual=0; 569 speed_manual=0;
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638
rpm_manual=0; fuel_manual=0; temp_manual=0; coolant_manual=0; } if (digitalRead(sw2) == 1){ pos_H[pos]=0x03; pos_L[pos]=0x01; pos=pos+1; } if (digitalRead(sw3) == 1){ pos_H[pos]=0x03; pos_L[pos]=0x40; pos=pos+1; }
if (digitalRead(sw4) == 1){ pos_H[pos]=0x02; pos_L[pos]=0x17; MIL=true; digitalWrite(LED_MIL,HIGH); pos=pos+1; } if (digitalRead(sw5) == 1){ pos_H[pos]=0x01; pos_L[pos]=0x71; pos=pos+1; } if (digitalRead(sw6) == 1){ pos_H[pos]=0x05; pos_L[pos]=0x00; pos=pos+1; } if (digitalRead(sw7) == 1){ pos_H[pos]=0x04; pos_L[pos]=0x20; MIL=true; digitalWrite(LED_MIL,HIGH); pos=pos+1; } if (digitalRead(sw8) == 1){ pos_H[pos]=0x00; pos_L[pos]=0x68; MIL=true; digitalWrite(LED_MIL,HIGH); pos=pos+1; } num_DTC=pos; } //------------------------------------------void comprueba_manual(){ char c = ' '; String mensaje = ""; String mensaje2 = ""; if (Serial.available()){ while((c != '=')) //Leemos hasta el igual { mensaje = mensaje + c; c = Serial.read(); delay(25); } mensaje.trim(); //Elimina los espacios en blanco mensaje.toLowerCase(); //Pasa a minusculas if (mensaje == "throttle"){manual_flag=1;} else if (mensaje == "speed"){manual_flag=2;} else if (mensaje == "rpm"){manual_flag=3;} else if (mensaje == "fuel"){manual_flag=4;} else if (mensaje == "temp"){manual_flag=5;}
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
639 else if (mensaje == "coolant"){manual_flag=6;} 640 else{ 641 manual_flag=0; 642 } 643 mensaje = ""; //Reseteo la cadena de caracteres 644 } 645 if ((Serial.available())&&(c=='=')){ 646 c = Serial.read(); //Elimino el '=' 647 delay(25); 648 while((c=='0')||(c=='1')||(c=='2')||(c=='3')||(c=='4')||(c=='5')||(c=='6')|| 649 (c=='7')||(c=='8')||(c=='9')||(c==' ')||(c=='-')) //Leemos la cantidad 650 { 651 mensaje2 = mensaje2 + c; 652 c = Serial.read(); 653 delay(25); 654 } 655 mensaje.trim(); //Elimina los espacios en blanco 656 657 switch(manual_flag){ //Asignamos el valor en tipo entero para su cambio en fun_mode1 658 case 1: 659 if ((mensaje2.toInt()<0)||(mensaje2.toInt()>100)){ 660 Serial.println("Throttle range = [0 - 100]"); 661 } 662 else{ 663 throttle_manual=mensaje2.toInt(); 664 } 665 break; 666 667 case 2: 668 if ((mensaje2.toInt()<0)||(mensaje2.toInt()>255)){ 669 Serial.println("Speed range = [0 - 255]"); 670 671 } 672 else{ 673 speed_manual=mensaje2.toInt(); 674 } 675 break; 676 677 case 3: 678 if ((mensaje2.toInt()<0)||(mensaje2.toInt()>16000)){ 679 Serial.println("Rpm range = [0 - 16000]"); 680 } 681 else{ 682 rpm_manual=mensaje2.toInt(); 683 } 684 break; 685 686 case 4: 687 if ((mensaje2.toInt()<0)||(mensaje2.toInt()>100)){ 688 Serial.println("Fuel range = [0 - 100]"); 689 } 690 else{ 691 fuel_manual=mensaje2.toInt(); 692 } 693 break; 694 695 case 5: 696 if ((mensaje2.toInt()<-40)||(mensaje2.toInt()>215)){ 697 Serial.println("Temp range = [-40 - 215]"); 698 } 699 else{ 700 temp_manual=mensaje2.toInt(); 701 } 702 break; 703 704 case 6: 705 if ((mensaje2.toInt()<-40)||(mensaje2.toInt()>215)){ 706 Serial.println("Coolant range = [-40 - 215]");
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris
707 } 708 else{ 709 coolant_manual=mensaje2.toInt(); 710 } 711 break; 712 713 case 0: 714 Serial.println("PID erroneo o no soportado en modo manual"); 715 break; 716 } 717 718 mensaje2 = ""; 719 } 720 } 721 //-----------------------------------------722 void loop(){ 723 comprueba_switch(); 724 unsigned long tiempo_actual = millis(); 725 726 switch (estado){ 727 //Estado de la fase de inicialización del protocolo 728 case INICIALIZACION_1: 729 digitalWrite(LED_ready,LOW); 730 ini5baud=fun_ini5baud(); 731 if (ini5baud==true){ 732 estado=INICIALIZACION_2; 733 estado_ini_5baud=0; 734 ini5baud=false; 735 } 736 break; 737 738 case INICIALIZACION_2: 739 ini=fun_ini(); 740 if (ini==true) { 741 digitalWrite(LED_ready,HIGH); //Se enciende el LED verde cuando se esta preparado para la comunicacion 742 estado=PETICIÓN_1; 743 length_rx=0; 744 tiempo_parado=tiempo_actual; 745 Serial3.flush(); 746 ini=false; 747 } 748 break; 749 750 //Estado que espera hasta que le llegue el principio de 751 //la trama de petición y lo guarda 752 753 case PETICIÓN_1: 754 if(Serial3.available()>0){ 755 byte_aux=Serial3.read(); 756 if(byte_aux==0x68){ 757 trama_rx[length_rx]=byte_aux; 758 length_rx = length_rx + 1; 759 estado=PETICIÓN_2; 760 } 761 else if (tiempo_actual - tiempo_parado > 5000){ //Si hay dato, no es el principio de trama y han pasado mas de 5 segundos 762 estado=INICIALIZACION_1; 763 } 764 } 765 else if (tiempo_actual - tiempo_parado > 10000){ //Si han pasado 10 segundos de inactividad 766 estado=INICIALIZACION_1; 767 ini5baud=false; 768 ini=false; 769 estado_ini_5baud=0; 770 estado_ini_rapida=false; 771 } 772 break;
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
773 //Estado que recibe y guarda la petición del tester hasta el checksum 774 case PETICIÓN_2: 775 if(length_rx<12){ //Si cumple la longitud maxima de trama 776 if(Serial3.available()>0){ 777 byte_aux=Serial3.read(); 778 trama_rx[length_rx]=byte_aux; 779 length_rx=length_rx+1; 780 if(length_rx>4){ //Cuando ya tenemos el primer byte de dato empezamos a comprobar el checksum 781 for (int cont3=0; cont3<length_rx-1; cont3++){ 782 sum=sum+trama_rx[cont3]; 783 } 784 //Si hemos llegado al checksum y es correcto paso a responder a la 785 if(sum==trama_rx[length_rx-1]){ 786 estado=RESPUESTA; 787 sum=0x00; 788 } 789 else{ 790 sum=0x00; 791 } 792 } 793 } 794 else if (tiempo_actual - tiempo_parado > 5000){ //Si no hay dato y han pasado más de 5 segundos 795 estado=INICIALIZACION_1; 796 } 797 } 798 else{ //En el caso que se corrompan los datos recibid 799 estado=PETICIÓN_1; 800 tiempo_parado=tiempo_actual; length_rx=0; 801 sum=0x00; 802 } 803 break; 804 //Estado que comprueba que la trama es correcta y actúa según el modorequerido 805 case RESPUESTA: 806 mode=trama_rx[3]; 807 if(manual_mode==false){ 808 Serial.println("MODO="); 809 Serial.println(trama_rx[3],HEX); 810 } 811 switch(mode){ 812 //Función que procesa peticiones de modo 1 813 case mode1: 814 fun_mode1(); 815 estado=PETICIÓN_1; //Después de interpretar la petición vuelvo a esperar otra 816 tiempo_parado=tiempo_actual; //Guardo el momento desde que empiezo a escuchar si hay trama de petición 817 break; 818 819 //Función que procesa peticiones de modo 3 820 case mode3: 821 fun_mode3(); 822 estado=PETICIÓN_1; 823 length_rx=0; 824 tiempo_parado=tiempo_actual; 825 break; 826 //Función que procesa peticiones de modo 4 827 case mode4: 828 MIL=false; 829 num_DTC=0; 830 digitalWrite(LED_MIL,LOW); 831 estado=PETICIÓN_1; 832 length_rx=0; 833 tiempo_parado=tiempo_actual; 834 break; 835 //Si nos pide algún modo no implementado vuelvo a esperar trama de petición 836 default: 837 estado=PETICIÓN_1; 838 length_rx=0;
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por Joaquín Berrocal Piris
839 840 841 842 843 844 845 846 847 848
tiempo_parado=tiempo_actual; break; } break; } } //----------------FIN DEL PROGRAMA---------------------
Simulador Diagnosis OBDII con protocolo ISO 9141-2
por JoaquĂn Berrocal Piris