адаптер кнопок в автомобиль

rtyz
Offline
Зарегистрирован: 30.10.2019

Добрый день , пожалуйста подскажите по коду . 

нашел код для матричного джойстика рено и магнитолы алпайна . Адаптер был собран на ардуино нано.

Залил код в про микро и подключил джойстик согласно схеме _не работает ... дописываю команду для монитора порта, что бы проводком  замыкать  и проверить алгоритм работы, но при запуске монитора загорается диод около 14 контакта и в мониторе порта без остановки отображается названия кнопок. 

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

Схема джойстика https://a.d-cd.net/f4f8accs-960.jpg

/////////////////////////////////////////////////////////////////
// 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() 
{  
   Serial.begin(115200);
  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);
    Serial.print("niz");

  if (code & MaskRadioButton)
    Send(cmdUp);
    Serial.print("verx");

  if (code & MaskVolumeUpButton)
    Send(cmdRight);
    Serial.print("pravo");

  if (code & MaskVolumeDownButton)
    Send(cmdLeft);
    Serial.print("levo");

  if (code & MaskOkButton)
    Send(cmdPlay);
Serial.print("play");
  if (code & MaskMuteButton)  
    Send(cmdMute);
    Serial.print("mute");

  if (code & MaskScrollDown)
    Send(cmdVolumeDown);
    Serial.print("volniz");

  if (code & MaskScrollUp)
    Send(cmdVolumeUp);
    Serial.print("volup");
}


 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а автор кода и схемы чо говорит?

rtyz
Offline
Зарегистрирован: 30.10.2019

DetSimen пишет:

а автор кода и схемы чо говорит?

у него он работает , он его и выложил https://www.drive2.ru/l/4434802/

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

начт, ищи ошибки в своей схеме. 

rtyz
Offline
Зарегистрирован: 30.10.2019

DetSimen пишет:

начт, ищи ошибки в своей схеме. 

код полностью скопирован, добавлена только команда для монитора и изменен пин вывода на магнитолу. джойстик не подключен, а монитор показывает циклическое "нажатие " всех кнопок

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

предъяви автору, чо за х-ня. Нам это зачем?

b707
Offline
Зарегистрирован: 26.05.2017

rtyz - в коде явных проблем не вижу. Похоже на то, что у вас с автором кода разные джойстики - у него нормально замкнутый, а у вас - разомкнутый. Попробуйте поменять полярность кнопок в коде

-NMi-
Offline
Зарегистрирован: 20.08.2018

DetSimen пишет:

предъяви автору, чо за х-ня.

и на бапки его, на щотчег!!! стрясёшь на нульцевую тачилу!!! с джойстиком!!!

rtyz
Offline
Зарегистрирован: 30.10.2019

b707 пишет:

rtyz - в коде явных проблем не вижу. Похоже на то, что у вас с автором кода разные джойстики - у него нормально замкнутый, а у вас - разомкнутый. Попробуйте поменять полярность кнопок в коде

они оба матричные отличаются  только количеством кнопок . Можете более подробно про полярность подсказать ? по кодам управления nec  алпай и кенвуд  совпадают и решил подключить с новым кодом , реакции магнитолы 0 (

/////////////////////////////////////////////////////////////////
// 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() 
{  
   Serial.begin(115200);
  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);
    Serial.print("niz");

  if (code & MaskRadioButton)
    Send(cmdUp);
    Serial.print("verx");

  if (code & MaskVolumeUpButton)
    Send(cmdRight);
    Serial.print("pravo");

  if (code & MaskVolumeDownButton)
    Send(cmdLeft);
    Serial.print("levo");

  if (code & MaskOkButton)
    Send(cmdPlay);
Serial.print("play");
  if (code & MaskMuteButton)  
    Send(cmdMute);
    Serial.print("mute");

  if (code & MaskScrollDown)
    Send(cmdVolumeDown);
    Serial.print("volniz");

  if (code & MaskScrollUp)
    Send(cmdVolumeUp);
    Serial.print("volup");
}

 

rtyz
Offline
Зарегистрирован: 30.10.2019

DetSimen пишет:

предъяви автору, чо за х-ня. Нам это зачем?

У вас раздвоение личности? пишите нам ..

Уважаемый ,для этого и задан вопрос в этом разделе. Форум и создан , что бы найти ответ на вопрос. Я не смог понять почему так работает  - задал вопрос.

Если Вам нечего посоветовать или вы в этом деле умный, то не стоит заходить в песочницу и писать ерунду не по теме.

Код мне нужен, может кому-то еще пригодится. Вам не нужен и я рад за вас.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

rtyz пишет:

 

Если Вам нечего посоветовать или вы в этом деле умный, то не стоит заходить в песочницу и писать ерунду не по теме.

Не, я в этом деле тупое, как пропка, жывотнае. :)

-NMi-
Offline
Зарегистрирован: 20.08.2018

Дет, ща тэндэция такайа, адын дурак запостил это гавно ради хайпа, другой дурак собрал это гавно из-за тупости и уже задайот вапросы уже на другом форуме. Счас этт норм. Пара уже привыкнуть к такой херне.

У меня на работе так было - мужики разберут-соберут->не работает... и так раза по три-четыре... потом начальник бежит, мол иди, думай, что там не так. Так-шо я привыкший к такай херне...              ))))))))))))))))))))))))))))

rtyz
Offline
Зарегистрирован: 30.10.2019

-NMi- пишет:

Дет, ща тэндэция такайа, адын дурак запостил это гавно ради хайпа, другой дурак собрал это гавно из-за тупости и уже задайот вапросы уже на другом форуме. Счас этт норм. Пара уже привыкнуть к такой херне.

У меня на работе так было - мужики разберут-соберут->не работает... и так раза по три-четыре... потом начальник бежит, мол иди, думай, что там не так. Так-шо я привыкший к такай херне...              ))))))))))))))))))))))))))))


Ещё один баран на этом форуме. Откуда вас за день столько? Этот код работает у 3 на драйве. На ютюбе есть видео.
Я рад что вы не дурак, а очень умный Homo sapiens
Если нечего по теме сказать, проходим мимо ... А умничать знаете где можно
Я рад, что вы не дурак, а очень умный Homo sapiens

svm
Offline
Зарегистрирован: 06.11.2016

Поставьте в 139 строке вывод code в монитор, и посмотрите что там творится.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Я вот раза 3 уже писал на заказ, код сопряжения джойстика с магнитолой.
Почему то в мыслях даже не было в открытый доступ выкладывать, что у меня, что у заказчиков.
Что я делаю не так ?

Автору кода, за один обработчик энкодера памятник нужно ставить, посмертно...

rtyz
Offline
Зарегистрирован: 30.10.2019

svm пишет:

Поставьте в 139 строке вывод code в монитор, и посмотрите что там творится.


Спасибо вечером попробую

Green
Offline
Зарегистрирован: 01.10.2015

В цепочки ифов со 198 строки вставьте фигурные скобки.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

rtyz пишет:
  Этот код работает у 3 баранов на драйве.

Так чего бы не спросить у тамошних баранов, раз они баранистее местных?

-NMi-
Offline
Зарегистрирован: 20.08.2018

rtyz пишет:

Ещё один баран на этом форуме. Откуда вас за день столько?

Откуда? Дык мы другие "бараны", мы "сверху" смотрим на других баранов. Просто мы поднимаемся выше в горы, там воздух свежее и травка зеленее, да и меньше народу-больше кислороду!!!

Аткуда нас столько? Да ладно, нас очень мало, ежли взять "разрез" даже по этому форуму --- корректно отвечающих гораздо меньше чем корректно задающих вопросы, тем паче, шо есть ещё и некорректно заданные вопросы, их так-же не мало. И если поделить все корректные на отвечающих = цифра будет катастрофически мала!

Так-шо небзди!

-NMi-
Offline
Зарегистрирован: 20.08.2018

DIYMan пишет:

Так чего бы не спросить у тамошних баранов, раз они баранистее местных?

Там тактика другая, смотришь отзывы на драйве и то-же самое видео на ютубе -------- бараны разные!!!

Там чото-типа "кукушка хвалит петуха за то, что хвалит он кукушку"

Ээтт счас норм, пиривыкайтЭ.

Green
Offline
Зарегистрирован: 01.10.2015

rtyz, всё получилось?

rtyz
Offline
Зарегистрирован: 30.10.2019

Green пишет:

rtyz, всё получилось?

да, в мониторе все работает. 

// alpine
#define alpinePin 14

#define cmdPower 0x09
#define cmdSource 0x13
#define cmdBand 0x0D
#define cmdVolumeDown 0x15
#define cmdVolumeUp 0x14
#define cmdUp 0x0D
#define cmdDown 0x0C
#define cmdLeft 0x0A
#define cmdRight 0x0B
#define cmdPlay 0x0E
#define cmdAProc 0x06
#define cmdMute 0x16
#define cmdAngleUp 0x81
#define cmdAngleDown 0x80
#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()
{
Serial.begin(115200);
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(0xB9);
SendByte(0x46);
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);
Serial.print("niz");
}

if (code & MaskRadioButton)
{
Send(cmdUp);
Serial.print("verx");
}
if (code & MaskVolumeUpButton)
{
Send(cmdRight);
Serial.print("pravo");
}
if (code & MaskVolumeDownButton)
{
Send(cmdLeft);
Serial.print("levo");
}
if (code & MaskOkButton)
{
Send(cmdPlay);
Serial.print("play");
}
if (code & MaskMuteButton)
{
Send(cmdMute);
Serial.print("mute");
}
if (code & MaskScrollDown)
{
Send(cmdVolumeDown);
Serial.print("volniz");
}
if (code & MaskScrollUp)
{
Send(cmdVolumeUp);
Serial.print("volup");
}
}

только осталось понять почему магнитола не реагирует . Коды верные

Protocol NEC (Kenwood modification)

Address 0x46B9

SRC 0x13 (без повторов)

ATT 0x16 (без повторов)

VolumeUp 0x14

VolumeDn 0x15

AUD 0x17

Play/Pause 0x0E (без повторов)

Up 0x0D

Down 0x0C

Left 0x0A

Right 0x0B

Phone 0x92

2-ZONE 0x82

DIRECT/OK 0x0F (без повторов)

1 0x01 (без повторов)

2 0x02 (без повторов)

3 0x03 (без повторов)

4 0x04 (без повторов)

5 0x05 (без повторов)

6 0x06 (без повторов)

7 0x07 (без повторов)

8 0x08 (без повторов)

9 0x09 (без повторов)

0 0x00 (без повторов)

R.VOL Dn 0x81

R.VOL Up 0x80