08.07.2020, 23:42 | #1 |
Пользователь
Регистрация: 07.12.2018
Город: Люберцы
Регион: 50, 90, 150
Машина: пятерочка
Сообщений: 36
|
KENWOOD kdc-4554u управление по протоколу NEC
Добрый день, уже неделю бьюсь что бы заставить магнитолу понимать команды с джойстика. В мониторе все клавиши работают, сигнал поступает на 14 пин . уже пробовал разное написание команд для магнитолы :
1. 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 2. #define SRC 0x9D62C837 #define NEXT_TRACK 0x9D62D02F #define PREV_TRACK 0x9D6250AF #define VOL_UP 0x9D6228D7 #define VOL_DOWN 0x9D62A857 #define PLUS 0x9D62B04F #define MINUS 0x9D6230CF #define ATT 0x9D626897 #define PLAY 0x9D62708F #define PHONE_UP 0x9D6249B6 // Только поднять 3. Function Code Function Code Function Code 0 0xb900 Tuner 0xb91c Volume+ 0xb914 1 0xb901 Tape 0xb91d Volume- 0xb915 2 0xb902 CD 0xb91e Source 0xb913 3 0xb903 CD-MD-CH 0xb91f Mute 0xb916 4 0xb904 Track- 0xb90a 5 0xb905 Track+ 0xb90b 6 0xb906 Rew 0xb90c 7 0xb907 Ff 0xb90d 8 0xb908 DNPP 0xb95e 9 0xb909 Play/Pause 0xb90e а магнитола не реагирует. Пожалуйста, подскажите, может в коде ошибка? //////////////////////////////////////////////////////////////// // 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"); } } |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|