Close
0%
0%

Smart car radio

I reversed engineered the canbus screen in my Clio and created a bluetooth remote control to listen to webradios without touching my phone.

Similar projects worth following
I like to listen to a webradio from my smartphone when I'm driving my car (Renault Clio). I love the playlist but it's not as comfortable as a regular car radio. My smartphone is connected to the car radio via bluetooth but I cannot do anything from the head unit to control the webradio app.
As a matter of fact, I replaced the stock radio from Renault about ten years ago for a better Alpine unit. Doing that, I lost the possibility of using the steering wheel remote control for the radio unit.
My project consist in two things:
- using the integrated display of the Clio (Update List model) to display the song title and the artist. For that, I revered engineered the canbus protocol that drive the display and used a bluetooth serial port to send the datas from the smartphone to the display
- repurposing the steering wheel remote control as a HID bluetooth keyboard to drive the smartphone. Thus I can drive my smartphone and keep my eyes on the road.

- The smartphone is connected to a (pretty crappy, but only 10 bucks) bluetooth audio receiver which is connected  with a stereo jack to the cd charger input of my Alpine car radio. I had nothing to modify on this part.


- The display receives the song title and the artist name from the smartphone using a bluetooth communication. The Tasker app for Android is used to extract text from the notification (A notification is sent from the webradio every time a new song starts). I had to slightly modify an existing plugin from Tasker to send the text to a bluetooth spp module. An arduino board relays the text from the bluetooth module to a canbus module. The canbus protocol used to drive the display has to be reverse engineered.


- The steering wheel remote control (3x3 keypad matrix) is repurposed to a HID bluetooth keyboard to drive the smartphone (Home, ESC, Alt+Tab and Alt+Shift+Tab). I added a DPAD in a 3D printed case (up, dow, left, right and Enter) with a scrolling wheel to change the volume on the smartphone. (As a bonus, I'd like to use the + and - buttons of the remote control to the Apline radio unit). The HID bluetooth part is managed by a RN42 module connected to an arduino board (for keypad matrix decoding, encoder and dpad inputs)

Licensing

Electronic hardware design : CERN OHL

The firmware and software are licensed under the GNU GPL

rmt_gerbers.zip

gerbers files from Easy EDA for the remote control bluetooth interface

x-zip-compressed - 21.17 kB - 10/18/2017 at 21:58

Download

can_gerbers.zip

gerbers files from Easy EDA for the CAN bus bluetooth interface

x-zip-compressed - 21.91 kB - 10/18/2017 at 21:58

Download

Adobe Portable Document Format - 32.87 kB - 10/16/2017 at 09:05

Preview
Download

Grove Bee Socket V0.9a.sch.pdf

Xbee form factor socket with 5V <-> 3.3V level converters

Adobe Portable Document Format - 43.50 kB - 09/28/2017 at 10:45

Preview
Download

RN42_bluetooth_cr_UG-v1.0r.pdf

RN42 bluetooth module (user guide)

Adobe Portable Document Format - 1.27 MB - 09/28/2017 at 10:40

Preview
Download

View all 7 files

  • 1 × Renault "Update List" display 8200380298 stock Clio II display (with canbus interface)
  • 1 × Arduino Uno (5V) Transfer text from bluetooth to canbus display
  • 1 × Canbus shield (5V) MCP2515 on SPI and MCP2551 or other canbus driver
  • 1 × bluetooth bee SPP bluetooth profile: receive text to display from the smartphone
  • 1 × Renault steering wheel remote control 820058695 arranged in 3x3 matrix keypad (the rotary switch on the back is not used) - BT keypad

View all 9 components

  • Bluetooth smartphone remote control

    Manu11/07/2017 at 12:22 0 comments

    I installed my new pcb for the smartphone remote control in my car:

    I added a 12V circuit from the car radio fuse:

    ... bodged the D13 pin to D8 pin (the led on the trinket board might prevent the digital input from working properly)

    and installed it in a small compartment near the fuse box:

    (everything in wrapped with heat shrink tubing)

    I had to modify the 10 pin header to insert the cable with a 180 degrees rotation and a small commit to github did the rest.

    Everything is working so far and I added a task on Tasker to start the webradio app when it detect the bluetooth connection to the hid bluetooth remote control.

  • Got my pcb's

    Manu11/06/2017 at 08:24 0 comments

  • Fails with 3.3V and 8MHz (and bonus)

    Manu10/18/2017 at 21:54 0 comments

    Before I decided to make pcb's for my canbus and remote control boards, I wanted to use a 3.3V CAN SPI Mikroelktronika's Click board.

    The Click board needs to be modified to 16MHz for the MCP2515 Can interface to be compatible with the Arduino library. No big deal.

    To make the project smaller, I'd go to the Arduino Fio boards as I'm using bluetooth modules in a Xbee from factor:

    At first glance, it has only pros:

    - small form factor (compared to a stack of Arduino Uno + shield(s))

    - Xbee header

    - 3.3V like the bluetooth module and the CAN SPI Mikroelktronika's Click board...

    The last thing bited me: at 3.3V Arduino board usually have a 8MHz oscillator. It seems that the canbus library for Arduino doesn't like to work at 8MHz. I'm not sure of that, if you know where I failed, please contact me...

    I then tried to use a overclocked 3.3V 16MHz Arduino board by replacing the Arduino 8MHz resonator with a 16MHz one. I doesn't work neither as the bootloader is now at 115200 bauds instead 57600. I gave up at this stage and decided to make my own pcb to achievemy small form factor goal.

    Bonus fail:

    Murphy's law: when you do wiring, the only screw you have is inserted between your wire and the spacer:

    use double sided tape!

  • 2$ pcbs and gerber merging

    Manu10/18/2017 at 21:29 0 comments

    I'm evaluating the jlcpcb.com service. It's basically free : 2$ for 5 pcbs (100x100mm max). As I have 2 boards, the first one should be 2$ (for 5 pieces), but the 2nd one is 5$ (for 5 pieces). It isn't that much but the 2 boards combined are less than the 100x100mm authorized surface. I also wanted to try the GerberPanelizer.exe software discussed on the hackaday blog: https://hackaday.com/2017/06/21/panelizing-boards-the-easy-way/)

    So I took the gerbers from EasyEDA from the can and the remote boards and merged them on a single 100x100mm pcb. Here is the resulting image with 2 canbus and 2 remote control boards panelized:

    Here are 10 canbus and 10 remote control pcbs for 2$...

  • PCB for the bluetooth HID remote control

    Manu10/18/2017 at 21:00 0 comments

    I'm not a huge fan of the 0.1" dupont headers as they are not super reliable (no retaining clip, no keying for idiot proofing...):

    So, I made a PCB with IDC headers (10-pin header for the D-pad with clickable rotary encoder; 6-pin header for the Renault 3x3 matrix remote control).

    Here is the link to the EasyEDA project (where you can download gerber files and BOM):

    https://easyeda.com/moimeme4/mergeBT-4f19506c93c54159ba06ac12d7cdefa4

  • PCB for Canbus and bluetooth SPP

    Manu10/18/2017 at 20:49 0 comments

    i have a working prototype that displays everything I want from the bluetooth link of my smartphone to the canbus of the Renault "Update List screen". But as it is, it needs:

    - 1 Arduino Uno board

    - 1 Canbus shield (Seeedstudio)

    - 1 bee shield + BT module in Xbee form factor

    The stack is pretty bulky.

    So I decided to integrate all of this on a pcb (except the Arduino board: I will use a Pro mini as a module to solder on the pcb).

    It is an excuse to try the EasyEDA online editor. The "user experience" is pretty good except I don't like the fact that you need to be connected to use it. Here is the link to the project:

    https://easyeda.com/moimeme4/can-1577f49e7cb848ee872ee9e1ce39179f

    and a screenshot of the schematic and the pcb:

    (if you want to reproduce it, you can download gerbers and BOM from the link of the project).

    I'm using a automotive 5V regulator TPS7A6550 to prevent nasty spikes from the 12V accessory rail.

    The pcb's are ordered, I'm waiting for them to check if there is no mistake...

  • Car wiring

    Manu10/18/2017 at 15:34 0 comments

    I have 2 Arduino boards to fit in my car:

    - one is driving the CANbus display => it will be fitted in the glove box for ease of debugging

    - the second one is the bluetooth remote control for the smartphone => it will be fitted near the stearing wheel (where the remote control buttons are attached)

    The easiest is the remote control: a ribbon cable is running between the remote control attached to the steering and a compartment near the fuse box:

    The arduino board will sit here waiting for a firmware update.

    For the display, it is trickier as I have to remove the dashboard bezel. I runned a 4-wire cable (+12V acc, GND, CANH, CANl) between the display and the glove box:

    The arduino board with the canbus interface and the bluetooth spp module will be in a case in the glove box.

    It's time to find some box for my boards...

  • BT remote shrinkification

    Manu10/18/2017 at 15:22 0 comments

    I've modified the bluetooth remote control of the smartphone to be smaller. I did that with :

    - an Adafruit Pro Trinket board

    - a Xbee socket for the RN42 BT HID module

    I intend to fit this module wrapped in shrink tube inside a compartment of the car. It is near the fuse box and I can open it by just removing a bezel (no screws!) : it is pretty mandatory for the future updates of the firmware.

  • Retrieving infos from smartphone bluetooth

    Manu10/09/2017 at 21:51 0 comments

    Now I have a working canbus display, but how to get song titles from my smartphone and send it to the display:

    Here is a screenshot of the webradio (ouifm, but it should work with any music player that send notifications) app that I like to listen to:



    And a notification of the current song:

    The config for the autonotification interception in Tasker:


    The corresponding task that fires a bluetooth message at every new notification:


    The bluetooth serial plugin config (after this discussion: https://github.com/giech/arduinotaskerbluetooth/issues/2, the plugin is modified to my purpose and is available on google play https://play.google.com/store/apps/details?id=com.giechaskiel.ilias.bluetoothserialfromtasker, than you Ilias!):


    (The MAC address of the bt moule is blurred, I don't know if it really matters...)

    And finally, the Tasker profile on top of that:


    My first intention was to plug the SPP BT module on the hardware UART of the Arduino board to use indiffrently the USB or the BT link without code changes. But, as I still have some issues (some notifications are lost, ...), I finally plugged the SPP BT module as a software serial interface and I use the USB link to debug my program.

    The corresponding Github commit: b287b22

    I don't know yet why I'm dropping some notifications... I'm suspecting:

    • the notifications interception plugin: I may have configurate it poorly
    • the bluetooth module: there is so little data on this that I don't know if I'm using it properly: I will probably switch to another RN-42 (like on the bluetooth remote control) but as a SPP link this time
    • the software serial code: the NeoSWserial library gives a handler that I might call too slowly

    If anyone had dropping characters on this kind of SPP module, please let me know how do you solved that issue.

  • Reverse engineering the Renault Update List display - Part 3

    Manu09/28/2017 at 11:33 3 comments

    At this time, I can send text to my display on the canbus but I need the Renault car radio attached to the display to make it function properly. My goal is to throw away this head unit and use my Alpine one. I logged some canbus packets and I discovered a few things:

    - The 0x121 ID is acknowledged by the display with a 0x521 ID packet


    - There is a keep alive dialog between the head unit and the display: Can ID's 0x3CF and 0x3DF are send on a regular basis to check if the other one is attached on the canbus.


    For the other Can ID's, I was stucked. At this moment, I was fortunate enough to find a guy who did the same thing with the opposite goal: he wanted his custom display to work as the Renault one. His work is based on a very similar Megane AFFA3 display.

    I didn't understand everything despite the google trad, but most of the infos I was missing was here:

    https://translate.googleusercontent.com/translate_c?anno=2&depth=1&hl=fr&rurl=translate.google.com&sl=pl&sp=nmt4&tl=en&u=http://megane.com.pl/topic/47797-wyswietlacz-radia-update-list-protokol/page__hl__wy%25C5%259Bwietlacz%2520radia%2520update%2520list&usg=ALkJrhgGbHh_iqpb54xLhMpq9wUkCJVQuA

    Here is a log:

    FRAME 3cf :ID=975: LEN=8:69:01:A2:A2:A2:A2:A2:A2
    FRAME 3cf :ID=975: LEN=8:61:11:00:A2:A2:A2:A2:A2
    FRAME 3cf :ID=975: LEN=8:61:11:00:A2:A2:A2:A2:A2
    FRAME 3df :ID=991: LEN=8:7A:01:81:81:81:81:81:81 // start sync
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81 // sync ok
    FRAME 3cf :ID=975: LEN=8:61:11:00:A2:A2:A2:A2:A2
    FRAME 3df :ID=991: LEN=8:7A:01:81:81:81:81:81:81
    FRAME 3df :ID=991: LEN=8:70:1A:11:00:00:00:00:01 // sync display
    FRAME 1c1 :ID=449: LEN=8:70:A2:A2:A2:A2:A2:A2:A2
    FRAME 4a9 :ID=1193:LEN=8:74:81:81:81:81:81:81:81 // response to a9
    FRAME 5c1 :ID=1473:LEN=8:74:81:81:81:81:81:81:81 // response to 1c1
    FRAME 3df :ID=991: LEN=8:70:1A:11:00:00:00:00:01
    FRAME 3df :ID=991: LEN=8:70:1A:11:00:00:00:00:01
    FRAME 121 :ID=289: LEN=8:70:81:81:81:81:81:81:81 // init display
    FRAME 1b1 :ID=433: LEN=8:70:81:81:81:81:81:81:81 // register display
    FRAME 5b1 :ID=1457:LEN=8:74:A2:A2:A2:A2:A2:A2:A2 // response to 1c1
    FRAME 521 :ID=1313:LEN=8:74:A2:A2:A2:A2:A2:A2:A2
    FRAME 3cf :ID=975: LEN=8:69:00:A2:A2:A2:A2:A2:A2
    FRAME 1b1 :ID=433: LEN=8:04:52:02:FF:FF:81:81:81 // enable display
    FRAME 5b1 :ID=1457:LEN=8:74:A2:A2:A2:A2:A2:A2:A2
    FRAME 1c1 :ID=449: LEN=8:02:64:0F:A2:A2:A2:A2:A2
    FRAME 121 :ID=289: LEN=8:10:1C:7F:55:55:3F:60:01
    FRAME 121 :ID=289: LEN=8:21:46:4D:20:20:20:20:20
    FRAME 121 :ID=289: LEN=8:22:20:10:52:41:44:49:4F
    FRAME 521 :ID=1313:LEN=8:30:01:00:A2:A2:A2:A2:A2
    FRAME 521 :ID=1313:LEN=8:74:A2:A2:A2:A2:A2:A2:A2
    FRAME 5c1 :ID=1473:LEN=8:74:81:81:81:81:81:81:81 // response to 1c1
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81 // ping
    FRAME 3cf :ID=975: LEN=8:69:00:A2:A2:A2:A2:A2:A2 // pong
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81 //...
    FRAME 3cf :ID=975: LEN=8:69:00:A2:A2:A2:A2:A2:A2
    FRAME 121 :ID=289: LEN=8:10:1C:77:65:55:1F:71:01
    FRAME 521 :ID=1313:LEN=8:30:01:00:A2:A2:A2:A2:A2
    FRAME 521 :ID=1313:LEN=8:30:01:00:A2:A2:A2:A2:A2
    FRAME 121 :ID=289: LEN=8:22:32:10:20:45:55:52:4F
    FRAME 121 :ID=289: LEN=8:24:00:81:81:81:81:81:81
    FRAME 521 :ID=1313:LEN=8:74:A2:A2:A2:A2:A2:A2:A2
    FRAME 121 :ID=289: LEN=8:21:45:55:52:4F:50:45:20
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81
    FRAME 3cf :ID=975: LEN=8:69:00:A2:A2:A2:A2:A2:A2
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81
    FRAME 3cf :ID=975: LEN=8:69:00:A2:A2:A2:A2:A2:A2
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81
    FRAME 3cf :ID=975: LEN=8:69:00:A2:A2:A2:A2:A2:A2
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81
    FRAME 3cf :ID=975: LEN=8:69:00:A2:A2:A2:A2:A2:A2
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81
    FRAME 3cf :ID=975: LEN=8:69:00:A2:A2:A2:A2:A2:A2
    FRAME 3df :ID=991: LEN=8:79:00:81:81:81:81:81:81
    ...

     This init sequence is in the Arduino code https://github.com/manu-t/autoradio-interface/blob/master/UpdateListDisplay/UpdateListDisplay.ino

    With some tries and errors, I finally ended to send text to the display without the...

    Read more »

View all 13 project logs

  • 1
    Overview

    From a high level, this is how the project is done

View all instructions

Enjoy this project?

Share

Discussions

Rafael Martins wrote 06/06/2021 at 22:26 point

Nice project. Thanks for all the information about the CAN messages in the "update list" stereo.

  Are you sure? yes | no

Nicolò wrote 06/17/2020 at 22:02 point

I've just seen that you have reverse engeneered the AFFA2 connector, I jjust wanted to ask you what is the "Rheostat {violet}" pin used for/by. What you mean with Rheostat?

  Are you sure? yes | no

Manu wrote 06/18/2020 at 06:22 point

I don't know, I got the wiring diagram from an auto forum which mentionned that. It might be a +12V, but I'm not sure as I don't own this car anymore.

  Are you sure? yes | no

Rafael Martins wrote 06/06/2021 at 22:13 point

I believe it's used to control the brightness of the dashboard. My car doesn't have this feature though.

  Are you sure? yes | no

Oleg69 wrote 11/05/2019 at 19:05 point

Dear Manu,

great project. I want made something similar to my dashboard display on my Seat Exeo (identical in construction to Audi A4) with the aim show music title and notifications from my Android phone and control music with steering wheel remote control on my phone. Bevor I work deep in this theme, I have some general questions to you and hope that you can help me: 

1.) My original car radio is still build in. What do you think, how often does the car radio send, for example, the message "AUX" through the CANBUS? Only once when the Aux mode is switched or permanent ( every ms, s, ect.)?

2.) It is possible to interecept the steering wheel remote control signal with the CAN BUS Shield? As I understand it working by this car also through the CANBUS. Since the  wheel remote control have no function in the AUX Mode for the car radio, I will use them to control my android playlist. 

What do you think? It is generaly possible ? My idea is to implement  my Android phone in my car without mayor changes on the car. 

  Are you sure? yes | no

Nicolò wrote 09/27/2018 at 10:43 point

Hi, have you found how to read the built in encoder?
I'm tring to read it but for some reason it looks odd.

I don't have a scope to read and visualize how it work, this is why I'm asking you if you found a way.

  Are you sure? yes | no

Manu wrote 09/27/2018 at 13:31 point

Hi, I know, it is a bit odd but a simple bidirectionnal encoder works the same (check my Arduino code):

encoder = new ClickEncoder(11,12,8);

In this setup, pin 11 and 12 are the encoder's contacts (molette 1, 2 & 3).

Résultat de recherche d'images pour "renault update list brochage télécommande au volant"

  Are you sure? yes | no

Nicolò wrote 09/27/2018 at 15:18 point

I think that mine is different.

I have a 3X3 matrix and the rotary pushes the first 3 buttons in sequence:
1 press -> 1 released -> 2 pressed -> 2 -> released -> 3 pressed -> 3 released


If I rotate it backward the order is inverted: 3->2->1

The pulses don't looks like a standard encoder...

  Are you sure? yes | no

Németh Csaba wrote 11/26/2017 at 13:36 point

Hi,

I just found your project. It is a bit similar than mine. I have a Clio too with a JVC stereo. I would like to build a converter among the new radio, steering wheel remote controller and the display with the possible less demolition. I will use the yellow mini iso connector.

I have got a lot of information from this forum: https://megane.com.pl/topic/47797-wy%C5%9Bwietlacz-radia-update-list-protok%C3%B3%C5%82/

Is it very usable with google translate ;)

EDIT: as I read, we are building from the same source :D

  Are you sure? yes | no

Manu wrote 11/29/2017 at 20:42 point

exactly, it was very useful, espacially the startup up code (even with google translate ;-)

  Are you sure? yes | no

Manu wrote 10/18/2017 at 22:27 point

Sorry for the poor video quality, there is so little light at my shop that everything is blurry...

  Are you sure? yes | no

Frederico Souza Sant'ana wrote 10/01/2017 at 18:56 point

Awesome project!!

Which logic analyzer did you use?

  Are you sure? yes | no

Manu wrote 10/01/2017 at 19:42 point

Thanks, it's an intronix logicport

  Are you sure? yes | no

janzo wrote 09/28/2017 at 09:10 point

Belle réalisation, impressionnant !!

Nice work, really impressing !!

  Are you sure? yes | no

Manu wrote 09/28/2017 at 09:39 point

Merci !

  Are you sure? yes | no

Manu wrote 09/25/2017 at 15:28 point

Hi,

I tried the esp32 but I'm very familiar (yet) with this chip. There a 2 problems that I cannot solve with the esp32:

- I cannot find a hid bluetooth profile example (https://github.com/espressif/esp-idf/issues/782#issuecomment-331900141)

- I don't know if it's possible to use simultaneously a bt spp and hid profiles (if someone has info about that...)

Once I could overcome these, I will give the esp32 a try.

Beyond that, I already had on hand the different bluetooth modules for Arduino so I made it in "Lego style".

  Are you sure? yes | no

Németh Csaba wrote 12/22/2017 at 06:53 point

What kind of bt module is it?

I'm looking for a BT module with HFP and PBAP support for my similar project.

  Are you sure? yes | no

Manu wrote 12/22/2017 at 07:39 point

I recently tried the RN-52 with A2DP, HFP and SPP. But there is no HID+SPP usable simultaneously.

  Are you sure? yes | no

mbt28 wrote 09/25/2017 at 15:04 point

Hi,

Instead of using this relatively complicated circuit, why dont you use ESP32? It is already have mcu + bt + wifi built in. You can talk to canbus through uart. And as far as I see there bluetooth AVCP apis to get playing song info.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates