Очень нужна ваша помощь с программированием!!!

Александр_196
Offline
Зарегистрирован: 21.12.2015

Здравствуйте товарищи! Совсем недавно начал изучать arduino. Появилась потребность сделать при помощи платы arduino nano v3.0 адаптер подрулевого джойстика для нештатной магнитолы.  Вся клавиатура джойстика представлена матрицей 3x3 — т.е. всего 9 ключей. Но 3 из них отвечают за работу колеса (энкодера). Оставшиеся 6 ключей отвечают за кнопки. На просторах интернета удалось найти скетч этого джойстика а также протокол управления моей магнитолой JVC. У меня возникли сложности с соединением этих двух скетчей. Знающие люди пожалуйста помогите разобраться. Заранее спасибо! Вот скетчи:

 

/////////////////////////////////////////////////////////////////
// alpine
#define alpinePin 12

#define cmdPower      0x09
#define cmdSource     0x0A
#define cmdBand       0x0D
#define cmdVolumeDown 0x15
#define cmdVolumeUp   0x14
#define cmdUp         0x0E
#define cmdDown       0x0F
#define cmdLeft       0x13
#define cmdRight      0x12
#define cmdPlay       0x07
#define cmdAProc      0x06
#define cmdMute       0x16
#define cmdAngleUp    0x4C
#define cmdAngleDown  0x4B
#define cmdCDChange   0x03
/////////////////////////////////////////////////////////////////
// джойстик
#define rows 3
#define cols 2
// номера кнопок в соответствии со схемой
const byte keys[rows][cols] =
{
  {1,4},
  {2,5},
  {6,3}
};

// состояния направлений енкодера
const byte encoderdirection[3][3] = // 0 - на месте, 1 - вниз, 2 - вверх
{
  {0, 1, 2},  // 0
  {2, 0, 1},  // 1
  {1, 2, 0}   // 2    
};

// 10 9 8 7 6 5

// строки
// красный ч красный
// коричневый ч желтый 6
// черный ч черный
// столбцы
// зеленый б красный
// голубой б черный
// желтый б желтый

// номера пинов
const byte rowPins[rows] = {10, 9, 8}; // строки (желтый, зеленый, голубой)
const byte colPins[cols] = {7, 5}; // столбцы (черный, красный)
#define encoderPin 6 // пин енкодера (коричневый)
byte encodervalue;

// маски для клавиш
#define MaskMediaButton      1
#define MaskRadioButton      2
#define MaskVolumeUpButton   4
#define MaskVolumeDownButton 8
#define MaskOkButton         16
#define MaskMuteButton       32
#define MaskScrollDown       64
#define MaskScrollUp         128

unsigned long starttime;
bool workkbd;
/////////////////////////////////////////////////////////////////

void setup()

  int i;
  // строки - на выход
  for (i = 0; i < rows; ++i)
  {
    pinMode(rowPins[i], OUTPUT);
  }
 
  // столбцы - на вход
  for (i = 0; i < cols; ++i)
  {
    pinMode(colPins[i], INPUT);
    digitalWrite(colPins[i], HIGH); // включаем подтягивающий резистор 
  }

  // столбец для енкодера
  pinMode(encoderPin, INPUT);
  digitalWrite(encoderPin, HIGH); // включаем подтягивающий резистор 
  
  encodervalue = 0;
 
  // управление Alpine
  pinMode(alpinePin, OUTPUT);
 
  starttime = millis();
  workkbd = false;
}

// сканирование джойстика
byte scan(void)
{
  int i, j;
  byte code = 0;
         
  for (i = 0; i < rows; ++i)
  {
    digitalWrite(rowPins[i], LOW);

    // кнопки
    for (j = 0; j < cols; ++j)
    {
      if(digitalRead(colPins[j]) == false)
      {
        code |= 1 << (keys[i][j] - 1);
      }        
    }
      
    // енкодер
    if (digitalRead(encoderPin) == false)
    {
      int oldencodervalue = encodervalue;
      encodervalue = i;
                       
      switch (encoderdirection[oldencodervalue][encodervalue])
      {
        case 1:  // вниз
          code |= 64;
          break;
        case 2:  // вверх
          code |= 128;
          break;
      }
    }
       
    digitalWrite(rowPins[i], HIGH);   
  }
 
  return code;
}

// отправка байта
void SendByte(byte data)
{
  for (int i = 0; i < 8; ++i)
  {
    digitalWrite(alpinePin, HIGH);
    delayMicroseconds(560);  
    digitalWrite(alpinePin, LOW);

    if (data & 1)
    { // 1
      delayMicroseconds(1680);
    }
    else
    { // 0
      delayMicroseconds(560);
    }
   
    data >>= 1;     
  }
}

// отправка команды
void Send(byte command)
{
  digitalWrite(alpinePin, HIGH);
  delayMicroseconds(9000);
  digitalWrite(alpinePin, LOW);
  delayMicroseconds(4500);

  SendByte(0x86);
  SendByte(0x72);
  SendByte(command);
  SendByte(~command); 

  digitalWrite(alpinePin, HIGH);
  delayMicroseconds(560);
  digitalWrite(alpinePin, LOW);
}

// цикл программы
void loop(void)
{
  byte code;
   
  code = scan();
 
  if (workkbd == false)
  {
    if (millis() - starttime > 3000)
      workkbd = true;
   
    return;
  }

  if (code & MaskMediaButton)
    Send(cmdDown);

  if (code & MaskRadioButton)
    Send(cmdUp);

  if (code & MaskVolumeUpButton)
    Send(cmdRight);

  if (code & MaskVolumeDownButton)
    Send(cmdLeft);

  if (code & MaskOkButton)
    Send(cmdPlay);

  if (code & MaskMuteButton) 
    Send(cmdMute);

  if (code & MaskScrollDown)
    Send(cmdVolumeDown);

  if (code & MaskScrollUp)
    Send(cmdVolumeUp);
}

Протокол управления магнитолой

/*

  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 (deguerra98@yahoo.com)

  */

 

  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

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015