Roverta

Lector K-Line

27VT

El botón llega

Bosch ve cambiar la entrada del portón. El vidrio y el pestillo no se mueven. La orden se corta dentro de la CCU.

Country en cero

En el SM024 v1.22, Country = 0 enciende el Transit Mode. Argentina es el 57. El 1, aunque diga Transit, no es el destino.

Pin siete

La 27VT de 1999 habla por K-Line, no por CAN. El lector despierta el módulo y anota la respuesta. No escribe configuración.

Freelander 1Lucas 27VT

5baudios para despertar la ECU
7pin de la K-Line en el zócalo
57código de país Argentina

El ESP32 habla con la camioneta por el conector OBD. La Raspberry Pi Zero W registra la sesión. El firmware abre la comunicación, mide la velocidad y publica los bytes. Country, el código EDC y el EKA quedan sin tocar hasta que una sesión real entregue el comando de lectura.

Recorrido de la señal

  1. MóduloCCU 27VTEn Transit Mode
  2. BusPin 7K-Line, 12 V
  3. InterfazNPN12 V ↔ 3,3 V
  4. TiempoESP325 bd y 10 kbaud
  5. USB 115200Pi Zero Wkline_log.py
  6. SalidaLoghost/logs/

01 · Vehículo

SALLNABB8XA690228

Marca / plantaLand Rover, Solihull
ModeloFreelander 1, 5 puertas
Año modelo1999, código VIN X
MotorRover L-Series 2.0 XEDi, turbodiésel
CajaManual 5 velocidades, volante a la izquierda
CarroceríaLucas 27VT, la CCU
Coding Index1 esperado. EKA presente. Inmovilizador dentro de la CCU
ECU de motorEDC del L-Series. Se reconoce con la CCU por el campo EDC code
Lámina D04.005 · 03-2003Catálogo de piezas
Despiece de alarma e inmovilización del Freelander 1: la CCU, el mando a distancia con su pila, los módulos y las dos bocinas, con los cableados marcados sobre la silueta del vehículo.
Alarma e inmovilización en el catálogo de piezas. La CCU (1) va separada del resto; el mando (2) lleva la pila (3), y las bocinas (9 y 14) cuelgan del frente.

02 · Síntoma

La entrada vive. La salida no.

El botón del portón llega a la CCU: en el escáner Bosch la entrada cambia de estado. El vidrio y el pestillo no se mueven.

Ese patrón coincide con el Transit Mode del manual de taller. Con la CCU en ese modo quedan desactivados el receptor de radio de los mandos, el pestillo del portón, la luneta trasera, el cierre centralizado y las luces interiores.

Manual de taller · alarma y CCU
Mapa del sistema de alarma y cierre del Freelander 1: catorce componentes numerados alrededor del vehículo, conectados a la unidad de control de carrocería.
  1. 07
    Unidad de control de carroceríaLa CCU 27VT
  2. 06
    Receptor RF
  3. 05
    Mando a distancia
  4. 03
    Cerradura del portón
  5. 02
    Cerraduras de puertas
  6. 11
    Interruptor del cierre centralizado
  7. 04
    LED de alarma
  8. 08
    Sensor volumétrico
  9. 09
    Cilindro de llave, puerta del conductor
  10. 01
    Contacto del capó
  11. 10
    Contacto de encendido
  12. 13
    ECU del inmovilizador
  13. 12
    ECU del ABS
  14. 14
    Bocina
Todo lo que cuelga de la CCU. Pasá por la lista para ubicar cada pieza en el dibujo.

La CCU sigue despierta e informa el botón. Con el contacto en posición II, el zumbador interno suena para avisar que el modo sigue activo.

En Coding Index 1 hay además un campo separado, Transport mode. Se lee junto con Country. La salida de fábrica, con TestBook, T4, PScan o SM024, pasa Country de 0 a 57 y deja el resto del bloque como estaba.

Los marcadores de temperatura y combustible no pasan por la 27VT. Van del sensor al tablero. Este dispositivo no los corrige.

03 · Bus

K-Line en el pin 7

La 27VT de este año modelo se alcanza por K-Line ISO 9141. No hay sesión de diagnóstico de la CCU por CAN. Un transceptor CAN, MCP2515 u otro, no despierta esta unidad.

El mismo pin 7 lo comparten varios módulos. Cada uno responde a su dirección de despertar. Una dirección que no corresponde produce silencio, sin escribir nada.

Capa físicaUn hilo. 0 V dominante, 12 V en reposo
ConectorSAE J1962, zócalo del vehículo
Pin de datos7
MasaPin 4, masa de chasis. El pin 5 es masa de señal desde el año modelo 2002.5
Pin 16Batería permanente. No alimenta el ESP32
Pin 13Bus DS2 en el manual posterior. En este MY99 el inmovilizador está dentro de la 27VT
InicializaciónLenta, 5 baudios, y después la velocidad de trabajo
Formato8N1, mientras una captura real no muestre otra cosa
Velocidad9600 o 10400. Ninguna está medida todavía en esta camioneta
DirecciónSin confirmar. Candidatas: 0x1C, 0x10, 0x17. 0x33 es la genérica ISO 9141
AjustesChecksum y comandos sin confirmar. PScan y SM024 los tienen en software cerrado

La dirección 9D no se envía

En el Lucas 5AS, un módulo de la misma época, 0x9D abre el modo de memoria. El firmware rechaza ese byte. No hay evidencia publicada de que en la 27VT haga lo mismo, y un disparo de ese tipo se acerca al área donde vive el código EDC.

04 · Placas

El tiempo lo cuenta el ESP32

ESP32Bit-bang de los 5 baudios y de la respuesta a unos 10 kbaud. USB serie a 115200
Pi Zero WComputadora de campo. Corre kline_log.py y guarda el log. Puede alimentar el ESP32 por USB si la corriente alcanza
ESP8266Queda afuera. El bit-bang a 10400 no sostiene la ventana de tiempos
Arduino UnoQueda afuera. Su único UART de hardware es el del USB

La Pi no puede cumplir la ventana de 25 a 50 ms del reconocimiento ISO si el diálogo viaja por Python. El apretón ocurre dentro del ESP32.

GPIO 25TX hacia el transistor o el L9637. No es pin de arranque
GPIO 26RX desde el divisor. Entrada
UART0USB hacia la Pi o la PC. 115200 8N1

Durante el arranque, el GPIO 25 queda en alta impedancia. La resistencia de 100 kΩ entre base y masa mantiene el NPN apagado hasta que el sketch pone la línea en reposo.

05 · Interfaz

12 V no entran al GPIO

El GPIO del ESP32 es de 3,3 V. No tolera 5 V ni 12 V. La K-Line en reposo está a tensión de batería, entre unos 11 V y 14,4 V con el alternador. El pin 7 entra solo por este circuito.

Transistor 2N2222, BC547 o NPN equivalente. Emisor a masa. El firmware arranca en IFACE NPN: GPIO en alto satura el transistor y pone la K-Line a masa. GPIO en bajo corta el transistor y la línea vuelve a 12 V por el pull-up que ya tienen las ECU.

Interfaz NPN entre el pin 7 del OBD y el ESP32. Lectura: 150 kΩ al GPIO 26, con 47 kΩ y zener de 3,3 V en paralelo a masa. Transmisión: GPIO 25 por 1 kΩ a la base del NPN, 100 kΩ de base a masa, colector por 1 kΩ al pin 7, emisor a masa. OBD · J1962 7K-Line 4Masa 16Batería ESP32 GPIO 26RX · entrada GPIO 25TX · salida GND USB 115200 → Pi Zero W sin conectar 0–14,4 V ≤ 3,3 V 150 kΩ 47 kΩ Zener 3,3 V cátodo al GPIO 26 1 kΩ NPN 2N2222 · BC547 0 / 3,3 V 1 kΩ 100 kΩ
Del pin 7 salen dos caminos. Arriba, el divisor que deja leer la línea. Abajo, el transistor que la baja a masa.
Versión en texto
OBD pin 4  ----------------------------------- GND ESP32
OBD pin 7  --+-- 150 kΩ --+------------------- GPIO26 (RX)
             |            |
             |            +---------+
             |            |         |
             |          47 kΩ    zener 3,3 V
             |            |      (cátodo arriba)
             |           GND       GND
             |
             +-- 1 kΩ -- colector NPN

GPIO25 --- 1 kΩ ---+--- base NPN
                   |
                 100 kΩ
                   |
                  GND
emisor NPN ------------ GND
1 kΩ de baseLimita la corriente de base. Con 3,3 V y Vbe ≈ 0,7 V, Ib ≈ 2,6 mA
100 kΩApaga el NPN mientras el ESP32 arranca. Evita clavar la K-Line al conectar el USB
1 kΩ de colectorLimita la corriente al dominar la línea. Protege el transistor y los drivers de las ECU
150 kΩ + 47 kΩDivisor de lectura. A 14,4 V, sin zener, el nodo queda cerca de 3,4 V
Zener 3,3 VTecho del GPIO 26. Con 14,4 V circulan unos 70 µA por los 150 kΩ

Sin zener, 14 V en ese divisor se acerca al máximo del ESP32. El zener forma parte del circuito. El ESP32 se alimenta por USB, desde la Pi o un power bank. El pin 16 no se conecta a 5 V, a 3,3 V ni a un GPIO. La masa es común: pin 4, GND del ESP32 y GND de la Pi.

L9637, si aparece el integrado

IFACE L9637 trata la interfaz como no inversora: GPIO en alto deja la K-Line suelta. El VCC lógico del L9637 va a 3,3 V. Con VCC a 5 V, la pata RX entrega 5 V y daña el ESP32. La pata de batería del integrado, si se usa, sale del pin 16 por la red de su hoja de datos, nunca hacia un GPIO.

Zócalo, visto de frente

Fila ancha arriba, pines 1 a 8 de izquierda a derecha. Fila angosta abajo, pines 9 a 16.

4 — masa, único retorno 7 — K-Line, única señal 16 — batería, esquina inferior derecha, sin usar

06 · Firmware

115200 en el monitor

El sketch se carga con el IDE de Arduino, placa ESP32 Dev Module. No usa WiFi ni Bluetooth: el bit-bang no comparte el tiempo con la radio. Se flashea desde la PC. La Pi Zero no es un entorno cómodo para compilar el core de ESP32.

HELPLista de comandos. También responde a ?
IFACE NPNTransistor inversor. Es el valor de arranque
IFACE L9637Transceptor no inversor, VCC a 3,3 V
LEVELSDurante 0,5 s cuenta cuántas muestras del GPIO 26 están en alto
CHECKLEVELS y un pulso dominante de 3 ms. Comprueba que el transistor baja la línea y la suelta
INIT HHInicialización lenta a la dirección hexadecimal HH
SCANINIT de 1C, 10, 17 y 33, con pausa entre ellas
INIT 9DRechazado. Responde ADDR_9D_NO_ENVIADA

SCAN no envía servicios de lectura de memoria, no acciona salidas y no escribe Country, EKA ni EDC.

Secuencia de cada INIT

  1. 01Línea en reposo durante 2 s, para que un intento anterior termine.
  2. 02Dirección a 5 baudios: start dominante, 8 bits con el menos significativo primero, stop en reposo. Cada bit dura 200 ms. El byte dura 2 s.
  3. 03Espera como máximo 350 ms el flanco de bajada del byte de sincronismo.
  4. 04Mide el ancho de ese primer bit bajo. Acepta entre 70 µs y 160 µs. 9600 baudios son unos 104 µs. 10400 baudios son unos 96 µs.
  5. 05Lee el byte de sincronismo y dos keywords con ese ancho de bit.
  6. 06Espera 30 ms y devuelve el complemento a uno del segundo keyword. En ISO 9141 esa ventana va de 25 ms a 50 ms. Sin este byte la ECU corta la sesión. No es una escritura.
  7. 07Lee el byte siguiente. En una sesión válida es el complemento de la dirección enviada.
  8. 08Suelta la línea y publica el resultado por USB. No transmite nada más.

Entre una dirección y la siguiente de SCAN hay 3 s, además de los 2 s de reposo del intento nuevo.

Cómo se lee el texto

KLINE_27VT_LISTOEl sketch arrancó y la línea está en reposo
RX_HIGH n/20Muestras en alto de LEVELS
KLINE_EN_REPOSO17 o más muestras en alto. La K-Line está en 12 V y el divisor la ve
KLINE_EN_BAJO3 o menos muestras en alto. Línea a masa, transistor invertido o sin pull-up
KLINE_INESTABLELectura a mitad de camino. Masa floja o contacto a medias
PULSO OKEl pulso de 3 ms se vio en el GPIO 26
PULSO FALLOEl transistor no mueve la línea que el divisor está leyendo
SILENCIONadie respondió en 350 ms
KLINE_QUEDA_EN_BAJOApareció un flanco y la línea no volvió a reposo
ANCHO_RAROPulso fuera de 70–160 µs. Detrás va el ancho medido
SYNC 55Byte de sincronismo ISO correcto
RX_INVERTIDAEl sincronismo llegó como AA, complemento de 55. El divisor o IFACE está al revés
KW xx yyDos keywords. Identifican el protocolo del módulo que contestó
BAUD9600 o 10400, la cifra más cercana al ancho medido, tolerancia de 250 baudios
BITUS nAncho crudo del primer bit, en microsegundos
ECHO xxByte que devolvió la ECU después del complemento del keyword
ESPERADO xxComplemento de la dirección enviada. Tiene que coincidir con ECHO
SESION_OKSYNC 55 y el eco coincide con el complemento de la dirección
SESION_PARCIALLlegó el sincronismo y falta el eco, o el eco no coincide
SESION_RARALlegaron bytes y el primero no es 55
SCAN_FINTerminaron las cuatro direcciones

Sesión ilustrativa

INIT 1C
SYNC 55
KW 83 76
BAUD 10400
BITUS 96
ECHO E3
ESPERADO E3
SESION_OK

Cómo leer el ejemplo

E3 es el complemento de 1C. Los keywords 83 76 son los del Lucas 5AS en modo normal. Si la 27VT usa otros, el log los muestra igual, y esos son los que valen. Los números de este recuadro son ilustrativos.

07 · Registro

La Pi guarda cada línea

sudo apt install python3-serial
sudo usermod -a -G dialout $USER
python3 kline_log.py /dev/ttyUSB0

El grupo dialout aplica después de volver a entrar a la sesión. Si el puente USB aparece como otro dispositivo: python3 kline_log.py /dev/ttyACM0.

Cada línea del ESP32 se copia a host/logs/ con fecha y hora. Los comandos se escriben en esa terminal y salen hacia el ESP32. Ctrl-C cierra el puerto. En la PC, el monitor serie del IDE a 115200 hace el mismo trabajo.

08 · En la camioneta

Contacto en II, motor parado

Batería capaz de mantener el contacto. Portón cerrado.

  1. 01Armar el circuito. Conectar masa en el pin 4 y K-Line en el pin 7. Dejar el pin 16 libre.
  2. 02Conectar el USB del ESP32 a la Pi o a la PC.
  3. 03Abrir el registro o el monitor. Tiene que aparecer KLINE_27VT_LISTO.
  4. 04IFACE NPN si el circuito es el transistor. IFACE L9637 solo con el integrado a 3,3 V.
  5. 05LEVELS. El resultado útil es KLINE_EN_REPOSO.
  6. 06CHECK. El resultado útil es PULSO OK.
  7. 07SCAN.
  8. 08Guardar el archivo de host/logs/.

Orden de lectura del log

  • 01PULSO FALLO o KLINE_EN_BAJO: el cable o el transistor están mal. Las direcciones no se interpretan todavía.
  • 02Las cuatro direcciones en SILENCIO, con PULSO OK y KLINE_EN_REPOSO: la electricidad está bien y ninguna de esas direcciones despertó un módulo. El siguiente dato es probar otra dirección con INIT HH, de a una. Nunca 9D.
  • 03SESION_OK: quedaron fijas la dirección, la velocidad y los keywords de un módulo de este vehículo. Con esos tres números se busca el comando de lectura de Country. La escritura sigue siendo un paso aparte, de un solo campo, sobre una lectura previa de esta misma CCU.

09 · Límites

Este lector todavía no escribe

No lee ni escribe el bloque de ajustes. Country, Transport mode, Tail window, VIN, EKA y EDC code siguen del lado de TestBook, T4, PScan o SM024 hasta que una sesión real entregue los comandos.

Cuando esa lectura exista, la escritura de reparación es una sola: cambiar Country de 0 a 57. Si Transport mode está activo en la misma pantalla, apagarlo en esa misma edición. El resto de los campos se copia tal como se leyeron, en especial el EDC code, el VIN 690228, Engine en Diesel, Gearbox en Manual, Drive en LHD, Doors y Tail window instalada.

El número EKA y el Master EKA son de solo lectura: se generan al fabricar la CCU. Las opciones escribibles EKA y EKA delay no forman parte de esta reparación. El EDC code es la clave con la que la CCU habilita el arranque del L-Series. Cargarlo desde otra camioneta, o modificarlo, deja el motor inmovilizado. Se sincroniza solo si se reemplaza la CCU o la ECU del motor.

Después, calibrar la luneta

El manual lo exige al salir de Transit Mode. Sin el dato de posición, el botón puede seguir sin completar la secuencia aunque Country ya sea 57.

  1. 01Portón cerrado, vehículo abierto, alarma desactivada.
  2. 02Desconectar la masa de la batería, esperar al menos 10 s y reconectar.
  3. 03Unos 2 s después el vidrio baja solo hasta el tope.
  4. 04Subirlo del todo, bajarlo del todo y subirlo otra vez hasta el tope.
  5. 05Si queda arriba, la calibración cerró. Si la CCU pita cerca de 1 s y el vidrio baja solo, repetir desde el primer paso.

En el mapa del SM024, el botón del portón es Door open request. Fuera de Transit Mode, la luneta pasa de STATIONARY a GOTO COS: baja lo justo para zafar el burlete y después suelta el pestillo. Durante la calibración los estados son CAL DOWN, CAL UP y CAL STALL.

10 · Archivos

Qué hay en el repositorio

Firmwarefirmware/esp32_kline/esp32_kline.ino
Registrohost/kline_log.py
Logshost/logs/kline-AAAAMMDD-HHMMSS.log

11 · Referencias

De dónde sale cada cifra

  • 01
    Blackbox Solutions, ayuda SM024 v1.22 ↗Country, Transport mode y entradas de la 27VT.
  • 02
    rovermems.com, protocolo Lucas 5AS ↗James Portman. Wakeup de 5 baudios, 8N1, comandos 0x3x, 0xF6 y EEPROM en doble copia.
  • 03
    PScan ↗Protocolo MY97-99 de la 27VT: configuración, mandos PLIP y datos en vivo.
  • 04
    Manual de taller FreelanderTransit Mode y calibración de la luneta. Sin enlace público.
  • 05
    Conector de diagnóstico C0040Pin 7 K-Line (ISO 9141), pin 4 masa, pin 16 batería.
  • 06
    Repositorio del proyecto ↗Investigación propia, firmware y registro. Los documentos se leen abajo.

Nuestros documentos

Lector_KLine_Freelander_27VT.mdVer en GitHub ↗

Cargando…