Steering wheel remote audio control

Good day. I'm trying to figure out how to translate resistance getting from steering wheel audio cotrol buttons (SWC) to resistance pattern which one understandable for audio head unit via remote control input.

HU is Sony XAV-601BT. It's RC-input compatible with Sony RM-X4S remote controller with resistive buttons. Scheme is below (scheme is the same both for Pioneer and Sony HU):

SWC resistance buttons pattern is unkown. Couldn't find any info about resistor nominals and controlling resistance on 2-wire cable which connected to stock HU. My car is Subaru Forester SG9 2.5XT '05 and stock HU is SUBARU GX806EF2 (OEM Kenwood). Rear panel terminals scheme (sorry for quality, it's the best one I found) SWC wires are on 8-pin harness. Using Subaru's pin numbering, it's pins 2 (+) and 6 (-). Looking at the rear: -- 4 3 2 1 8 7 6 5

So my idea is to connect 2 wires to Arduino then read all resistance regarding to all buttons on SWC. Then to program Arduino for specific reaction by output resistance for each command to Sony HU.

So my question: is there straightway to "generate" resistance by Arduino?

Thanks in advance.

No, you need a resistor.

Okay, thank you, MarkT Resistor or a couple of. I understand. Or maybe digital potentiometer controlled by Arduino?

I managed to build an adapter for steering wheel controls with arduino nano and a digital potentiometer. Can provide details if anyone is interested.

It looks like you can practically just take the sleeve (-) and feed that to an input pin with a pull down resistor of suitable value. If this is currently also still connected to the radio, the radio itself will likely already be providing a pull down.

dop2000: I managed to build an adapter for steering wheel controls with arduino nano and a digital potentiometer. Can provide details if anyone is interested.

Are you able to? If you can, please do.

Thanks.

Ok, this was my first project, I apologise in advance in case I did anything wrong.

You will need:

  1. A car with steering wheel control buttons. I used Suzuki Swift :slight_smile:
  2. Stereo head unit, in my case Pioneer MVH-X165UI
  3. Arduino, I used Nano.
  4. 100k digipot, I used MCP4131
  5. 10k resistor.

Here is the schematic:

And the sketch:

#include <SPI.h>

// remote control commands for Pioneer
const int VOL_UP=1;
const int VOL_DN=2;
const int PREV_TR=3;
const int NEXT_TR=4;
const int MODE=5;
const int MUTE=6;


int csPin=4; // digipot pin

int wheelPin=A5; // steering wheel resistance reading pin

int i=0;
int prevButton=0;

void setup() {                
  pinMode(csPin, OUTPUT);   
  delay(50);

  SPI.begin();
  delay(50);
  SPI.transfer(0); // command
  SPI.transfer(0); // value
  
  pinMode(wheelPin, INPUT);

  delay(100);
  //Serial.begin(9600); 
}


int getR() { // this function returns pressed button code or 0 if all buttons are released

  // read resistance value from the steering wheel buttons
  int r=analogRead(wheelPin);
  //Serial.println(r);
 
  // below values are for Suzuki Swift steering wheel controls and 10 kOhms known resistor
  if (r>=9 && r<=15) return(VOL_UP);
  if (r>=18 && r<=26) return(VOL_DN);
  if (r>=120 && r<=156) return(PREV_TR);
  if (r>=60 && r<=80) return(NEXT_TR);
  if (r>=33 && r<=47) return(MODE);
  if (r>=2 && r<=6) return(MUTE); 
  return (0);
}

void loop() {
  int currButton=getR(); // get current pressed button code
  if (currButton!=prevButton) { // if it has changed since last reading
    delay(10);
    currButton=getR(); // wait 10ms and read again to make sure this is not just some noise
    if (currButton!=prevButton) { 
      //Serial.println(currButton);
      prevButton=currButton; 

      // send command to car stereo, below values are for Pioneer head units
      SPI.transfer(0);  
      switch(currButton) {
       case VOL_UP: SPI.transfer(21); break;  // 16kOhm
       case VOL_DN: SPI.transfer(31); break;  // 24k    
       case PREV_TR: SPI.transfer(14); break;  // 11k
       case NEXT_TR: SPI.transfer(10); break;  // 8k
       case MODE: SPI.transfer(2); break;  // 1.6k
       case MUTE: SPI.transfer(4); break;  // 3k
       default: SPI.transfer(0); break; // nothing
     }
   }
  }
  delay(5);
}

Car voltage can be quite nasty, it’s not recommended to power adruino directly from it.
So I used a few safety components from this post:

And then to drop the voltage to 5V I put a small $2 step down converter from ebay (it also provides power to a dash cam).

Here is my finished board:

Let me know if something is not clear or if I made a mistake.

dop2000:
Ok, this was my first project, I apologise in advance in case I did anything wrong.

You will need:

  1. A car with steering wheel control buttons. I used Suzuki Swift :slight_smile:
  2. Stereo head unit, in my case JVC MVH-X165UI
  3. Arduino, I used Nano.
  4. 100k digipot, I used MCP4131
  5. 10k resistor.

Here is the schematic:

And the sketch:

#include <SPI.h>

// remote control commands for JVC
const int VOL_UP=1;
const int VOL_DN=2;
const int PREV_TR=3;
const int NEXT_TR=4;
const int MODE=5;
const int MUTE=6;

int csPin=4; // digipot pin

int wheelPin=A5; // steering wheel resistance reading pin

int i=0;
int prevButton=0;

void setup() {               
  pinMode(csPin, OUTPUT); 
  delay(50);

SPI.begin();
  delay(50);
  SPI.transfer(0); // command
  SPI.transfer(0); // value
 
  pinMode(wheelPin, INPUT);

delay(100);
  //Serial.begin(9600);
}

int getR() { // this function returns pressed button code or 0 if all buttons are released

// read resistance value from the steering wheel buttons
  int r=analogRead(wheelPin);
  //Serial.println(r);

// below values are for Suzuki Swift steering wheel controls and 10 kOhms known resistor
  if (r>=9 && r<=15) return(VOL_UP);
  if (r>=18 && r<=26) return(VOL_DN);
  if (r>=120 && r<=156) return(PREV_TR);
  if (r>=60 && r<=80) return(NEXT_TR);
  if (r>=33 && r<=47) return(MODE);
  if (r>=2 && r<=6) return(MUTE);
  return (0);
}

void loop() {
  int currButton=getR(); // get current pressed button code
  if (currButton!=prevButton) { // if it has changed since last reading
    delay(10);
    currButton=getR(); // wait 10ms and read again to make sure this is not just some noise
    if (currButton!=prevButton) {
      //Serial.println(currButton);
      prevButton=currButton;

// send command to car stereo, below values are for JVC head units
      SPI.transfer(0); 
      switch(currButton) {
      case VOL_UP: SPI.transfer(21); break;  // 16kOhm
      case VOL_DN: SPI.transfer(31); break;  // 24k   
      case PREV_TR: SPI.transfer(14); break;  // 11k
      case NEXT_TR: SPI.transfer(10); break;  // 8k
      case MODE: SPI.transfer(2); break;  // 1.6k
      case MUTE: SPI.transfer(4); break;  // 3k
      default: SPI.transfer(0); break; // nothing
    }
  }
  }
  delay(5);
}





Car voltage can be quite nasty, it's not recommended to power adruino directly from it.
So I used a few safety components from this post:
http://forum.arduino.cc/index.php?topic=7497.msg59812#msg59812

And then to drop the voltage to 5V I put a small $2 step down converter from ebay (it also provides power to a dash cam).

Here is my finished board:

![|300x230](http://i.imgur.com/uLrbbOk.jpg)

Let me know if something is not clear or if I made a mistake.

can you expain the wiring?
MCP4131
leg 4 and 5 and 7 go to GND
leg 6 to car stereo
leg 1 to arduino pin 4
leg 8 to 5v
what about leg 2 and 3?
i see that they connect to the arduino board at pin 11 and 13
but in your program there is no use in pin 11 and 13?

can you help my understand what am i missing?

thanks

volski: can you expain the wiring? MCP4131 leg 4 and 5 and 7 go to GND leg 6 to car stereo leg 1 to arduino pin 4 leg 8 to 5v what about leg 2 and 3? i see that they connect to the arduino board at pin 11 and 13 but in your program there is no use in pin 11 and 13?

can you help my understand what am i missing?

SCK and SDI (legs 2 and 3) should be connected to arduino pins 13 and 11. I think they are hard-coded in the SPI.h library and not user-configurable. Legs 4 and 7 connected to GND. Leg 5 is not used.

Here is the pinout of the cable that plugs into car stereo (remote control input):

Also, I recommend this great video which explains how to use MCP4131 with arduino: https://www.youtube.com/watch?v=_dUQOTemSJQ

Note to all, This DOES NOT work with the Sony WX-GT90BT and other MEX series decks of the same period (current units as of todays date). I found out the hard way...

jupiterengineering: Note to all, This DOES NOT work with the Sony WX-GT90BT and other MEX series decks of the same period (current units as of todays date). I found out the hard way...

Looks like Sony wired remote works on the same principle, but the resistance values might be different. Here is the diagram of Sony RM-X4S remote I found: |500x99

More information here: http://www.panuworld.net/minidisc/fordsony/

You can also try modifying the sketch to cycle through all 128 steps on the digipot and see if it triggers any functions on the head unit.

Hi, Currently I am trying to connect steering wheel to a head unit using arduino nano as interface. But I can not find MCP4131 or equivalent over here. Is there any other option? Thanks

kurniawandicky: Is there any other option?

Hi, You can try doing the same with a bunch of resistors of different values. See the diagram here. Don't ask me how it works though, I don't know :)

Another option is to use IR-transmitter to send commands to the head unit. There are plenty of instructables on how to 'clone' any IR remote control with arduino.

dop2000: Hi, You can try doing the same with a bunch of resistors of different values. See the diagram here. Don't ask me how it works though, I don't know :)

Another option is to use IR-transmitter to send commands to the head unit. There are plenty of instructables on how to 'clone' any IR remote control with arduino.

Thank you for quick answer, very helpul. Basicaly my head unit is only need 1K2 ohm for seek up, 1K6 ohm for seek down and 0 ohm for Source to ground. I will try with various resistors..

Hey Lazyfao,

Did you try it with the resistor?

Got success to "generate" resistance by Arduino?

Hi, i really have very little experience with arduino, but i thought it would be really nice to make my steering wheel buttons working using arduino. So I am trying this method now (as mentioned above, with the digipot), but i get stuck with the wiring. In this example the car buttons give 2 wires, but in my case I have 8 wires (one for each button), plus ground. Or four wires, plus ground, when i would use the the little board that came with the buttons. But that doesn't seem to do anything. So how do I go from here? I it for example possible to just put those 8 wires each on a pin and lead them to one output with the necessary values?

If each button has its own wire, then it's even easier. No need to read the resistance, just connect each wire to a free digital pin on arduino and change the code to check digital pins instead of the analog pin.

I'd been thinking of using an array of optocouplers and load resistors, as I hadn't heard of MCP4131 -- ordered one now. Looking at a 3-wire setup, though the additional signal wire only has one button so is even easier to read and decode.

Hello guys , how is it going ?I need to solve something in my car , i need values resistance of my opel astra 2002 wheel control , can some budy help me . i used a multimeter to measure my car steering wheel resistance but i dont understand it ???? i am adding some photos i made . thanks wish all the best. at the resistance first is without touchin any button second next 3- back 4-vol up 5-vol down

I am also trying to read and write my steering wheel button thru Arduino. Has anyone figured this out yet? I changed my steering wheel on my vehicle to a newer model, the resistance values are different than the stock wheel for my cruise control. I am just trying to read the new buttons into the Arduino and write them back to my PCM the way the old buttons did. My radio button are easy since I am just running them thru a rcjoycon and it sends commands to my carputer to control radio functions. I would just like my cruise control to work again with the new wheel buttons. I learned a great deal reading these forums, but it seems no one has gotten them to work properly.

Thanks, Barry