Всем привет, после моего бж мультируль мазда 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();
}
-----------------------------------------------------------------------------------
Не забудьте написать спасибо за мои старания, всем управляемого магнитофона.