BMW E90 CAN bus Instrument Cluster

I'm trying to control a BWM E90 instrument cluster (KOMBI) with a seeed CANBed board. There's a pretty complete post of a nearly identical project here: Controlling BMW E90 instrument cluster

Sadly I'm not having any luck. The display shows what looks like a bus error (looks like a car on top of a little 'T' structure), and no dials move. The KOMBI is powered, and in addition to the error glyph, if I push the button on the display the bottom LCD lights up and I can see the odometer reading. The CANBed board is (I think) properly grounded to power and the display unit (LEDs on-board come on). The KOMBI instrument cluser normally (I think) lives on the BMW K-CAN bus, which runs (again I think) at 100 baud, so that's what I set my CANBed to.

I didn't solder any 120-ohm resister to the CANBed--using it with whatever it natively came with. Power/ground/CAN-H/CAN-L only connections. Physical bus is on a breadboard: a 120-ohm resister at each end between high/low, with the only two devices on this little bus being the CANBed and the KOMBI unit.

At this point I just want to control the RPM/tachometer.

Here's my code:

#include <mcp_can.h>
#include <SPI.h>

const int SPI_CS_PIN = 17;              // CANBed V1
MCP_CAN CAN(SPI_CS_PIN);          // Set CS pin

//------------------------------------------------------------------

// pulled these values off a blog post/raw capture from an E90
uint8_t ignition_frame_on[5] = {0x01,0x01,0xA0,0x05,0x2C};

// original values from blog -- doesn't work either
//uint8_t ignition_frame_on[5] = {0x45,0x42,0x69,0x8F,0xE2};

void sendIgnitionFrame() {
  uint16_t CAN_ID = 0x130;
  CAN.sendMsgBuf(CAN_ID,0,5,ignition_frame_on);
  ignition_frame_on[4]++;  // a forum post said this byte had to increment, so...
}

void sendRPM() {
  uint16_t CAN_ID = 0x0AA;
  uint8_t rpmFrame[8] = {0x5F,0x59,0xFF,0x00,0x34,0x0D,0x80,0x99}; // fixed value for now
  CAN.sendMsgBuf(CAN_ID,0,8,rpmFrame);
}

//------------------------------------------------------------------

void setup() {
  while (CAN_OK != CAN.begin(CAN_100KBPS))    // init can bus : baudrate = 100k
    delay(100);
}

void loop() {
    sendIgnitionFrame();
    sendRPM();
    delay(100);  // send messages every 100ms
}

I am trying to do the exact same thing with the same instrument cluster. Did you make any progress?

So far I can get the turn signal to blink and that's about it.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.