воскресенье, 14 июня 2020 г.

Kia Sportage замена мильной приборки на километровую. Корректор спидометра на Arduino

Адаптер Сигнала Скорости

Транзистор kc238b, аналог (?) обычного кт315.
3 цифровой pin на ARDUINO - сигнал с датчика скорости.
4 цифровой pin на ARDUINO - выход на стрелочный спидометр.
A0 - аналоговый вход, сюда подключается потенциометр для регулировки. 3,3kOm (например) контакты слева направо GND/СИГНАЛ/+5V.
вместо Hz в прошивке км/ч .
 При 100hz показания равны 60км/ч
скетч
//******************************************************************** volatile unsigned long micros_sp = 0; volatile byte sz = 0; //счетчик обнуления volatile unsigned int sp = 0; //скорость volatile unsigned int InputHz = 0; volatile unsigned int OutputHz = 0; double popravka = 0; volatile boolean st = false; //триггер unsigned long timing; unsigned long timing2; int Vixod=4; #define PIN_POT A0 unsigned long Period; unsigned long sp2; unsigned long Skvajnost; bool Status=0; int rotat; //******************************************************************** void setup(){ Serial.begin(115200); //инициализация ком порта attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса pinMode(PIN_POT, INPUT); pinMode (Vixod, OUTPUT); } //******************************************************************** void loop(){ if (millis() - timing > 50) { timing = millis(); if (sz != 0){sz--;}else{sp = 0;}; InputHz=sp; popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01; //Period=6000; // тестовый меандр OutputHz=InputHz*popravka; Period=600000/OutputHz; sp2=600000/Period; Serial.println ((String)OutputHz+" Hz x"+(String)popravka); Serial.println ((String)sp+"km/h"); Serial.println ((String)sp2); } Skvajnost= Period/2 ; // такая скважность называется меандр if (Status==0) { if ( (micros()-timing2)>= Skvajnost) { timing2 = micros(); digitalWrite(Vixod, HIGH); Status=1; } } if (Status==1) { if ( (micros()-timing2)>= (Period-Skvajnost) ){ timing2 = micros(); digitalWrite(Vixod, LOW); Status=0; } } } //******************************************************************** void speedometr(){ //измеряем частоту на входе спидометра по прерыванию if(!st){micros_sp = micros();} else {sp = (600000/(micros() - micros_sp));} st = !st; sz = 30; }


Полная схема подключения
Подключение от датчика с подтяжкой на 5 В
Рабочая (живая схема):
Список деталей для сборки:
транзистор КС238 или КТ3102 или КТ315.
оптрон РС 817
преобразователь 5В
переменник
резисторы 2.2ком, 1ком, 10к







 Вариант 2. Корректор тахометра и спидометра. 


 A0 pin ардуино - вход от потенциометра регулятора спидометра. 
2pin ардуино - вход - сигнал тахометра от ЭБУ двигателя 
3pin ардуино - вход - сигнал от датчика скорости 
4pin ардуино - выход - на спидометр в приборку, соединять только через транзистор как по схеме выше. 
7pin ардуино - выход - на тахометр в приборку, соединять только через транзистор как по схеме выше.
скетч:
//ТАХОМЕТР volatile unsigned long micros_th1 = 0; volatile boolean sttaho = false; //триггер тахометра volatile byte sztaho = 0; //счетчик обнуления volatile unsigned int sptaho = 0; //кол-во оборотов //КОРРЕКЦИЯ ТАХОМЕТРА volatile unsigned int InputTaho = 0; volatile unsigned int OutputTaho = 0; double popravkaTaho = 1.5; //ДЛЯ двигателя 4ц приборка от 6ц - коэффициент 1.5 //СПИДОМЕТР volatile unsigned long micros_sp = 0; volatile byte sz = 0; //счетчик обнуления volatile unsigned int sp = 0; //скорость volatile boolean st = false; //триггер //КОРРЕКЦИЯ СПИДОМЕТРА volatile unsigned int InputSpeed = 0; volatile unsigned int OutputSpeed = 0; double popravka = 0; //ВРЕМЯ РАБОТЫ ОСНОВНОЙ ПРОГРАММЫ (каждые 50 миллисекунд - указано в loop) unsigned long timing; //ГЕНЕРАТОР ИМПУЛЬСОВ СПИДОМЕТРА unsigned long timing2; unsigned long Period; unsigned long Skvajnost; bool Status=0; //ГЕНЕРАТОР ИМПУЛЬСОВ ТАХОМЕТРА unsigned long timing3; unsigned long PeriodTaho; unsigned long SkvajnostTaho; bool StatusTaho=0; //ПИНЫ int OUTSPEEDPIN=4; //ПИН ВЫХОДА - НА СПИДОМЕТР int OUTTAHOPIN=7; //ПИН ВЫХОДА - НА ТАХОМЕТР #define PIN_POT A0 //ПИН СИГНАЛА ОТ ПОТЕНЦИОМЕТРА ПОПРАВКИ //******************************************************************** void setup(){ Serial.begin(115200); //инициализация ком порта attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса attachInterrupt(0, tahometr, RISING); //прерывание тахометр по фронту импульса pinMode(PIN_POT, INPUT); pinMode(OUTSPEEDPIN, OUTPUT); pinMode(OUTTAHOPIN, OUTPUT); } //******************************************************************** void loop() { if (millis() - timing > 50) { timing = millis(); //Считаем спидометр: if (sz != 0) { sz--; } else { sp = 0; } InputSpeed=sp; popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01; //Коэффициент умножения входящего сигнала от 0.00 до 2.00. OutputSpeed=InputSpeed*popravka; //Вычисление правильной скорости Period=600000/OutputSpeed; //Вычисление периода импульса //Считаем тахометр if (sztaho != 0) { sztaho--; } else { sptaho = 0; } InputTaho=sptaho; OutputTaho=InputTaho*popravkaTaho; //Вычисление правильной скорости PeriodTaho=600000/OutputTaho; //Вычисление периода импульса } //Генерируем импульсы для СПИДОМЕТРА Skvajnost= Period/2 ; //такая скважность называется меандр if (Status==0) { if ( (micros()-timing2)>= Skvajnost) { timing2 = micros(); digitalWrite(OUTSPEEDPIN, HIGH); Status=1; } } if (Status==1) { if ( (micros()-timing2)>= (Period-Skvajnost) ){ timing2 = micros(); digitalWrite(OUTSPEEDPIN, LOW); Status=0; } } //Генерируем импульсы для ТАХОМЕТРА SkvajnostTaho=PeriodTaho/2 ; if (StatusTaho==0) { if ( (micros()-timing3)>= SkvajnostTaho) { timing3 = micros(); digitalWrite(OUTTAHOPIN, HIGH); StatusTaho=1; } } if (StatusTaho==1) { if ( (micros()-timing3)>= (PeriodTaho-SkvajnostTaho) ){ timing3 = micros(); digitalWrite(OUTTAHOPIN, LOW); StatusTaho=0; } } } //******************************************************************** void speedometr(){ //измеряем частоту на входе спидометра по прерыванию if(!st){micros_sp = micros();} else {sp = (600000/(micros() - micros_sp));} st = !st; sz = 30; } void tahometr(){ //измеряем частоту на входе тахометра по прерыванию if(!sttaho){micros_th1 = micros();} else {sptaho = (600000/(micros() - micros_th1));} sttaho = !sttaho; sztaho = 30; }
ет

1 комментарий: