3
\$\begingroup\$

I am designing an interface for my car steering wheel to a Android head unit, using a Sparkfun Arduino Pro Micro to handle the USB side of things. The steering wheel buttons use three wires and a resistor ladder for the buttons, as shown in this diagram from the service manual:

2006 Nissan 350Z Steering Wheel interface

Each resistor in the diagram is the same value. My current solution is looks like this:

schematic

simulate this circuit – Schematic created using CircuitLab

Which works on my PC, but causes two problems in the car

  1. Pressing "Power Switch" or "Mode Switch" causes a brown-out on the micro controller and resets it, most likely due to exceeding the USB current.
  2. The car is a much noisier environment and the "Volume Switch" buttons are not distinguishable reliably in the car, no matter how much smoothing i do in code.

Ideally what I need is to know which line (L or W) is being pressed when the ADC reads a value. This would make the noise far less of an issue and I could then probably apply some sort of current limiting to eliminate the brown-outs without worrying about compressing the ADC range of values too much (and lose the diode).

Is there a simple way I can read the value at the ADC and use a digital pin to figure out which line was pressed (hopefully without too many components)?

\$\endgroup\$
1
  • \$\begingroup\$ The line impedances are unbalanced and prone to stray noise from inductive lines. Use 0.01 uF on both ends of cable between SW_A ,B to SW GND to lower differential impedance and absorb transient V=LdI/dt. \$\endgroup\$ Oct 6, 2017 at 15:01

1 Answer 1

4
\$\begingroup\$

You would be better to have the default point referenced to mid-rail...

Something like this.

schematic

simulate this circuit – Schematic created using CircuitLab

That way the switches will adjust the voltages either higher or lower than the mid-point. R3, R4, and R5 provide a little isolation and should be << than R1 and R2. Chose values for R1 and R2 that are in the same range as the resistors in the steering wheel times about 3. That should get you approximately the following voltages.

enter image description here

Also add a capacitor to provide you with a little noise reduction and to get rid of some of the switch debounce.

You may also want to consider adding some ESD protection.

In case you are not aware, the software needs to handle this kind of button scanning carefully. Since the voltage will slew through other voltages on it's way to the switch pressed value a certain amount of averaging and time comparison is required.

If the running average is deep enough the decoupling capacitor may not be omitted.

\$\endgroup\$
2
  • \$\begingroup\$ Thank you so much! I'll breadboard that out and get back to you. \$\endgroup\$
    – Kaboom22
    Oct 6, 2017 at 15:34
  • \$\begingroup\$ For my or anyone else's future reference: I kept the capacitor, R1 and R2 were changed to 1K. Resistors in the steering wheel were measured at 175Ω. \$\endgroup\$
    – Kaboom22
    Oct 9, 2017 at 16:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.