Всем доброго времени суток. Наконец ко мне пришел миг счастья — свободные выходные. Пролетят они как миг, но думаю отдохнуть успею. А заодно и написать об прошедших изысканиях на тему установки панели приборов. Эту часть я пишу уже очень долго. Хотелось её сделать максимально содержательной, чтоб уже дождаться покупки дисплея и на следующей части закончить повествование. Но все время требовалось вносить коррективы в черновик, а тут и новая версия Венатора 3 лайт вышла и с совершенно новым скетчем.
В прошлой части я описал как начинались изыскания по поводу блока сбора данных. Все вроде началось хорошо. Но всегда есть НО! В машине есть два типа подключения датчиков.

Дело в том, что рисуя скетч, я еще не смотрел на схему. Думал, что все по очереди слепится. Ну и естественно забыл об этих двух типах подключения. Очень зря я так думал. Когда заморочился схемами — понял, сколько придется еще раз менять скетч, подгоняя его под нужды автомобиля.
Я уже описывал датчики ранее, но не вдавался какой полярности они. А их бывает два типа.
И так первый тип. Это когда от плюса батареи через датчик (выключатель, переключатель) идет питание на индикатор и на массу. То есть датчик включает или выключает +12В (грубо говоря), а масса на индикаторе постоянна.
На стареньких Т4 к этому типу относятся:
1) Сигналы Спидометра
2) Сигналы Тахометра
3) Индикация поворотов и аварийной сигнализации
4) Индикация включения габаритов
5) Индикация включения дальнего (ближнего) света фар.
6) Индикация включения свечей накала
7) Напряжение бортовой сети
8) Индикация включения вентиляторов радиатора
9) Индикация включения противотуманных фар
10) Индикация включения стопов
К счастью в этом списке все подключается к шилду как есть.
Что же касается второго типа, то тут От плюса батареи питание сразу идет на индикатор, но масса подключена через датчик (выключатель, переключатель). То есть датчик подключает массу, а +12В (грубо говоря и сильно округляя) на индикаторе постоянно.
К этому типу относятся:
1) Температура охлаждающей жидкости
2) Уровень топлива
3) Низкий уровень охлаждающей жидкости
4) Индикация низкого и высокого давления масла
5) Индикация включения ручного тормоза
6) Индикация открытия дверей
7) Индикация пристегивания ремня безопасности.
Такие датчики подключаются немного по другой схеме.

Шилд немного подготовлен к подключению такого типа датчиков. Однако только немного. На нем есть контактные площадки для пайки резисторов для подтяжки к +5В. Однако мне такая идея не понравилась и я +5В откусил, а на обратную сторону подключил +12В (с генератора +14.4В). Так же пришлось своим единственным паяльником с широким жалом перепаивать SMD резисторы на новое место, а вместо них ставить перемычки (резисторы с маркировкой 0). Размер их для покупки на рынке 1206 вроде. Стоят копейки. Вот так получился шилд после моих изысканий.

И так нужно убрать резисторы 100кОм (маркировка 104) с насиженного места, и переместить их на те самые подготовленные контактные площадки. Резисторы 47кОм (маркировка 473) остаются на своих местах, а вместо 100кОмных, нагло передвинутых, вставить перемычки (маркировка 0). Не думал, что это так сложно будет, но справился. Глаза боятся, а руки делают.
Вот схемки вариантов подключения входов к Ардуино:

Теперь меняем в скетче входы, которые будут соответствовать новой распайке. То есть В1, В3, В5, В7, В9, В11, В13, В15, В17, В19, В21 и В23 мы отдаем под второй тип. При этом В9, В11, В13, В15, В17, В19, В21 и В23 могут быть и аналоговыми и цифровыми, В1, В3, В5 и В7 — только цифровыми.
Отдельно карта входов такого шилда с распределенным функционалом:

А теперь пошла часть с изменениями под новые версии.
Вот так это будет выглядеть в обновленном скетче:

В старых версиях менять это все надо было в самом скетче в месте чтения датчиков. Тут же номера назначаются в начале в зоне объявления переменных. Переменных выходит больше, но удобнее для не очень шарящих.
Теперь перейдем к самому скетчу. При тестах, у меня тахометр, спидометр, количество топлива и температура охлаждающей жидкости отображались не верно. Да в принципе при покупке авто температуру не показывало (был оборван провод на разъеме датчика), а тахометра не поставили с завода (древний потому что), так что потерял лишь скорость и уровень топлива (было бы что терять, белка Фред все равно до 100км/ч разгоняет машину только с горки при попутном ветре за 3 дня). По сути все аналоговые датчики безбожно врали. Оно и не удивительно. Потому под окончание тестов я замучил Frud'a вопросами и кое что для себя выяснил.
Во первых это тот факт, что по умолчанию в скетче для скорости считается 6 импульсов от датчика за 1 оборот. На Т4 же устанавливали датчики с 7 импульсами. Вот что написано в T4Wiki:
Signalform
Der Geber liefert pro Radumdrehung ca. 7 Impulse. Das resultierende Signal ein recht akzeptables, weitgehend symmetrisches Rechtecksignal mit einer Amplitude von ca. 9 Volt (mindestens 5 Volt).
Это означает.: Датчик подает около 7 импульсов на оборот колеса. Результирующий сигнал является довольно приемлемым, в основном симметричным прямоугольным сигналом с амплитудой около 9 вольт (не менее 5 вольт).
Не буду приводить текст, однако так же ниже написано, что возможно есть второй вариант датчиков скорости, используемый на старых дизельных Т4 без блока управления двигателем.
Остаётся вопрос какой же датчик купил я? Однако об этом в следующей части (оставим интригу).
При датчике с 7 импульсами и стандартном размере колеса (195/70 R15), где длинна окружности поверхности катания примерно 2 метра, скорость в км/ч равна частоте в Гц.
Остается поправить эту цифру в скетче.
Во вторых это собственно про цифры в скетче.
В скетче есть строки:
void spd(){ //измеряем частоту на входе спидометра по прерыванию
if(!st){micros_sp = micros();}
else {sp = (sp_mult/(micros() — micros_sp));}
st = !st;
sz = 30;
}
void tah(){ //измеряем частоту на входе тахометра по прерыванию
if(!tt){micros_th = micros();}
else {th = (48666.68/(micros() — micros_th));}
tt = !tt;
tz = 10;
}
А немного выше еще строка:
sp_mult = 3600000/sp_sens; //вычисление коэфф. пересчета частоты в скорость
Последняя строка выполняется всего 1 раз при старте Ардуино. В ней вычисляется дальнейший коэффициент пересчета частоты в скорость. Это переменная sp_mult. Состоит она из цифры 3600000, разделенной на установленное в начале количество импульсов на оборот колеса, то есть на переменную sp_sens.
Кусочки озаглавленные словом void выполняются при срабатывании прерывания. Сложная штука. По проще говоря срабатывает при получении импульса с датчика. Так вот получает импульс, высчитывает
sp = sp_mult/разница_времени_импульсов
th = 48666.68/разница_времени_импульсов
Немного поясню откуда берется цифра:
Для спидометра (пока на стадии выяснения, пользуемся корректировкой в программе):
1 об/мин = 1/60 об/сек = (7*(1/60))*1000000 = 816666.67
Хотя по формуле в скетче выходит немного другая цифра:
3600000/7 = 514285,71
Данный вопрос выясняется и в этом месте будет корректироваться.
Для тахометра:
1 об/мин = 1/60 об/сек = 2.92*(1/60) = 0.4866667 Гц
Переводим в микросекунды 0.04866667*1000000 = 48666.67
Число 2.92 это соотношение валов генератора и коленвала. Известно, что один оборот генератора выдает лишь 1 импульс (вывод на пин W идет с одной обмотки, а всего их 3 обмотки соединеных звездой).
Так на приборных панелях с тахометром на самом тахометре и пишут diesel х2.92
Если кому нужно то я стырил у SanekBorisovich Вот прямо тут вот эти данные:
"для корректной и правильной работы тахометра должно быть свое передаточное.
1X, ABL I=1:2,52
1X, ABL I=1:2,99 (широкий ремень)
AAB I=1:2,92"
Для прочих двигателей придется искать в интернете. И да, владельцам течиков с датчиками положения коленвала этот коэффициент равен количеству импульсов на оборот коленвала.
Ниже расположил уже почти финальную версию скетча в картинках.
Скачать описанную версию программы и скетч, в котором еще не выставлены пины входов можно Вот в этой записи блога Frud'a.





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


Comments 17
Можете помоч по дачику температури ОЖ
Я припоял 100К и 47к смасси но не показивает
Помочь могу. Наверно. Датчик какого типа у Вас? Откуда получает питание?
на дачике 2 разиома машина опел астра
и ешо кагда ключ закрит на проводе от дачика температури катори подключаеца к приборнои панели 12.6в наприжене ест кагда откриваю ключ наприжене становица 1.1 в
Sintariel
Помочь могу. Наверно. Датчик какого типа у Вас? Откуда получает питание?
буду очен признателен если у вас ест сжема паек на ардуино мега2560 можете поставит сравню с моим может я что то напутал
Спасибо
Sintariel
Помочь могу. Наверно. Датчик какого типа у Вас? Откуда получает питание?
Я сделал вот так
Sintariel
Помочь могу. Наверно. Датчик какого типа у Вас? Откуда получает питание?
питане получает от егу
Если присмотритесь внимательно на всю схему, а не только на данное подключение, то увидите 2 различные схемы подключения датчиков. Возможно Вы выбрали не то подключение, или подключились не в том месте. Данная схема — для типичного подключения. Не обязательно у Вас именно так как на схеме. Некоторым приходилось к датчикам колхозить свою отдельную схему.
И так перефразирую: нужна для понимания полная цепь от + батареи до массы батареи через датчик. Ни больше, ни меньше.
//********************************************************************
unsigned long micros_sp = 0, micros_th = 0;
volatile int tz;
volatile int sz;
volatile int sp; //импульсы спидометра
volatile int th; //импульсы тахометра
int analogInput [15]; //массив аналоговых значений
int digitalInput[29]; //массив цифровых значений
String resultString = ""; //строка
int i; //счетчик циклов
//********************************************************************
void setup(){
for(i=0; i<=14; i++){ //обнуление массива аналоговых значений
digitalInput[i]=0;
}
for(i=0; i<=28; i++){ //обнуление массива цифровых значений
analogInput[i]=0;
}
Serial.begin(115200);
Serial2.begin(115200); //инициализация ком порта
attachInterrupt(0, speedometr, RISING); //прерывание спидометра по фронтам импульса
attachInterrupt(1, tahometr, RISING); //прерывание тахометра по фронтам импульса
}
//********************************************************************
void loop(){
analogInput[0] = analogRead(0); // B13 напряжение
analogInput[1] = analogRead(1); // B24 топливо
analogInput[2] = analogRead(2); // B21 температура охлаждения
analogInput[3] = analogRead(8); //
analogInput[4] = analogRead(7); //
analogInput[5] = analogRead(3); //
analogInput[6] = analogRead(4); //
analogInput[7] = analogRead(9); //
analogInput[8] = analogRead(10); //
analogInput[9] = analogRead(11); //
analogInput[10] = analogRead(12); //
analogInput[11] = analogRead(13); //
analogInput[12] = analogRead(14); //
analogInput[13] = analogRead(15); //
analogInput[14] = analogRead(6); //
digitalInput[0] = digitalRead(4); // зажигание
// digitalInput[1] = digitalRead(5); //
//********************************************************************
digitalInput[2] = digitalRead(53) + //
digitalRead(52) * 2; //
//********************************************************************
digitalInput[3] = digitalRead(5) + // A14 левый поворот
digitalRead(6) * 2; // A13 правый поворот
//********************************************************************
digitalInput[4] = digitalRead(7) + // A18 габарит
digitalRead(8) * 2; // A17 дальний
//********************************************************************
digitalInput[5] = digitalRead(9) + // А16 птф передние
digitalRead(10) * 2; // A15 птф задний
//********************************************************************
digitalInput[6] = digitalRead(24); // A23 чек
digitalInput[7] = !digitalRead(49); // B 9 — уровень тж
digitalInput[8] = !digitalRead(27); // A19 — ручник
digitalInput[9] = 0;//digitalRead(50); // B 3 износ колодок
digitalInput[10] = !digitalRead(47); // B10 — лампа топлива
digitalInput[11] = !digitalRead(51); // B12 — уровень ож
digitalInput[12] = !digitalRead(11); // А24 — давление масла
digitalInput[13] = !digitalRead(37); // A20 лампа вентилятора
digitalInput[14] = !digitalRead(12); // A23 зарядка
digitalInput[15] = !digitalRead(22); // A 5 абс
digitalInput[16] = digitalRead(26); // A20 srs
digitalInput[17] = digitalRead(18); // A 3 ремень
digitalInput[18] = digitalRead(46); // B 1 двери
digitalInput[19] = digitalRead(42); // B 2 p
digitalInput[20] = digitalRead(39); // А22 r
digitalInput[21] = digitalRead(24); // A 7 n
digitalInput[22] = 0;//digitalRead(46); // B 6 d
digitalInput[23] = 0;//digitalRead(52); // B 5 s
digitalInput[24] = digitalRead(25); // A 8 резерв
digitalInput[25] = 0;//digitalRead(26); // A 9 резерв
digitalInput[26] = digitalRead(27); // A10 резерв
digitalInput[27] = 0;//digitalRead(28); // A11 резерв
digitalInput[28] = digitalRead(44); // B 4 резерв
resultString = String(resultString + sp);
resultString = String(resultString + ", ");
resultString = String(resultString + th*10);
resultString = String(resultString + ", ");
for(i=0; i<=14; i++){ //передаем аналоговые данные из массива в COM-port
resultString = String(resultString + analogInput[i]);
resultString = String(resultString + ", ");
}
for(i=0; i<=28; i++){ //передаем цифровые данные из массива в COM-port
resultString = String(resultString + digitalInput[i]);
}
resultString = String(resultString + ":\n");
// Serial2.print (resultString);
Serial.print (resultString);
resultString = String("");
tz = tz — 1;
sz = sz — 1;
if (tz == 0){th = 0;}
if (sz == 0){sp = 0;}
delay(50);
}
//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
sp=(900000.0/( micros() — micros_sp));
micros_sp = micros();
sz = 10;
}
//********************************************************************
void tahometr(){ //измеряем частоту на входе тахометра по прерыванию
th=(2900000.0/( micros() — micros_th));
micros_th = micros();
tz = 10;
}
eto moi kod pojalusta kto mojet skazat vchom priblema chto spidometr ne rabotaet taxometr rabotaet a spidometr net
Мне кажется, или скетч старый?
на старом DIGMA андроид 4.2 отлично работает.
esp8266 много ест и долго запускается.
А так все здорово!
Очень интересует USB подключение
В части со ссылками я сноску сделал.
Спасибо за труды, в библиотеку мирового достояния (закладки) однозначно.
Красавелло! Только не бросай на полпути! Все получится!)
Дык на древнем планшете тестил на машине уже. Последние версии на планшете не идут. Дико тормозят. Как хватит денежки на дисплей — окончательно все интегрирую в авто. Бросать уже готовую конструкцию — совсем не хочется.
Уверен, получится офигенно!