E46 Cluster Driver
An Arduino sketch and schematic for the hardware to drive a BMW instrument cluster over CAN-BUS, KBUS and general IO lines. The firmware has been designed to work with my DashboardSender application.
What Is Supported
Currently the board can interact with these parts of the instrument cluster, though some parts are not implemented in the software yet:
- Parking Brake LED
- Cruise Control LED
- ABS Warning LED
- Airbag Warning LED
- Fog Light Status
- Full Beam Status
- Coolant Temperature Gauge
- Indicators (Turn Signals) - Including Double Rate
- Door open status
- Bulb out warnings
- Set Time
Not currently working:
- Fuel Gauge
- MPG Readout
For ease of assembly onto standard strip board the design uses the Atmega328p in a DIP package. Two Atmels are used as the KBUS requires the hardware UART to send the data. The two chips are connected over the I2C bus. If using an variant with 2 or more UARTs it is entirely possible to roll the whole firmware into one chip.
To interface with the CAN-BUS the MCP2551 and MCP2515 ICs are used, these connect to the main processor over SPI.
The KBUS connection is handled by a stripped down version of the driver circuitry designed by Thaniel, see Resources. Only the TX portion is used as the instrument cluster only sends a periodic status packet which can be ignored for the purposes of driving the cluster. An MCP2025 Linbus tranceiver could also be used.
Some of the functions (Such as the parking brake LED) require certain pins to be pulled to GND from 12V, these are handled using a 2N2222A on the outputs of a PCF8574. This IO Expander is used just incase I need the other Atmel pins for other uses later on (Fuel guage?)
The main Arduino sketch requires these libraries: