Сопряжения резистивных кнопок руля управления головным устройством в авто.

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

Нужна помощь с реализацией задумки.

Пытаюсь вкорячить в свой субарик Головное устройство от более новой модели авто, есть проблема с резистивными кнопками на руле.

Можно ли на Арудино сделать так?
Есть родных 6 кнопок на руле, у каждой свое сопротивление, ГУ (головное устройство) необходимо 2 блока кнопок, 4 кнопки и 4 кнопки, они подключаются к 2 разным входам на ГУ. Я хотел бы обойтись штатными, т.е при нажатии 2 кнопок одновременно - эмулируется на вход ГУ нажатие нужно кнопки на нужный вход. Для нового ГУ необходим доп. провод в "улитке" руля, сейчас управление руля реализовано на 2 проводах.
 
Вот номиналы:
 
008-up Impreza, 2009-up Forester (all without phone/BT buttons):
 
Mute 22 Ohms
Volume Up 90 Ohms
Volume Down 200 Ohms
Mode 360 Ohms
Channel Up 690 Ohms
Channel Down 1500 Ohms
No buttons 4700 Ohms
 
2011-up Impreza, Forester, and Crosstrek (all with phone/BT buttons):
 
Pin 4:
Seek Up 0 Ohms
Seek Down 330 Ohms
Volume Up 1000 Ohms
Volume Down 3110 Ohms
No buttons 100K Ohms
 
Pin 13:
Mode 0 Ohms
On hook 330 Ohms
Off hook 1000 Ohms
Talk 3110 Ohms
No buttons 100K Ohms
 
 
На Pin 13 ГУ
При одновременном нажатии Volume Up и Mute (в сумме 112ом) эмулируется нажатие On hook 330ohms
При одновременном нажатии Volume Down и Mode (в сумме 560ом) эмулируется нажатие Off hook 1000ohms
При нажатии Mode (360 Ohms) эмулируется нажатие Mode 0 Ohms 
При нажатии Mute 22ohms эмулируется нажатие Talk 3110 Ohms (т к в новом ГУ эта кнопка не задействована, ф-ция Mute активируется длительным нажатием Mode)
 
Возможно ли такое, может кто-то делал уже похожий проект?
Т.е на аналоговый вход (АЦП) получаем определенное сопротивление, сверяем, создаем на других двух выходах ЦAП нужное сопротивление (как я подозреваю, такое невозможно) но может сделать просто управление на выходе подобранными резисторами?
В идаале иметь обучаемое устройство, с заложенной погрешностью резисторов, т.к на холодной машине номиналы резисторов "уплывают". Думаю такое устройство было полезно многим.
Заранее благодарен за помощь.
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

на выходе цап сделать сопротивление?

есть более реальный вариант: цифровой потенциометр

https://www.google.ru/search?q=%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B...

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

jeka_tm пишет:

на выходе цап сделать сопротивление?

есть более реальный вариант: цифровой потенциометр

https://www.google.ru/search?q=%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B...

Спасибо, добрый человек, я и не слышал никогда про цифровой потенциометр, в голове у себя представлял как "ЦАП с изменяемым сопротивлением" :)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Проще кучу резисторов на кучу выходов поставить чем  с ЦАПом ..... 

#define KnopkaUP   6

#define UP_on  digitalWtite ( KnopkaUP , LOW);

#define UP_off  digitalWtite ( KnopkaUP , HIGH);

 

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

trembo пишет:

Проще кучу резисторов на кучу выходов поставить чем  с ЦАПом ..... 

#define KnopkaUP   6

#define UP_on  digitalWtite ( KnopkaUP , LOW);

#define UP_off  digitalWtite ( KnopkaUP , HIGH);

 

Сейчас прозвонил выводы ГУ, кнопка замыкается через резистор именно на землю, так, что через резисторы вполне реально. Буду думать как реализовать такой код, я в этом очень плохо волоку. Лудить - паять без проблем.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а может действитель цап. все равно основной блок измеряет же напряжение. подается напряжение. на делитель получившийся и так далее

можно просто измерить это напряжение и выдавать его

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

ГУ принимает значения сопротивлений в широком диапазоне, например, на холоде с утра, после заводки авто, залипает кнопка громкость вниз. Это и понятно, ибо на новом ГУ "Громокость" вниз это 3310 Ом, а на кнопках руля, сейчас No button 4700 Ом, и на холоде уходит номинал резистора, при этом ГУ считает нажатой кнопку. Т.е разница в целых 1390 Ом на холоде. 

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

jeka_tm пишет:

а может действитель цап. все равно основной блок измеряет же напряжение. подается напряжение. на делитель получившийся и так далее

можно просто измерить это напряжение и выдавать его

Это мысль! Сейчас попробую измерить напряжение на управляющих выводах ГУ. Есть ли там вообще какой либо потенциал.

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

Выдавать напряжение - не уверен, 3,3В на выводах ГУ.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

trembo пишет:

Проще кучу резисторов на кучу выходов поставить чем  с ЦАПом ..... 

#define KnopkaUP   6

#define UP_on  digitalWtite ( KnopkaUP , LOW);

#define UP_off  digitalWtite ( KnopkaUP , HIGH);

 

Очень неудачное решение просто никакая точность при морозах. Зимой не работает -проверено. Цифровой потенциометр отличный вариант - проверено, точности для этого применения - выше крыши. Есть двухканальные - Ваш вариант. Что касается шести кнопок, то на них можно выполнить 18 действий :  короткое нажатие, длинное нажатие, двойное нажатие. 

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

brokly пишет:

trembo пишет:

Проще кучу резисторов на кучу выходов поставить чем  с ЦАПом ..... 

#define KnopkaUP   6

#define UP_on  digitalWtite ( KnopkaUP , LOW);

#define UP_off  digitalWtite ( KnopkaUP , HIGH);

 

Очень неудачное решение просто никакая точность при морозах. Зимой не работает -проверено. Цифровой потенциометр отличный вариант - проверено, точности для этого применения - выше крыши. Есть двухканальные - Ваш вариант. Что касается шести кнопок, то на них можно выполнить 18 действий :  короткое нажатие, длинное нажатие, двойное нажатие. 

Я уже поизучал даташиты на цифровые потенциометры, проблему сейчас вижу лишь в одном, т.к у них разрядность  256, а номиналы 1, 10, 100кОм, мне необходим двухканальный на 10кОм, но для режима No button, нужен 100кОм. Вот думаю как такое реализовать.

 

по нажатиям, длинные нажатия уже задействованы в ГУ, например в новой ГУ, длинное нажатие Mode = Mute. По мне так проще, нажимать две кнопки сразу, тем более у меня для этого удачно расположены кнопки.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

полевиком земплю можно отключать или замыкать резистор 90ком)

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

2 x 5 резисторов - это формирование Uвых ?

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

SU-27-16 пишет:

2 x 5 резисторов - это формирование Uвых ?

Можно сказать и так. С Головного устройства на этих 2 парах выводов есть земля и 3,3в. Ардуино должна просто замыкать через резистор эти выводы по заданному сценарию. 3 вида сценария нажатия рулевых кнопок: нажатие одной кнопки, длинное нажатие одной кнопки, одновременное нажатие 2 кнопок. 

dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

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

//Адаптер кнопок на руле
#define PIN 5 //номер аналогового порта
#define LIMIT 10 //предел погрешности при дребезге

byte bytes[4];
unsigned long math_time,old_time,real_time, res_dt1, res_d;
void setup()
{
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
Serial.begin(115200);
}

void loop()
{
res_d = analogRead(PIN);
if( res_d < LIMIT) res_d = LIMIT;
delay(10);
res_dt1 = analogRead(PIN);
old_time = millis();
math_time = 0;
while(math_time < 200)
{
real_time = millis();
math_time = real_time - old_time;
res_dt1 = analogRead(PIN);
if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break;
}

if( math_time > 70)
{
if (res_dt1>675 && res_dt1<685) digitalWrite(2,LOW );
delay(30);
digitalWrite(2, HIGH);

if (res_dt1>105 && res_dt1<115) digitalWrite(3,LOW );
if (res_dt1>1020 && res_dt1<1030)digitalWrite(3, HIGH);

if (res_dt1>25 && res_dt1<35) digitalWrite(4,LOW );
if (res_dt1>1020 && res_dt1<1030)digitalWrite(4, HIGH);

if (res_dt1>105 && res_dt1<115) digitalWrite(3,LOW );
if (res_dt1>1020 && res_dt1<1030)digitalWrite(3, HIGH);

if (res_dt1>25 && res_dt1<35) digitalWrite(6,LOW );
if (res_dt1>1020 && res_dt1<1030)digitalWrite(6, HIGH);

if (res_dt1>105 && res_dt1<115) digitalWrite(7,LOW );
if (res_dt1>1020 && res_dt1<1030)digitalWrite(7, HIGH);

if (res_dt1>105 && res_dt1<115) digitalWrite(8,LOW );
if (res_dt1>1020 && res_dt1<1030)digitalWrite(8, HIGH);

if (res_dt1>25 && res_dt1<35) digitalWrite(9,LOW );
if (res_dt1>1020 && res_dt1<1030)digitalWrite(9, HIGH);

bytes[0] = res_d & 0xFF; // преобразовать в 4-байта
bytes[1] = (res_d & 0xFF00) >> 8;
bytes[2] = (res_d & 0xFF0000) >> 16;
bytes[3] = (res_d & 0xFF000000) >> 24;
Serial.write( bytes,4); // отправить прочитаное значение в сериал монитор
}
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

если вам нужно два канала управляемого напряжения 0...3,3 V - то эти 10 резисторов не помогут, нужна резистивная матрица R2R на 5 входов ! ( просто резисторов будет больше )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

res_dt1, res_d; им хватит и int , там не более 1023....

 

если хотя бы один выход из 2, 3, 4, 6, 7, 8 в HIGH - на выходе после резисторов будет 5 V
dennisdennis
dennisdennis аватар
Offline
Зарегистрирован: 18.01.2015

SU-27-16 пишет:

если вам нужно два канала управляемого напряжения 0...3,3 V - то эти 10 резисторов не помогут, нужна резистивная матрица R2R на 5 входов ! ( просто резисторов будет больше )

Я своим рисунком ввел в заблуждение. Нарисовал неправильно. Идея в том, что Ардуино будет просто управлять выводом как реле. Вместо реле - транзистор. Постараюсь перерисовать схему.

ankor90
Offline
Зарегистрирован: 06.11.2018

Доброго времени суток.

Хочу реализовать подобную задумку на Nissan x-trail, только через двух канальный цифровой потенциометр MCP42100.

получилось реализовать проект?