JVC stalk adapter - DIY?

fratello

Standard Member
Thank You, again, for support ! I hope -me too !- to be able to recreate those codes, JVC-48 codding ... despite my low-level of knowledge :( !
Best regards !
 

danimal1228

Standard Member
I signed up just to reply to this thread. I finally got it to work with my JVC headunit. I used an Arduino to create the timing. Now all I have to do is write the code to intercept the steering wheel commands. If anyone finds out any more JVC codes let me know. I tried a few random control codes but they don't do anything.

Here is the code for the Arduino. It receives commands over the serial port and sends the appropriate JVC Remote command.



Code:
/*
  JVC
  Communicate with JVC car radio over 3.5mm Remote connector
  
  Connect Arduino PIN to Base of NPN transistor
  Emitter is tied to ground
  Collector is tied to 3.5mm TIP
  Ground 3.5mm Ring/Sleeve
  
  By Dan Guerra ([email protected])
  */

  int PIN = 7;          // Digital IO pin connected to base of transistor
  int Length = 537;     // Length in Microseconds
  int IncomingByte = 0; // Initialize Serial Buffer
  int Reps = 3;         // Number of times to repeat each transmission

void setup() {
  pinMode(PIN, OUTPUT); // Set pin to output
  digitalWrite(PIN, LOW); // Make PIN low to shut off transistor
  Serial.begin(9600);
  Serial.println("1 - Volume Up");
  Serial.println("2 - Volume Down");
  Serial.println("3 - Source");
  Serial.println("4 - Sound");
  Serial.println("5 - Mute");
  Serial.println("6 - Skip Fwd");
  Serial.println("7 - Skip Back");
  Serial.println("8 - Skip Fwd Hold");
  Serial.println("9 - Skip Back Hold");
}

void loop() { 
  if (Serial.available() > 0) {
    IncomingByte = Serial.read();
    
    switch (IncomingByte) {
      case '1':
        JVCVolUp();
        break;    
      case '2':
        JVCVolDn();
        break;    
      case '3':
        JVCSource();
        break;    
      case '4':
        JVCSound();
        break;    
      case '5':
        JVCMute();
        break;    
      case '6':
        JVCSkipFwd();
        break;    
      case '7':
        JVCSkipBack();
        break;    
      case '8':
        JVCSkipFwdHold();
        break;    
      case '9':
        JVCSkipBackHold();
        break;    
        
      default:;
    }
  }
}


void JVCVolUp() {      // Send 0x04
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bZERO();
    bONE();    // 4 
    bZERO();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCVolDn() {      // Send 0x05
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bONE();
    bZERO();
    bONE();    // 5 
    bZERO();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCSource() {      // Send 0x08
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bZERO();
    bZERO();    // 8 
    bONE();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCSound() {      // Send 0x0D
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bONE();
    bZERO();
    bONE();    // D (13) 
    bONE();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCMute() {      // Send 0x0E
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bONE();
    bONE();    // E (14) 
    bONE();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCSkipFwd() {      // Send 0x12
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bONE();
    bZERO();    // 2 
    bZERO();
    
    bONE();
    bZERO();   // 1
    bZERO();
  
    Postamble();
  }
}

void JVCSkipBack() {      // Send 0x13
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bONE();
    bONE();
    bZERO();    // 3 
    bZERO();
    
    bONE();
    bZERO();   // 1
    bZERO();
  
    Postamble();
  }
}

void JVCSkipFwdHold() {      // Send 0x14
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bZERO();
    bONE();    // 4 
    bZERO();
    
    bONE();
    bZERO();   // 1
    bZERO();
  
    Postamble();
  }
}

void JVCSkipBackHold() {      // Send 0x15
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bONE();
    bZERO();
    bONE();    // 5 
    bZERO();
    
    bONE();
    bZERO();   // 1
    bZERO();
  
    Postamble();
  }
}


void bONE() {                     // Send a binary ONE over the line
  digitalWrite(PIN, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PIN, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length * 3);  // for 537 * 3 = 1611us
}


void bZERO() {                    // Send a binary ZERO over the line
  digitalWrite(PIN, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PIN, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length);      // for 537us
}

void Preamble() {
  digitalWrite(PIN, LOW);         // Not sure what this does
  delayMicroseconds(Length * 1);
  
  digitalWrite(PIN, HIGH);        // AGC
  delayMicroseconds(Length * 16);
  
  digitalWrite(PIN, LOW);         // AGC
  delayMicroseconds(Length * 8);
  
  bONE();    // 1 Start Bit
  
  bONE();    //       (7 bit device code)
  bONE();    
  bONE();    // 7
  bZERO();
 
  bZERO();
  bZERO();    //4
  bONE();
}
    
    
void Postamble() {
  bONE();
  bONE();    // 2 stop bits
}
 

psynapse

Novice Member
Has anybody noted this document?

http://support.jvc.com/consumer/support/documents/RemoteCodes.pdf

It includes data such as

Table 1 Transmission format

Item Content

1. Type of modulation Pulse-interval modulation

2. Header Mark 8.44 ms, space 4.22 ms (omissible)*

1

3. Pulse width 0.527 ms +&#8211;60 us

4. Pulse interval (0) 1.055ms +&#8211;60 us

5. Pulse interval (1) 2.11ms +&#8211;100 us

6. Output form Word-unit continuous output

7. Word cycle 46.42 ms +-2 ms

8. Space between words (46.42 -16.88 - 0.527 &#8211; n x 1.055) +- 2 ms: n is the number of &#8220;1&#8221;.

A brief inspection suggests that this is the exact specification
 

Nero81

Standard Member
I signed up just to reply to this thread too! :)
I spent a day trying to find some info on JVC wired remote control, but this is really the only source of info in all the internet...

These are my 2cents:

- I have an old JVC KD-DV6201 (1 din DVD reader, with video out) so the infrared remote has also some buttons to manage the OSD functions when the video output is on (DVD/Divx playback or browsing discs with mp3); by the way I didn't test the wired control with a monitor connected to the output, I use my JVC just as a standard car-audio unit, but with 4.7 GB discs :D

- I'm using an Arduino Leonardo and I modified the danimal1228's sketch to easily check all the codes from 00 to 7F, with this results:

00 - Power ON / OFF
04 - Vol +
05 - Vol -
06 - Mute/Unmute
08 - Source
0C - Equalization preset cycle
0D - Mute/Unmute (and Power OFF with "press and hold" - see below)
12 - Seach + / Track + (and Manual Tune + / Fast fwd with "press and hold")
13 - Seach - / Track - (and Manual Tune - / Fast rwd with "press and hold")
14 - Band cycle / Folder +
15 - Program 1-6 cycle / Folder -
16 - Sel cycle (it cycles between Fader/Balance/Loudness/Subwoofer out level/Volume gain for the current source)

- furthermore, before finding the 00 and 06 codes I've tried to understand how to power off the unit, simulating the "press and hold" on the infrared remote control: to do this the standard "3x (Preamble - Code - Postamble)" sequence has to be repeated at least 11 (eleven) times, but it's not simply enough to send "33x (Preamble - Code - Postamble)"! Since sending 11 characters on the Arduino serial console (9600 baud) with the danimal1228's sketch was working, I've tried to replicate this behavior with an 800us delay (1 sec / (9600 bits/sec / 8 bits per character) = 833us to send a character) between every sequence and it worked. After a couple of tests I decreased this delay to 50us, but maybe it can be even less.
So it becomes "11 x (3x (Preamble - Code - Postamble) + 50us delay)"

- the "press and hold" simulation also works with Vol + / Vol -: with the minimum 11 repetitions it increases/decreases the volume by 2 (or sometimes 3), with 20 repetitions by 8/9.

That's all for today!
As soon as I have time to clean the sketch from the messy debug lines I'll post it here. :)
 

Dgently

Standard Member
Hi, any update to your progress with the Arduino sketch? Am keen to know if you're satisfied with the result! :)
 

Nero81

Standard Member
Not yet, still stucked on the resistive commands reception from my Alfa steering wheel. Too much work on these days and too less time to play with the Arduino. I'm enjoying the JVC with manual control, while waiting for some spare time!
I'll let you know... :)
 

Sibaya

Standard Member
Hi All
Earlier in the year I wrote some code to interface with an Arduino to a JVC head unit, also scanned for all the codes I could find, there are some diagnostic and configuration commands that are not included in the code attached. The code combines the example cited earlier along with some other I copied that gives multi-function to each button. In the car I was dealing with it was a simple steering interface and would not work for an Alfa. My 156 (and I believe all models since 2003) use CAN-bus interface. To interface from an Arduino you can use a CAN shield or I guess build your own by adding a CAN chip. As for the code for the JVC and multiclick - if you have a problem with the code/building a board for it then have a look at this blog otherwise here is just the code, its an attachment as it exceeds max message length. Hope this helps someone

regards
 

Attachments

marcot1

Standard Member
Thanks for the Arduino sketch, I'm in the process of integrating it with an 05 Toyota's resistive steering wheel controls. Does any one have any other JVC codes? I've not yet recieved the head unit, I want to be done with the arduino control ahead of time so I can get things installed as quickly as possible

Specifically I'm looking to control a paired bluetooth phone for call pickup and voice dialing.

In the sketch there is the code 0x1B which is labeled BTCall, I'm not sure if this is a generic function that will answer a call if one is incoming and voice dial if the phone is not in a call.

Finally how do the skip buttons work when the radio is on vs listening to cd/mp3 sources?

Any feedback is appreciated.
 

Sibaya

Standard Member
the code for answering a BT call is x'0B', its the same as 'sound' just the head unit changes its functionality when a call comes in on BT. So the sketch will on 'double click' change the equaliser if there is no call or answer the call if one comes in.
The code for making a call is x'1B'. I have the JVC paired with a HTC one X and when you select the button to make a call it switches to voice recognition, thats automatic and not part of any customisation I have done.
I have scanned my head unit for all codes and they are in the sketch (other than diagnostic codes), if you want the sketch to do the scan let me know, the manuals that come with the head unit do not contain any codes
The skip/back buttons for stored stations do next/previous song on CD/USB, here is link to a JVC typical manual and you can see how the control buttons are grouped by function, the IR controls the buttons by the same groupings
regards
 

marcot1

Standard Member
I would appreciate it if you could post the scanning sketch, the radio should be here today and I would like to bench test it tonight. I've got the arduino and a mockup of the resistive controls laid out on a bread board for testing right now.

The radio is a JVC KWAV71BT DVD/media unit, I'm not sure if it has any other remote codes other than the standard lot. If I find any I'll post them back here.
 

Sibaya

Standard Member
Here is the scanning code, it simply sends the hex strings to the JVC, displays the hex string being sent and you note the behaviour of the head unit. The head unit doesnt accept strings above 7F

Code:
/*
  Test platform to determine what IR codes are getting a respons.
  Simply transmits hex codes from 00 to FF in a 10 second cycle, the idea is to see if the radio respondes to the codes displayed in the log, its a hack of the real 
  transmitter code so there is plenty of redundant code in here
  
  Thanks are due to:
  The multi button class: Original code by Jeff Saltzman // http://jmsarduino***************/2009/10/4-way-button-click-double-click-hold.html
  The JVC codes and testing interface by Dan Guerra ([email protected])
  
  The rest (not much) by Rob Lloyd ([email protected]) March 5 2013
 
  */ 
  int BPVirt = 0;          // Virtual event number, used in case selection 
  int adddouble = 4;       // number to be bumped to pin number to identify double click event   
  int addhold = 8;         // number to be bumped to pin number to identify hold event
  int VolUB = 4;           //  Input pin 4 corresponds to volume up switch
  int VolDB = 5;           //  Input pin 5 corresponds to volume down switch
  int WaveB = 6;           //  Input pin 6 corresponds to wave switch
  int TuneB = 7;           //  Input pin 7 corresponds to Tune switch
  int ConOut = 0;          // by default no output to console
  int PINO = 8;            // Digital IO pin connected to base of transistor
  int Length = 537;        // Length in Microseconds
  int IncomingByte = 0;    // Initialize Serial Buffer
  int RepTime = 11;            // Number of times to repeat each transmission
  int Reps = 4;            // Number of times to repeat each transmission
  int b = 0;               // detected event number i.e. what button action is detected
  int buttonPin= 0;        // the input pin, coresponds to one of 4 real pins (4 to 7)
  int i = 1;
  int j2 = 1;
  int DebugOn = 0;
  
  // Button timing variables
  int debounce = 20;       // ms debounce period to prevent flickering when pressing or releasing the button, default 20
  int DCgap = 250;         // max ms between clicks for a double click event, default 250
  int holdTime = 1000;     // ms hold period: how long to wait for press+hold event
  int longHoldTime = 3000; // ms long hold period: how long to wait for press+hold event
  int event = 0;           // event number 
 unsigned int number = 0x00;
  char temp[2];

  
  
  //   Initialisation

  void setup() {
  pinMode(PINO, OUTPUT);
  digitalWrite(PINO, LOW); // Make PIN low to shut off transistor
  
  
    Serial.begin(9600);
    Serial.println("Enter 1 to Go");
    

}  
//   Process loop, dont start till console is running

void loop() { 
    if (Serial.available() > 0) {
      while (number <= 0x7f)
      {

        temp[0] = (char) (number/16);
        temp[1] = (char) (number%16);
 
        Serial.println(" ");
        Serial.print("Sending Hex ");
        Serial.print(temp[0],HEX);
        Serial.print(temp[1],HEX);
        Serial.print(" for 10 seconds ");
        // timer loop do 10 loops once a second
        j2= 1;
        i = 1;
        while (j2 < RepTime) 
        {
          i = 1;
          while (i < Reps)
         {
            // IR repaeater 3 times
            
                Preamble();
                switch (temp[1]) {
                    case 0: 
                      JVCA0();
                      break;    
                    case 1:
                      JVCA1();
                      break;    
                    case 2:
                      JVCA2();
                      break;    
                    case 3:
                      JVCA3();
                      break;  
                    case 4:
                      JVCA4();
                      break;  
                    case 5: 
                      JVCA5();
                      break;  
                    case 6: 
                      JVCA6();
                      break;
                    case 7:
                      JVCA7();
                      break; 
                    case 8:
                      JVCA8();
                      break; 
                    case 9:
                      JVCA9();
                      break; 
                    case 10:
                      JVCAA();
                      break; 
                    case 11:
                      JVCAB();
                      break; 
                    case 12:
                      JVCAC();
                      break; 
                    case 13:
                      JVCAD();
                      break; 
                    case 14:
                      JVCAE();
                      break; 
                    case 15:
                      JVCAF();
                      break; 
                  
                    default:;
                } 
                switch (temp[0]) {
                    case 0: 
                      JVCB0();
                      break;    
                    case 1:
                      JVCB1();
                      break;    
                    case 2:
                      JVCB2();
                      break;    
                    case 3:
                      JVCB3();
                      break;  
                    case 4:
                      JVCB4();
                      break;  
                    case 5: 
                      JVCB5();
                      break;  
                    case 6: 
                      JVCB6();
                      break;
                    case 7:
                      JVCB7();
                      break; 
                        
                    default:;
                }
                Postamble();
                i++;
            } // end of IR repeats
            delay(1000);
            j2++;
        } // end of timer loop
        number++;
      } // end of hex count
      
    } // end of console loop

}  // end of setup

void JVCA0() {      // Send 0x01
    
    bZERO();
    bZERO();
    bZERO();    // 1 
    bZERO();
}
void JVCA1() {      // Send 0x01
    
    bONE();
    bZERO();
    bZERO();    // 1 
    bZERO();
}
void JVCA2() {      // Send 0x02
    
    bZERO();
    bONE();
    bZERO();     
    bZERO();
}
void JVCA3() {      // Send 0x03
    
    bONE();
    bONE();
    bZERO();     
    bZERO();
}
void JVCA4() {      // Send 0x04
    
    bZERO();  
    bZERO();
    bONE();   
    bZERO();
}
void JVCA5() {      // Send 0x05
    
    bONE();  
    bZERO();
    bONE();   
    bZERO();
}
void JVCA6() {      // Send 0x06
    
    bZERO();  
    bONE();
    bONE();   
    bZERO();
}
void JVCA7() {      // Send 0x07
    
    bONE();  
    bONE();
    bONE();   
    bZERO();
}
void JVCA8() {      // Send 0x08
    
    bZERO();  
    bZERO();
    bZERO();   
    bONE();
}
void JVCA9() {      // Send 0x09
    
    bONE();
    bZERO();
    bZERO();    // 1 
    bONE();
}
void JVCAA() {      // Send 0x10
    
    bZERO();
    bONE();
    bZERO();     
    bONE();
}
void JVCAB() {      // Send 0x11
    
    bONE();
    bONE();
    bZERO();     
    bONE();
}
void JVCAC() {      // Send 0x12
    
    bZERO();  
    bZERO();
    bONE();   
    bONE();
}
void JVCAD() {      // Send 0x13
    
    bONE();  
    bZERO();
    bONE();   
    bONE();
    }
void JVCAE() {      // Send 0x13
    
    bZERO();  
    bONE();
    bONE();   
    bONE();
}
void JVCAF() {      // Send 0x15
    
    bONE();  
    bONE();
    bONE();   
    bONE();
}
void JVCB0() {      // Send 0x01
    
    bZERO();
    bZERO();
    bZERO();   

}
void JVCB1() {      // Send 0x01
    
    bONE();
    bZERO();
    bZERO();   

}
void JVCB2() {      // Send 0x02
    
    bZERO();
    bONE();
    bZERO();     

}
void JVCB3() {      // Send 0x03
    
    bONE();
    bONE();
    bZERO();     

}
void JVCB4() {      // Send 0x04
    
    bZERO();  
    bZERO();
    bONE();   

}
void JVCB5() {      // Send 0x05
    
    bONE();  
    bZERO();
    bONE();   

}
void JVCB6() {      // Send 0x06
    
    bZERO();  
    bONE();
    bONE();   

}
void JVCB7() {      // Send 0x07
    
    bONE();  
    bONE();
    bONE();   

}

//    Wire signals to be generated for a '1' bit
void bONE() {                     // Send a binary ONE over the line
  if (DebugOn = 1) {
    Serial.print(" 1 ");
  } 
  digitalWrite(PINO, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PINO, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length * 3);  // for 537 * 3 = 1611us
}

//    Wire signals to be generated for a '0' bit
void bZERO() {   // Send a binary ZERO over the line

  if (DebugOn = 1) {
    Serial.print(" 0 ");
  } 
  
  digitalWrite(PINO, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
   digitalWrite(PINO, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length);      // for 537us
}

//    Wire signals to be generated for a start of signal to a JVC
void Preamble() {

  if (DebugOn = 1) {
    Serial.println(" ");
    Serial.print(" AGC "); 
  } 

  
  digitalWrite(PINO, LOW);         // Not sure what this does
  delayMicroseconds(Length * 1);
  
  digitalWrite(PINO, HIGH);        // AGC
  delayMicroseconds(Length * 16);
  
  digitalWrite(PINO, LOW);         // AGC
  delayMicroseconds(Length * 8);
  
  bONE();    // 1 Start Bit
  
  bONE();    //       (7 bit device code)
  bONE();    
  bONE();    // 7
  bZERO();
 
  bZERO();
  bZERO();    //4
  bONE();
}
    
//    Wire signals to be generated for a end of signal    
void Postamble() {
  if (DebugOn = 1) {
    Serial.print(" STOP ");
  } 

  bONE();
  bONE();    // 2 stop bits
}
 

Sibaya

Standard Member
At the risk of sounding like a nanny and repeating earlier posts; don't put voltage down the JVC remote wire, put it to ground in order to send a signal. Hate to see your test bench and JVC go up in smoke :eek:
regards
 

marcot1

Standard Member
Very frustrating, I'm not getting any response out of the radio at all. It's normal front panel connections all work perfectly.

The radio and the arduino are sharing a common ground and the transistor is connected properly as far as I can tell. Two different arduino's and the same result.

Basic connections:
Pin 8 to base of the transistor: (verified this is the correct pin in the sketch)
Emitter is tied to ground
Collector is tied to blue/yellow wire on the head unit marked "Steering remote"

Ground cable from the arduino to the chassis of the radio.
 

Sibaya

Standard Member
I had a frustrating time too. I couldn't get mine to work either with a common earth as you described, I'm no electronics person but can not see a logical reason why it doesnt work as you described.To get mine working on the breadboard the radio and arduino circuits were a separate 12 v from radio with earth back to radio and arduino on the 5v USB circuit replacing the transistor with an optocoupler so there is no common ground. When I went to a strip board I kept the radio circuit isolated and took the arduino power/earth through a power converter upstream from the radio
 

Srimal1985

Standard Member
Hi Guys,
I have JVC KD-R431 head unit.
My car is a toyota corolla 2004. But is has a panasonic head unit. So, when i bought the steering wheel control connects2 interface unit, they said it does not work with corolla, which has panasonic head unit.
So, i urned to search a way of putting few resistors inside the steering control unit in my car and connect it to the single wire in back of JVC.
This way works for sony. But still i havent got a clue if it works the same way with JVC.
I contacted JVC, Conects2.
No one helped me.
Pls somebody help me to find the resistor values.
Thanks.
 

kisel39

Novice Member
the correct code to emulate rm-rk52 on the Arduino:
void JVCVolUp() { // Send 0x04
Preamble();
Adr();
bZERO();
bZERO();
bONE();
bZERO();
bZERO();
bZERO();
bZERO();
Postamble();
Adr();
bZERO();
bZERO();
bONE();
bZERO();
bZERO();
bZERO();
bZERO();
Postamble();
}

void JVCVolDn() { // Send 0x05
Preamble();
Adr();
bONE();
bZERO();
bONE();
bZERO();
bZERO();
bZERO();
bZERO();
Postamble();
Adr();
bONE();
bZERO();
bONE();
bZERO();
bZERO();
bZERO();
bZERO();
Postamble();
}

void JVCSours() { // Send 0x08
Preamble();
Adr();
bZERO();
bZERO();
bZERO();
bONE();
bZERO();
bZERO();
bZERO();
Postamble();
Adr();
bZERO();
bZERO();
bZERO();
bONE();
bZERO();
bZERO();
bZERO();
Postamble();
}

void JVCSound() { // Send 0x0D
Preamble();
Adr();
bONE();
bZERO();
bONE();
bONE();
bZERO();
bZERO();
bZERO();
Postamble();
Adr();
bONE();
bZERO();
bONE();
bONE();
bZERO();
bZERO();
bZERO();
Postamble();
}

void JVCMute() { // Send 0x0E
Preamble();
Adr();
bZERO();
bONE();
bONE();
bONE();
bZERO();
bZERO();
bZERO();
Postamble();
Adr();
bZERO();
bONE();
bONE();
bONE();
bZERO();
bZERO();
bZERO();
Postamble();
}

void JVCSkipFwd() { // Send 0x12
Preamble();
Adr();
bZERO();
bONE();
bZERO();
bZERO();
bONE();
bZERO();
bZERO();
Postamble();
Adr();
bZERO();
bONE();
bZERO();
bZERO();
bONE();
bZERO();
bZERO();
Postamble();
}

void JVCSkipBack() { // Send 0x13
Preamble();
Adr();
bONE();
bONE();
bZERO();
bZERO();
bONE();
bZERO();
bZERO();
Postamble();
Adr();
bONE();
bONE();
bZERO();
bZERO();
bONE();
bZERO();
bZERO();
Postamble();
}

void JVCSkipFwdHold() { // Send 0x14
Preamble();
Adr();
bZERO();
bZERO();
bONE();
bZERO();
bONE();
bZERO();
bZERO();
Postamble();
Adr();
bZERO();
bZERO();
bONE();
bZERO();
bONE();
bZERO();
bZERO();
Postamble();
}

void JVCSkipBackHold() { // Send 0x15
Preamble();
Adr();
bONE();
bZERO();
bONE();
bZERO();
bONE();
bZERO();
bZERO();
Postamble();
Adr();
bONE();
bZERO();
bONE();
bZERO();
bONE();
bZERO();
bZERO();
Postamble();
}

void JVCBTCall() { // Send 0x1B
Preamble();
Adr();
bONE();
bONE();
bZERO();
bONE();
bONE();
bZERO();
bZERO();
Postamble();
Adr();
bONE();
bONE();
bZERO();
bONE();
bONE();
bZERO();
bZERO();
Postamble();
}

void bONE() {
PORTD = PORTD ^ B10000000;
delayMicroseconds(537);
PORTD = PORTD ^ B10000000;
delayMicroseconds(1611);
}

void bZERO() {
PORTD = PORTD ^ B10000000;
delayMicroseconds(537);
PORTD = PORTD ^ B10000000;
delayMicroseconds(537);
}
void Preamble() {
PORTD = PORTD ^ B10000000;
delayMicroseconds(1611);
PORTD = PORTD ^ B10000000;
delayMicroseconds(11000);
}

void Adr() {
bONE();
bONE();
bONE();
bONE();
bZERO();
bZERO();
bZERO();
bONE();
}

void Postamble() {
bONE();
bONE();
delayMicroseconds(21000);
}
 

DimaVv

Novice Member
Another variant of the program.
Works with steering wheel remote control of Renault clio like this

and jvc audio KD-x125



Code:
Code:
int PINO = 8;            // Digital IO pin connected to base of transistor
int Length = 537;        // Length in Microseconds
int DebugOn = 0;

#define POWERNOFF 0x00
#define VOLUP 0x04
#define VOLDOWN 0x05
#define MUTE 0x06
#define SOURCE 0x08
#define EQUALIZER 0x0d///0x0C
#define MUTE2 0x0e//0x0D// - Mute/Unmute (and Power OFF with "press and hold" - see below)
#define SEARCHFORW 0x12// - Seach + / Track + (and Manual Tune + / Fast fwd with "press and hold")
#define SEARCHBACK 0x13// - Seach - / Track - (and Manual Tune - / Fast rwd with "press and hold")
#define BANDFORW 0x14// - Band cycle / Folder + //programs
#define BANDBACK 0x15// - Band cycle / Folder + //programs
#define PROGR 0x15// - Program 1-6 cycle / Folder -//programs
//#define UNKNOWN 0x16// - Sel cycle (it cycles between Fader/Balance/Loudness/Subwoofer out level/Volume gain for the current source)

#define GREENPIN 5
#define BLUEPIN 3
#define YELLOWPIN 6
#define BROWNPIN 7
#define REDPIN 4
#define BLACKPIN 2

#define OUT_PINS 3
unsigned char out_pins[OUT_PINS]={
  GREENPIN,BLUEPIN,YELLOWPIN};

void setup() {
  pinMode(PINO, OUTPUT);
  digitalWrite(PINO, LOW); // Make PIN low to shut off transistor
  Serial.begin(115200);
  Serial.println("Enter 1 to Go");
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
  pinMode(YELLOWPIN, OUTPUT);
  pinMode(BROWNPIN, INPUT_PULLUP);
  pinMode(REDPIN, INPUT_PULLUP);
  pinMode(BLACKPIN, INPUT_PULLUP);
}

unsigned char GetJoystic(void){
  static unsigned char stage = 0;
  static unsigned char scroll_stored;
  unsigned char tmp,i;
  if (++stage > (OUT_PINS-1)) stage=0;

  for (i=0;i<(OUT_PINS);i++)
    if (i==stage){
      digitalWrite(out_pins[i], LOW);
    }
  else{
    digitalWrite(out_pins[i], HIGH);
  }

  delay(10);

  tmp = digitalRead(BROWNPIN);
  if (!tmp){
    if (stage != scroll_stored){
      char scrl = stage-scroll_stored;
      scroll_stored = stage;
      if ((scrl == 1) ||(scrl==-2)) {
        Serial.println("Scroll-");
        return SEARCHFORW;
      }else{
        Serial.println("Scroll+");
        return SEARCHBACK;
      }
    }
  }
  tmp = digitalRead(REDPIN);
  if (!tmp){
    switch(stage){
    case 0:
      Serial.println("Select");
      return SOURCE;
    case 1:
      Serial.println("Vol+");
      return VOLUP;
    case 2:
      Serial.println("Vol-");
      return VOLDOWN;
    }
  }
  tmp = digitalRead(BLACKPIN);
  if (!tmp){
    switch(stage){
    case 0:
      Serial.println("Source-");
      return BANDFORW;
    case 1:
      Serial.println("Mute");
      return MUTE2;
    case 2:
      Serial.println("Source+");
      return BANDBACK;
    }
  }
  return 0;
}

void loop() {
  unsigned char Key = GetJoystic();
  static unsigned char code = 0;
  if (Key){
    Serial.print("Key ");
    Serial.println(Key,HEX);
    JVCSendCommand(Key);
    delay(2);
    JVCSendCommand(Key);
    delay(20);
  }

  if (Serial.available() > 0) {
    char inp=Serial.read();
    Serial.print("Received: ");
    Serial.println(inp, DEC);
    switch (inp){
      case '1':
      code--;
      break;
      case '2':
      code++;
      break;
      case '3':
      JVCSendCommand(code);
      break;
    }
  
  
  }
}  // end of loop


void JVCSendCode(unsigned char code){
  unsigned char i,tmp=1;
  for (i=0;i<sizeof(code)*8-1;i++){//7bits
    if (code & tmp)
      bONE();
    else
      bZERO();
    tmp = tmp << 1;
  }
}

void JVCSendCommand(unsigned char code){
  Preamble();
  JVCSendCode((unsigned char)code);
  Postamble();
}

//    Wire signals to be generated for a '1' bit
void bONE() {                     // Send a binary ONE over the line
  if (DebugOn == 1) {
    Serial.print(" 1 ");
  }
  digitalWrite(PINO, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PINO, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length * 3);  // for 537 * 3 = 1611us
}

//    Wire signals to be generated for a '0' bit
void bZERO() {   // Send a binary ZERO over the line
  if (DebugOn == 1) {
    Serial.print(" 0 ");
  }
  digitalWrite(PINO, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PINO, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length);      // for 537us
}

//    Wire signals to be generated for a start of signal to a JVC
void Preamble() {
  if (DebugOn == 1) {
    Serial.println(" ");
    Serial.print(" AGC ");
  }
  digitalWrite(PINO, LOW);         // Not sure what this does
  delayMicroseconds(Length * 1);

  digitalWrite(PINO, HIGH);        // AGC
  delayMicroseconds(Length * 16);

  digitalWrite(PINO, LOW);         // AGC
  delayMicroseconds(Length * 8);

  bONE();    // 1 Start Bit
  JVCSendCode(0x47);
}

//    Wire signals to be generated for a end of signal  
void Postamble() {
  if (DebugOn == 1) {
    Serial.print(" STOP ");
  }
  bONE();
  bONE();    // 2 stop bits
}
P.S. This JVC has not 3.5mm jack input - only wire with label "STEERING WHEEL REMOTE".
 

Spartelfant

Novice Member
Hi there!

I've taken the code posted above and put in a lot of comments. Fixed a few bugs as well, most notably:
- I changed the pulse width from 537 us to 527 us. This is the same pulse width used by JVC IR remotes. The 537 us did work, but caused my radio's display to flicker.
- On startup, the previous code immediately sent the command associated with the scrollwheel changing position. This is because on startup there is no known last position for the scrollwheel, so its current position is interpreted as a change. I fixed this, so you can power up the chip together with the radio.
- Since I'm using an Arduino Nano with an on-board LED, I added some code that will output the data being sent to this LED as well for diagnostic purposes.
- Removed a seemingly unnecessary 10 ms delay from the code.
- Restructured the sending of commands: HEADER, START BIT, 3 x (ADDRESS, VALUE, 2 STOP BITS). When command are sent only once, the radio may not always pick up on them. This way the radio never misses a command, but also never unintentionally interprets a single button press as multiples of the same command.

The hardware I used:
- Arduino Nano (I used a cheap clone from China)
- DC-DC power supply for the Nano (I got this one)
- A 1k resistor
- An optocoupler (I used the 4N25)
- A fuse (I used 250mA because I had that lying around, you could use a smaller value as well)
- A prototyping PCB to connect everything up nice and tidy
- A small enclosure, some wires, heatshrink, etc.

A video of my contraption in action:

And a link to the code I wrote: [C] Renault Twingo / Clio steering wheel remote via Arduino Nano - Pastebin.com
 

R-P

Standard Member
Cannot believe I have missed this post for the last 7 years or so... :(

Any clue as to what code a Toyota Gen2 Prius uses? This just might be a doable project to familiarize myself with Arduino, even with my severe dislike of programming since building a 80C51 based study project in the late 90's...
 

Spartelfant

Novice Member
Any clue as to what code a Toyota Gen2 Prius uses? This just might be a doable project to familiarize myself with Arduino, even with my severe dislike of programming since building a 80C51 based study project in the late 90's...
What I found with a quick Google search is Steering Wheel control aftermarket radio Gen2 NON JBL. After bridging the two climate control wires with a 68 Ohm resistor, they're only using 3 wires to interface the steering wheel controls. Could be a resistor ladder with one common wire and a wire for left- & right-hand controls if you're lucky. At any rate, it looks like a good starting point.
As for programming the Arduino, it's a lot easier than a microcontroller. The Arduino programming language looks a lot like C (making it pretty similar to what I'm guessing you used for the microcontroller), but it is just a bit higher level. So no digging through datasheets to find which bits to set in which register :)
 

R-P

Standard Member
I am running an aftermarket JVC already, so the 68 ohm resistor is already in place. Next step is getting rid of OEM altogether and put in an old 7" JVC headunit.

Thanks:clap:. Will update if I get anywhere.
 

superip

Novice Member
I signed up just to reply to this thread too too! :)
As comment Nero81 almost 3 years ago, I spent too few days trying to find some info on JVC wired remote control, but this is really the only source of info in all the internet...
In my case I installed a JVC KD-r961bt on my peugeot 306 and would like to control it through a 307 remote control that I will adapt.

I just wanted to thank all of the contributors to this conversation, especially spartelfant from which I will use the hardware and the code (with some customization).

:thumbsup::thumbsup::thumbsup::thumbsup:
 

daniieeel

Novice Member
Another variant of the program.
Works with steering wheel remote control of Renault clio like this

and jvc audio KD-x125



Code:
Code:
int PINO = 8;            // Digital IO pin connected to base of transistor
int Length = 537;        // Length in Microseconds
int DebugOn = 0;

#define POWERNOFF 0x00
#define VOLUP 0x04
#define VOLDOWN 0x05
#define MUTE 0x06
#define SOURCE 0x08
#define EQUALIZER 0x0d///0x0C
#define MUTE2 0x0e//0x0D// - Mute/Unmute (and Power OFF with "press and hold" - see below)
#define SEARCHFORW 0x12// - Seach + / Track + (and Manual Tune + / Fast fwd with "press and hold")
#define SEARCHBACK 0x13// - Seach - / Track - (and Manual Tune - / Fast rwd with "press and hold")
#define BANDFORW 0x14// - Band cycle / Folder + //programs
#define BANDBACK 0x15// - Band cycle / Folder + //programs
#define PROGR 0x15// - Program 1-6 cycle / Folder -//programs
//#define UNKNOWN 0x16// - Sel cycle (it cycles between Fader/Balance/Loudness/Subwoofer out level/Volume gain for the current source)

#define GREENPIN 5
#define BLUEPIN 3
#define YELLOWPIN 6
#define BROWNPIN 7
#define REDPIN 4
#define BLACKPIN 2

#define OUT_PINS 3
unsigned char out_pins[OUT_PINS]={
  GREENPIN,BLUEPIN,YELLOWPIN};

void setup() {
  pinMode(PINO, OUTPUT);
  digitalWrite(PINO, LOW); // Make PIN low to shut off transistor
  Serial.begin(115200);
  Serial.println("Enter 1 to Go");
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
  pinMode(YELLOWPIN, OUTPUT);
  pinMode(BROWNPIN, INPUT_PULLUP);
  pinMode(REDPIN, INPUT_PULLUP);
  pinMode(BLACKPIN, INPUT_PULLUP);
}

unsigned char GetJoystic(void){
  static unsigned char stage = 0;
  static unsigned char scroll_stored;
  unsigned char tmp,i;
  if (++stage > (OUT_PINS-1)) stage=0;

  for (i=0;i<(OUT_PINS);i++)
    if (i==stage){
      digitalWrite(out_pins[i], LOW);
    }
  else{
    digitalWrite(out_pins[i], HIGH);
  }

  delay(10);

  tmp = digitalRead(BROWNPIN);
  if (!tmp){
    if (stage != scroll_stored){
      char scrl = stage-scroll_stored;
      scroll_stored = stage;
      if ((scrl == 1) ||(scrl==-2)) {
        Serial.println("Scroll-");
        return SEARCHFORW;
      }else{
        Serial.println("Scroll+");
        return SEARCHBACK;
      }
    }
  }
  tmp = digitalRead(REDPIN);
  if (!tmp){
    switch(stage){
    case 0:
      Serial.println("Select");
      return SOURCE;
    case 1:
      Serial.println("Vol+");
      return VOLUP;
    case 2:
      Serial.println("Vol-");
      return VOLDOWN;
    }
  }
  tmp = digitalRead(BLACKPIN);
  if (!tmp){
    switch(stage){
    case 0:
      Serial.println("Source-");
      return BANDFORW;
    case 1:
      Serial.println("Mute");
      return MUTE2;
    case 2:
      Serial.println("Source+");
      return BANDBACK;
    }
  }
  return 0;
}

void loop() {
  unsigned char Key = GetJoystic();
  static unsigned char code = 0;
  if (Key){
    Serial.print("Key ");
    Serial.println(Key,HEX);
    JVCSendCommand(Key);
    delay(2);
    JVCSendCommand(Key);
    delay(20);
  }

  if (Serial.available() > 0) {
    char inp=Serial.read();
    Serial.print("Received: ");
    Serial.println(inp, DEC);
    switch (inp){
      case '1':
      code--;
      break;
      case '2':
      code++;
      break;
      case '3':
      JVCSendCommand(code);
      break;
    }
 
 
  }
}  // end of loop


void JVCSendCode(unsigned char code){
  unsigned char i,tmp=1;
  for (i=0;i<sizeof(code)*8-1;i++){//7bits
    if (code & tmp)
      bONE();
    else
      bZERO();
    tmp = tmp << 1;
  }
}

void JVCSendCommand(unsigned char code){
  Preamble();
  JVCSendCode((unsigned char)code);
  Postamble();
}

//    Wire signals to be generated for a '1' bit
void bONE() {                     // Send a binary ONE over the line
  if (DebugOn == 1) {
    Serial.print(" 1 ");
  }
  digitalWrite(PINO, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PINO, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length * 3);  // for 537 * 3 = 1611us
}

//    Wire signals to be generated for a '0' bit
void bZERO() {   // Send a binary ZERO over the line
  if (DebugOn == 1) {
    Serial.print(" 0 ");
  }
  digitalWrite(PINO, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PINO, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length);      // for 537us
}

//    Wire signals to be generated for a start of signal to a JVC
void Preamble() {
  if (DebugOn == 1) {
    Serial.println(" ");
    Serial.print(" AGC ");
  }
  digitalWrite(PINO, LOW);         // Not sure what this does
  delayMicroseconds(Length * 1);

  digitalWrite(PINO, HIGH);        // AGC
  delayMicroseconds(Length * 16);

  digitalWrite(PINO, LOW);         // AGC
  delayMicroseconds(Length * 8);

  bONE();    // 1 Start Bit
  JVCSendCode(0x47);
}

//    Wire signals to be generated for a end of signal 
void Postamble() {
  if (DebugOn == 1) {
    Serial.print(" STOP ");
  }
  bONE();
  bONE();    // 2 stop bits
}
P.S. This JVC has not 3.5mm jack input - only wire with label "STEERING WHEEL REMOTE".
Hi there!

I've taken the code posted above and put in a lot of comments. Fixed a few bugs as well, most notably:
- I changed the pulse width from 537 us to 527 us. This is the same pulse width used by JVC IR remotes. The 537 us did work, but caused my radio's display to flicker.
- On startup, the previous code immediately sent the command associated with the scrollwheel changing position. This is because on startup there is no known last position for the scrollwheel, so its current position is interpreted as a change. I fixed this, so you can power up the chip together with the radio.
- Since I'm using an Arduino Nano with an on-board LED, I added some code that will output the data being sent to this LED as well for diagnostic purposes.
- Removed a seemingly unnecessary 10 ms delay from the code.
- Restructured the sending of commands: HEADER, START BIT, 3 x (ADDRESS, VALUE, 2 STOP BITS). When command are sent only once, the radio may not always pick up on them. This way the radio never misses a command, but also never unintentionally interprets a single button press as multiples of the same command.

The hardware I used:
- Arduino Nano (I used a cheap clone from China)
- DC-DC power supply for the Nano (I got this one)
- A 1k resistor
- An optocoupler (I used the 4N25)
- A fuse (I used 250mA because I had that lying around, you could use a smaller value as well)
- A prototyping PCB to connect everything up nice and tidy
- A small enclosure, some wires, heatshrink, etc.

A video of my contraption in action:

And a link to the code I wrote: [C] Renault Twingo / Clio steering wheel remote via Arduino Nano - Pastebin.com
Hello there! I have a JVC KD-R561E. This station does not bring Jack back to the controls. Just bring a power steering wheel. With the codes that you have you are how. but I need an installation diagram for how the cables. I have a Citroen Xsara. Regards, and thank you very much.
 

Liseratum

Novice Member
Another variant of the program.
Works with steering wheel remote control of Renault clio like this

and jvc audio KD-x125



Code:
Code:
int PINO = 8;            // Digital IO pin connected to base of transistor
int Length = 537;        // Length in Microseconds
int DebugOn = 0;

#define POWERNOFF 0x00
#define VOLUP 0x04
#define VOLDOWN 0x05
#define MUTE 0x06
#define SOURCE 0x08
#define EQUALIZER 0x0d///0x0C
#define MUTE2 0x0e//0x0D// - Mute/Unmute (and Power OFF with "press and hold" - see below)
#define SEARCHFORW 0x12// - Seach + / Track + (and Manual Tune + / Fast fwd with "press and hold")
#define SEARCHBACK 0x13// - Seach - / Track - (and Manual Tune - / Fast rwd with "press and hold")
#define BANDFORW 0x14// - Band cycle / Folder + //programs
#define BANDBACK 0x15// - Band cycle / Folder + //programs
#define PROGR 0x15// - Program 1-6 cycle / Folder -//programs
//#define UNKNOWN 0x16// - Sel cycle (it cycles between Fader/Balance/Loudness/Subwoofer out level/Volume gain for the current source)

#define GREENPIN 5
#define BLUEPIN 3
#define YELLOWPIN 6
#define BROWNPIN 7
#define REDPIN 4
#define BLACKPIN 2

#define OUT_PINS 3
unsigned char out_pins[OUT_PINS]={
  GREENPIN,BLUEPIN,YELLOWPIN};

void setup() {
  pinMode(PINO, OUTPUT);
  digitalWrite(PINO, LOW); // Make PIN low to shut off transistor
  Serial.begin(115200);
  Serial.println("Enter 1 to Go");
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
  pinMode(YELLOWPIN, OUTPUT);
  pinMode(BROWNPIN, INPUT_PULLUP);
  pinMode(REDPIN, INPUT_PULLUP);
  pinMode(BLACKPIN, INPUT_PULLUP);
}

unsigned char GetJoystic(void){
  static unsigned char stage = 0;
  static unsigned char scroll_stored;
  unsigned char tmp,i;
  if (++stage > (OUT_PINS-1)) stage=0;

  for (i=0;i<(OUT_PINS);i++)
    if (i==stage){
      digitalWrite(out_pins[i], LOW);
    }
  else{
    digitalWrite(out_pins[i], HIGH);
  }

  delay(10);

  tmp = digitalRead(BROWNPIN);
  if (!tmp){
    if (stage != scroll_stored){
      char scrl = stage-scroll_stored;
      scroll_stored = stage;
      if ((scrl == 1) ||(scrl==-2)) {
        Serial.println("Scroll-");
        return SEARCHFORW;
      }else{
        Serial.println("Scroll+");
        return SEARCHBACK;
      }
    }
  }
  tmp = digitalRead(REDPIN);
  if (!tmp){
    switch(stage){
    case 0:
      Serial.println("Select");
      return SOURCE;
    case 1:
      Serial.println("Vol+");
      return VOLUP;
    case 2:
      Serial.println("Vol-");
      return VOLDOWN;
    }
  }
  tmp = digitalRead(BLACKPIN);
  if (!tmp){
    switch(stage){
    case 0:
      Serial.println("Source-");
      return BANDFORW;
    case 1:
      Serial.println("Mute");
      return MUTE2;
    case 2:
      Serial.println("Source+");
      return BANDBACK;
    }
  }
  return 0;
}

void loop() {
  unsigned char Key = GetJoystic();
  static unsigned char code = 0;
  if (Key){
    Serial.print("Key ");
    Serial.println(Key,HEX);
    JVCSendCommand(Key);
    delay(2);
    JVCSendCommand(Key);
    delay(20);
  }

  if (Serial.available() > 0) {
    char inp=Serial.read();
    Serial.print("Received: ");
    Serial.println(inp, DEC);
    switch (inp){
      case '1':
      code--;
      break;
      case '2':
      code++;
      break;
      case '3':
      JVCSendCommand(code);
      break;
    }


  }
}  // end of loop


void JVCSendCode(unsigned char code){
  unsigned char i,tmp=1;
  for (i=0;i<sizeof(code)*8-1;i++){//7bits
    if (code & tmp)
      bONE();
    else
      bZERO();
    tmp = tmp << 1;
  }
}

void JVCSendCommand(unsigned char code){
  Preamble();
  JVCSendCode((unsigned char)code);
  Postamble();
}

//    Wire signals to be generated for a '1' bit
void bONE() {                     // Send a binary ONE over the line
  if (DebugOn == 1) {
    Serial.print(" 1 ");
  }
  digitalWrite(PINO, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PINO, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length * 3);  // for 537 * 3 = 1611us
}

//    Wire signals to be generated for a '0' bit
void bZERO() {   // Send a binary ZERO over the line
  if (DebugOn == 1) {
    Serial.print(" 0 ");
  }
  digitalWrite(PINO, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PINO, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length);      // for 537us
}

//    Wire signals to be generated for a start of signal to a JVC
void Preamble() {
  if (DebugOn == 1) {
    Serial.println(" ");
    Serial.print(" AGC ");
  }
  digitalWrite(PINO, LOW);         // Not sure what this does
  delayMicroseconds(Length * 1);

  digitalWrite(PINO, HIGH);        // AGC
  delayMicroseconds(Length * 16);

  digitalWrite(PINO, LOW);         // AGC
  delayMicroseconds(Length * 8);

  bONE();    // 1 Start Bit
  JVCSendCode(0x47);
}

//    Wire signals to be generated for a end of signal
void Postamble() {
  if (DebugOn == 1) {
    Serial.print(" STOP ");
  }
  bONE();
  bONE();    // 2 stop bits
}
P.S. This JVC has not 3.5mm jack input - only wire with label "STEERING WHEEL REMOTE".
Hi! I have JVC KD-X310BT. I use your code,but no result. Sketch with irda works well. I use transistor PN2222A in contrast of optocoupler. what could be the problem? Can you help me?
 
Last edited by a moderator:

Similar threads

The latest video from AVForums

Podcast: Panasonic HX800 TV + Sony HT-G700 Soundbar reviews, movie and TV show news and reviews

Trending threads

Latest News

MBL brings high end Hi-Fi systems and speakers to UK
  • By Andy Bassett
  • Published
Roku announces Streambar and adds Airplay to streaming devices
  • By Andy Bassett
  • Published
Amazon Prime Day confirmed as 13-14th October
  • By Andy Bassett
  • Published
Linn upgrades Majik LP12 turntable with new tonearm
  • By Andy Bassett
  • Published
VPI announces new Prime 21 turntables
  • By Andy Bassett
  • Published
Top Bottom