Управление магнитолой Kenwood по протоколу NEC

Опубліковано: 21 квітня 2020р. 19:01
Я їжджу на Subaru Outback (BP), Mazda 626 III
Харків, Україна

Всем привет, после моего бж мультируль мазда 6 многие попросили выложить скетч Ардуино с программой управления магнитолой Kenwood с помощью руля по протоколу NEC и по одному проводу "Steering Wheel Remote". Сразу скажу, я вовсе не программист и как это сделал до сих пор так и не понял, но все работает. Также хочу сказать дабы не было обид или негативов, ответственность я ни за что не несу, так что изучайте внимательнее и делайте то что считаете нужным. На блюдечке подать не смогу, так что как там правильно и как мне сделать так или вот так, я сам понятия не имею, управление может и одинаково, а вот рули у всех разные. Все подойдет идеально если у Вас Kenwood KMM-BT304 и руль Мазда 6, а также Ардуино Нано. Но сейчас не об этом. Как же все-таки его подключить.
Для этого понадобится:
— Ардуино нано/уно (другие не пробовал)
— Преобразователь 12в\5в для питания ардуины
— Транзистор 2N2222 (использовал PN2222A)
— Резисторы 47 Ом, 100 Ом (возможно другие)
— Руль с резистивным управлением и постоянным сопротивлением при ненажатых кнопках.

Для начала нужно узнать какое общее сопротивление на выходе руля. Для этого находим провода выходящие от кнопок или один провод если масса берется в другом месте. Да кстати проверял, с руля можно и один провод взять если второй заземлить (управление массой), но вопрос в надежности. У меня общее сопротивление с кнопок на левой стороне было 5.1кОм, при нажатии на кнопку + значение падало до 150 Ом, а при нажатии на кнопку — становилось 300 Ом. Замеряем кнопки и записываем.

Если все так, то продолжаем дальше, в среде ардуино нужно будет подключить руль и вывести на экран значения выдаваемые от кнопок, для этого в скетче есть слеши которые для настройки нужно будет убрать их там 6шт, после чего вернуть. Вывести экран и нажимая кнопки записать значения выводимые на монитор. К примеру: получилось при нажатии на кнопку + 568+-2, эти цифры и будут отвечать за функцию, находим строчку где KVUP(K-кнопка, V-громкость, UP-вверх) и ставим вместо 610 свои 568 с этим думаю разобрались. С резисторами от ардуино не знаю, у меня получилось на этих, но скорее всего нужно будет подбирать.

Упрощенный скетч:
------------------------------------------------------------------------------------------------------
#define VOLUP 0x14 // Громкость +
#define VOLDOWN 0x15 // Громкость —
#define ATT 0x16 // Mute
#define AUDIO 0x17 // Управление
#define TRACKFORW 0x0B // Следующий трек
#define TRACKBACK 0x0A // Предыдущий трек
#define FOLDERFORW 0x0D // Следующая папка
#define FOLDERBACK 0x0C // Предыдущая папка
#define PAUSE 0x0E // Пауза

#define PULSEWIDTH 560
#define OUTPUTPIN 5 // D5 на транзистор 2N2222
#define REMA A0 // A0 аналоговый вход
#define ADDRESS 0xB9
#define HOLDTIME 250 // время, после которого кнопка считается зажатой
#define ALLDOWN 1010
#define DELTA 30 // погрешность измерения аналогового входа
// если показания подскочат больше чем на 10 АД, увеличить значение

#define KVUP 640 // Vol +
#define KVDW 440 // Vol —
#define KNEX 750 // Up
#define KBAC 870 // Preset
#define KMOD 150 // Mod
#define KSOR 970 // Mute

boolean flag;
float analogA = 0;
unsigned long time;

void setup() {
// Serial.begin(9600); //монитор для настройки (убрать косые (6 строк), вернуть обратно после настройки)
pinMode(OUTPUTPIN, OUTPUT);
digitalWrite(OUTPUTPIN, LOW);
}

void loop() {

unsigned char Key = GetInput();

if (Key) {
SendCommand(Key);
// } //(для настройки)
// delay(50); //(для настройки)
// if (analogA < 1010) { //(для настройки)
// Serial.print("KEY_A "); //(для настройки)
// Serial.println(analogA); //(для настройки)
}
}

unsigned char GetInput(void) {
analogA = analogRead(REMA);
if ((abs(ALLDOWN — analogA) < DELTA))
{
time = 0;
flag = false;
}
if (abs(ALLDOWN — analogA) > DELTA && time == 0)
{
time = millis();
do {
delay(30);
} while (abs(ALLDOWN — analogRead(REMA)) > DELTA && millis() — time <= HOLDTIME);

if (millis() < time + HOLDTIME && flag == false)
{

if (abs(analogA — KVUP) < DELTA) // кнопка на руле VOL +
{
return VOLUP;
}

if (abs(analogA — KVDW) < DELTA) // кнопка на руле VOL-
{
return VOLDOWN;
}

if (abs(analogA — KNEX) < DELTA) // кнопка на руле UP
{
return TRACKFORW;
}

if (abs(analogA — KBAC) < DELTA) // кнопка на руле PRESET
{
return TRACKBACK;
}

if (abs(analogA — KMOD) < DELTA) // кнопка на руле MODE
{
return AUDIO;
}

if (abs(analogA — KSOR) < DELTA) // кнопка MUTE
{
return PAUSE;
}
}
//----------------------Удержание кнопки----------------------------
else if (millis() >= time + HOLDTIME)
{

if (abs(analogA — KVUP) < DELTA)
{
time = 0;
return VOLUP;
}

if (abs(analogA — KVDW) < DELTA)
{
time = 0;
return VOLDOWN;
}

if (abs(analogA — KNEX) < DELTA)
{
flag = true;
return FOLDERFORW;
}

if (abs(analogA — KBAC) < DELTA)
{
flag = true;
return FOLDERBACK;
}

if (abs(analogA — KSOR) < DELTA)
{
return ATT;
}

}
}
return 0;
}

void SendValue(unsigned char value) {
unsigned char i, tmp = 1;
for (i = 0; i < sizeof(value) * 8; i++) {
if (value & tmp)
SendOne();
else
SendZero();
tmp = tmp << 1;
}
tmp = 1;
for (i = 0; i < sizeof(value) * 8; i++) {
if (value & tmp)
SendZero();
else
SendOne();
tmp = tmp << 1;
}
}

void SendCommand(unsigned char value) {
unsigned char i;
Preamble();
SendValue(ADDRESS);
SendValue((unsigned char)value);
Postamble();
}

void SendZero() {
digitalWrite(OUTPUTPIN, HIGH);
delayMicroseconds(PULSEWIDTH);
digitalWrite(OUTPUTPIN, LOW);
delayMicroseconds(PULSEWIDTH);
}

void SendOne() {
digitalWrite(OUTPUTPIN, HIGH);
delayMicroseconds(PULSEWIDTH);
digitalWrite(OUTPUTPIN, LOW);
delayMicroseconds(PULSEWIDTH * 3);
}

void Preamble() {
digitalWrite(OUTPUTPIN, LOW);
delayMicroseconds(PULSEWIDTH * 1);
digitalWrite(OUTPUTPIN, HIGH);
delayMicroseconds(PULSEWIDTH * 16);
digitalWrite(OUTPUTPIN, LOW);
delayMicroseconds(PULSEWIDTH * 8);
}

void Postamble() {
SendOne();
}
-----------------------------------------------------------------------------------

Не забудьте написать спасибо за мои старания, всем управляемого магнитофона.

0 0

Коментарі

Щоб залишати коментарі, потрібно авторизуватись.