Hacking My Car

The Hacked Car

This past summer I bought my first car. While I’m really not a ‘car person’, I believe you don’t own something until you’ve taken it apart.

So of course one of the first things I did with my car was take apart the AV unit.

Why?

My car, a 2011 Infiniti G37x, has no stock aux input. Previous models of the car, and lower trims, had an aux input through RCA jacks in the center console. The best I can figure from the service manual is that those inputs are repurposed for the backup camera on the higher trims. This leaves the only form of input as a usb port, for either iPods or USB media. Being as I run an android, this doesn’t work for me.

The easiest solution would be to purchase a wirelinq - I did, and it worked surprisingly well, but had enough quirks that I wasn’t satisfied. So I took my dashboard apart to add a GROM BT3 adapter. This takes the place of the stock satellite radio module, which I wasn’t interested in paying for anyhow. Installation was pretty seamless, and the module works well.

I added the aux input provided by the module in the center console, where the stock RCA jacks would have been.

Taking it further

So, audio working, I can play audio through Bluetooth or through AUX. Sweet, job done, right?

Well.. yes, if it weren’t for my habit of never ending projects.

See, my G37 is the non-navigation model. I’m not too sad about this - I much prefer using google maps versus built in navigation that gets outdated yearly. However one of the caveats of the non-navigation model is that the 7” screen in the center of my dashboard doesn’t really do anything. It just displays the (kind of ugly) media interface all the time. In my opinion, a waste of a screen.

So let’s hack into that display, put something on it. When I started this project, I would have been content with just displaying a static image. As long as I could display something other than the ugly built-in interface, I’d be happy.

Research

Poking around online, I found a factory service manual for my car. Among other info, the service manual contains a wiring diagram, and signal information.

Reading through the service manual led me to the following conclusions:

And this brings me to what was meant to be the main topic of this page - during my research I stumbled upon OpenAuto - an unofficial Android Auto build for linux, specifically for a raspberry pi.

What better use of the display than to integrate OpenAuto? Media browsing, navigation, hands-free calling - it’s a proper car infotainment system.

The Plan

Ok, so I need to:

That’s pretty daunting.

In Depth

Powering the Pi

This is a two-fold issue. We both need to step down the 12V of the car electronics to 5V for the pi, and we need a way to safely shut down the pi. If we just tap in to the car’s ignition state, every time we shut down the pi we’re yanking power from it. Running a Pi off an SD card means that there’s a high chance of data corruption if we just yank the power. I’m not trying to reimage my car every time I turn it off, so we want an intelligent way of shutting down the pi when the car is turned off.

I was about halfway through designing my own state detecting circuit when I found a really nice off the shelf board by Mausberry. With that taken care of, I can move on to the next part.

Tapping in to the car’s display harness

This was one of the scarier parts of the hack - I had to dig in to the innards of my car and cut wires. Not something I take lightly. The plan is to be able to switch between display sources. The easiest way to do this is with a relay. RGBs works off of four signals, Red, Green, Blue, and Sync. So I have to be able to switch 4 wires. The easiest way to do this would have been with a 4 pole relay, but those are expensive, so I went with two two-relay boards, which was much cheaper.

So I moved forward with this schematic, repeated for each signal.

Relay circuit

To trigger the relay, I repurposed the “snow mode” switch on the center console. I figure that as I live in California, I likely won’t be using this switch any time soon.

Generating an RGBs Signal from a Raspberry Pi

When I initially tried to do this, I went through three steps. Raspberry pi to HDMI, HDMI to VGA, VGA to RGBs through a GBS 8100.

The image quality wasn’t great, to say the least.

Trying for something more ideal, I settled on using a VGA 666 Hat for the Raspberry pi. With some modifications to the Pi’s firmware you can generate 15khz VGA with this board. The main difference between VGA and RGBs is that RGBs runs at 15khz and VGA has two separate sync signals.

So running the firmware slower works to get us to 15khz, but we still need to combine the Vertical and Horizontal sync signals from VGA to a Combined Sync signal for RGBs.

A Combined Sync signal is an XOR of Vertical and Horizontal Sync, and we can accomplish this, along with some nice adjustments for TTL changes and speed with the following circuit I found, which has been floating around since 1996.

Sync Combining Circuit

Works like a charm!

Sync Combining Circuit

Tap in to the steering wheel controls harness

Find the wire, add a relay, using the same circuit as we did for the display. Easy enough.

Convert steering wheel control voltage to button presses for the pi

Attach the “Pi side” of the relay circuit to a Teensy. The Teensy is great as it can emulate a USB keyboard.

The “Resistive Ladder” of the steering wheel controls means that each button pressed on the wheel will output a different voltage to the Teensy. Using a few if statements, the Teensy can detect which “voltage rung” is being sent, and send an appropriate keypress to the raspberry pi over USB.

So the process of pressing “Pause/Play” would follow:

This is probably the most finicky part of the build, and quite honestly I haven’t figured out why. 80% of the time this system works great, but 20% of the time no keypresses are detected at all. I’ve yet to figure out why (I suspect code), but will update this page when I have solved it.

Add a touchscreen

Taking the Display Module out of the car, we can take it apart following guides meant to replace the plastic screen protector. Only instead of replacing the screen protector with a new one, I’m replacing it with a resistive touchscreen overlay, which when paired with a controller acts as a mouse for the raspberry pi. In the future I’d like to replace this overlay with a capacitive one, but my quick research couldn’t find a source for capacitive overlays in the size I need.

Do all of the above without breaking my car

I had a few close calls, but ended this build with nothing broken, and a fully facelifted infotainment system.

The Future

In the future I’d love to be able to upgrade the screen to one that’s higher resolution, but as of now have no concrete plan on how to do this. The main issue preventing an easy upgrade is that any screen I find must take multiple inputs, and switch automatically - in order to keep functionality of my rearview camera. I could implement an electrical fix for this, but the space behind the dash in my car is now pretty cramped with the extra electronics added from getting to the current point, so unless I want to redo most of my wiring, this upgrade is put on hold for now.