Добрый день, уже неделю бьюсь что бы заставить магнитолу понимать команды с джойстика. В мониторе все клавиши работают, сигнал поступает на 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");
}
}
Полезные темы:
Социальные закладки