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
}