July 2018



17 July 2018: 

While waiting for my next shipment to arrive, I started working on the steering wheel controls and digital control panels and displays.

I purchased an OMP Superquadro wheel from ATS. I want to have a minimalistic dash in the Ultima, with very few buttons and controls. I want to be able to control most functions using the steering wheel, with the remainder of controls using a 7″ console touch screen. Instead of going for analog gauges, I want to have a steering wheel mounted display and another 7″ main gauge display on the dash.

To start off, I designed a prototype steering wheel casing that mounts behind the steering wheel on the steering wheel boss for all my button controls and LCD screen. I used my Creality CR10S 3D printer to print the 1st prototype.


After testing the location for the screen and buttons, I made a few changes and printed a complete prototype, using low cost push buttons and a Nextion 3.2″ screen I had lying around. The plan is to use an Arduino Nano inside the wheel to interface with the buttons and screen which in turn will communicate with the main system controller, most likely an Arduino Mega.

As you can see in the pictures below, the prototype is functional. Due to the number of buttons and controls on the wheel, I had to use an X-Y matrix system for the digital switch inputs similar to a keypad controller in order to connect all the buttons, the two rotary encoders and the LCD screen to the Arduino Nano.

This means the 18 button inputs are only using 9 pins on the arduino with a 4×5 matrix.

The Arduino communicates with the Nextion LCD display using UART serial interface.

For the main dash interface, I purchased a Raspberry Pi and a 10″ TFT touch display. The idea was to install Android (Emteria) and use some of the commercially available gauge dashboards like RealDash to display all the data on the screen. RealDash is easy to use and supports many different sources out of the box. I eventually decided against this idea as Android takes too long to boot up. The alternatives are to use an embeddded Linux OS on a single board computer that many of the commercial products use such as the Holley Dominator Digital Dash. Most of these products use QT to design their dashboards. This will still be an option, but for now I believe I can get a realtime display working the way I want with all the features using the Atmel ATmega2560 microcontroller. From my testing it takes less than 1 second for the gauges to work and is way more reliable than a single board computer system.

The picture below shows my initial mockup of the 7″ dashboard display, again using a Nextion 7″ Enhanced display. I had problems using the built-in gauge control for the Nextion display because of the flickering when using a fast refresh rate, but also because the gauge needle cannot be a rotating image. The only properties you can set on the needle is the length, width and colour.

I ended up having over 80 different images stored on the 32MB flash of the Nextion display, switching the gauge background image for value of the gauge. This seems to work well, but almost impossible to get higher precision due to the limitations of memory on the screen to hold more images.

In order to do the same for the 3.2″ screen is going to be a challenge as the small screen only has 4MB of flash. Tghe image sizes used by the Nextion display are fairly big as the 48Mhz and 8KB of SRAM is not strong enough to uncompress space optimised images in realtime.

Apart from the main gauge display screen, I am planning to use another 7″ display on the front of the dashboard for my main system controls and car information display. I am using Adobe Photoshop to draw the control panel and buttons. These controls will be run by an Arduino Mega with sufficient hardware serial ports to drive both screens, communicate with the Arduino Nano in the steering wheel as well as communicating with the Chevy LS3 ECU using a MCP2515 CAN controller.

Below a picture of the basic controls running on the 7″ Display unit. As you can see there are a couple of fixed buttons on the right for car lock/unlock, Brights, lights on/off and Hazards. These functions will also be available on the steering wheel. The buttons on the left from Top to bottom are:

Vehicle Information Display: For display key vehicle data such as water/oil temperature, air/fuel ratio, exhaust gas temperates etc.

Settings: For changing general car settings such as dimming display, interior lighting, door lock/unlock settings and more.

Driver Profile: For viewing driver statistics, adding new drivers, modifying driver information and registering driver fingerprints. I am going to use a fingerprint access system in order to start the car.

Tyre Pressure: This will show the current tyre pressures for all four wheels. I still have to find some good TPM sensors that I can get data from using Wifi or Bluetooth but I see there are lots of different options, so will leave that for much later in the project.

The controls on the bottom will be for switching on the Aircon, controlling the temperature and adjusting the interior fan speed. There is also a button for window demister. I am using the standard Ultima-supplier aircon unit with manual controls, so I will have to use some servo’s to interface with them, combined with interior temperature sensors to allow for automatic climate control, again using the Atmel microprocessors.

I am still playing around with different designs for the gauges in Photoshop. I am using the outer shadow and drop shadow effects to give the gauge needle the glowing effect. I also found a way to record the actions in Photoshop to rotate the gauge needle and save the document in a scripted way, so if I need to save 80 different gauge positions as separate files I don’t have to do this manually. I had to write some custom bash scripts to automatically rename the files as the Photoshop action replay will always save using the same file name.

I have not kept accurate timing this month on the exact number of hours worked, as I have not spent all these hours in the garage, but worked in a much warmer study as it has been fairly cold. I estimate having spent about 50 hours doing 3D design work, graphic design and programming micro controllers.

I have figured out how to communicate using the CAN bus using the MCP2515 controller, but most of the sample code and code libraries were built for the standard OBD protocol. The LS3 engine I have uses the standard Chevy ECU which uses their own proprietary CAN bus called GMLAN. It will take some reverse engineering to get all the data from the ECU, but I will post my code and libraries on this blog as I figure things out.

This means I am in for about 250 hours to date.

19 July: Still working on gauges

Below is my progression on the gauge display mock-up. I have separate images that will overlay on the basic gauge for when the indicators are switched on to give the glow effect as they flicker. I will also save the various icon images to hide or display them based on the vehicle and engine status messages received over the CAN bus.

24 July 2018: Body has arrived

Another long wait and the body has finally arrived, together with fuel tanks, Aircon, lights, grills, locks etc.

Hellmann sent another massive truck with two 20ft containers on the back. At least this time I was prepared and I had the angle grinder ready to cut off the container seal. The guys at Ultima do a sterling job in securing the body to ensure nothing gets damaged during transit. There must have been a couple of rolls of bubble wrap used, with all the body parts and windscreen taped together, wrapped in plastic and then covered by a ground sheet, finally tied down to the container with high quality tie-downs.

It took about an hour to offload all the parts.

Once the truck had left, we moved all the parts to my workshop so I can start auditing all the boxes to make sure everything is accounted for.

After going through all the boxes of parts, I went through the build CD as well as the Ultima online resource guide to see what the next job is to start with.

It seems like I need to start fitting the aircon unit and run the pipes through the side pods on both sides. For this I need to make holes in the side pods which would be difficult once they are riveted in place. Once I am finished installing these pipes, I can rivet the side pods in place and start fitting the body bottom side sills.

When going through the aircon parts, I noticed that the unit still uses old-style mechanical switches for the fan unit and a manual thermostat switch. The heater unit uses a manual cable mechanism to open and close the valve. In order for me to convert the aircon to a more modern climate control system, I would need to replace some of these and perhaps use a servo to control the valve action.

25 – 31 July: Install Aircon and fix side pods

I drilled and tapped three holes as per the build manual on the underside of the steering support brace for the aircon front panel. After fitting this panel to the steering brace, it made the alignment of the aircon main bracket a little easier. I marked and drilled all the holes for the rivets to hold the bracket onto the front cross braces. After applying some sealant, I riveted the bracket in place.

I then marked and cut the holes in both side pods for the aircon and heater pipes. After feeding the pipes to the engine bay, I tested the side pods for fitment.

To match the rest of the underbody and provide additional insulation and protection from stone chips, I sprayed the side pods, side pod brackets and fuel tanks with rubberising paint using the same technique as I did with the bottom of the chassis using the sandblasting gun.

It took me a few days to build up courage to rivet the side pods to the chassis because every time I rivet panels I usually end up with messing the terrible black Sikaflex everywhere. Somehow I managed to get the black stuff on my working clothes without noticing, and after going into the house to make a phone call, I sat down on the bed and ruined my wife’s new bed covers. Needless to say I ended up in the dog box over this -:)

Finally I can start with the pre-fit of some body panels. I started with the side covers that fit over the outer chassis braces. After laying these panels down, I marked out the cutouts for the wiring harness and radiator pipes in the front and cute these sections away using the Dremel tool. I measured and marked the locations for proper fitment according to the manual, but it seems like the gap between the rear tyres and the side panels are too close. I will keep the panels in this place for now using G-clamps and check the alignment again after fitting the cockpit main section.

For the first time since starting the build, I needed additional hands to lift up and move the bulky body panels. Luckily my son is old enough and doesn’t mind helping every now and then.

At this stage I noticed that Ultima did not send me the aluminium rear top bulkhead panel which is needed to cover up the back of the cockpit after cutting away the GRP in order for the cockpit section to fit over the roll cage braces.

I purchased some release agent, wax and extra carbon fibre from AMT Composites in order to mold my own carbon bulkhead panel. I will take this mold from the rear of the body before cutting out the back section of the cockpit.