Arduino based DIY LINcontroller for Nissan LEAF PTC heater

UPDATE: Some Arduino boards has no inbuilt pullup resistor for RX pin. If your Arduino board has no pullpup resistor on RX pin, please use 10KOhm pullup resistor between RX and VCC (5V) pins! Otherwise you MCP2004A LIN Transceiver will not work.


I've been getting emails asking about how I fixed my PTC heater recently and if there is any way it can be activated without original Climate Control Unit (CCU), as some people are interested in using it in their DIY EV conversions. So I though probably it's time to do another LEAF project and reverse engineer LEAF PTC heater LIN communication.

First I will explain how Nissan LEAF (2011-2012) PTC heater works and communicates with vehicle. It works by using LEAF main high voltage battery power. And as you probably know, it was very badly designed and has a huge failure rate due to poor design. You can read about it here. So because it uses HV power I strongly advice you not to play with PTC heater if you are not a competent person to do so.

For communication LEAF PTC heater uses LIN bus. CCU acts as a master sending request commands to PTC heater and also listens for the answer messages from PTC heater. I will not go in to details how LIN communication works. Do your own research if you are curious about how it works.

So after doing some experimenting with my LEAF I successfully identified correct bytes in two LIN messages, which are responsible for PTC Heater work. There are two messages sent from CCU, first one is a command message with ID 0x3B and 8 data bytes from CCU. Second message has ID 0x24 and carries no data bits from CCU, it actually requests some data from PTC heater, which replies immediately with data of 4 bytes. CCU then checks for fault codes and decides if it's safe to activate it. Interestingly even non critical fault codes from PTC will prevent CCU from activating PTC. For example my friend pulled some PTC elements from PTC heater itself and after that he was unable to use the heater anymore as CCU was throwing a code blaming internal circuit. I guess PTC heater checks it's own internal PTC elements resistance and if it does not match with a programmed one it reports it as a non critical fault to CCU. And this is enough for CCU to decide not to activate PTC heater anymore. But if I send an activation command to such heater with my own built controller, it activates and works without any issues. Although if there is a critical fault detected in PTC heater, it will lock itself and will prevent it from switching on.

Now few tings before we go into technical details. First of all by taking on this project you understand and agree that all responsibility goes only to yourself. As all this next information is provided for educational purposes and I will not take any responsibility for someone else's stupidity. If you use this controller on your PTC heater, you must make sure your heater has no faulty components or failing connections inside. Otherwise you are risking to damage PTC itself, blow a fuse in DC/DC junction block or in worst case scenario blow your HV battery.

For this DIY LIN controller you will need the following components:
U1: Arduino ProMini 16Mhz/5V or Arduino UNO board
U2: MCP2004A LIN Transceiver
U3: 12V to 5V DC/DC inverter
R1: 1kOhm resistor
R2-R4: 3x 470Ohm resistors
PB: Momentary push button
LED1-LED3: 3x LED
*OPTIONAL:
U4: I2C 1602 LCD

Below you will find a wiring diagram:
LCD screen is an optional feature. If you decide to use it, you will be able to see a status of sent request to activate the PTC heater. Also it will show controller requested power data byte and PTC heater response data byte which represents actual PTC heater power. If there is a fault on LIN communication line, display will show a fault message.

If you choose not to use the LCD screen, then you must use 3 LEDs connected as shown in a wiring diagram. LED1 will show if you pressed the button requesting heater activation. LED2 will lit up if there is something wrong with LIN communication line. LED3 will lit up as soon as PTC heater will reply with message which shows that heating was activated.

Bellow you will find editable Arduino code in ino and hex formats:
LEAF_PTC_LIN_controller_V1.1.rar LEAF_PTC_LIN_controller_V1.1.rar
Size : 15.197 Kb
Type : rar
UPDATE. I am also sharing controller code for "dry" PTC heater (from LEAF made after 2013). It was tested and reported as fully working. Please only use it if you using PTC in custom project and not in LEAF vehicle. As LEAF made after 2013 has two other slave modules connected to LIN bus. Code for "dry" PTC:
LEAF_DRY_PTC_LIN_controller_V1.1.rar LEAF_DRY_PTC_LIN_controller_V1.1.rar
Size : 15.254 Kb
Type : rar
If you will want to use ino editable file you will need to download I2C LCD and Tasks libraries from:
https://github.com/johnrickman/LiquidCrystal_I2C
https://github.com/kcl93/Tasks

I have also used LIN communication library from:
https://github.com/gicking/LIN_master_Arduino
But if you will be using ProMini or UNO boards you don't need to download LIN library as it is included in my project file already.

If you just want to use it without any modifications, you can use hex file and Xloader V1.0 to upload code easily without downloading anything else.
 
After you assembled your controller and uploaded the firmware, you must locate the LIN communication wire and disconnect it from CCU. Connect this wire to your controller instead. One of easiest locations to do this is behind the CCU connector (only for 2011-2012 LEAF!!!) :

The needed wire is in light blue color and is a last wire in lower row of CCU connector.

PTC heater is activated if you press push button for 2 seconds. And it's deactivated as soon as you press push button again.

IMPORTANT! This controller and it's code was designed for testing purposes only! Never activate PTC heater if vehicle is NOT in "READY" mode (green vehicle symbol must be lit up on instrument cluster!). Otherwise you risking to damage precharge resistor, which is located in HV battery and is a nightmare to replace. Also make sure you disconnect PTC heater first and give a minute before you switch your vehicle power off. Again this is needed to prevent precharge resistor failure in case your PTC heater has failed components inside.

I am testing bit more advanced version of this controller. Will share this information with you very soon.


 

© Copyright EV-OLUTION