RX8 Project – Part 16, Fitting Piston Cooling Oil Jets

These are something I hadn’t really come across until I started working on this project. While I was researching the work Noble had done developing their twin turbo engines I found the installation of piston cooling oil jets noted as one of the modifications undertaken. On the basis they found it was fine to use the stock pistons but did this mod I started doing research into what exactly they were and why they were used.

The usage of these jets seems to be almost exclusively related to turbocharged engines, both diesel and petrol due to the amount of energy released in these engines. This increased release of energy caused by burning more fuel in pressurised air generates much higher temperatures inside the engine and while the block and head are actively cooled most normal engines rely on incidental oil spray to keep the piston cool. Once you start getting the piston considerably hotter you have a couple options. Either use a piston material which will cope with much higher temperatures without degrading (either due to the temperature affecting the material properties or due to thermal expansion) or somehow cool the piston. Various materials have been used for high performance pistons to help negate the material strength and thermal expansion problems with varying degrees of success but these are generally very expensive made to order parts and well beyond the range of most. This is where the jets come in.

The jet is usually some sort of nozzle drilled into an oil gallery in the block which directs a stream of oil at the underside of each piston. This both cools and lubricates the piston and rod small end/pin.
The original Noble modification is known to have some issues but this was more of a problem with the implementation. Take a look at this : http://noblecars.org/engine.html

The basic problem of the original Noble method is that with such large drillings (probably about 4mm diameter) the cooling will be very effective because the flow rate will be high but the overall engine oil pressure will likely be very low, particularly around the main bearings because that is where they are drilled into the oil supply. Clearly the one place you don’t want low oil pressure!

So me being me I decided to improve on the situation! Firstly I found that most cars that have these fitted (unsurprisingly) use considerably smaller jets, the best example I found was a NASCAR engine using a jet of 0.75mm (I have since tried to find this page again with no luck). Not wanting to risk trying to drill a hole of such a small diameter freehand at the bottom of the cylinder bore from the top I took a slightly different approach and started looking for suitable nozzle inserts that I could use that were available easily and cheap. After a lengthy search trying to find something intended for the purpose (from either a suitable production vehicle or something) I gave up and started just trying to work out what I actually needed and realised that with the rise of home 3D printing small nozzles were actually easy to get – specifically the extruder nozzles used on these printers. These nozzles are usually brass, have an M6 thread and are available in a range of hole sizes, for me the 0.8mm version looked like a good match.

3d printer nozzle

I bought a pack of four nozzles off eBay for a few pounds and decided I should see what sort of spray I actually got from them – I wanted them to produce a fine jet at the normal engine oil pressure rather than a mist as this would assure the oil reached the piston rather than most of it just hitting the inside of the cylinder bore which would achieve nothing. Because I’d decided on the M6 thread it made a test jig quite simple, just a normal M6 nut welded on the end of a bit of 12mm tube. When welding anything threaded it’s a good idea (particularly on smaller threads) to put a suitable mating part in to present distortion if you can. In this case I used a standard M6 bolt. After welding the nut the bolt can simply be unscrewed again but if you don’t do this the heat will often distort the thread enough that it is unusable after welding. The 12mm tube just happened to be about right for the nut but also a good size to allow a normal garden hose to fit over it. Water pressure in the UK is nominally about 3 Bar which is at least in about the right area to represent an oil pressure. Also there is the question of viscosity but my logic told me that oil being more viscous than water should not for a mist as easily, so if it worked with water oil should be fine. The test showed a solid jet out to about a meter from the nozzle and beyond that a tight stream of droplets another meter or so. This should certainly be good enough for what I need!

After this test I decided to go for it, so I ordered another set of four nozzles and started trying to work out how to actually machine the block to make them fit. Due to the position the jets need to be installed the oil feeds need to be drilled from the crank bearing housing 60° either side of the centre line to match the cylinder bore angle and also at a slight angle forward or backward (depending on which cylinder it is) so they actually come out into the shoulder at the bottom of the bores rather than just continuing between the cylinders.
First off I marked up the 60° line for each bore so I had something to line the drill up with for the angle and the starting point for the drilling. Next I found a drill bit that nicely fitted into the groove in the bearing housing so as to avoid reducing the supporting area for the bearing which as it turns out is a 3.2mm. This is the area that apparently will crack on the Noble engines – they use a significantly larger drill hole here which breaks into the bearing support lands and I suspect this is part of the issue but that’s purely speculation. There is also no issue with restricting the flow to the jets here because the jets are now significantly smaller than drilling. The next important thing is this involves drilling quite a long, narrow diameter hole through aluminium and that can be quite problematic!

First off let me say this is next bit is a bad idea all round, you either have to be very confident in your abilities with a hand drill or not care if you ruin an engine block. Ideally you want to be both! If not you will want to talk to a machine shop to do this!

Before you start remember to remove the bearing shell itself and put it somewhere safe! Aluminium is a soft material and will stick to drill bits and tend to generate heat due to friction, if it gets hot enough it can actually seize onto the drill bit causing it to break. Firstly a normal length 3.2mm drill won’t be long enough for this job, it will work to an extent but the flutes will eventually be covered by the sides of the drilled hole when you get deeper and there’s nowhere for the chips of aluminium to go. My advice is to buy a long series drill bit and use it. Start the hole with a normal bit because long bits are more flexible and can be harder to get and accurate start with but once you have a dimple that will hold the bit in place swap to the long series. Use plenty of lubricant (go on, guess how I found that out!). You can use WD40 but it can get quite expensive if you have a few holes to do as it tends to vaporise off during cutting. Thicker oils tend to protect the cutting edge more but make cutting slower but in this case aluminium is soft and so drills quickly anyway plus we’re only making a small hole so it will make little difference. Personally I used 3in1 on mine with works well and helps flush the chips out but you will need to reapply the oil to the hole regularly during the process to make sure the drill is well lubricated. You could also use engine oil or even gearbox oil but these would probably slow the process a little more. Go slowly and let the tool do the work, if you push too hard there is a serious risk of flexing the drill bit which at best will give you a hole that wanders and at worst a serious risk of snapping the drill bit.
Once the 3.2mm hole comes through into the shoulder at the bottom of the bore we need to make the M6 nozzle fit, this means tapping a suitable thread into the bore end of the drilling. First clean out all the swarf (drilling debris) from the new hole. At this stage this is just to make sure we get a nice clean thread cut. Now we have the interesting bit, to tap M6 we need a 5mm pilot drill, so we have to drill out the cylinder end of the 3.2mm drilling to 5mm with enough depth for the nozzle to screw in but the only way to do this is to do it from the top of the bore with a really long drill! I went on eBay again and bought and extra long series 5mm drill for the job. This thing is 250mm long and looks absolutely ridiculous in a cordless hand drill.

Extra long Series Drill

It actually looks more like it should be used on masonry but these have the normal tip and are actually for metal. If the one you buy has a flat ceramic insert in the tip you’ve bought the wrong one! 5mm Drill Jet

I suggest you mark the depth you need to drill to accommodate the nozzle thread (with a little extra room for tapping) on the drill bit. The actual depth here isn’t critical as long as there’s enough depth for the nozzle threads at a minimum. Again plenty of lubricant and drill with slow speed and light pressure and be very careful to keep the drill loaded straight otherwise at best your hole will be at a funny angle but at worst you may snap the drill and damage the bore surface.

 

5mm Drilled hole

Next clean the swarf out again so we can get a good thread tapped. Tapping the holes is another slightly awkward problem for the same reason as drilling the pilot hole, we need to do it from the top of the bore. I suggest going on eBay (or any of a thousand other places online) again and looking for an extra long ratchet tap wrench. These are available under any number of brands but I suspect they’re largely all from the same place. They are available in a small version, which is 250mm long and will tap M3-M10 or a large version which is 300mm long but taps M5-M12. I went for the smaller one because the smaller chuck should allow tapping tighter to the cylinder wall without damaging it and this is likely to be tight for this task. Expect this to be about £10. While you’re at it buy an M6x1 plug (bottoming) tap!

Tapping the Jets

Again proceed slowly with a well lubricated tap, many people will say you need to use proper cutting compound but for a small hole in a soft material this isn’t necessary, 3in1 will be fine. Try to cut forward a bit (maybe a turn at a time or so) and then back the tool off until you feel it turn smoothly. This will help prevent the tap from clogging up and either seizing up or damaging the new thread by material being forced against it. It may be necessary to back the tap out entirely to clean the removed metal from the threads because this is effectively a blind hole. Be careful not to keep going once the tap bottoms out. If you aren’t careful it’s comparatively easy to strip the threads in the aluminium with such a small tap and then it would be awkward to repair. If you’re not confident this really isn’t an ideal job for anyone new to tapping because it relies on having a degree of ‘feel’ about what you need to do and when to stop.

Rinse and repeat five more times and congratulations you now have six neatly drilled and tapped jet positions! Before doing anything else clean everything again, I used a combination of brake clean, compressed air and a scribe. You need to make sure there is no swarf left in the drillings so you don’t risk that jet becoming clogged. Once clean you need to fit the jets. The jets I selected have an external hexagon and so can be tightened up with a socket wrench but you will need sufficient extension to reach the bottom of the cylinder bore with an appropriate sized socket. Clean all the jets with brake clean to degrease them – technically this is not necessary but it helps remove any other grime that has become stuck to the jets in manufacture/transit. Next I recommend you apply a small dab of a suitable thread locker to the jet threads, specifically I went for Loctite 243 which is a medium strength thread locker which will resist oil. You can use others but if you go for anything stronger you’ll need a blowtorch to get it out and trying to do that down a cylinder bore could be interesting! Once you have the dab of Loctite on the jet you need to screw it into the newly tapped hole – I found it easiest to do this carefully from the crank side of the block by fingertip but your mileage may vary! Once you have it in enough to keep it in place tighten it in with the socket wrench. The jets will only need to be nipped up for two important reasons; firstly they are thread locked and so will not vibrate loose and second they are small and made of brass so any more force will likely strip the hex.

Piston Jets Fitted
That’s it, one new set of shiny piston cooling oil jets! More on this project coming soon!

RX8 Project – Part 15, Engine Strip #2

So having removed the timing chain and tensioners (see part 1) next we need to start looking at removing some more major parts of the engine.

Having already removed the cam covers already you should be looking at something like this:

Jag Cams

Thanks to the Jag Motor Project for the image – hopefully they don’t mind me borrowing it! It seems I have misplaced my own photo of this!

You need to remove the cam bearing housings because the design of this engine has the head bolts directly under the cam making it impossible to remove the head with the cams still in place. This is worth remembering and is at least part of the reason stretch bolts are used for the head – it is impossible the re-torque them after an interval of use without removing all the timing gear. As you can see in the photo these are three smaller housings and one larger one at the front each held on with two small bolts. Basically you just need to carefully remove these bearing housings in order. I suggest marking the direction and its position on each one before removal. The position could be achieved by putting each into a small tub which is numbered. However you do this you need to know which is which and which way round they go. Remove them carefully and make sure you don’t drop any bits! Once you have removed the housings you’ll see this:

S-Type V6 Cams Removed

Now we have clear access to the head bolts which as you can see in the photo there are eight of. These are fairly easily removed except for one thing – the bolts are set well down into the head and there is very little room in the recess to put in a socket. You will need a 15mm socket for these bolts and a small breaker bar (or an impact gun) as they will be quite tight.

These bolts are not reusable – I mean you can but it’s a terrible idea particularly in such a critical location because odds are high it will not be up to the job. This is because “stretch” bolts rely on the material of the bolt reaching the yield point of the material at which it begins to exhibit a fairly constant elastic stretch. In effect once they start to deform they behave a bit like a very stiff spring and so if tightened correctly will hold a very accurate load without loosening and so do not need to be re-tightened after a run in period. That said hang onto them for now so you know what to order to replace them!

S-type V6 Head bolt removal

You can see how tight the casting is around the socket! Once all the bolts are gone you can lift the head away. It might take a little persuasion with a mallet. Make sure you have a suitable clear space to put it on once you remove it.

Now you should have this level of grime:

S-type V6 Head removed

Obviously you can just pull off the head gasket now to improve the situation quite a bit and you can have a good look at the state of the engine:

S-type V6 Factory Hone

Here you can see the cylinder bore actually looks in very good condition and even still has the factory honing marks on the bores which is a good sign it’s been working well and shouldn’t have suffered wear issues.

Now do all of that again for the other head and you should have something that looks a bit like this:

S-type V6 Heads Removed

Congratulations now you have an engine with no heads but since my plan was to upgrade the rods I still needed to remove more so flip the engine over and we can get to it.

S-type Oil Pump

In the picture you can see the oil pump is just held on by four small black bolts. I put the crank bolt back in place just so I didn’t lose it but you would have removed this a long time ago. Once the four small bolts are out the oil pump can just be slid off the crank and put aside.

S-type V6 Front Oil Pump Removed

 

Next we need to remove the con rod bolts and this is where having the crank bolt comes in because you can put it back in finger tight and once it snugs up a bit you can turn over the engine to get access to all the rod bolts. Mark up each rod with a cylinder number and arrow for the front of the engine. I put sharpie marks across the split line of the rod to make it easier to match them up later. I had to use something to knock the piston out of the bore use something non metallic otherwise you will likely damage a surface you don’t want to damage. I used a length of wooden dowel. Do these carefully unbolting and removing one at a time. When knocking the piston out don’t forget to catch it before it falls on the floor!

S-Type V6 Oil Pump Removed

So all we have left is the crank. If all you wanted to do was straight swap the rods this is as far as you need to get. Well I wanted to do a few other while I was at it (more on this in another post) so I carried on to remove the crank. This is actually pretty simple at this point, you just take out the 16  main bolts holding the lower block to the upper block along the bearings. The other thing you can see in the picture are the engine mounts, the rubbers here aren’t stock s-type, they’re actually from a V8 Land Rover (Discovery among many others). The reason for this is they’re very strong, extremely cheap (£7 a pair delivered from eBay) and have a stud each side which will fit straight onto the factory cast aluminium mounting arms and also make mounting onto the car really easy when we get to that stage!

S-type V6 Lower Block

It’s worth noting in the above picture not all the bolts are the same. This is because some have small studs on the top to allow the windage plate to be mounted (blue). Note which goes where so this can be put back later! Next you also need to remove the 6 outer bolts (red) before the block will separate.

S-Type V6 Lower Block Bolts

Once all the bolts are out again you might need a gentle tap with a mallet and/or a scraper to get the block apart. Don’t drop the crank bearings!

If you’ve done all of this you should have something a bit like this in front of you:

S-type Stripped 2.5 Block

And a heap of bits you just removed:

S-type Engine Parts

More to come on this project in my next post!

RX8 Project – Part 14, Engine Strip #1

After deciding to turbo the engine (see earlier posts) is became apparent I would have to upgrade the piston rods to make sure the engine wasn’t in danger of these failing and ruining the engine. This meant I needed to extract these from the engine Now bear in mind that this was the first time I’d ever taken the head off and engine before let alone removed a crank so it was likely to be quite a long and delicate process! Also accept that I was making this up as I went along, things may be in a strange order but it seemed to work!

First things first mount the engine to a suitable stand:

Here it is, it’s already upside down but that doesn’t matter! First off I took off the sump. On this engine it’s a cast alloy unit with a large front bulge which makes working around the front of the engine more awkward so I got it out the way early on.

V6 Windage tray

Take off the oil pick up pipe (2xM6 bolts) to get room for the windage tray. The tray is held on by 5 nuts on some special studs on this engine, these are M10 one side to hold the lower block to the upper block but i think M5 on the top just to hold the windage tray.

Duratec V6 Bottom

Now we have exposed the moving parts of the engine and get the first look at the bits we are replacing but there’s a lot more before we get them all out. An interesting thing to note here is the absence of crank bearing caps. On this engine the block is formed in two cast pieces which joint along the crank centre line so the crank bearings are held in place by the substantial cast ribs you can see in the picture and each bearing has four M10 bolts to keep it in place with additional bolts around the outside of the casting.

Next move to the front of the engine and disconnect the hose from the block to  the water pump then unbolt the water pump. On the Ford version of this engine the water pump is driven directly off one of the cams but on this Jaguar one it is a separate unit driven from the back side of the accessory belt and is held on by three small M6 bolts. Next up remove the crank bolt, there are a variety of ways to do this (the easiest probably being a decent impact gun but at this point in the project I’d not yet bought it) but the method I chose was to block the rotation of the crank using a block of wood. This is done by finding a suitable block that fits between the crank and the housing such that as the crank counterweight rotates round it is stopped by the wood. Just remember that the crank bolt undoes anticlockwise so make sure you put the block on the correct side(the bottom in the above image)!

S type V6 front

Now you can flip the engine back up the correct way because we’re moving on to the heads This is because the cam covers need removing to take off the front engine cover.

S-type V6 Black Cam Cover

This bit is again very simple, remove the bolts holding each coil unit in place. Again this being the Jaguar version of the engine is came from the factory with coil on plug. Next remove all the bolts around the cam cover and lift the cover away. Sometimes these get refitted with instant gasket to fix a failed cover gasket cheaply and quickly and so it may require some persuasion, I usually use a putty knife or a wallpaper scraper for this job but it can be easy to damage the faces if you’re not very careful. Alternatively plastic trim removal tools can work well. Obviously repeat the process for the other cover.

Next up we need to remove the front engine cover. This involves removing the bolts all the way round the edge, you can’t miss them, there’s loads and they’re all the same! Make sure you get them all, I think there’s 17 of them but don’t quote me on that, one is under the belt tensioner by the crank! This cover again might require a little help coming away due to the gasket but should be relatively easy. If it isn’t then you’ve missed a bolt so stop prying it!

S-Type V6 No Front Cover

It should look something like this! Now you can see the other feature these jag engines have – variable valve timing on the intake cams. An important point here is the crank timing wheel (the notched wheel on the crank). These have two key positions but only one is correct so carefully mark which position lines up with the key on the crank when you take it off. I recommend something permanent so when you clean all the oil residue off the mark is still visible, a centre punch mark should do it.

Next you need to remove the timing chain tensioners. These are small hydraulic cylinders that use engine oil pressure to maintain tension in the timing chain. They are held on by two bolts each. Just undo the bolts and carefully remove the tensioners from the tension arms.

S-type V6 Timing Tensioner

Once the tension cylinders have been removed the tension arms can be lifted off their dowels and removed as well and then the chains can be lifted off and you should have something that looks a bit like this:

S-type V6 removed tensioner

Now all that is clear the chain runners can be removed. These also hold the VVT solenoids and so are quite a complex bit of metal but are easily removed. I also took of the water hoses at this point just to simplicity.

Now you should be at this stage:

S-type timing gear removed

In the next part the engine strip will continue…

RX8 Project – Part 13, Canbus #3, Labview!

If you just want the CANbus ID for the RX8 PS light and not all the background work just skip to the end!

So it’s been quite a long time since I had chance to have another go at getting the CANbus on the cluster working and while previously I manged to get everything apart from the power steering warning light working I decided I really should find out why not. This is a simple lesson in why getting sufficient sleep is really important!

I was contacted a while ago buy a guy doing a similar conversion to mine who happened to have a second complete RX8 and a variety of diagnostic equipment that can talk CANbus who had send me a block of CANbus log data that I’ve done nothing like enough work on since I’ve had it! Anyway the key here is I knew that the car some of the logs had come from had the factory PCM (ECU) working as intended and as such the power steering light doesn’t illuminate. This meant that somewhere in that log file was the data that turned off the light, I just had to work out where it was!

Now first off I took the approach of taking the two sets of data logs I had, one from a car with a functioning PCM and one from a car that doesn’t. Then list out all the ID’s that occurred in each set of data. I’m going to assume for my purposes that any that occur in both sets are not required. The logic being that the data that turns off the light must be present in one set and not the other. I admit that this might not be the case if there’s something more complex going on like if with the PCM removed the power steering computer doesn’t get the required data and sends a different value on the same ID. But for now it’s a starting point!

The ID’s that remain are as follows:

201, 203, 215, 231, 240, 250, 420, 620, 630, 650

A couple of these we’ve already seen elsewhere, specifically 201, which is the RPM and speed to the dash, and 420 which control the cluster warning lights. So after setting up the arduino and canbus data to strobe all these remaining address and nothing happening I gave up!

Many weeks went by and I it was nagging at me why I couldn’t find the right code. Eventually I decided to try a different tack so I ordered a USBtin which is a really neat little USB to CAN adapter which appears as a virtual COM device in windows and can be controlled using a series of commands known as the LAWCIEL protocol (details of which can be found here). The kit version is really quite cheap and would probably be a good option for the budget conscious but on this occasion I just decided to be lazy and buy the prebuilt one.

Clearly I’ve decided to PC control it at this point! Next up I needed a way to stop it when the warning light went off. I ordered a very cheap optical detector off ebay which can be wired into an Arduino or something similar. These are the ones that vary around £1-2  so difficult to argue with. They offer a potentiometer to adjust the switching brightness so I can tune it to what I need and a digital output so I don’t need to mess about doing analog reads or calibrating things on a microcontroller. Yes i know it’s not the neatest or most efficient way of doing it but for my purposes it’s so cheap and easy it really doesn’t matter! So I need to make that talk to a PC in a way I can use and that’s where this whole thing starts to get more interesting.

I’d pondered ways of interfacing a microcontroller to a PC easily and while it’s not terribly hard to make it shout over serial when an input goes high I came across something much more interesting. There’s a company called National Instruments who make lots of very expensive software and equipment for recording data from experiments but fairly recently they started supporting hobbyists by producing the Labview Makerhub, and more specifically a package called LINX. LINX includes a series of drivers and firmwares to allow things like Arduinos, Beaglebones and even Raspberry Pi’s to be used as IO devices (the Raspberry Pi can actually have programs loaded to them as a full remote node). This is quite a major step because it suddenly allows hobbyists to use really good professional software without having the problem of only being able to use NI’s extremely expensive hardware! This gave me and idea – use labview as the core software then I can use the supplied LINX firmware to set up an arduino as IO. To make this deal even sweeter you can also download Labview for free from NI for home use. Take a look here

So after a quick bit of following the instructions we have a basic labview program that will read the arduino IO via serial:

Labview Lynx1

Basically what this does  is it starts by opening a serial connection via the LINX toolkit, this returns a device name to an on screen string display and passes a reference which identifies the connection to the read stage. The next bit the larger grey rectangle is how Labview handles a while loop so it’ll keep performing the enclosed functions constantly from left to right until the conditional term in the bottom right goes high – in this case it’s a stop button. So basically the loop just calls a LINX channel read of channel 2 where I connected the light sensor to the Arduino. The inner rectangle only executes when the read value is false (i.e. when the light goes off) and while there’s a lot of information recorded here from elsewhere in the program basically if it sees the light go off it records the current ID being tested, the time that has elapsed since the test started. This means we know when it’s right!

Labview is designed to capture data from lab instruments and so there’s a really handy thing called the VISA toolkit that allows blocks of data read and write via the serial port and basically you can just open a port with specified settings then make read and write requests and do things like crop the incoming data at a predefined character. In this case that character needed to be CR (Carriage Return) this is ASCIIcharacter 13 because LAWCIEL terminates everything with one.

Labview Lynx2

For the USBtin we open the correct COM port at 115200,8 Data bits, No parity, 1 stop bit and no flow control. The other thing to note is at the top right, this sets the termination character to the numeric value of CR, the benefit here is you can perform a read of any length and it will automatically break up the data in the buffer so a single read can vary in length but the start will always synchronise  with the read call. Opening the connection in a terminal program for the first time and you’ll see nothing actually happens as such, an OK is signified by a CR so all you see is the cursor move. At this stage we are only connected to the USBtin, not the CANbus. So next, configure the CAN connection, send a value of “S6\r” . The code is S6, this will set the USBtin to 500kbit correct for the dash, the \r is how you indicate a CR in a Labview string. Next I chose to send “v\r” which requests the version from the USBtin, we don’t need this but it gives a solid confirmation it’s talking to us. Next up Z1\r tells the USBtin to timestamp the incoming data, I thought this might be useful but never actually implemented it.

Labview Lynx3

With the setup complete we can start reading data by opening the CAN connection by sending O\r. On a terminal program (assuming you have the CANbus wired up) doing this would result in packets of can data from the cluster appearing. The initial read of length 1 byte reads just the confirmation from the USBtin that it has received the open request. Next is the main read, it’s worth noting the read length is set at 50 bytes but this will be cut short by the termination character set earlier so we can accept varying length CAN data. C\r closes the CAN connection and again another read 1 byte clears the acknowledge. Tacked on the end is a section to read the controller status looking for error states etc. The keen eyed amongst you will notice the majority of this code is conditional, this is because the code needs to insert send requests among the stream of reads. This is because if the data is not read from the USBtin constantly a buffer somewhere fills (I imagine on the USBtin itself but can’t confirm this) and the port crashes. I spent a lot of time finding this out the hard way!

Labview Lynx4This is the write data code, again very similar but it just opens the port, writes whatever string is in the buffer and closes the connection. Once the connection is confirmed closed it resets the Boolean that causes the ‘write’ condition so on the next loop it goes back to reading again to keep the buffer clear. The read loop runs at the maximum possible speed but it is slowed down because it waits for either a termination character or 50 characters to be received before it completes and loops again.

Beyond that the only other bits of code just generate the data for the write buffer using an increment counter for the ID field and toggling between either 8 bytes of FFFF or 0000 every 100ms for 20 cycles and setting the write flag high to send the data..

So after letting this run for a fair while it started spitting out values, specifically the ID 300 for the power steering light. Wait a minute that wasn’t in the list earlier. Yes I know that, that’s where getting enough sleep comes in. Originally I split the data based on whether or not the PCM was fitted and ignored the ones that occurred in both sets, the obvious mistake here is that of course the power steering light isn’t controlled by the PCM, quite logically it’s controlled by the power steering controller!

So there we go, ID 300, the first byte (leading) controls the light, values below 80 turn the light off. Unplugging the PCM causes the controller to send 80 on loop hence the the warning light.

Get data from ID: 4B1
0	0	0	0	0	0	0	0	
-----------------------------
Get data from ID: 81
43	6F	1	4B	
-----------------------------
Get data from ID: 300
80	
-----------------------------
Get data from ID: 231
F	0	FF	FF	0	
-----------------------------
Get data from ID: 430
95	5F	83	0	0	0	60	
-----------------------------
Get data from ID: 81
25	6F	1	4B	
-----------------------------
Get data from ID: 81
16	6F	1	4B	
-----------------------------
Get data from ID: 630
8	0	0	0	0	0	6A	6A

Looking at the log data again we see that ID 300 is getting a value of 80 – this is during the self test before the engine is started. I previously tried sending this data on the original Arduino CAN setup and go no result so what did I do wrong. Again this is based on another assumption, I though the logger was ignoring high order bytes with zero value (ie this value if could be 00-00-00-00-00-00-00-80) well it turns out that was totally wrong, it actually ignores trailing zeros, the value of the can data here should be 80-00-00-00-00-00-00-00.

So while all these hours of work told me one thing I should have already known it’s actually worked out Ok because it highlighted this other problem (read ‘incorrect assumption’ !). This means The odds of me working out all the other data from the logs (that I’d previously written off as not usable) is actually much higher!

 

 

RX8 Project – Part 11, Turbo’s #2 – Wastegates

So now the project is going in the turbo direction I need to be a bit wary with how I do it. The GT1549 turbo’s I chose had positives and negatives. They looked to be exactly the right size for the engine I had, they were fairly common in one form or another and importantly the price was spot on! I still don’t understand quite how but I managed to find someone on eBay with a matching pair of these turbos fully cleaned and rebuilt for £65 each delivered! So that’s the positives, now the negatives, firstly rather than the normal bracket bolted to rear of the compressor housing to hold the wastegate actuator. On these turbos it is actually cast into the housing and so it would make rotating the housing to fit the application considerably more difficult. The second problem is they have a factory fitted actuator which isn’t adjustable more than a small amount and I really didn’t want to start tweaking a completely untested engine with no idea what was going to happen with no way of keeping the boost below the 18 psi wastegate pressure!

So getting over these problems. Having looked at the rotation problem I came to the conclusion I should be able to make them both fit with no rotation changes needed. The backup plan here was to grind off the cast in mount and custom make a bracket using a bit of steel plate if it turned out I needed to later on. This takes us to the wastegate problem. I looked at a number of ways of providing a reduction in the actuator pressure including adding springs to the rod side of the actuator and even bolting the internal wastegate solid and fitting external wastegates to the manifolds I came to the conclusion the only real way of giving a wide but reliable range of adjustment while keeping the package as small as possible would be to replace the stock actuator with an aftermarket adjustable one.

Now this is where the plan goes a bit wrong about – after looking about for ages to find a sensible option at a half sensible price the best I could come up with was this : Kinugawa Actuator 

Kinugawa Actuator

I’m under no illusions here, this is a a cheapo unit! But I strongly object to spending the cost of the car on each wastegate. The problem is even though I got these for £68 each which really is very cheap they actually cost more then the pair of turbos! Considering all this it’s still a pretty good option because it is a ‘universal’ version. It comes with a range of springs for different pressures so I can start at just a few psi and swap the springs out as needed and also comes supplied with four different actuator rods.

So here we are – actuators!

Kinugawa Package

So at first glance they look ideal, but don’t let that fool you! There’s a couple engineering problems to overcome.

Actuator Flap clash

The first problem is this; the hole in the supplied rod end isn’t large enough for the flap actuator on the turbo. The solution is simply to drill this out to fit. I didn’t note the sizes, but it was a standard drill size.

Next up was that this ‘universal’ actuator was never really intended for a turbo this small and as such the shortest actuator rod is too long to allow the wastegate flapper to close so I had to modify that as well. The rods are nominally 6mm diameter but the end the rod end has a fine pitch thread meaning modifying that would need me to buy a fine pitch die to extend the thread. Luckily the end that goes into the actuator is a standard M6x1mm metric thread so that was the easier option.

Modified Actuator Rod

I measured how much I needed to shorten the rod to allow the flapper to just close at one end of the rod ends adjustment. The opening pressure of the actuator is set by preload so the more it is tightened greater the boost pressure. I then simply cut the thread down to the required point and then trimmed off the excess. The good news is if I made the rod too short I three more tries for each one!

Modified Actuator Rod

And here is the difference – it’s actually about 25mm less than it started out! Reassemble the whole thing and magically it now fits where it needs to!

GT15 Kinugawa actuator

The other thing you will need to do potentially at this point is change the spring. Once the actuator rod is in the actuator this is actually not too bad but be a bit fiddly. First of position the actuator so the rod is sticking downward between the jaws of a vice. Tighened the vice to hold the rod in place then undo all the housing screws. Lift off the top housing and carefully remove the diaphragm underneath. Next you need to carefully release the rod to take the load off the spring. then you just unscrew the rod and take the aluminium piston and the spring underneath out the housing. Reassembly is just the reverse but the key is to put tension on the rod again and clamp it in place again before refitting the diaphragm and cap otherwise it’s very difficult to get the diaphragm correctly positioned without any wrinkles that could cause damage or leakage.

So now we have two turbos with adjustable wastegate actuators with a potential working range covering something like 3-30psi!

 

RX8 Project – Part 10, Turbo!

So this is about the time this whole project started getting a bit out of hand, when I decided I was going to need more power…significantly more.

I looked into what options I had –

Option 1 – I could stay naturally aspirated and probably skim the head to increase compression a bit and get more out of it but tuning in this way can be very intricate and looked to be more involved than I wanted for the amount of power I could expect.

Option 2 – Supercharger, there are a few options here. Realistically the most common supercharger these days the Eaton M45 found on the modern Mini cooper S is just too small for this so sticking with the positive displacement type we can get an M62 from a mercedes CLK230 and with the right pulley ratio it would probably be ideal for moderate improvements. For real degrees of silliness an M90 might well be needed and these are a little harder to find.

Option 3 – Turbo, this gives a huge amount of options due to the prevalence of turbo engines at the moment and would give potential for significant power gains comparatively cheaply and without needing to align belts.

After debating for a very long time the best way to go for a road car I settled on option 3 primarily for the simplicity aspect – I know very little about the intricacies of high compression engines and I know superchargers require a level of alignment very difficult to achieve with DIY manifolds! The next obvious question is how much power? Well following finding out from Noble that the rods in the engine fold up at something a bit over 300bhp I decide that from a cost and complexity point of view I’d aim for about 280bhp as a limit so I could keep the amount of parts I needed to a minimum – famous last words!

Now there’s a huge online argument about whether two smaller turbos or a single larger one gives the best throttle response and performance. This isn’t an argument I want to get into but in my case I decided twin turbo was the way to go for two reasons. Firstly because I could close mount them under the engine to keep the overall engine package as small as possible and so simplify the pipework on the exhaust side. Secondly because due to the government publicising the benefits of diesel there are now loads of small cheap turbos about for very little money..

Getting into sizing most of the information is that Noble used two T25 turbos. Taking a look at http://www.boosttown.com/forced_induction/air_amount_calculator.php

We can see that for this engine at 6000 rpm and 0.7 bar of boost we need about 27 lbs/min of total airflow. Next we need the T25 Map for a common inducer size:

T25 Compressor map

Looking at the map for the normal T25 turbo we can see that with two turbos to share the load and so only needing about 13.5 lb/hr at 1.7 pressure ratio the turbo is right in its optimal zone. Not a bad choice all in all but these are old design turbos and as a twin turbo configuration the actual  amount of available exhaust will be limited so the turbo may not spool until a bit high up the rev range so I started looking at other options which would give a good improvement across a wider rev range. To achieve this a smaller exhaust housing was needed and this is where the diesel engines come in. Turbos used for diesel engines tend to have smaller exhaust housings for this very reason and they’re abundant. This led me to the GT1549, this is a manufacturer specific version of the GT1548 turbo, people have reported them to be good for 180-200bhp which is right in the area we want.

GT1548 Compressor Map

In many ways a similar map to the T25 but the spindle speeds are noticeably higher. The unit as a whole is much smaller but will have less weight in the rotating components and as a result of the smaller exhaust housing the turbo should generate boost at lower RPM. I used to have a map for the exducer which confirms this but have since misplaced it. Now before anyone tells me “you can’t use a diesel turbo on a petrol” consider this – this same turbo was used on both a huge range of diesel engines but also on the Saab 9-5 V6 petrol. That said there is also a VNT version of this turbo (GT15xxV), VNT turbos don’t last long on petrol engines by all accounts.

So here we are, the turbosGT1549 x2 :

So there you have it, a short post but a complete change in the direction of the project from where it started off and we’re only just getting started!

 

 

RX8 Project – Part 9, Flywheels Part 3

So just to finish of the flywheel section here are the the finished custom parts :

Flywheel spacer on the crank, you can see the black dust seal in the centre covering the new pilot bearing underneath.Duratec V6 Crank Spacer

A wider shot showing the spacer in position among the currently disassembled state of the engine.Duratec v6 Flywheel spacer

And finally the flywheel itself.

Custom Duratec v6/RX8 Flywheel

In this photo the ring gear and location dowels for the clutch basket have been fitted.

The ring gear was actually a lot easier to fit than it was to remove because you can just put the ring gear in the oven (at maximum, in my case 250°C+ off the end of the scale!) and put the flywheel in the freezer for an hour or so as well – this may not actually be necessary but you want the most possible room between the parts when you fit them together. If the ring gear snags on the way down it because there isn’t quite enough space it can be a real pain to get it off again. Before installing the ring make sure it is the correct way round – all the teeth should have a bevel on one side to help the starter engage cleanly this goes towards the position of the starter motor! Take the hot ring out the oven, check it and drop it into place as quickly as possible but make sure it’s right and fully seated to the shoulder of the flywheel. Once touching the flywheel the ring will cool rapidly and lock in place.

The dowels in question turned out to be the wrong size, I specified them as 1/4″ diameter (6.35mm) and this is what is still shown on the drawing but it turns out the ones I measured had more rust than I thought and the holes in the clutch basket are actually designed to locate on 6mm dowels – something I really should have checked! From what I have since found out this is likely one of the many Ford engines which have special dowels which are  (from what I can find out) 8mm on the flywheel side but only 6mm on the clutch side. The correct dowels are actually 6.30mm on the smaller diameter so my original measurement wasn’t actually too far off, I just shouldn’t make daft assumptions! Larger end is 7.97mm diameter by 6.5mm long on the ones I have, overall length is 18mm. Tolerances and fits are not my strong point but I’ll probably start with a 7.9mm drill and hope to press fit them.

For simplicity I recommend buying something like this available via eBay as Cosworth clutch dowels by x-power engines:Xpower Flywheel Dowels

I’m planning to modify the appropriate holes on the flywheel to use the correct dowels I just haven’t quite got round to it yet!

I should probably also take a moment here to mention flywheel bolts. The Duratec crank has a slightly unusual thread which is M10x1.0mm (M10 Extra fine). This is as it happens the same thread commonly used on brake hydraulic components like bleed screws. Needless to say the stock bolts are far too short as the engine originally just had a thin flex plate so longer bolts were needed. Now various companies will sell flywheel bolts for almost any engine but not for something like this and they rarely specify the actual sizes of the bolts in a kit so I can’t just buy one for something else that will fit very easily. My solution was find the best standard bolt I could and so I am using some 12.9 high tensile socket cap bolts which I managed to find from a bolt supplier on eBay with the right thread. For anyone who doesn’t know 12.9 rated bolts are the highest rating before getting into one off special items (usually using exotic materials) and they really are very strong. As a comparison ARP gives their flywheel bolts as having a tensile strength of 180,000 PSI. The 12.9 bolts are rated to have a minimum tensile strength of 176,900 PSI – a number close enough it makes me think they are likely the same material! The strength figures for these bolts mean at the size I will be using each bolt can be safely loaded to in excess of 7000kg of tensile load indefinitely with no deformation. Their failure point being somewhere north of 9500kg each! Some time in the future I will do a full write up of nuts bolts and other fixtures it’s worth knowing about.

So that’s my shiny custom flywheel, next time you see it it should be bolted to a rebuild engine with a whole host of custom or cobbled bits on it!

RX8 Project – Part 8, Flywheels Part 2

Apologies for the long delay since my last post (more than a month!), life has been getting in the way of having time to do anything on blog of late. The good news is that the RX8 project has made some progress and this blog is still no-where near the current status so there’s still plenty to come!

In flywheels part one I mentioned how I ended up in a situation where I didn’t really think the cast flywheel was save to modify and how a chance encounter led me to a solution. The problem it presented is I’m primarily an electrical/electronic engineer, while I dabble fairly extensively in mechanical things designing a flywheel isn’t exactly something that comes up every day and the precision was critical so I spent a lot of time making sure I got it right!

Critical aspects as I saw them were the bolt pattern to match the crank, bolt points for a suitable clutch and and very accurate outer diameter to allow fitment of the RX8 starter ring gear.

Looking at these criteria one at a time the bolt pattern is an interesting one. At first glance all the 8 bolts appear to be evenly spaced around the crank on a PCD (Pitch Circle Diameter – this means the centre of each of the holes is placed on a circle). After checking my early flywheel model drawings against the real flywheel I noticed that all the bolts lined up except one which was just slightly wrong; ok, approximately 2mm, enough to be considered very wrong! Duratec V6 Crank Alignment

This suggested the pattern wasn’t exactly what I thought so I started checking exactly what the error was in different directions to figure out what was going on. After extensive measurement I managed to work out what was wrong, the bolts were indeed on a PCD they just weren’t evenly spaced. For even spacing the bolts would be at 45° intervals but one hole was shifted 4° round the PCD so it was 41° and 49° to the two nearest holes. Combined with a 76mm PCD this made the bolt pattern line up perfectly. This is actually quite useful because it means when the crank/flywheel are balanced they cannot be reassembled in the wrong alignment.

The crank also features a location register to make sure the centre of the flywheel is perfectly centred on the crank. The register is a raised lip accurately machined to a specific outer diameter so there is no lateral slop between the parts, in this case I measured this to be 44.40mm in diameter. when I trial fitted this it needed some emery on the crank to fit but this seemed due to surface rust where the engine had been stored in a damp room for a long time. Your mileage may vary!

Next up we had the clutch, I initially planned on using the RX8 clutch as I thought it would be stronger and have more options later but on further research it turned out RX8 clutches are very expensive indeed and anything other than a stock one gets very expensive very quickly and largely need to be imported so I started looking at other options. This took me back to the idea of using a Mondeo 240mm clutch, they’re cheap, readily available and the stock ones will handle a fair amount of power. Admittedly a stock kit is highly unlikely to last long with the amount of power this project could get to but there are readily available uprated covers and plates that could be used. Plus £50 on a project that may never really work isn’t too bad, £300 for a new RX8 stock clutch is more than the car cost! I also already head the factory Mondeo flywheel to take all the appropriate dimensions from which kept the process fairly simple.

The last issue was the ring gear, this is critical because the RX8 has its starter motor on the gearbox side and when because of this the options are either re-use the RX8 starter or butcher the RX8 bellhousing to allow an engine side starter to fit. For simplicity I figured I’d go with the RX8 starter since I was getting the flywheel made anyway. Starter ring gears are whats called an interference fit on the flywheel. In essence the ring gear is intentionally slightly smaller than the flywheel it is designed to fit onto and when the two parts are either pressed or heat fitted (heating up the ring so it expands and can be slipped into place) together. It is a tiny change in size when fitted and just the friction between the two parts that prevents the ring gear slipping when the engine is started hence why this is rather critical. To simplify this I modelled a nominal 290mm for the diameter of the lip this mounts on but supplied the ring gear to the machine shop and asked them to machine to an interference fit. This led to the following design:

RX8 Flywheel V6 – Machining Drawing

After a lot of double checking with these base measurements I needed to get the correct offset from the crank to make sure the clutch plate is in the correct position to be fully engaged with the gearbox splines. This led to me modelling everything to make sure it would all fit where it needed to:

RX8-V6 Clutch AssemblyHere you can see how everything stacks up. Between the bell housing and engine there is a 10mm spacer (grey) this represents the adaptor plate thickness. Clearly the bell housing has been simplified but the overall length is correct and the position of the splines (a little hard to see in the picture) and pilot bearing diameter (the reduced diameter) on the gearbox input shaft are correct.

Unfortunately having got all of this looking right and sent it over to the machinist and work starting on it I realised a couple minor mistakes, one was that I’d not offset the flywheel to match the spacing of the bell housing caused by the adaptor plate (shown above but this picture is from a later version) but related to that I hadn’t checked the offset to make sure the starter ring gear was actually in the right position to engage with the starter!

Turned out it was a little off and actually needed more offset but unfortunately the raw material for the flywheel had been delivered and machining had already begun and sadly it wasn’t big enough to allow for this extra thickness so I needed a new plan. The best I could come up with was to add a small spacer to correct this. Luckily this also allowed an opportunity to include a new pilot bearing location. This is a bearing that locates into the end of the crank to support the engine side of the gearbox input shaft and due to the gearbox adaptor plate thickness and the fact of it being a mismatched engine and gearbox the standard bearing was now too far away to support the shaft.

RX8 V6 Crank Spacer V1

This spacer corrects the problems above and still includes the correct bolt pattern, location diameters to keep everything centred. The 35mm internal diameter is the exact size of the bearing I used. This allowed a suitable bearing and a dust seal to be pressed into place and likely stay there, that said there’s a lip in the spacer to hold the bearing up and once the gearbox shaft is in place it physically can’t fall out. It’s probably worth pointing out here that this bearing only actually moves in use when the clutch is pressed, when driving along in a gear the clutch locks the crank and input shaft together and so the bearing is rotating overall but the inside and outside are rotating at the same speed so the vast majority of the time it shouldn’t experience any wear.

The final product to be coming in part 3!

 

 

 

 

 

 

 

RX8 Project – Part 7, Introduction to flywheels

Having decided what engine I was going to use and deciding to keep the existing gearbox so I could retain the factory carbon prop shaft the next logical step was to work out how exactly to achieve that…

First off the engine I had bought was from an automatic and so had a flex plate rather than a flywheel. This is a comparatively thin piece of steel which gives the starter ring gear, which would be on the outside of the flywheel on a  manual, a fixing point and also mates the torque converter to the crank. In automatics the torque converter provides the rotating mass to smooth the engine pulses. So the first step was to get a flywheel that would work. My first idea was to take the factory RX8 flywheel which has quite a deep offset (i.e. it is quite dished) which would help correct for gearbox adapters which would space the gearbox off the engine. So I looked into simply machining off the back of the RX8 flywheel flat and drilling the bolt pattern from the V6 crank into it. While technically this would work there are a few problems.

RX8 V6 Flywheel Mod

(Taken from here : http://www.locostbuilders.co.uk/viewthread.php?tid=185939&page=2)

The image above shows exactly what I’m talking about, this is a factory RX8 flywheel modded onto a V6 crank. I believe the engine used in this case is the Mazda KLDE. While this all looks good there are a couple of issues. First is that the RX8 flywheel isn’t balanced as it stands, it forms a balanced arrangement with the rest of the engine and so needs modifying. I don’t have a picture of this but the weighted lip on the rear ranges from thin on one side to very thick the other. Aftermarket flywheels get round this by using balanced flywheel and a separate counterweight. Problem two is that the factory flywheel is cast iron, this has an irregular structure and can have flaws and other weaknesses from new but parts are generally made with a factor of safety to account for this but modification in this way will remove some of this additional strength and change areas of stress. I actually 3D modelled this change to see if it would work:

Original:

RX8 Flywheel Bottom OldRX8 Flywheel Top Old

Modified:

RX8 Flywheel Bottom NewRX8 Flywheel Top New

Having modelled this I performed a stress analysis of this based on the force created by the flywheel spinning at 8000 RPM. This is more than redline as it stands but it seemed prudent to plan ahead! It turns out the stock flywheel is only about 20% stronger than required based on the nominal ‘standard’ properties of cast iron. The new version would be below strength at this speed, dropping to 7500 RPM gave something around 102% strength. Not a number I felt confident in at all! Just to make a point here as people argue the safety of modded flywheels a lot (mostly from “I’ve done it and it’s fine”). I’m not saying it will fail modded like this, in fact the numbers suggest it is (just) strong enough here but there is no margin for error even on the ‘ideal’ material and cast iron does vary significantly. A given flywheel might be fine like this for years, but get a weaker one or one with a flaw or even give it a hard jolt when it’s at full revs and it may just shatter. If it does, be somewhere else!

So after deciding the mod wasn’t really the best idea I realised that all I needed was a flywheel that would bolt up and work. A fairly easy task at face value since it turned out the the standard Ford clutch splines (1″ dia, 23 spline) match the gearbox the solution suddenly seemed simple and I just needed a stock Ford flywheel and clutch for that engine. It turns out there were a few variations of the Ford flywheel depending if you went for an ST200, ST220 or just a vanilla V6 Mondeo but the difference between them seems to be some are ‘lighter’ versions to make the more special cars rev a little more freely. This is achieved by leaving out sections of the outer lip on the flywheel. In my case I had no idea if this project would ever work so I bought the cheapest! This is when another problem emerged:

 

Mondeo Vs S-Type Starter

Note the starter ring gear on each. The top is the S-Type flex plate, the bottom is the Mondeo one. It seems the Ford and Jag use a different starter motor as well. Add to this that the Mondeo flywheel puts the clutch far too far forward to mate to the gearbox and because the starter is on the engine side on the Jag but on the top of the gearbox on the Mondeo (because it’s transverse) – something we can’t do on the RX8 as the gearbox is wrong and there isn’t the room in the tunnel the whole idea falls apart! Modifying the cast one seems to be the only sensible option.

Around this time I happened to have a chat with a colleague at work who is a professional mechanical engineer and 3D designer I know through the job I had at the time and explained the problem and he directed me towards a machinist who did a lot of work for him and was well into cars. By chance a few days later this machinist came into the office and as soon as I explained the problem he just said “ah, we’ll just make you a custom one if you do a design”…. So I found myself with the challenge of designing a custom flywheel which as per the machinists recommendation would be made out of EN24 steel. As a comparison changing the models above to EN24 changes the safety factor to something around 300% from memory meaning we can lighten it significantly later if required and not risk weakening it dangerously.

More to come…

RX8 Project – Part 6, Canbus #2

So now we have a powered up RX8 cluster and some Canbus hardware that we can talk to we can start doing a few interesting things with our new setup.

Fire up the Arduino IDE and we can start writing our basic controller code. Canbus devices have a device address and a memory location for all the required data so we need to work all of these out. This is a lot easier for digital IO than the more complicated analog values because digital IO are just either set bit on or off whereas analog values can have funny scaling and things going on. I initially used a canbus demo program which worked because I basically cloned the Arduino Canbus shield. Plenty of starter guides and information can be found here : https://learn.sparkfun.com/tutorials/can-bus-shield-hookup-guide

My initial approach involved setting the target address for the Canbus transmission and sending patterns of bits high and low and see what happens. Google told me that the cluster Canbus interface operates on 500 kHz clock so with that information we should get a connection.

#include <Arduino.h>
#include <mcp_can.h>
#include <mcp_can_dfs.h>

#define CANint 2
#define LED2 8
#define LED3 7

MCP_CAN CAN0(10); // Set CS to pin 10

void setup() {
 // put your setup code here, to run once:
 Serial.begin(115200);
 Serial.println("Init…");

Serial.println("Setup pins");
 pinMode(LED2, OUTPUT);
 pinMode(LED3, OUTPUT);
 pinMode(CANint, INPUT);

Serial.println("Enable pullups");
 digitalWrite(LED2, LOW);
 Serial.println("CAN init:");
 
 if (CAN0.begin(CAN_500KBPS) == CAN_OK) 
 {
 Serial.println("OK!");
 } 
 else 
 {
 Serial.println("fail :-(");
 while (1) 
 {
 Serial.print("Zzz… ");
 delay(1000);
 }
 }

Serial.println("Good to go!");
}

unsigned char offarray[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // Always Off Array
unsigned char onarray[8] = {255,255,255,255,255,255,255,255}; // Always On Array

void loop() {
 // put your main code here, to run repeatedly:

for (int i=0; i <= 512; i++){ 
  for (int l=0; l <= 10; l++){  
    for (int j=0; j <= 100; j++){
       CAN0.sendMsgBuf(i, 0, 8,offarray);
       delay(10);
     }

     for (int k=0; k <= 100; k++){
     CAN0.sendMsgBuf(i, 0, 8,onarray);
     delay(10);
     }
   }
  }
}

So this loop will iterate through 512 addresses strobing all 8 bytes high and low on 1 second intervals. The trick here is that canbus needs regular packets to stay active, so we can’t just send a value once. In this case each value (high or low) is send 100 times at 10ms intervals so the cluster should stay active long enough to see if anything is happening. Each address will get 10 cycles of high and low before moving onto the next address. In concept this would work and provided ‘i’ is set to increment high enough you would cover all the addresses. Bear in mind at this rate you’d have to watch it for about 90 mins…

Thankfully around the time I started running though this trying to find any useful addresses I came across this :

https://www.cantanko.com/rx-8/reverse-engineering-the-rx-8s-instrument-cluster-part-one/

This nicely tied in with the hardware I was working on and so the code and information is all exceedingly useful and saved me a lot of time. Specifically it gives the address locations for most of the indicators on the cluster which is what we really need.

After lots of trial and error I managed to come up with a block of code that can control the cluster but easily allow me to set any warning light I need on the dash, or more accurately also to turn off all the warning lights. Something that will be essential come MOT time as a warning light that stays on is an MOT fail and since most of the systems that control them will no longer be in the car (primarily the original ECU).

#include <Arduino.h>
#include <mcp_can.h>
#include <mcp_can_dfs.h>


#define COMMAND 0xFE
#define CLEAR 0x01
#define LINE0 0x80
#define LINE1 0xC0

#define CANint 2
#define LED2 8
#define LED3 7

#define NOP __asm__ ("nop\n\t")

// Variables for StatusMIL
bool checkEngineMIL;
bool checkEngineBL;
byte engTemp;
byte odo;
bool oilPressure;
bool lowWaterMIL;
bool batChargeMIL;
bool oilPressureMIL;

// Variables for PCM
byte engRPM;
byte vehicleSpeed;

// Variables for DSC
bool dscOff;
bool absMIL;
bool brakeFailMIL;
bool etcActiveBL;
bool etcDisabled;


MCP_CAN CAN0(10); // Set CS to pin 10

void setup() 
{
    
    //Serial.begin(115200);
    //Serial.println("Init…");
    //Serial.println("Setup pins");
    
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(CANint, INPUT);

    //Serial.println("Enable pullups");
    digitalWrite(LED2, LOW);
    //Serial.println("CAN init:");
    
    if (CAN0.begin(CAN_500KBPS) == CAN_OK) 
    {
        //Serial.println("OK!");
    } 
    else 
    {
        //Serial.println("fail :-(");
        while (1) 
        {
            //Serial.print("Zzz… ");
            delay(1000);
        }
     }

Serial.println("Good to go!");
}

unsigned char stmp[8]       = {0, 0, 0, 0, 0, 0, 0, 0};                         // Always Off Array
unsigned char otmp[8]       = {255,255,255,255,255,255,255,255};                // Always On Array

unsigned char statusPCM[8]  = {125,0,0,0,156,0,0,0};                            // Write to 201
unsigned char statusMIL[8]  = {140,0,0,0,0,0,0,0};                              // Write to 420
unsigned char statusDSC[8]  = {0,0,0,0,0,0,0,0};                                // Write to 212

unsigned char statusEPS1[8] = {0x00,0x00,0xFF,0xFF,0x00,0x32,0x06,0x81};        // Write to 200 0x00 00 FF FF 00 32 06 81
unsigned char statusEPS2[8] = {0x89,0x89,0x89,0x19,0x34,0x1F,0xC8,0xFF};        // Write to 202 0x89 89 89 19 34 1F C8 FF

unsigned char statusECU1[8] = {0x02,0x2D,0x02,0x2D,0x02,0x2A,0x06,0x81};        // Write to 215 - Unknown
unsigned char statusECU2[8] = {0x0F,0x00,0xFF,0xFF,0x02,0x2D,0x06,0x81};        // Write to 231 - Unknown
unsigned char statusECU3[8] = {0x04,0x00,0x28,0x00,0x02,0x37,0x06,0x81};        // Write to 240 - Unknown
unsigned char statusECU4[8] = {0x00,0x00,0xCF,0x87,0x7F,0x83,0x00,0x00};        // Write to 250 - Unknown


/*

215 02 2D 02 2D 02 2A 06 81 // Some ECU status

231 0F 00 FF FF 02 2D 06 81 // Some ECU status

240 04 00 28 00 02 37 06 81 // Some ECU status

250 00 00 CF 87 7F 83 00 00 // Some ECU status

*/


void updateMIL()
{
    statusMIL[0] = engTemp;
    statusMIL[1] = odo;
    statusMIL[4] = oilPressure;
    
  if (checkEngineMIL == 1)
  {
    statusMIL[5] = statusMIL[5] | 0b01000000;
  }
  else
  {
    statusMIL[5] = statusMIL[5] & 0b10111111;
  }
   
    if (checkEngineBL == 1)
  {
    statusMIL[5] = statusMIL[5] | 0b10000000;
  }
  else
  {
    statusMIL[5] = statusMIL[5] & 0b01111111;
  }

   if (lowWaterMIL == 1)
  {
    statusMIL[6] = statusMIL[6] | 0b00000010;
  }
  else
  {
    statusMIL[6] = statusMIL[6] & 0b11111101;
  }

     if (batChargeMIL == 1)
  {
    statusMIL[6] = statusMIL[6] | 0b01000000;
  }
  else
  {
    statusMIL[6] = statusMIL[6] & 0b10111111;
  }

       if (oilPressureMIL == 1)
  {
    statusMIL[6] = statusMIL[6] | 0b10000000;
  }
  else
  {
    statusMIL[6] = statusMIL[6] & 0b01111111;
  }
}

void updatePCM()
{
    statusPCM[0] = engRPM;
    statusPCM[4] = vehicleSpeed;
}

void updateDSC()
{       
  if (dscOff == 1)
  {
    statusDSC[3] = statusDSC[3] | 0b00000100;
  }
  else
  {
    statusDSC[3] = statusDSC[3] & 0b01111011;
  }

    if (absMIL == 1)
  {
    statusDSC[4] = statusDSC[4] | 0b00001000;
  }
  else
  {
    statusDSC[4] = statusDSC[4] & 0b11110111;
  }

      if (brakeFailMIL == 1)
  {
    statusDSC[4] = statusDSC[4] | 0b01000000;
  }
  else
  {
    statusDSC[4] = statusDSC[4] & 0b10111111;
  }

     if (etcActiveBL == 1)
  {
     statusDSC[5] = statusDSC[5] | 0b00100000;
  }
  else
  {
    statusDSC[5] = statusDSC[5] & 0b11011111;
  }

    if (etcDisabled == 1)
  {
    statusDSC[5] = statusDSC[5] | 0b00010000;
  }
  else
  {
    statusDSC[5] = statusDSC[5] & 0b11101111;
  }
 

}

void loop() 
{
    // StatusMIL
    engTemp         = 145;
    odo             = 0;
    oilPressure     = 1;    // Either 0 (fault) or >=1 (Ok)
    checkEngineMIL  = 0;
    checkEngineBL   = 0;
    lowWaterMIL     = 0;
    batChargeMIL    = 0;
    oilPressureMIL  = 0;

    updateMIL();
    CAN0.sendMsgBuf(0x420, 0, 8, statusMIL);
    delay(10);


    // StatusPCM
    engRPM          = 60;    // RPM  Value*67 gives 8500 RPM Reading Redline is 127
    vehicleSpeed    = 93;    // Speed  Value=0.63*(Speed)+38.5

    updatePCM();
    CAN0.sendMsgBuf(0x201, 0, 8, statusPCM);          //CAN0.sendMsgBuf(CAN_ID, Data Type (normally 0), length of data, Data
    delay(10);

    // StatusDSC
    dscOff          = 0;
    absMIL          = 0;
    brakeFailMIL    = 0;
    etcActiveBL     = 0;    // Only works with dscOff set
    etcDisabled     = 0;    // Only works with dscOff set

    updateDSC();
    CAN0.sendMsgBuf(0x212, 0, 8, statusDSC);
    delay(10);

/*
    CAN0.sendMsgBuf(0x200, 0, 8, statusEPS1);
    delay(10);            

    CAN0.sendMsgBuf(0x202, 0, 8, statusEPS2);
    delay(10);    
           
    
    CAN0.sendMsgBuf(0x215, 0, 8, statusECU1);
    delay(10);  

    CAN0.sendMsgBuf(0x231, 0, 8, statusECU2);
    delay(10);  

    CAN0.sendMsgBuf(0x240, 0, 8, statusECU3);
    delay(10);  
    CAN0.sendMsgBuf(0x250, 0, 8, statusECU4);
    delay(10);  

*/
            
 }

This is the current latest version of the code I have, the serial comms section at the start is handy for checking you have a working connection but if you don’t have the serial monitor open it will cause the Arduino to hang at the transmit instruction and not get as far as updating the canbus so I recommend enabling these initially but once you get a working connection comment them back out as above. There are also sections above taken directly from the Cantanko page to deal with the power steering controller and some other bits, I haven’t tried these yes as the cluster isn’t in a car but I plan do so at some stage.

This code has some limitations in this form, basically the warning lights etc are set in the code as static values so this code will just set everything normal and all the lights I have addresses for to off. One particular curiosity is the way the cluster treats the oil pressure value. The data space actually has a whole byte for a value here but the cluster only only has two values despite having an actual gauge, a value of 0 drops the needle to the bottom, a value of 1 or more sets the gauge to normal. My feeling on this is the car was originally intended to have a proper oil pressure transmitter but someone decided it was too expensive and a normal pressure switch was used instead and rather than redesign the cluster they just changed the scaling in the on board microcontroller to behave as described. long term I’d love to mod the cluster to add the analog functionality back in but without the code for the controller this would probably involve disconnecting the original drive to that gauge and adding another Arduino inside the cluster just for driving that gauge. It seems like a lot of work to know oil pressure on a scale of low to high!

The code also sets a speed and RPM however the ODO and trip meters will not increment as it stands – I purposefully left this bit of code out because it’s only really applicable if you’re on an actual car otherwise your cluster will just keep clocking up. The ODO and trips seemed to be the one bit no-one else had managed to do or identify but after quite a few hours of testing  random blocks will various combinations of high and low as well as sending incrementing / decrementing values I noticed my trip meter had actually moved up by 0.1 miles which meant something was working. I eventually managed to trace it to the address listed above. The trick to actually making it work is that the value in the byte is irrelevant to what the cluster displays, so no this doesn’t let you clock it back! What it appears to do is counts the changes to the value so I made it work by setting up a loop of code that keeps changing this value up to a certain number to give a specific distance. Turns out the cluster needs to see 4140 changes per mile. Eventually I plan to tie this in to the speedometer value so only one value needs to be set, by knowing the pulses per mile and the speed we can work out the time delay between each change. As an example at 100mph we need to send 115 changes per second, this is one every 8.7ms which is obviously faster than the loops above and so for speed and accuracy would have to be hardware timed with an interrupt to do the update at the right speed. I’ll probably do an updated version at a later date.

There’s a couple other things I need to sort out, the airbag warning light being the prime one because this is an outright MOT fail. Now in theory when it’s back on the car it should work just fine as the airbag wiring is all there but I figured it was worth working out anyway. So after working through all of the RX8 cluster wiring diagrams (1)(2)(3)(4) I pieced this together :RX8 Cluster Pinout

This covers the majority of everything someone might need to use the cluster on a simulator apart from the fuel gauge. The RX8 fuel gauge is a bit of an oddity because the car uses a saddle shaped fuel tank to allow it to clear the driveshaft and so it has two senders denoted as ‘main’ and ‘sub’.

RX8 Fuel System Senders

Each of these apparently has a resistance value of between about 325Ω at the bottom and 10Ω at the top. There seems to be some questions about how this system works out what to display based on the two sender values and whether it expects to see one remain full while the other empties or something similar. Unfortunately I’ve not played with it much because I’ve don’t actually need to make this work off the car (since the car will have the senders but I can say putting 100Ω a resistor between both 2R-2P and 2R-2T gives a value of about 1/3 of a tank and 9Ω (because I just added a 10Ω on along side the existing 100Ω) across these connections gives a full tank reading  (actually a little above full) so as long as you move both together it works fine, this is ok if all you want to do is get the fuel warning light off for a driving simulator but not that helpful for a single fuel sender conversion which is why most people are interested. If I get chance I’ll investigate further. Also for some reason it takes an absolute age to move up the scale which is a bit unfortunate but I suspect is as intended. At least it should be stable!

All of that leaved us with just one light I can’t get to turn of, the warning light for the electronic power steering. This is controlled via canbus by the look of the circuit diagram but as yet I’ve not found the address for it. If anyone knows the address please leave a comment! Else I will have to go back to either trial and error or the really dodgy backup plan which involves cutting the tracks in the cluster and doubling up on another warning light which isn’t used much! Maybe I should just add another controller in the cluster!

So hopefully that gives you (almost) everything you need to know about making the cluster work! We might get back to mechanical things in the next update…