I've always loved the green and black style of the instruments in my 2003 SAAB 9-3 Gen2, and I've been slowly trying to hack various aspects of the infotainment system.
Here is one example, where I have reverse-engineered the display module of the ICM2 unit.
One day I hope to incorporate this knowledge into an upgraded multimedia system project, but for now it has been a good learning experience!
This module is called "ICM2", the Infotainment Control Module (2), and it is basically a glorified control panel that talks to all the other modules (CD Player, Amplifiers, Radio, etc) in the car and tells them what to do.
Here I've documented the general experience of the reverse-engineering process, with pointers to more specific details to be found in my dedicated GitHub repositories linked in the sidebar.
A new 'FPC Stick' from Adafruit arrived in the post recently, and I set to work attempting to get the ICM2 display to operate through it.
The end goal here is to be able to use two of these FPC connectors on a custom PCB (and possibly two more, to intercept the 30-pin FPC from the buttons/switches on the ICM unit) in a kind of "Man-In-The-Middle" arrangement. This will allow for very easy Stock / Custom switching, if desired!
Here's a close up shot of the crappy soldering I did.
No project would be complete without a bodge wire or two, at least, in my experience.
Here's a photo of the whole setup in breadboard form at the moment.
Also, yes, I mistakenly wrote BUILT from Jets, instead of BORN from Jets. You've caught me, I'm a fake fan. I'll turn in my keys immediately...
Due to COVID-19 the postal service here in Australia has been somewhat slower than usual, and so that has also slowed project advances somewhat. Eventually, though, the 0.5mm 20pin FPC connectors and Adafruit FPC "Stick" that I ordered arrived...
My plan was to use these to allow for a more robust hacking solution - rather than having bodge wires soldered tentatively to vias on the back of the display PCB, I would simply interface with the intended connector! Here's what the business end of that looks like, note the I2C pullup resistors (which would later be proven to be unnecessary).
What comes as a surprise to nobody, half a millimetre pin pitch is quite small - and my $15 Bunnings Soldering Iron is quite crap.
Persevering with flux and braid, I thought I had done an alright job. Unfortunately the pins were either not making contact, or were shorting out with each other.
A few connectors later (melted plastic, bent pins) the FPC breakout board started to look a bit war-torn, and eventually traces began to come loose. At that point I gave up and returned to the bodge wire solution - next time I will have a new soldering iron with more power and a chisel tip, and hopefully that will improve my results.
I then began to integrate with an upcoming project of mine, an ESP32 based Bluetooth audio receiver that can talk to the CAN-bus in my car to receive Play/Pause/Next/Previous signals from the steering wheel.
I was mainly curious to know if the ESP32 could drive an I2C display at the same time as it could manage a Bluetooth A2DP session and an I2S stream, without audio "glitches". Turns out it can! Here are some experiments of "now playing" screen designs.
Also note the small 5V to 3.3V logic level shifter on the longer breadboard - this eliminated the need for any I2C pullups, as mentioned earlier
I also experimented with how a "visualiser" might look, I'm still keen on this idea, although implementing an FFT routine may be pushing the limits of my own knowledge in embedded programming.
It doesn't look like much, but hacking up the various ESP-IDF Bluetooth examples in order to get "track playback position" working drove me absolutely crazy!
For now I've got another Adafruit FPC Breakout "Stick" on order, so hopefully I can re-attempt a ribbon cable connection. This will also greatly simplify the hack for other people who want to try it!
I plan to move towards a system where I can have the ESP32 tucked behind the centre console of my car. I may even begin to investigate the physical controls of the ICM2 unit, allowing for all manner of interactive menus! Stay tuned.
I took apart the display and traced out the LCD PCB using a combination of a multi-meter, and by taking photos of both sides of the PCB and overlaying them in Photoshop.
I then had to convince the ICM2 unit to turn on the display for me, in order for me to measure voltages and data being sent to it. I knew that I had to complete the MOST ring-bus loop before the ICM2 would boot, so I did that by shoving a plastic S/PDIF cable into the MOST port:
That worked perfectly! I was then able to plug in my Kingst LA2016 logic analyser...
...and by doing so I could identify that an I2C bus was being used to control the display.
I then made a full schematic of the PCB circuit using KiCAD 5 - mainly to practice drawing schematics - and also to have a place to store important electrical notes regarding the display interface.
I don't have any good-quality photos, but I actually reverse-engineered the I2C commands by using a BusPirate V3 (python scripts used are in the GitHub repo). I then moved onto using an ESP8266-based NodeMCU board.
Here's what the wiring for that looked like - with wires soldered onto vias on the back of the LCD module and plugged straight into a breadboard:
My current hardware setup looked somewhat like this, with an included DC-DC step-down converter. The step-down converter is usually set to output around 7V - this is because the LED back-light array(s) need about that much (plus pulse width modulation for brightness control) in order to achieve better brightness:
That's all for now - I'm waiting on some parts in the mail to "break out" the 0.5mm FPC connector into a through-hole format. Hopefully this will allow for a less invasive install procedure (by plugging directly into the intended ribbon cable) - and will result in less issues with dodgy wire connections.
I do wish to experiment with an I2C multiplexer - to allow for in-system switching between "stock" and "custom" display routines. Endless possibilities, endless fun!