Своими руками: Конвертер лямбда-зонда + интегрированный осцилогра
Всем привет. Так получилось, что не так давно на моей машине (Volvo 740) окончательно отмер датчик кислорода (лямбда-зонд). По не совсем удачному стечению обстоятельств — у меня оказалась топливная система Siemens, которая известна тем, что ее датчики стоят гораздо дороже, нежели Bosch. За новенькую лямбду, в среднем по-магазинам, хотят от 17 до 24 тысяч рублей. Разумеется для меня это слишком дорого и несколько поразмыслив и почитав интернеты было решено сделать конвертер, но не совсем обычный.
Циркониевый и титановый зонд отличаются друг от друга тем, что первый генерирует ЭДС, а второй — меняет свое сопротивление. В первом случае нам нужно смотреть на сигнал: меньше 0.45 — бедная смесь, больше — богатая. Малое сопротивление титанового датчика — богатая смесь, большое — бедная. Если речь идет о 4х проводной титановой лямбде (более распространено), то сигнал НА датчик должен быть около 1 вольта (и сниматся далее). А если используется 3х проводная — то напряжение должно быть уже около 5 вольт.
Для пояснения приведу графики: Циркониевый зонд генерирующий ЭДС:
Титановый зонд, меняющий свое сопротивление:
О том что получилось, ниже.
Собственно инградиенты получились такие: плата Arduino, несколько метров провода, обвес элементов (он будет дан ниже) и собственно новенький лямбда-зонд от BOSCH. Все вместе — не больше 1400 рублей.
Самый главный вопрос: почему же все таки Arduino используется как основной элемент? Все очень просто: во-первых он был под рукой. Во-вторых — его стоимость — 180 рублей (!) если заказываеть на ebay.com. В-третьих он уже полностью готов для использования (не надо мучиться с поиском драйверов, программаторами и прочим, те кто знаком с AVR поймут меня). В первой версии устройства использовалась средняя плата — версия UNO. Такая же как на картинке:
Уже позже, пришла версия Nano, она заметно меньших размеров, правда корпус для нее оказался все равно большеват. Но для UNO он был тоже мал.
В корпусе:
Теперь перейдем непосредственно к схеме и программе, зашитой в него.
Arduino подключается таким образом (рисовать пришлось в паинте):
По схеме подключения:
R1 — порядка 100 кОм (можно меньше).
R2 — 5-6 мОм
VD1 — любой светодиод на 3-5 вольт
на схеме пометил своим названием — оптопара PC817, или аналогичная.
5 вольт на питание платы берутся от USB-переходника (пока что не подвел питание, езжу так).
Красный провод, отводящий 5 вольт на выход оптопары имеет смысл только когда используется 3х контактный датчик (об этом было написано в начале статьи)
В моем случае использовалась 4х контактная лямбда BOSCH:
Черный — сигнальный — на ногу А0 платы
Серый — масса сигнального — или на массу, или на контакт GND платы. У меня сделано вторым методом, но лучше подключить к массе автомобиля.
Белые — один на постоянные (!) +12 вольт, второй на массу.
Т.к. родные провода датчика очень короткие, мне пришлось их удлинить: разъемы купил на авторынке, провода сечением 1мм (можно 0.75) разных цветов усадил в термоусадку. Многие задаются вопросом, мол могут ли идти помехи на сигнальный провод от соседних. Как показывает практика — нет, даже учитывая тот факт что мой провод, в сумме получился чуть больше метра.
Разница в нагревателях титановой и циркониевой лямбды состоит в том, что цирконий нагревается ВСЕГДА, а титан только прогревается вначале.
На ардуино зашивается вот такая программа, любезно подкорректированная моим другом-программистом Алексеем:
int ledPin = 2; // Светодиод подсоединен к выводу 13
int analogPinInput = 0;
int outputSignal = 3;
double input = 0.0;
void setup(){
pinMode(ledPin, OUTPUT); // устанавливаем вывод 13 как выход
pinMode(outputSignal, OUTPUT);
Serial.begin(1200);//9600
}
void loop(){
double voltageLevel = 0.0;
while(true){
voltageLevel = inputVoltageLevel();
if(voltageLevel >= 0.45 && voltageLevel != 0){
digitalWrite(outputSignal, HIGH);
digitalWrite(ledPin, HIGH);
}
if(voltageLevel < 0.45 && voltageLevel != 0){
digitalWrite(outputSignal, LOW);
digitalWrite(ledPin, LOW);
}
Serial.println(voltageLevel);
}
}
double inputVoltageLevel(){
input = analogRead(analogPinInput) * 0.0049;
return(input);
}
О том что тут происходит:
Контроллер мерит сигнал приходящий на ногу А0,
если сигнал меньше 0.45 вольт — плата ни чего не делает
если больше — подает питание на выход 13, открывая оптопару.
Все приходящие значения она отправляет в виртуальный ком-порт для считывания (если не подключен к компьютеру, все остается работать как и надо).
Светодиод работает тогда, когда идет богатая смесь.
Плата прошивается с помощью родного софта Arduino, который качается на официальном сайте (мануалов в инете слишком много на этот счет), дальше плата подключается к компьютеру и шьется круглой кнопочкой (Загрузить).
В целом, конвертер готов. Теперь наступает самое интересное:
Силами все того же Алексея и желанием что то по-писать, был написана такая софтина (на JAVA, требует установки ява-машины):
Подключаем к компьютеру ардуино, который уже подключен ко всей системе, запускаем программу и видим… график того что происходит на лямбде. Очень удобно тестировать так любой-другой зонд, просматривая его осциллограмму. Пробовали на другой машине — все работает и производительности контроллера и программы хватает с избытком (ей же мерили еще сигнал форсунок, но об этом разговор уже будет в другой "статье").
Под капотом машины, оно выглядит примерно так (этап колхозинга — обкатываемся):
Езжу так уже почти месяц — схема полностью рабочая. Раньше спустся полчаса поездки инжектор вываливался в аварийный режим. Расход стал меньше, мотор стал поохотней крутится.
Алексей доволен проделанной работой:
P.S.
По сети гуляет вот такая схема конвертера, коий был также мною собран, но доработан уже после того как мы сделали ардуино:
Почему то у меня она не захотела работать, но помогло вот такое:
Возможно кому-либо пригодится такая табличка:
Благодарю за внимание. Пожелания, идеи, а также вопросы и предложения можно задать в коментариях.
Че-ло-ве-чи-ще ))) Однозначно оценка "отлично" !