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

Александр_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
}

 

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

Уважаемые модераторы! Можно попросить Вас удалить мои темы в связи с неправильным их размещением? Ранее на форумах необщался, поэтому прошу прощения за свои косяки и впредь обещаю размещать всё как положено!

bwn
Offline
Зарегистрирован: 25.08.2014

Ниче здесь не удаляется, а код лучше сворачивать, ведь долго листать. Не помогают, А-никто не заинтересовался, В-нет идей, т.к. никто не заинтересовался.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Удалять не будем. Можем отредактировать.

gleco1
Offline
Зарегистрирован: 22.12.2015

bwn пишет:

Ниче здесь не удаляется, а код лучше сворачивать, ведь долго листать. Не помогают, А-никто не заинтересовался, В-нет идей, т.к. никто не заинтересовался.

Да,нет! Очень даже интересно! И развёрнутый код легче читается. Парень проделал большую работу, просто подсказать некому.

gleco1
Offline
Зарегистрирован: 22.12.2015

Александр_196 пишет:

Здравствуйте товарищи! Совсем недавно начал изучать arduino. Появилась потребность сделать при помощи платы arduino nano v3.0 адаптер подрулевого джойстика для нештатной магнитолы...

Сашенька, скажи, ты брал где-то готовые блоки скетчей? Подскажи, пожалуйста.

bwn
Offline
Зарегистрирован: 25.08.2014

gleco1 пишет:

bwn пишет:

Ниче здесь не удаляется, а код лучше сворачивать, ведь долго листать. Не помогают, А-никто не заинтересовался, В-нет идей, т.к. никто не заинтересовался.

Да,нет! Очень даже интересно! И развёрнутый код легче читается. Парень проделал большую работу, просто подсказать некому.

Обычно сперва читают описание проблемы, а затем уже код. Если код длинный, то до описания могут и не дойти, а значит шансы на помощь снижаются.