Digital Speedometer to Car's Instrument Cluster via CAN Bus

Implementing Arduino CAN bus shield and digital speedometer to car's LCD-display in instrument cluster.

Jan 18, 2021

38009 views

11 respects

Components and supplies

1

16 MHz Crystal

2

Ceramic Disc Capacitor, 150 pF

1

Resistor 10k ohm

1

MCP2515

2

Resistor 4.75k ohm

2

Ceramic Disc Capacitor, 18 pF

1

Resistor 1k ohm

1

TJA1055

1

Screw Block Terminal 5-R3.5

1

Arduino Nano R3

Apps and platforms

1

Arduino IDE

1

Autodesk EAGLE

Project description

Code

Can Bus Speedometer

arduino

Code for the setup with CAN bus compatible radio (Chorus)

GALA Speedometer

arduino

Code for the setup with Concert-radio

GALA Speedometer

arduino

Code for the setup with Concert-radio

Can Bus Speedometer

arduino

Code for the setup with CAN bus compatible radio (Chorus)

Downloadable files

Board

Board

Schematics

Schematics

Schematics

Schematics

Comments

Only logged in users can leave comments

Anonymous user

2 years ago

You can use a standard CAN shield on a Fault tolerant bus, you just have to remove the termination resistor fitted to many commercial boards. A couple of us on the TT forum have managed to work out how to write to the central part of the display. It's very much more complicated but gives you much more scope for custom displays. This link gives the basics of how to do it. https://www.ttforum.co.uk/forum/viewtopic.php?f=19&t=1954729&hilit=+DIS A problem that we still haven't fully resolved is contention for the display. For example if your radio writes to the top two lines of the display to show the station, it will overwrite your display. If you write to the main screen area the DIS shows air temperature on the second line and there appears to be no way to stop this.

databus100

2 years ago

Hello John! When I started this project I wasn't aware of the fact that off-the-shelf shields work on FT-CAN, so I designed one myself. I also wanted that the shield would be able to operate in single-wire mode if faults occurred. I've checked that ttforum-project thread and it is awesome! This summer I'm planning to use John949949's piece of github-code for DIS-comms and implement a custom display. Only problem is data acquisition with an Arduino connected to infotainment-CAN: Where can I acquire the data? To my knowledge TT Mk1 doesn't have a gateway-unit.

Anonymous user

2 years ago

Hi John - I don't think you covered pixel mode in your write up. Could you share? Thanks! -Wade

Anonymous user

2 years ago

You have three choices for acquiring data. 1) Eavesdrop on the powertrain bus. This gives data with the lowest laency. Probem is that it is not esy to identify the data you are after. Thereis no published list fo CanIDs or the data encoding used so finding the data is hard. A few IDs have been identified if you do some searching. 2) Use the Audi dognostic protocol via the OBD socket. A little bus sniffing of an Audi specifc tool like VCDS will find you the data. There appears to be a sginificant latency however - maybe a second? 3) Use OBDII protocol via the diagnostic socket. This is dead easy and full data IDs and encoding is given in the OBDII wiki. The big drawback is that not all cars support all the data so the values you want may not be available.. Gateway. I'm not an expert on the Mk1 (I have a MK2) but I believe there is a rudimentary gateway in the instrument cluster. A Gateway will allow you to send messages and get responses across the various buses but you can't eavesdrop unless you physically connect to the appropriate bus. Good luck. P.S. Someone gave me the codes to do pixel by pixel graphics on the DIS. I can't remember if I covered them in the write up. The opcode for the pixel mode is 0x55. It writes a pixel pattern at the given line. Usage is similar to the Write command 0x57.

Anonymous user

2 years ago

Here is what I was told: the opcode for the pixel mode is 0x55. It writes a pixel pattern at the given line. Usage is similar to the Write command 0x57. Here is an example: 0x55: pixel mode 0x0C: length of rest of packet 0x0A: mode (see info below) 0x10: x co-ordinate of left 0x10: y co-ordinate of top 0xFF: pattern of first 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of last 8 pixels Some 8N clusters seem to only allow drawing full lines with all 64 pixels. The 8J also allows to draw shorter graphics of only 8 pixels per write. The mode byte seems to have different meaning on some clusters, or not all clusters support all modes. Here is what I normally use: 0x08: clear pixels (8J cluster might not support this mode) 0x09: invert pixels 0x0A: overlay pixels 0x0B: draw pixels I think the example has the number of bytes wrong. I tested it on my MK2 but didn't get very far as I hit a road block in my project which I have yet to clear.

Anonymous user

2 years ago

This is fantastic - thanks for such a great writeup! I also have a TT and have been searching for a way to display my own information on the display screen. I hope to try this out later this spring. Greetings from Minneapolis!

databus100

2 years ago

Hello Wade! The bus capacitors with the bus overall resistance create a RC low-pass filter for data signals. Since the bus capacitors were optional, I didn't size them but chose a value estimate from the TJA1055 Application Hints (150pF). P. 20 fig. 8 diagram: " Capacitors approx. 150 pF (optional)". P. 56 "At a bit rate of 125kbit/s the capacitor value should not exceed 330pF". 150pF capacitors combined with 100kbits/s bit rate should provide a corner frequency high enough for the data signals to pass.

databus100

2 years ago

Hello, and sorry for my bad naming conventions. I changed the names of code snippets to more self-explanatory ones. So, there are two code snippets in the attachments: 1. Code for the CAN Bus Speedometer (requires the custom Arduino shield) 2. Code for the setup with Concert Radio (requires Arduino only, since the data transmission can be implemented with Arduino's digital output pins) And about the TJA1055 error pin (4) - Nano D3 -connection, " in normal mode (EN = 1, STB_N = 1) the pin ERR_N indicates a bus failure condition." I haven't configured this functionality yet, but it should be found in the later versions.

databus100

2 years ago

Hello Wade! Your're welcome! I'm glad to hear that my instructions were useful and that the components list and schematics were correct. In my setup, radio remained connected to CAN bus and I just tapped into to bus wires behind the radio. So did you first try to disconnect the radio from the bus and then connect the bus wires to Arduino? Or what was the way that didn't work?

databus100

2 years ago

Glad to be of help!

Anonymous user

2 years ago

Hi again - is it possible that the code above is "out of sync" with the board schematic? I see MCP2515 output interrupt pin (12) connected to Nano D2, but the code has this as the GALA signal pin. Also, it looks like the TJA1055 error/status pin (4) has a trace to Nano D3, but I don't see D3 used in the code. Those traces look physically present in the photo of the back side of the circuit board. I'm sure I'm missing something simple here...

Anonymous user

2 years ago

IT WORKS!! My custom board, built using the information you compiled on this page, is successfully placing my own text at the top of the TFT screen. THANK YOU so much for putting this all together! One quick note for others following your project like me - this doesn't work if you splice into the CAN lines in the green plug in the instrument cluster itself. Even though those are identified as radio CAN lines, there must be something between the radio itself and the cluster. Connecting to the CAN bus using the wires behind the radio for sure will work. THANKS AGAIN!!!

Anonymous user

2 years ago

No, I first tried the wires to my instrument cluster (18 and 19 in the green connector), because the other components I plan to interface to the cluster display already live in the space behind it. Also, it is *extremely* crowded behind my radio - I have a hardwired FM-Bluetooth adapter, an xCarlink USB/auxiliary line in adapter, and additional wires in the loom for line-level outputs to an aftermarket audio amplifier. I didn't want to disturb the wiring for all of that if I could avoid it... For now, I have a temporary connection (pin connectors pushed into the backs of the existing harness connector) and a radio that is hanging out of the dash. But now I know that it works. Tapping into the wires should be simple enough... It's just really tight quarters working on that.

Anonymous user

2 years ago

Thanks for that clarification! I am curious about the 150pF capacitors between both CAN-H and CAN-L lines and ground. Could you comment on the purpose of these capacitors and how you sized them?

Anonymous user

2 years ago

Ah! I read only the data sheet - not the application hints. Thanks again!

Anonymous user

2 years ago

This is excellent!! My wife has a TT and that display is busted. It is a common failure on the Audi forums and even fails again after an expensive dealer replacement. I wanted to put another (maybe battery) display over the original and was thinking how to get the data. I was wondering if it were possible to use a Bluetooth OBDII dongle? I kind of forgot about it since (other priorities etc) but your project sparked my interest in this again.

databus100

2 years ago

Hello Slippy17! It is possible to acquire data using the OBD2 Bluetooth dongle. In fact, there is a library for Python, that allows you to request data from the car.

Anonymous user

2 years ago

That's great. I must look at this again. I will let you know how I get on. Thank you.

Anonymous user

2 years ago

Hello! Thaks for this project. Can the schematics diagram be in a regular format .jpg?

databus100

2 years ago

I cleaned up the schematics a little bit. You can find it in the attachments. There you go!

Anonymous user

2 years ago

Have you looked into ColorMFA at all? It's a similar project from Russia that does so much more

databus100

2 years ago

Yes I know ColorMFA, but I think it's closed project and it requires soldering to the cluster. In my case it's out of scope, since I didn't want to do any permanent modifications to the car. And what do you think, would this project exist if I would've bought a colorMFA 😂.

Anonymous user

2 years ago

Hey. Nice job here, big respect ! I was wondering if you could implement an analog pulse-frequency-modulated VSS output on one of the arduino pins, whose frequency depends on the acquired vehicle speed value from CAN ?

databus100

2 years ago

Ah okay, I see😁. The analog output signal should be quite easy, but how are you going to acquire that vehicle speed signal on CAN Bus? From Infotainment CAN or drivetrain CAN? If I may ask, why did you go for DSG?

databus100

2 years ago

Hello. Yes why not. For what purpose would that VSS Arduino output be?

Anonymous user

2 years ago

For the sole purpose of retaining the original speedometer in audi A3 8L swapped with a DSG transmission, which doesnt have an analog speed sensor anymore.. Need to pickup the speed signal from ABS via can and convert it to analog pulses :)

Anonymous user

2 years ago

I believe infotainment can is sufficient, since you can already pick up a speed value from it and display in big digital numbers :D My old 6 speed manual gearbox is really wonky and not so easy to drive and switch gears anymore.. And its a challenge, since A3 8l's never came with DSG gearboxes ;D Also.. shift paddles on my steering wheel will finally work !

Anonymous user

2 years ago

Hi Jussi Ristiniemi, I have project "Start Energy via Canbus". I have some can ID for break and start-stop button. I feel, when I send from arduino to canbus of car. This message overwitten of orgin message of car. Your project have this trouble. Or, If you have experience about it. Please help me. Thanks!

databus100

2 years ago

In my project radio sends message frequently, that's why I have to send messages with higher frequency, so that the radio messages doesn't appear on DIS. What are you exactly trying to implement in your project?

Anonymous user

2 years ago

This project idea is very similar to what I am doing right now and I was wondering if you could provide some insight. I am currently using CAN to link Video Game telemetry to a physical instrument cluster. I have figured out how to send RPM accurately over CAN, but speed I am struggling with. I am working with a 2006 Audi A4 cluster and followed your methodology on the signal for speed. I have found multiple sources saying that CAN id 0x351 is the speed identifier so I am certain that that isn't the issue. I have reversed the equation for speed so that I take a value in MPH, convert to KMH, multiply by 190 then add 1 to get the decimal value for the 4 byte hex string. Once I am there i used an algorithm to get the UV and LV in hex and then send the signal back over ID 0x351. Does this all sound right? I can't seem to get any speed values to show on the cluster. The cluster I am using has three different CAN ports (Powertrain, Convenience, Infotainment). Sending the RPM over powertrain seems to work, but speed does not, could it be possible that it is apart of a different CAN line?

databus100

2 years ago

Hello Reed! I did some research and found this: https://hackaday.io/project/6288/instructions. This guy has implemented CAN bus cluster emulator to VW Polo, so I think same IDs would also work on your Audi. He uses the following piece of code to emulate vehicle speed: ` //Speed CanSend(0x5A0, 0xFF, speedL, speedH, drive_mode, 0x00, lo8(distance_counter), hi8(distance_counter), 0xad);` So the ID would be 0x5A0. About the ID 0x351: I think cluster uses this ID to send the vehicle speed forward to other modules on Infotainment or Convenience bus, so emulating vehicle speed with this ID won't work.

Anonymous user

2 years ago

Thaks for this project! I have a question: does this device work autonomously in CAN-Bus or in conjunction with a radio?

databus100

2 years ago

Hello Andrei! At the moment, it doesn't work without radio, so if I turn it off, the uppermost part of DIS goes black. If you want it to work independently, you have to emulate the radio's CAN messages to emulate an active radio. Also if you want the radio to wake on ignition, you'll have to keep it connected to CAN or implement a 'man in the middle' solution.

databus100

2 years ago

Hello Andrei! Nice to hear that you managed to get it work without radio! On line ' for(int j=0; j<3000/REFRESH_RATE;j++){', 3000 represents duration of Audi screen in milliseconds. Interval represents how often I want to update speed in DIS and refresh_rate tells how often I send data to DIS.

Anonymous user

2 years ago

Ок, I understand. I checked if you add the ID 661 with the code data [0] = 0x01; data [1] = 0x01; data [2] = 0x12; data [3] = 0xa0; data [4] = 0x00; data [5] = 0x00; data [6] = 0x00; data [7] = 0x00; That radio is not required. This code sends the message "radio is on"! And a question for you: what is the code responsible for INTERVAL & REFRESH_RATE? I need to change the display time "Audi" screen.

Anonymous user

2 years ago

this is a nice project, I like it :) I want to ask you for a few things, how can i contact you?

databus100

2 years ago

Hello fmaxhari, You can pm me here in Hackster!

Anonymous user

2 years ago

Nice project! I'm in the process of using a TJA1055 to create a volume control knob for the OEM amplifier in a Hyundai Veloster. This would allow me to use an aftermarket radio, without replacing the amplifier (which already has good audio quality). No such product exists on the market. My question, is how were you able to determine what value the termination resistors should be? I'm trying to copy your setup, because so far I've had no luck. I've transplanted a TJA1055 from a MCP2551 CAN-Arduino shield with no luck. So I went and desoldered the MCP2515 and 16MHz crystal to create my own from scratch, but I may have destroyed the MCP2515 in the process.

databus100

2 years ago

Thanks Tyler! The size of the termination resistor depends on how many nodes there are connected to the CAN bus network. The resistance for each bus wire should be around 100 Ohms. For example, if there are 5 nodes in the network, each of them should have 500 Ohm termination resistors, since the nodes are connected in parallel to each other. In my case, I couldn’t confirm the node count, so I chose a resistance value that wouldn’t affect the total bus resistance too much. “It is recommended not to exceed approximately a 6kOhm termination resistance at a single transceiver” (TJA1055 Application Hints p.62). So I chose a resistor that fulfilled these requirements and was available at my local electronic component shop (4,75 kOhm).

Anonymous user

2 years ago

Hi Jussi. Awesome project! Is it also possible to show boost pressure? I’ve seen some guys build an Arduino boost gauge with an external oled screen, but it would be way cooler to show it up the oem screen.

Anonymous user

2 years ago

If you're going to use a boost gauge, you can show anything you want on the first two lines of the display using Jussi's code above! Check out John Somebody's forum post above for pulling info from the powertrain CAN-bus. If you have a later Mk1 TT, there are two CAN wire pairs going to the instrument cluster. You might be able to get the boost pressure from one of them. If you have an earlier one (that doesn't require a CAN-bus interface board), you can definitely get the info you want from the k-line and can use the 3LB protocol to take over the display using an Arduino. Here's a good place to start: https://kovo-blog.blogspot.com/2013/11/audi-fis-3-line-protocol.html https://github.com/ibanezgomez/fisblocks

Anonymous user

2 years ago

Hi, just looked through your build and this is something I've looked for for a long time! You see I really want to make digital instrument clusters for my cars (bmw e46 and e34) with rasberry pi, but I have no clue how to interface the rpi/arduino to the vehicle sensors. Both rpm and speed. Do you might have some time to help me with it? Best regards, Norwegian car and electronics enthusiast.

Anonymous user

2 years ago

Hi Jussi Ristiniemi, I have project "Start Energy via Canbus". I have some can ID for break and start-stop button. I feel, when I send from arduino to canbus of car. This message overwitten of orgin message of car. Your project have this trouble. Or, If you have experience about it. Please help me. Thanks!

databus100

2 years ago

In my project radio sends message frequently, that's why I have to send messages with higher frequency, so that the radio messages doesn't appear on DIS. What are you exactly trying to implement in your project?

Anonymous user

3 years ago

Have you looked into ColorMFA at all? It's a similar project from Russia that does so much more

databus100

2 years ago

Yes I know ColorMFA, but I think it's closed project and it requires soldering to the cluster. In my case it's out of scope, since I didn't want to do any permanent modifications to the car. And what do you think, would this project exist if I would've bought a colorMFA 😂.

mirxas

3 years ago

Hey. Nice job here, big respect ! I was wondering if you could implement an analog pulse-frequency-modulated VSS output on one of the arduino pins, whose frequency depends on the acquired vehicle speed value from CAN ?

databus100

2 years ago

Hello. Yes why not. For what purpose would that VSS Arduino output be?

mirxas

2 years ago

I believe infotainment can is sufficient, since you can already pick up a speed value from it and display in big digital numbers :D My old 6 speed manual gearbox is really wonky and not so easy to drive and switch gears anymore.. And its a challenge, since A3 8l's never came with DSG gearboxes ;D Also.. shift paddles on my steering wheel will finally work !

mirxas

2 years ago

For the sole purpose of retaining the original speedometer in audi A3 8L swapped with a DSG transmission, which doesnt have an analog speed sensor anymore.. Need to pickup the speed signal from ABS via can and convert it to analog pulses :)

databus100

2 years ago

Ah okay, I see😁. The analog output signal should be quite easy, but how are you going to acquire that vehicle speed signal on CAN Bus? From Infotainment CAN or drivetrain CAN? If I may ask, why did you go for DSG?

Anonymous user

4 years ago

Thaks for this project! I have a question: does this device work autonomously in CAN-Bus or in conjunction with a radio?

Anonymous user

2 years ago

Ок, I understand. I checked if you add the ID 661 with the code data [0] = 0x01; data [1] = 0x01; data [2] = 0x12; data [3] = 0xa0; data [4] = 0x00; data [5] = 0x00; data [6] = 0x00; data [7] = 0x00; That radio is not required. This code sends the message "radio is on"! And a question for you: what is the code responsible for INTERVAL & REFRESH_RATE? I need to change the display time "Audi" screen.

databus100

2 years ago

Hello Andrei! At the moment, it doesn't work without radio, so if I turn it off, the uppermost part of DIS goes black. If you want it to work independently, you have to emulate the radio's CAN messages to emulate an active radio. Also if you want the radio to wake on ignition, you'll have to keep it connected to CAN or implement a 'man in the middle' solution.

databus100

2 years ago

Hello Andrei! Nice to hear that you managed to get it work without radio! On line ' for(int j=0; j<3000/REFRESH_RATE;j++){', 3000 represents duration of Audi screen in milliseconds. Interval represents how often I want to update speed in DIS and refresh_rate tells how often I send data to DIS.

Anonymous user

4 years ago

Hi Jussi. Awesome project! Is it also possible to show boost pressure? I’ve seen some guys build an Arduino boost gauge with an external oled screen, but it would be way cooler to show it up the oem screen.

Anonymous user

2 years ago

If you're going to use a boost gauge, you can show anything you want on the first two lines of the display using Jussi's code above! Check out John Somebody's forum post above for pulling info from the powertrain CAN-bus. If you have a later Mk1 TT, there are two CAN wire pairs going to the instrument cluster. You might be able to get the boost pressure from one of them. If you have an earlier one (that doesn't require a CAN-bus interface board), you can definitely get the info you want from the k-line and can use the 3LB protocol to take over the display using an Arduino. Here's a good place to start: https://kovo-blog.blogspot.com/2013/11/audi-fis-3-line-protocol.html https://github.com/ibanezgomez/fisblocks

Anonymous user

4 years ago

You can use a standard CAN shield on a Fault tolerant bus, you just have to remove the termination resistor fitted to many commercial boards. A couple of us on the TT forum have managed to work out how to write to the central part of the display. It's very much more complicated but gives you much more scope for custom displays. This link gives the basics of how to do it. https://www.ttforum.co.uk/forum/viewtopic.php?f=19&t=1954729&hilit=+DIS A problem that we still haven't fully resolved is contention for the display. For example if your radio writes to the top two lines of the display to show the station, it will overwrite your display. If you write to the main screen area the DIS shows air temperature on the second line and there appears to be no way to stop this.

databus100

2 years ago

Hello John! When I started this project I wasn't aware of the fact that off-the-shelf shields work on FT-CAN, so I designed one myself. I also wanted that the shield would be able to operate in single-wire mode if faults occurred. I've checked that ttforum-project thread and it is awesome! This summer I'm planning to use John949949's piece of github-code for DIS-comms and implement a custom display. Only problem is data acquisition with an Arduino connected to infotainment-CAN: Where can I acquire the data? To my knowledge TT Mk1 doesn't have a gateway-unit.

Anonymous user

2 years ago

Here is what I was told: the opcode for the pixel mode is 0x55. It writes a pixel pattern at the given line. Usage is similar to the Write command 0x57. Here is an example: 0x55: pixel mode 0x0C: length of rest of packet 0x0A: mode (see info below) 0x10: x co-ordinate of left 0x10: y co-ordinate of top 0xFF: pattern of first 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of next 8 pixels 0xFF: pattern of last 8 pixels Some 8N clusters seem to only allow drawing full lines with all 64 pixels. The 8J also allows to draw shorter graphics of only 8 pixels per write. The mode byte seems to have different meaning on some clusters, or not all clusters support all modes. Here is what I normally use: 0x08: clear pixels (8J cluster might not support this mode) 0x09: invert pixels 0x0A: overlay pixels 0x0B: draw pixels I think the example has the number of bytes wrong. I tested it on my MK2 but didn't get very far as I hit a road block in my project which I have yet to clear.

Anonymous user

2 years ago

You have three choices for acquiring data. 1) Eavesdrop on the powertrain bus. This gives data with the lowest laency. Probem is that it is not esy to identify the data you are after. Thereis no published list fo CanIDs or the data encoding used so finding the data is hard. A few IDs have been identified if you do some searching. 2) Use the Audi dognostic protocol via the OBD socket. A little bus sniffing of an Audi specifc tool like VCDS will find you the data. There appears to be a sginificant latency however - maybe a second? 3) Use OBDII protocol via the diagnostic socket. This is dead easy and full data IDs and encoding is given in the OBDII wiki. The big drawback is that not all cars support all the data so the values you want may not be available.. Gateway. I'm not an expert on the Mk1 (I have a MK2) but I believe there is a rudimentary gateway in the instrument cluster. A Gateway will allow you to send messages and get responses across the various buses but you can't eavesdrop unless you physically connect to the appropriate bus. Good luck. P.S. Someone gave me the codes to do pixel by pixel graphics on the DIS. I can't remember if I covered them in the write up. The opcode for the pixel mode is 0x55. It writes a pixel pattern at the given line. Usage is similar to the Write command 0x57.

Anonymous user

2 years ago

Hi John - I don't think you covered pixel mode in your write up. Could you share? Thanks! -Wade

Anonymous user

4 years ago

This project idea is very similar to what I am doing right now and I was wondering if you could provide some insight. I am currently using CAN to link Video Game telemetry to a physical instrument cluster. I have figured out how to send RPM accurately over CAN, but speed I am struggling with. I am working with a 2006 Audi A4 cluster and followed your methodology on the signal for speed. I have found multiple sources saying that CAN id 0x351 is the speed identifier so I am certain that that isn't the issue. I have reversed the equation for speed so that I take a value in MPH, convert to KMH, multiply by 190 then add 1 to get the decimal value for the 4 byte hex string. Once I am there i used an algorithm to get the UV and LV in hex and then send the signal back over ID 0x351. Does this all sound right? I can't seem to get any speed values to show on the cluster. The cluster I am using has three different CAN ports (Powertrain, Convenience, Infotainment). Sending the RPM over powertrain seems to work, but speed does not, could it be possible that it is apart of a different CAN line?

databus100

2 years ago

Hello Reed! I did some research and found this: https://hackaday.io/project/6288/instructions. This guy has implemented CAN bus cluster emulator to VW Polo, so I think same IDs would also work on your Audi. He uses the following piece of code to emulate vehicle speed: ` //Speed CanSend(0x5A0, 0xFF, speedL, speedH, drive_mode, 0x00, lo8(distance_counter), hi8(distance_counter), 0xad);` So the ID would be 0x5A0. About the ID 0x351: I think cluster uses this ID to send the vehicle speed forward to other modules on Infotainment or Convenience bus, so emulating vehicle speed with this ID won't work.

Anonymous user

2 years ago

I know it's been a long time since those comments were posted, but I'm also working on using a cluster to display game's telemetry data, but on VW's cluster (2013 Passat). I have almost all sorted out, but still can't figure out the speed. In my case - I can show the speed correctly (by "show" I mean that the speedometer needle moves), but it works for few seconds only. After this short time - the needle bounces for a moment and falls down to 0. To make it work again - I need to stop (or set the speed to 0) and start moving again. And everything starts all over. As far as I know - the cluster receives two, seperate messages with speed (one is from the engine, and the second one is from ABS). I suspect, that there's a problem with the checksum. Have you ever solved it?

fmaxhari

4 years ago

this is a nice project, I like it :) I want to ask you for a few things, how can i contact you?

databus100

2 years ago

Hello fmaxhari, You can pm me here in Hackster!

Anonymous user

4 years ago

Nice project! I'm in the process of using a TJA1055 to create a volume control knob for the OEM amplifier in a Hyundai Veloster. This would allow me to use an aftermarket radio, without replacing the amplifier (which already has good audio quality). No such product exists on the market. My question, is how were you able to determine what value the termination resistors should be? I'm trying to copy your setup, because so far I've had no luck. I've transplanted a TJA1055 from a MCP2551 CAN-Arduino shield with no luck. So I went and desoldered the MCP2515 and 16MHz crystal to create my own from scratch, but I may have destroyed the MCP2515 in the process.

databus100

2 years ago

Thanks Tyler! The size of the termination resistor depends on how many nodes there are connected to the CAN bus network. The resistance for each bus wire should be around 100 Ohms. For example, if there are 5 nodes in the network, each of them should have 500 Ohm termination resistors, since the nodes are connected in parallel to each other. In my case, I couldn’t confirm the node count, so I chose a resistance value that wouldn’t affect the total bus resistance too much. “It is recommended not to exceed approximately a 6kOhm termination resistance at a single transceiver” (TJA1055 Application Hints p.62). So I chose a resistor that fulfilled these requirements and was available at my local electronic component shop (4,75 kOhm).

Anonymous user

4 years ago

Hello! Thaks for this project. Can the schematics diagram be in a regular format .jpg?

databus100

2 years ago

I cleaned up the schematics a little bit. You can find it in the attachments. There you go!

Anonymous user

4 years ago

This is fantastic - thanks for such a great writeup! I also have a TT and have been searching for a way to display my own information on the display screen. I hope to try this out later this spring. Greetings from Minneapolis!

databus100

2 years ago

Hello, and sorry for my bad naming conventions. I changed the names of code snippets to more self-explanatory ones. So, there are two code snippets in the attachments: 1. Code for the CAN Bus Speedometer (requires the custom Arduino shield) 2. Code for the setup with Concert Radio (requires Arduino only, since the data transmission can be implemented with Arduino's digital output pins) And about the TJA1055 error pin (4) - Nano D3 -connection, " in normal mode (EN = 1, STB_N = 1) the pin ERR_N indicates a bus failure condition." I haven't configured this functionality yet, but it should be found in the later versions.

databus100

2 years ago

Glad to be of help!

databus100

2 years ago

Hello Wade! The bus capacitors with the bus overall resistance create a RC low-pass filter for data signals. Since the bus capacitors were optional, I didn't size them but chose a value estimate from the TJA1055 Application Hints (150pF). P. 20 fig. 8 diagram: " Capacitors approx. 150 pF (optional)". P. 56 "At a bit rate of 125kbit/s the capacitor value should not exceed 330pF". 150pF capacitors combined with 100kbits/s bit rate should provide a corner frequency high enough for the data signals to pass.

databus100

2 years ago

Hello Wade! Your're welcome! I'm glad to hear that my instructions were useful and that the components list and schematics were correct. In my setup, radio remained connected to CAN bus and I just tapped into to bus wires behind the radio. So did you first try to disconnect the radio from the bus and then connect the bus wires to Arduino? Or what was the way that didn't work?

Anonymous user

2 years ago

Hi again - is it possible that the code above is "out of sync" with the board schematic? I see MCP2515 output interrupt pin (12) connected to Nano D2, but the code has this as the GALA signal pin. Also, it looks like the TJA1055 error/status pin (4) has a trace to Nano D3, but I don't see D3 used in the code. Those traces look physically present in the photo of the back side of the circuit board. I'm sure I'm missing something simple here...

Anonymous user

2 years ago

Thanks for that clarification! I am curious about the 150pF capacitors between both CAN-H and CAN-L lines and ground. Could you comment on the purpose of these capacitors and how you sized them?

Anonymous user

2 years ago

IT WORKS!! My custom board, built using the information you compiled on this page, is successfully placing my own text at the top of the TFT screen. THANK YOU so much for putting this all together! One quick note for others following your project like me - this doesn't work if you splice into the CAN lines in the green plug in the instrument cluster itself. Even though those are identified as radio CAN lines, there must be something between the radio itself and the cluster. Connecting to the CAN bus using the wires behind the radio for sure will work. THANKS AGAIN!!!

Anonymous user

2 years ago

No, I first tried the wires to my instrument cluster (18 and 19 in the green connector), because the other components I plan to interface to the cluster display already live in the space behind it. Also, it is *extremely* crowded behind my radio - I have a hardwired FM-Bluetooth adapter, an xCarlink USB/auxiliary line in adapter, and additional wires in the loom for line-level outputs to an aftermarket audio amplifier. I didn't want to disturb the wiring for all of that if I could avoid it... For now, I have a temporary connection (pin connectors pushed into the backs of the existing harness connector) and a radio that is hanging out of the dash. But now I know that it works. Tapping into the wires should be simple enough... It's just really tight quarters working on that.

Anonymous user

2 years ago

Ah! I read only the data sheet - not the application hints. Thanks again!

Anonymous user

4 years ago

This is excellent!! My wife has a TT and that display is busted. It is a common failure on the Audi forums and even fails again after an expensive dealer replacement. I wanted to put another (maybe battery) display over the original and was thinking how to get the data. I was wondering if it were possible to use a Bluetooth OBDII dongle? I kind of forgot about it since (other priorities etc) but your project sparked my interest in this again.

databus100

2 years ago

Hello Slippy17! It is possible to acquire data using the OBD2 Bluetooth dongle. In fact, there is a library for Python, that allows you to request data from the car.

Anonymous user

2 years ago

That's great. I must look at this again. I will let you know how I get on. Thank you.

Anonymous user

4 years ago

So you've at least been able to display something on the screen? As you note, seems like getting an actual value would be pretty easy at that point (when you can drive it)

Anonymous user

2 years ago

Nice, all the best!

databus100

2 years ago

Yes, I can display my own content on the screen (e.g. "Arduino hub" text in project picture). I've managed to find the speed data messages on the CAN bus (at least I think I have), so the next step is test drive.