1991 BMW 850i
The BMW HomeLink Garage door opener is a nice addition to the 850i and was installed in the panel above the rear view mirror.
I used a dremel to cut out the opening and then cleaned it up with a utility knife blade (as a scraper).
The HomeLink unit was purchased on Ebay for $14 shipped! BMW part number is 6-9I9-879.
There is very little clearance behind this panel so it is necessary to butcher the HomeLink a little.
A piece of foam (not shown) was glued to the back of the circuit board to hold it in-place and prevent shorting any traces to the sunroof motor.
Car PC Project
The following details my car computer added in place of the existing Radio and OBC. It is built on a Raspberry Pi running Kodi with custom addons for the MID, HD Radio, sensors and OBD. The addons are written in python (a programming language I had never used until this project). Kodi is an open source multimedia platform running under the Linux OS in this project and makes UI development relatively easy once you become familiar, and of course it makes audio and video playback easy.
I cannot claim all the credit for this design as it is largely based on a design published on the web (http://engineering-diy.blogspot.ro). Although I started out copying this design exactly I have since deviated away from it quite a lot.
I'm not a software programmer so learning Python consumed a lot of my time but I have come to appreciate this is a very versatile programming language that will undoubtedly be put to other uses.
I'm using an 8" 1024x600 LCD panel (model# ZJ080NA 08A) in place of the radio and MID. This panel is a little wider than the standard DIN opening and so required some surgery.... I removed one of the inner walls and relocated it to the right and then rebuilt the structure.
I checked a few different types of glue for re-assembly but none were strong enough for my liking so I ended up welding it... I used superglue to tack it in place and then using the piece of plastic I removed from the radio/OBC divider as my welding material and an old soldering iron to melt it, I welded the pieces back together. It worked surprisingly well and is very strong! Just be sure to do this in a wll ventilated area.
It's not quite as clean looking as it was but it is very strong.
I also used the technique to repair a broken mounting post for the HVAC panel (a common issue with these cars)...
I didn't have the broken piece so I formed a piece of straight plastic around a snug fitting drill bit using a heat-gun and then welded the joint with my soldering iron.
Here is the LCD/touch panel roughed in place. I used a piece of 1/4" aluminum bar stock to fill the gap below the LCD panel. It has slots machined into it for the LCD and touch panel flex cables.
Here is what it looks like finished. The perimeter of the LCD panel is wrapped in an adhesive backed matt black vinyl sheet. The small hole you see in the accessory plate to the left of the LCD is an LED light sensor used to adjust the intensity of the LCD backlight based on ambient light (it automatically dims at night).
Here's what it looks like on the inside...
From left to right the circuit boards are; touch screen controller, modified LCD controller with HDMI interface, 12V to 5V power supply below it, 4 channel audio amplifier and power down sequencer on the right wall (it mimics the stock radio output and drives the standard remote amplifier and speakers).
The Raspberry pi, HD radio module and other parts of the system are mounted behind the glovebox.
The LCD panel is held in place with 4 small magnets (one at each corner) which makes it relatively easy to remove and gain access behind.
The computer display fuel pressure using these pressure transducers; they are rated 0-100psi (~ $15 ea on Ebay from China and surprisingly nice quality). They require a +5V supply and output an analog voltage proportional to pressure.
It is important to use a liquid thread sealant on these fittings. Teflon tape is not recommended for fuel lines.
Here you can see the sensors fitted to the car... tucked away nicely behind the heater control solenoids.
Routing cables to the pressure sensors was easy, passing through a hole to the side of the brake booster that I believe is for a clutch actuator. There is also a connection to the battery post in front of the heater control solenoids that I used to measure and display battery voltage (very accurately).
I also added sensors to monitor intake vacuum (or pressure if you have SC or TC). These sensors are good for -14.5 psi to +30psi (typical intake vacuum is about -10psi). A lot of info can be gleaned by monitoring the intake vacuum (old school).
You can see how I routed the wiring... passing through the firewall next to the brake booster as for the fuel pressure sensors.
The 8" LCD/touch panel and driver came from China and were a bargain at $55 incl shipping (Ebay) but they were not without issues.... the panel was a little dim so I did some probing and found that this driver board (a generic board included with many LCD kits from China) can only source about 100mA of backlight current... this LCD panel requires a nominal 350mA for best brightness! The LCD panel also requires a few analog voltages which are derived from the same inverter that is driving the backlights and these were not set correctly either causing the intensity and contrast controls to not be offset! So I made some modifications to the board to correct these issues.
In this picture I'm temporarily driving the backlights directly from +12V (with a suitable current limiting resistor... 10 ohms, 2W). But it was replaced with an ambient light level controlled inverter. The video interface to the LCD is standard HDMI and an analog input is available for the reverse backup camera (yet to be installed).
Some additional technical details below:
This is the I-Bus interface. It interfaces directly to the Raspberry UART and GPIO for CTS.
This is the interface to the diagnostics interface (it was later modified with the addition of an Arduino). A relay isolates the circuit from the car's diagnostic bus when not in use and ties the signals off as does the cap on the diagnostic connector under the hood (cap must be removed or modified to use this circuit).
This is the prototype. A printed circuit board has now been designed.
Below is the initial circuit I came up with to modulate the LCD backlight intensity. It works but a better version is underway.
The circuit below delays power removal from the Raspberry Pi for about 15 mins after turning off the car. This avoids the start up delay (about 1 minute) when stopping for fuel or a quick grocery stop. It tells the Raspberry to shut down shortly before cutting off the power... allowing for a safe shutdown. In the off state it consumes no power.
This diagram shows how it is all hooked up.
This project involved a lot of reverse engineering; decoding the MID messages and handshaking was first undertaken with a PC and a stand alone Python program. This ran on a Dell D630 laptop which has a real serial port. I experienced problems when using a USB/serial converter which did not appear to implement the 8E1 parity correctly. I also had to reverse engineer the HD radio commands and the diagnostics interface (explained later).
Here is a sample of the PC program I wrote to capture I-Bus messages (time stamped hex and decoded messages):
2017-02-12 17:40:25.640000 02:05:01:90:82:02:16 EKM to MID Average_speed= 28.2 MPH
2017-02-12 17:40:25.656000 02:07:01:c0:00:00:ff:ff:c4 EKM to MID inspection= ff:ff:00:00
2017-02-12 17:40:25.671000 02:0b:01:be:56:7a:43:82:ff:ff:ff:ff:5b EKM to MID unknown2= ff:ff:ff:ff:82:43:7a:56
2017-02-12 17:40:25.687000 02:06:ff:a4:f0:0b:82:26 EKM to ALL Mileage= 134128 miles
2017-02-12 17:40:25.703000 02:04:ff:a5:00:5c EKM to ALL unknown3= 00
2017-02-12 17:40:25.718000 02:05:ff:fc:07:12:11 EKM to ALL impulses_per_Km= 12:07
2017-02-12 17:40:25.734000 02:04:01:ac:01:aa EKM to MID codelock= 01
2017-02-12 17:40:25.750000 02:05:01:ae:00:00:a8 EKM to MID unknown1= 00:00
2017-02-12 17:40:25.765000 02:06:ff:bc:fd:5f:20:c5 EKM to ALL unitcoding= 20:5f:fd
2017-02-12 17:40:25.781000 02:05:ff:bd:01:01:45 EKM to ALL language= 01:01
2017-02-12 17:40:25.796000 02:07:01:86:00:00:00:00:82 EKM to MID timer= 00:00
2017-02-12 17:40:25.812000 02:07:01:87:00:00:00:00:83 EKM to MID freezetimer= 00:00
2017-02-12 17:40:25.828000 02:05:ff:83:38:26:65 EKM to ALL time= 06:38PM
2017-02-12 17:40:25.843000 02:07:ff:82:02:12:17:07:78 EKM to ALL Date= 02:12:17
2017-02-12 17:40:25.859000 02:04:01:9c:00:9b EKM to MID speed_limit_status= 00
2017-02-12 17:40:25.875000 02:05:01:9d:ff:ff:9b EKM to MID factory_speed_limit= ff:ff
2017-02-12 17:40:25.890000 02:05:01:98:ff:ff:9e EKM to MID default_speed_limit= ff:ff
2017-02-12 17:40:25.906000 02:05:01:99:ff:ff:9f EKM to MID speed_limit= ff:ff
2017-02-12 17:40:25.921000 02:04:01:8c:00:8b EKM to MID unknown4= 00
2017-02-12 17:40:25.937000 02:05:01:8e:ff:ff:88 EKM to MID park_vent_heater_1= ff:ff
2017-02-12 17:40:25.953000 02:05:01:8f:ff:ff:89 EKM to MID park_vent_heater_2= ff:ff
2017-02-12 17:40:25.968000 02:05:ff:a0:15:06:4b EKM to ALL outside_temp= 61.5 degF
2017-02-12 17:40:29.078000 02:05:ff:83:39:26:64 EKM to ALL time= 06:39PM
2017-02-12 17:40:32.906000 02:04:ff:fa:01:02 EKM to ALL i_am_here= 01
2017-02-12 17:40:32.968000 02:05:ff:f8:00:00:00 EKM to ALL ign_key_position= OFF
2017-02-12 17:40:33.015000 02:05:ff:fb:07:06:02 EKM to ALL heartbeat= 06:07
2017-02-12 17:40:33.062000 02:04:08:81:00:8f EKM to unk unknown
2017-02-12 17:40:36.953000 02:07:01:c0:00:00:ff:ff:c4 EKM to MID inspection= ff:ff:00:00
2017-02-12 17:40:37 02:0b:01:be:56:7a:43:82:ff:ff:ff:ff:5b EKM to MID unknown2= ff:ff:ff:ff:82:43:7a:56
2017-02-12 17:40:37.031000 02:06:ff:a4:f0:0b:82:26 EKM to ALL Mileage= 134128 miles
2017-02-12 17:40:37.078000 02:04:ff:a5:00:5c EKM to ALL unknown3= 00
2017-02-12 17:40:37.125000 02:05:ff:fc:07:12:11 EKM to ALL impulses_per_Km= 12:07
2017-02-12 17:40:37.140000 02:04:01:ac:01:aa EKM to MID codelock= 01
2017-02-12 17:40:37.156000 02:05:01:ae:00:00:a8 EKM to MID unknown1= 00:00
2017-02-12 17:40:37.171000 02:06:ff:bc:fd:5f:20:c5 EKM to ALL unitcoding= 20:5f:fd
2017-02-12 17:40:37.187000 02:05:ff:bd:01:01:45 EKM to ALL language= 01:01
2017-02-12 17:40:37.203000 02:07:01:86:00:00:00:00:82 EKM to MID timer= 00:00
2017-02-12 17:40:37.218000 02:07:01:87:00:00:00:00:83 EKM to MID freezetimer= 00:00
2017-02-12 17:40:37.234000 02:05:ff:83:39:26:64 EKM to ALL time= 06:39PM
2017-02-12 17:40:37.250000 02:07:ff:82:02:12:17:07:78 EKM to ALL Date= 02:12:17
2017-02-12 17:40:37.265000 02:04:01:9c:00:9b EKM to MID speed_limit_status= 00
2017-02-12 17:40:37.281000 02:05:01:9d:ff:ff:9b EKM to MID factory_speed_limit= ff:ff
2017-02-12 17:40:37.296000 02:05:01:98:ff:ff:9e EKM to MID default_speed_limit= ff:ff
2017-02-12 17:40:37.312000 02:05:01:99:ff:ff:9f EKM to MID speed_limit= ff:ff
2017-02-12 17:40:37.328000 02:04:01:8c:00:8b EKM to MID unknown4= 00
2017-02-12 17:40:37.343000 02:05:01:8e:ff:ff:88 EKM to MID park_vent_heater_1= ff:ff
2017-02-12 17:40:37.359000 02:05:01:8f:ff:ff:89 EKM to MID park_vent_heater_2= ff:ff
2017-02-12 17:40:37.375000 02:05:ff:a0:15:06:4b EKM to ALL outside_temp= 61.5 degF
2017-02-12 17:40:37.390000 02:05:01:92:40:81:55 EKM to MID MPG_1= 14.0
2017-02-12 17:40:37.406000 02:05:01:93:ff:7f:15 EKM to MID Reset;_MPG_2= --.-
2017-02-12 17:40:37.421000 02:05:01:a2:ff:ff:a4 EKM to MID distance= ff:ff
2017-02-12 17:40:37.437000 02:07:01:88:ff:ff:ff:ff:8c EKM to MID time_of_arrival= ff:ff
2017-02-12 17:40:37.453000 02:05:01:96:34:02:a6 EKM to MID Range= 234 miles
2017-02-12 17:40:37.468000 02:05:01:90:82:02:16 EKM to MID Average_speed= 28.2 MPH
2017-02-12 17:40:37.484000 02:05:ff:a0:15:06:4b EKM to ALL outside_temp= 61.5 degF
2017-02-12 17:40:41.734000 09:04:02:81:02:8c ZKE to EKM passenger door open
2017-02-12 17:40:41.781000 02:03:09:01:09 EKM to ZKE message_acknowledge= 09
I decoded everything of use to me but there are still a few messages i've not been able to figure out.
Back to home page
Link to Page 11