Standalone ECU Implementation

From X1/9 Wiki
Revision as of 19:29, 2 February 2024 by Jonohhh (talk | contribs)
Jump to navigation Jump to search

This is a project. One which, I'm fairly certain has not been done (or perhaps not documented) before. I am also an electronics moron. Perhaps you should take what you see below with a grain of salt.

EDIT: I DID IT! It actually works...

As these cars age, our reliance upon Mopar for electronics/computer support must end, otherwise ownership of these cars into the far future is simply not feasible. Additionally, content discussed below can be useful for standalone ecu implementation for engine swap applications.

Standalone ECU Implementation - The Electronics

For this project, I decided to use an ECUMasters EMU Black. There wasn't much in the way of choice admittedly - as of now, there are only two standalone ECUs on the market, that I am aware of, that have Plug and Play support for the Fiat 500 (specifically the CAN implementation). One of them being a model from SCS Delta, and of course, the EMU Black (and Classic).

The plug and play adapter is indeed plug and play...for the car it is designed for, which is the Euro/Global market spec that uses a Bosch ME7.9.10. Our US spec cars, which use a Marelli8GMx, have quite a lot of differences under the hood, with changes to the: EVAP system, diverter valve, Oxygen sensor(s), the inclusion of MultiAir (and thus the power and gnd to the four, high current solenoids), and a couple other systems.

The different requirements of the US spec car, along with the use of an entirely unrelated ECU family, meant that Fiat had to change the pinout of the factory harness. Thankfully, however, the connector is the same - a variant of the TE284617. This means that, for the most part, the *cars own* harness can be easily repined. I hoped that there would be a way to modify the pinout of the PnP adapter itself, but this proved near impossible given the design.

As it stands, and without me (or someone) making a PnP adapter, modification to the cars wiring harnesses is very difficult to avoid. Personally, I didn't have the time to come up with a solution to that, and decided the harness would just be a casualty of attempting to pioneer something like this.


There are a few main things which stand out as incompatibilities (beyond simply repining).

  • The Lambda sensor (Upstream Wideband Oxygen Sensor) is a part of the C2 connector on the T-jet model, whereas it is on the C1 connector for USA spec cars. A jumper of some form could be used, but you are at the mercy of the pinout of the PnP adapter - and it is possible the PnP adapter is made for a narrow band sensor (some documentation points to this). I suggest wiring the Lambda sensor directly to the EMU Black itself, in this instance. Ecumasters provides pretty good documentation on this, so I won't elaborate here. I do not know anything about the OEM sensor, so especially if your car has some miles on it, I highly reccomend getting a new Bosch LSU4.9 sensor. These can be found for many applications nowadays. I used one from my 2006 BMW 330i, with the N52 engine - the sensor retails for around $100 (Bosch PN 0 258 017 098). You will need to buy a LSU4.9 connector online, as you must retain the connector end of the LSU4.9 sensor, as it contains a calibration resistor strip - so do not cut the sensor wiring as a method of connecting it to the EMU.
  • The diverter valve is wired differently on the T-jet model. However, this proves to be a non issue for one major reason: since Multiair being removed or made passive is a needed part of this swap, you don't really end up needing electronic control anyway. Since the engine will now be traditionally throttled, you can simply buy a pneumatic diverter valve and hook a single hose straight to the inlet manifold. No valves, no solenoids, no wires. Just air, and it works great provided the correct spring is used.
  • The starter interlock relay, which is a physical means of preventing the engagement of the starter if the clutch has not triggered the downstop switch, is switched on the high side by the Marelli ECU, and seemingly on the low side by the Bosch ecu (and thus this PnP adapter). This can be resolved in two ways- one, the interlock function can be removed, by powering the relay any time the ignition switch is on, or, an additional relay can be added which serves to switch the OEM interlock relay on the high side. Alternatively, the oem interlock relay could be replaced entirely by the aforementioned external one- but that would likely involve further modification of existing wiring.
  • The wiring of the brake, clutch, and reverse switches is a little messed up, at least it seems that way. In the US spec car, all three of the aforementioned switches operate at 12v. I thought that perhaps this is just because they were floating, but neither of the pulldown options made a difference for me. The EMU Black can support up to 12v on the analog inputs- though it will not read anything over 5v. The switch inputs, which are used by default, are not designed to be given power at all - they are supposed to be switched by closing a circuit to GND. Failure to repin this could lead to damage of your ECU. My solution for the reverse switch was to re-wire the reverse switch to go GND > REV SW > EMU Switch Input rather than the factory configuration 12V > REV SW > EMU Switch Input. This works just fine. For the brake pedal switch, I connected the signal wire (which, remember, operates at 12v) to a free analog input, with an inline resistor. Combining this resistor with the pulldown setting in the EMU black creates a voltage divider and, with the resistor I used, pulls the voltage to around 4v. I currently do not have a clutch switch input - but given I don't have control of the Interlock relay yet anyway, I guess it isn't critical. The EMU reads 5V on an analog input for any voltage 5-12v. Additionally, sending 12v does create a slight deviation of the EMUs sensing circuitry voltage, which I am not really happy with, hence me adding a resistor inline for the brake switch.
  • The After Run Coolant pump is switched by grounding a single wire in the C1 (body side) connector. Grounding this pin completes the circuit through the coil side of the relay (low side switching), which is hot at all times, to allow the pump to run whenever the ECU requests. One of the EMU's AUX outputs should be used in this case, as those are for low side switching. In order to run this pump after shutdown with the EMU Black, the delayed shut-down function should be enabled, with logic (using Virtual Parameter Outputs, and Parametric Outputs) to control the run conditions, and thus when to keep the ECU awake. At some point, I will attach screenshots of how to do this, but it's not too difficult IMO. There are more complex things to deal with. This pin
  • The ECU/EMU power input pins are a bit..wrong. As the PnP adapter comes, the high current capacity, ignition switched supply from the body harness is connected to the 12V ignition pin on the EMU black, which is not used as a main power feed in the EMU - it is simply an ignition status input to tell the ECU to turn on/wake up, and thus the pin on the EMU is small. Additionally, the cars 12V ignition signal (used to wake up the factory ecu) is connected to the EMUs main power feed, which is also just wrong. To avoid this mess, I have used the cars 12V ignition switched signal, bypassed the PnP adapter, and routed that directly to pin G18 (ign 12v) on the EMU. For the main power feed, I again bypassed the EMU Black and got the power directly from the batteries ve+ terminal. You should absolutely use a fuse as close to the battery terminal as possible if you choose to go this route. I am sure there are other solutions, perhaps some more elegant, but this is what I did. If you find something better, please share, and Ill be sure to update this page.


Wiring Diagrams, Pinouts, etc

Be wary that the 500 Abarth Plug and Play adapter manual you can find online through ECUMasters is not up to date - it is for the older version of the PnP adapter made for the EMU Classic. While some things are the same, or very close, there are a few differences. The documentation which comes with the PnP adapter for the EMU black should be correct and up to date.

Additionally: do NOT blindly connect wires to where you think they should go based on a diagram. There are discrepancies in the EMU documentation as I mentioned above, and there are also errors in fiats own wiring diagram - at least in the service manual I have. I guess it wouldn't be a fiat if the documentation was correct.

Please use the following as nothing more than a general guide. Always check, double check, and triple check every connection before proceeding. I am not responsible for damage to your car, yourself, or the EMU black, all of which are very possible. The following spreadsheet needs some polishing, and some edits, which I will be doing in the future as I have time. The rows highlighted are those which you should look at with the most skepticism, as there is either a discrepancy, or incompatibility requiring work beyond simply moving a wire around.

For now, I must approve anyone who tries to access this document. Once I have a higher level of confidence in its correctness, it will be open to all, but for now I would like to ensure I talk to and warn each person who would like to use it.

https://docs.google.com/spreadsheets/d/1OC6R-kx5jToImxXRtPxPB29olWXmCCdy5MaccLEAFsg/edit?usp=sharing

Also useful - for the components which need to be wired directly to the EMU. EMU Black Pinout (from ECUMasters site)

EDIT: I personally would never consider beginning this swap without a full electrical manual from the factory service manual. There was a LOT of ambiguity from many sources - the EMU PnP manual, and the factory service manual included. As a result, many things had to be changed as I was working, and may not have been documented. Its quite a tedious process, be warned.


Engine Modifications

The engine modification portion of this swap is extremely straightforward. It's almost like fiat developed these valvetrain systems to be modular, and allow streamlined production of many variations of the FIRE engines. (They did). There is a single incompatibility, but thankfully dealing with this is trivial.

Essentially, we are removing everything above the cylinder head, and swapping on the upper head/camshaft carrier from a Tjet model. That's literally it.

https://photos.app.goo.gl/Mu9VttL8tYuCDjff6

The single incompatibility comes from an additional oiling port added to the cylinder heads meant to be paired with the multiair system. As you can imagine, given the above mention of streamlined manufacturing, the only difference is a single hole drilled through to one of the head bolt wells, which isn't drilled on Tjet models.

It appears that fiat went through quite a few revisions of this differentiation over the years, with some tjet blocks lacking the feed port entirely, some head gaskets lacking the hole to allow oil to flow to the not needed port on the cam carrier, and some cam carriers missing the hole entirely. Thankfully for us, it's easier to plug an oil port than it is to drill a new one in this application.

The route I decided on, involves drilling out the existing oiling port slightly, and tapping it for a 5/16 set screw. By 3D printing a plug, I was able to prevent debris from falling into the engines oil galley, preventing mechanical carnage from following the conversion. The length of set screw used does not really matter. In my case, it was likely a little under double the 5/16 thread diameter, but using two shorter ones in a jamb-nut configuration is likely a reasonable option too. Red loctite was used to seal and retain the plug. There are better sealant options, but this is what I used.

The actual process of swapping the cam carriers is no different than what you'd do in the process of replacing the cam carrier on a MultiAir model. Once the valve cover is removed, you then remove the multiair, followed by the cam carrier. At that point it is as simple as applying engine assembly lube to all cam lobes, installing your NEW, OEM (INA) lifters into the carrier, and installing the carrier onto the engine. Of course, you will want to replace the gasket. Before pulling anything apart, ensure that you have the needed ten (10) M16*1.0 threaded plugs which seal up the access ports for the bolts which hold the carrier to the cylinder head. They are hard to find (nearly impossible in the US), and will likely take a significant amount of time to get if you do not have them. I had to order mine from europe. At this point, you are done - as the TJET carrier is a one piece unit, there is no valve cover. If you do not have the upper timing belt cover (it is different than the cover for the MultiAir unit), you will want to order one of these from europe as well. For lifters, you can buy a full set of sixteen INA (oem) lifters for less than $300, as opposed to the over $600 if buying from mopar here in the states. Part numbers are avaliable in my parts number document *here* (not linked yet).

Follow good maintenance practices in this process, at a bare minimum you'll want to replace the carrier gasket, timing belt, and timing belt tensioner.


Tuning

This is a placeholder, but eventually, a basemap will be posted, as well as my process for creating it.


Cost Report

EMU Black: $1200

PnP Adapter: $300 (on sale for $150) The reason for the significant cost discrepancy between this PnP adapter and ones for the ME7.9.10 implementation is that there are no active components needed in the installation of the EMU Black, as opposed to the Bosch ECU.

OEM/INA Lifters (16x):~$220 from Europe. Don't buy them from Mopar at a cost of $47 a piece. They are made by INA, and available much cheaper.

TJET Cam Carrier w/ Camshafts: ~$300 from Europe.

Timing Belt Kit: same as usual cost, same parts as the MultiAir spec

Cam Carrier Gasket: same as usual cost, same parts as the MultiAir spec (a hole could potentially be different but it's irrelevant as you'll have blocked it off anyway)

CANBUS Implementation. (incomplete, indefinitely)

Edit: While I was able to figure out quite a few parameters by logging the car's C CAN network - it ultimately proved to be unnecessary. Somehow, some way, Fiat changed very little in this regard when adapting the 500 to the US market, despite it having an entirely different ECU. As such, there is no need for me to know...pretty much any of this, though I guess being overprepared is better than underprepared. Regardless, I will list the parameters I know of below, even though I do not know enough of them to create an ECU translator that will satisfy every module on the car.


In order for a modern (lol, kinda) vehicle like the "New" 500 to function relatively normally, communication from the ECU over CANBus is vital. The instrument panel, ABS, electronic power steering, and even the BCM for controlling such minute things as the door locks, all receive vital information from the ECU over CAN. While the idea of implementing this communication in a custom application seems daunting, for the most part, it is thankfully not.

Reverse engineering CANBus comms is very time consuming, and at times, can be difficult or impossible to fully understand the contents. Thankfully, that does not always matter


The Immobilizer

The Immobilizer function is the cause of headache for many, especially those looking to swap a stock multiair engine into another vehicle such as the X1/9. Thankfully, doing the opposite - implementing a standalone ECU with the stock BCM - is far easier, as the ECU itself is what handles most of the immobilizer function.

The process is quite simple, and is as follows.

Shortly after the ignition is switched on, once every node on the bus has woken, the ECU/PCM sends a message to the BCM with a status bit, four bits of generated data, and two bits of...something.

The BCM then takes in this data, applies some translation/adjustment to it using an internal code, and then replies to the ECU with the result of this translation/adjustment.

The ECU knows what changes the BCM should apply to this data, and thus it knows what response it should receive. The ECU then checks that the response received is what is expected- that the BCM is the one "married" to the ECU, and if it is, the ECUS own fuel cutoff immobilizer is disabled.

The ECU then sends one final message to the BCM, nothing more than a status bit (bit 0), telling the BCM that verification was successful.


Annotation of a recorded exchange is below.


•key is switched on•
ECU sends

0x0010A001 (message ID) , 05 A4 34 18 89 0A 2C ( where 05 is the status bit, A4 34 18 89 are the 'challenge' for the ECU, and 0A 2C are...something)


the bcm replies:

0x0010A000 (message ID) , AB 16 C1 00 00 00 00 ( where AB 16 C1 is the BCMs 'reply' to the ECUS challenge)


after successful verification, the ecu sends a final reply, likely disabling the Immobilizer light on the cluster, among other things:

0x0010A001 (message ID) , 06 00 00 00 00 00 00 ( where 06 is the status bit indicating successful verification)


•immobilizer exchange complete, engine start permitted•


So we can gather, the first (status) bit of 05 seems to indicate the immo is enabled, and is sending a challenge, and that a status of 06 indicates the ecus immo is satisfied. What is not known, is if sending the BCM the status bit 06 without previously sending a challenge will result in no complaints from the BCM. This will be tested soon.

Miscellaneous

This section will be a mess. It is essentially a raw and un-edited copy of notes taken on my phone during the CAN RE process. This info can be used for all sorts of things - for example, reading sport button status over CAN and using it to actuate an exhaust flap or enable water meth injection.


emu can switches: fiat 500 preset

can sw 1 ac

can sw 2 sport

can sw 3 parking brake

can sw 4 unknown



Cruise Buttons :

0x810A000


Byte 0

0x01 when cruise off

0x81 when cruise on

0xA9 when resume pressed

0xD1 when set pressed


Byte 1

0xFE when cruise off

0x7E when cruise on

0x56 when resume pressed

0x2E when set pressed



Wheel Speed is on ID: 218A006

Wheel Speed at stop: 0x00 , 0x2C

Wheel Speed at 63: 03 , E0 Wheel Speed at 74: 04 , 9B Bit flip at 100kph 05 to 06 Bit flip at 50kph: 02 to 03

Byte 1 & 3 seem to be Rear Wheel Speeds Wheel Speeds in MPH

Sport Button is on CAN ID 0x606:

All 0x00 except

Byte 4 0xA0 off, on

Byte 5 0x0C off, 0x0E on

Byte 7 0x01 off, 0x41 on


ESC Light: 10A006 Byte 0: 0x00 (full on), 0x40 (partial and full off) Byte 2: brake pressure (units, scalar, offset unknown)

ESC ID: A18A006 Default: byte 2 bit 7-5 off Partial byte 2 bit 7 on Full: byte 2 bit 7 on bit 5 on Back bits of byte 2 counting 10s of mph Byte 3 vehicle speed, overflow every 10mph

EPS ID: 30A002



Instrument Panel ID: A001

7 

02 - have engine oil changed


1

90 - engine oil pressure lamp

66 - cruise control on

^

oil pres lamp on above 8x

cruise lamp on below X4

startup example:

0x80 - oil pressure lamp on 0x00 - oil pressure lamp off



2

x.x5, x.x7, - coolant temperature lamp

x.x1, x.x3, - coolant temperature warning (bar max + lamp + message)

x.x6 - fuel cutoff active

x.x9 flashing cel and coolant temperature warning

startup example:

0x90 - CEL on 0x80 - CEL off

3

x.5A > two coolant bars - 123.8 f - 51c

x.64 > three coolant bars - 141 deg f - 60c

x.70 > four coolant bars - 160ish...

x.9C > five bars

x.9F > six bars

x.A2 > seven bars


no further changes


4


5

0x00 - generator light on 0x7F - generator light off then 0x30 - generator light still off? then 0xBE - generator light still off? voltage perhaps

6

rpm / 33

no offset

8

x.xE - have engine oil changed