kostyamat
12.05.2017, 18:54
Эмулятор ручки управления КК на Arduino Nano
Теория, программа, принципиальная схема
Теория: Конструктивно, ручка круиз контроля представляет собою две инфо.шины+один "земельный" провод.
Между инфо.шинами и "землей" одновременно-попарно включаются некие резисторы, которые формируют некий потенциал, в зависимости от нажатий на кнопки. Если все кнопки отпущены, между каждой из двух инфо.шин и "землей" имеем сопротивление 20.5 КОм и напряжение (потенциал) 4.55 вольт. Таким образом ЭБУ автомобиля узнает о наличии ручки КК.
Со стороны ЭБУ, система считывания сопротивления резисторов представляет собой два АЦП канала, входы которых подтянуты к +5в через резисторы 2КОм.
По крайней мере на это указывают рабочие промеры напряжения на выводах родной ручки КК, при ее наличии. Из этого вывод: ЭБУ не измеряет резисторы, ЭБУ измеряет напряжение на этих двух входах АЦП. Эти напряжения формируют резистивные делители, сформированные резисторами подтяжки к +5в в АЦП ЭБУ и резисторы в родной ручке управления КК.
Мне родную, правильную, ручку купить так и не удалось, к тому же по дому валялась относительно дешевая, и легко доступная, ручка управления КК от Chrysler PT Cruiser. Эту ручку я купил по ошибке. Эта ручка КК, имея три вывода, фактически является одноканальной, ее инфо.шины попросту запараллелены. Но при этом, на место в руле, эта ручка встает как родная.
Идея: Из написанного мной выше, я пришел к выводу, что переключение режимов КК в ЭБУ осущевствляется некими напряжениями на двух входах АЦП ЭБУ, входы которых выведены на 6-ти пиновый разъем "часовой пружины" руля, меняющимися при нажатии кнопок ручки управления КК. Хмм...
Подумав и почитав, я принял решение делать эмулятор-переходник, с ручки PT Cruiser на двухканальною родную, на базе Arduino.
Затратность: Схема получилась проста до безобразия. Это видно на рисунке, всего три резистора, два конденсатора, +Arduino Nano, стоимость всех деталей на Aliexpress состаляет всего 3$, плюс ручка КК PT Cruiser, которую можно купить на разборках от 10-15$. Общая стоимость 30% от цены оригинальной ручки КК для нашего барашка.
Схема, сборка и как работает: Ручку от PT Cruiser подключаем ко входу АЦП ардуино А0, подтянутого к +5в, снимаемого с внутреннего стабилизатора arduino, через резистор 10кОМ. Arduino читает и оцифровывает напряжение сформированное резистивным делителем резистора подтяжки и резисторами внутри ручки, при нажатии на кнопки.
Используется функцияdata=analogRead(analogPin);
При оцифровке напряжения получаем некое цифровое значение, которое пропускаем через фильтры if <> и если какая нибудь кнопка на ручке нажата, записываем в цифровые выходы arduino D6 и D9 значения ШИМ модуляции, соответствующие нажатой кнопке.
Используется функция{analogWrite(pin6_OUT_D9, значение_ШИМ+corr_D9); analogWrite(pin4_OUT_D6, значение_ШИМ+corr_D6);}
Переменные corr_D9 и corr_D6 введены в программу для возможности общей коррекции значений на выводах D6\D9. Например при разбросах значения внутреннего +5в у разных плат ардуино, или разбросах параметров резисторов относительно указанных на схеме.
Итак, ШИМ снимаем с выводов D6 и D9 через сглаживающую RC цепочку, призванную убрать "пилу" ШИМ в выходном напряжении.
Скетч (программа) для платы Arduino Nano:
int analogPin=0; //пин для подключения ручки КК от PT Cruiser, A0 на плате Ардуино, подтянут через резистор 10КОм к выводу +5 на плате.
// Второй вывод ручки подключается к GRND Ардуино
int data;
int corr_D6;
int corr_D9;
int pin4_OUT_D6 = 6; // 4-й вывод на разъеме "часово пружины" руля, D6 на плате Ардуино.
// 5-вывод на разъеме "часовой пружины" является "массой" и подключается к выводу GRND Ардуино.
int pin6_OUT_D9 = 9; // 6-й вывод на разъеме "часово пружины" руля, D9 на плате Ардуино.
// Последовательно к каждому из выходов D6 и D9 нужно включить по резистору 470 Ом и по конденсаторк 4.7мФ Х 10 вольт на "землю", вывод GRND Ардуино.
// D6&9 <-----[ 470 ]-----+----------------> Pin 4 & Pin 6 в разъеме "часовой пружины" руля Додж Калибер.
// ¦+
// === 4,7mF x 10v
// ¦
// " Grnd
// вывод GRND на плате ардуино.
void setup()
{
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Serial.begin(9600);
pinMode(pin6_OUT_D9, OUTPUT); // sets the pin as output
pinMode(pin4_OUT_D6, OUTPUT); // sets the pin as output
corr_D6=0; // Вносит поправку сразу во все значения напряжения на выводе D6 Ардуино.
corr_D9=0; // Вносит поправку сразу во все значения напряжения на выводе D6 Ардуино.
}
void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
if (data>=400 && data<=1023) {analogWrite(pin6_OUT_D9, 231+corr_D9); analogWrite(pin4_OUT_D6, 231+corr_D6);} // Normal - 4.55v pin 6 and 4.55v pin 4
if (data>=50 && data<=80) {analogWrite(pin6_OUT_D9, 13+corr_D9); analogWrite(pin4_OUT_D6, 182+corr_D6);} // On/Off - 0.90v pin 6 and 3.75v pin 4
if (data>=140 && data<=180) {analogWrite(pin6_OUT_D9, 159+corr_D9); analogWrite(pin4_OUT_D6, 38+corr_D6);} // Coast/Set - 3.35v pin 6 and 1.35v pin 4
if (data>=300 && data<=350) {analogWrite(pin6_OUT_D9, 198+corr_D9); analogWrite(pin4_OUT_D6, 93+corr_D6);} // ACC/Res - 4.00v pin 6 and 2.25v pin 4
if (data>=0 && data<=40) {analogWrite(pin6_OUT_D9, 67+corr_D9); analogWrite(pin4_OUT_D6, 137+corr_D6);} // Eruise/Cansel - 1.80v pin 6 and 3.00v pin 4
delay(50);
}
37871
ПС. Установку Arduino ID, драйвера, настройки COM-порта я описывать не буду, этой информации море в сети. И поверьте - там все просто. Под силу любому человеку, умеющему читать и включать ПК. :)
Например, тут (http://arduino.ua/ru/guide/Windows) это расписано очень доступно, а тут (https://www.youtube.com/watch?v=yYsFdyf-kjg) можно даже посмотреть.
На этом первая часть закончена. Во второй части будет фото-отчет об установке и использовании.
Теория, программа, принципиальная схема
Теория: Конструктивно, ручка круиз контроля представляет собою две инфо.шины+один "земельный" провод.
Между инфо.шинами и "землей" одновременно-попарно включаются некие резисторы, которые формируют некий потенциал, в зависимости от нажатий на кнопки. Если все кнопки отпущены, между каждой из двух инфо.шин и "землей" имеем сопротивление 20.5 КОм и напряжение (потенциал) 4.55 вольт. Таким образом ЭБУ автомобиля узнает о наличии ручки КК.
Со стороны ЭБУ, система считывания сопротивления резисторов представляет собой два АЦП канала, входы которых подтянуты к +5в через резисторы 2КОм.
По крайней мере на это указывают рабочие промеры напряжения на выводах родной ручки КК, при ее наличии. Из этого вывод: ЭБУ не измеряет резисторы, ЭБУ измеряет напряжение на этих двух входах АЦП. Эти напряжения формируют резистивные делители, сформированные резисторами подтяжки к +5в в АЦП ЭБУ и резисторы в родной ручке управления КК.
Мне родную, правильную, ручку купить так и не удалось, к тому же по дому валялась относительно дешевая, и легко доступная, ручка управления КК от Chrysler PT Cruiser. Эту ручку я купил по ошибке. Эта ручка КК, имея три вывода, фактически является одноканальной, ее инфо.шины попросту запараллелены. Но при этом, на место в руле, эта ручка встает как родная.
Идея: Из написанного мной выше, я пришел к выводу, что переключение режимов КК в ЭБУ осущевствляется некими напряжениями на двух входах АЦП ЭБУ, входы которых выведены на 6-ти пиновый разъем "часовой пружины" руля, меняющимися при нажатии кнопок ручки управления КК. Хмм...
Подумав и почитав, я принял решение делать эмулятор-переходник, с ручки PT Cruiser на двухканальною родную, на базе Arduino.
Затратность: Схема получилась проста до безобразия. Это видно на рисунке, всего три резистора, два конденсатора, +Arduino Nano, стоимость всех деталей на Aliexpress состаляет всего 3$, плюс ручка КК PT Cruiser, которую можно купить на разборках от 10-15$. Общая стоимость 30% от цены оригинальной ручки КК для нашего барашка.
Схема, сборка и как работает: Ручку от PT Cruiser подключаем ко входу АЦП ардуино А0, подтянутого к +5в, снимаемого с внутреннего стабилизатора arduino, через резистор 10кОМ. Arduino читает и оцифровывает напряжение сформированное резистивным делителем резистора подтяжки и резисторами внутри ручки, при нажатии на кнопки.
Используется функцияdata=analogRead(analogPin);
При оцифровке напряжения получаем некое цифровое значение, которое пропускаем через фильтры if <> и если какая нибудь кнопка на ручке нажата, записываем в цифровые выходы arduino D6 и D9 значения ШИМ модуляции, соответствующие нажатой кнопке.
Используется функция{analogWrite(pin6_OUT_D9, значение_ШИМ+corr_D9); analogWrite(pin4_OUT_D6, значение_ШИМ+corr_D6);}
Переменные corr_D9 и corr_D6 введены в программу для возможности общей коррекции значений на выводах D6\D9. Например при разбросах значения внутреннего +5в у разных плат ардуино, или разбросах параметров резисторов относительно указанных на схеме.
Итак, ШИМ снимаем с выводов D6 и D9 через сглаживающую RC цепочку, призванную убрать "пилу" ШИМ в выходном напряжении.
Скетч (программа) для платы Arduino Nano:
int analogPin=0; //пин для подключения ручки КК от PT Cruiser, A0 на плате Ардуино, подтянут через резистор 10КОм к выводу +5 на плате.
// Второй вывод ручки подключается к GRND Ардуино
int data;
int corr_D6;
int corr_D9;
int pin4_OUT_D6 = 6; // 4-й вывод на разъеме "часово пружины" руля, D6 на плате Ардуино.
// 5-вывод на разъеме "часовой пружины" является "массой" и подключается к выводу GRND Ардуино.
int pin6_OUT_D9 = 9; // 6-й вывод на разъеме "часово пружины" руля, D9 на плате Ардуино.
// Последовательно к каждому из выходов D6 и D9 нужно включить по резистору 470 Ом и по конденсаторк 4.7мФ Х 10 вольт на "землю", вывод GRND Ардуино.
// D6&9 <-----[ 470 ]-----+----------------> Pin 4 & Pin 6 в разъеме "часовой пружины" руля Додж Калибер.
// ¦+
// === 4,7mF x 10v
// ¦
// " Grnd
// вывод GRND на плате ардуино.
void setup()
{
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Serial.begin(9600);
pinMode(pin6_OUT_D9, OUTPUT); // sets the pin as output
pinMode(pin4_OUT_D6, OUTPUT); // sets the pin as output
corr_D6=0; // Вносит поправку сразу во все значения напряжения на выводе D6 Ардуино.
corr_D9=0; // Вносит поправку сразу во все значения напряжения на выводе D6 Ардуино.
}
void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
if (data>=400 && data<=1023) {analogWrite(pin6_OUT_D9, 231+corr_D9); analogWrite(pin4_OUT_D6, 231+corr_D6);} // Normal - 4.55v pin 6 and 4.55v pin 4
if (data>=50 && data<=80) {analogWrite(pin6_OUT_D9, 13+corr_D9); analogWrite(pin4_OUT_D6, 182+corr_D6);} // On/Off - 0.90v pin 6 and 3.75v pin 4
if (data>=140 && data<=180) {analogWrite(pin6_OUT_D9, 159+corr_D9); analogWrite(pin4_OUT_D6, 38+corr_D6);} // Coast/Set - 3.35v pin 6 and 1.35v pin 4
if (data>=300 && data<=350) {analogWrite(pin6_OUT_D9, 198+corr_D9); analogWrite(pin4_OUT_D6, 93+corr_D6);} // ACC/Res - 4.00v pin 6 and 2.25v pin 4
if (data>=0 && data<=40) {analogWrite(pin6_OUT_D9, 67+corr_D9); analogWrite(pin4_OUT_D6, 137+corr_D6);} // Eruise/Cansel - 1.80v pin 6 and 3.00v pin 4
delay(50);
}
37871
ПС. Установку Arduino ID, драйвера, настройки COM-порта я описывать не буду, этой информации море в сети. И поверьте - там все просто. Под силу любому человеку, умеющему читать и включать ПК. :)
Например, тут (http://arduino.ua/ru/guide/Windows) это расписано очень доступно, а тут (https://www.youtube.com/watch?v=yYsFdyf-kjg) можно даже посмотреть.
На этом первая часть закончена. Во второй части будет фото-отчет об установке и использовании.