The Distracted Driving System
The DistractedDriving system allows you to
replace your stock I-Bus compatible BMW navigation head unit with an Android
device. It plugs directly into the stock wiring harness and is compatible with
the stock radio controller. This allows you to control functions such as volume
from the steering wheel. Your Android device continues to function as normal
allowing you to use navigation, check traffic or the weather, listen to your
music or watch cat videos on youtube…while parked in a safe location of course. The images below show how the circuit board fits into the E46 3 Series BMW's stock navigation system.
The system was designed for an E46 M3 but can be adapted to other BMW’s, Mini's and Land Rovers that use the I-Bus as the main driver communication method. NOTE: BMW's with the "Business Radio" (i.e. No Nav screen and a CD player in the dash) can only use this system to connect their android to the Ibus. To source audio from the Tablet, an aftermarket amplifier is needed. A second option is to retain the stock radio and relocate it to the trunk. This will let you keep the AM/FM tuner but its implementation is left as an exercise to the user (I can't have all the fun after all). The aftermarket solution would look something like this:
- Direct attachment to stock BMW Navigation Wiring Harness (I-Bus only)
- Full I-Bus integration
- Control the stock radi
- Operate Android Device from
steering wheel controls
- Instrument cluster readouts
- Automatic screen dimmer
- USB interface to Android Devices
- Android device trickle power via USB
- 3.5mm stereo audio jack
- Differential audio outputs
- Standard mini-blade type fuse
- Redundant USB voltage protection
- Protective case for interface
How its made
As you may have already learned from the videos, this device is based on a (currently obsolete) version of the Sparkfun IOIO. I used the same microcontroller and gave myself access to the same programming pins that exist on the IOIO. Since an IOIO can program an IOIO, that is my firmware download mechanism.
The IOIO firmware gives you access to all the cool features of a PIC24 MCU. Most importantly for this project was the UART. I hooked that up to an MCP2004 LIN bus transciever which you all know allows the 2 wire UART to talk to a single wire iBus.
BMW used to use differential signals for the audio. This requires two wires for every channel but can totally eliminate common mode distortion. To get my tab's single ended outputs to play nice with the differential signals the BMW expects, I used two TDA7052 buffers, one for the right and one for the left, since I couldn't find anyone who still sells the 2 channel version.
Slap on a switching regulator since you're drawing 500 mA when charging and the 7V drop is obviously way too much for an LDO and you're set!
How it works
If you're used to writing Microcontroller firmware in C, Java is a real nightmare to deal with UART characters. Somehow I cobbled together a mess of code that works despite the lack of unsigned variables. I haven't looked at it in so long that I've forgotten how java works but here is the jist:
- Use the IOIO libraries to open up a UART
- On occasion, check for bytes in the RX buffer
- If you found a byte, check to see if an entire message is in there and do something with it
Oh boy, I really have no idea how this app works any more. Uhhh...good luck!
Now up to YOU! Once you've figured out how to use a schematic and layout editor, learned what gerber files are and know what the letters DRC stand for, you're ready to submit your design to a PCB prototype fabricator. Now all thats left is to order all your parts from Digikey, get a decent soldering iron for the fine pitch MCU and settle in for 2-3 hours in a (hopefully) well ventilated workspace.