Корректор электронного (стрелочного) спидометра на ARDUINO

все по электропроводке и оборудованию
brat4791
Сообщения: 2
Зарегистрирован: 15 май 2021, 01:28
Бус: Vista sv32

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение brat4791 »

Что то я не увидел там про спидометр,тахометр.
Разве тупо подавать на вход сигнал. Должно быть некий код дописан
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

Ну это уже самостоятельно надо изобретать. По ссылке там этот драйвер подключен к ардуино и рулит мотором, кусок кода с примером как им рулить. Остальное сам изобретай, скетч пиши.
8(928)376-99-75
Аватара пользователя
Андрюха Бух
Сообщения: 7
Зарегистрирован: 18 апр 2017, 22:29
Бус: Volkswagen Caravelle T-3
Откуда: Луганск (ЛНР)

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Андрюха Бух »

Ребята всем привет,может у кого есть эскиз с размерами диска на шрус для индуктивного датчика.Не знаю как он правильно называется.
Аватара пользователя
Андрюха Бух
Сообщения: 7
Зарегистрирован: 18 апр 2017, 22:29
Бус: Volkswagen Caravelle T-3
Откуда: Луганск (ЛНР)

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Андрюха Бух »

Изображение
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

нету
8(928)376-99-75
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

UPDATE:
Для тех, у кого не заработал корректор тахометра - сделайте подтяжку 12 вольт через резистор 10кОм к проводу на тахометр после транзистора кс238. Опробовано на приборке от Golf 3.
Приборка не видит сигнал, т.к. фактически ардуино просто отключает-включает массу, уровень сигнала 0 вольт, а должно быть 12 вольт. УАЗ приборы работают, фольц не хочет. Резистор устраняет проблему.
8(928)376-99-75
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

123.jpg
Подозреваю, что на некоторых прибоках подтяжка на 12 вольт понадобится и для спидометра тоже.

Отправлено спустя 34 минуты 42 секунды:
Подключение тахометра
123.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
8(928)376-99-75
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

Новая схема подключения датчика скорости. (или сигнала тахометра)

подключение к ардуино.png
По такой же схеме нужно подключать и тахометр, только на 2 pin.

Была проблема, что сигнал не мог пройти через оптопару, в итоге ничего не работало. Исправил.
Schematic_speedometr-taho_2021-07-14.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

Резистор R7 на схеме делает притяжку к 5 вольтам.
Для тахометра гольф 3 притяжка к 12 вольтам.
R8 для спидометра гольф 3 отсутствует.
8(928)376-99-75
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

ОБНОВЛЕННЫЙ СКЕТЧ.
- Убран баг с танцами стрелок во время запуска.
ПОКАЗАТЬ ИСХОДНЫЙ КОД

Код: Выделить всё


//ТАХОМЕТР
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 = 0.667;   //ДЛЯ двигателя 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 = 1;

//ВРЕМЯ РАБОТЫ ОСНОВНОЙ ПРОГРАММЫ (каждые 50 миллисекунд - указано в loop)
unsigned long timing;

//ГЕНЕРАТОР ИМПУЛЬСОВ СПИДОМЕТРА
unsigned long             timing2;
unsigned long             Period; 
unsigned long             Skvajnost;
bool                      Status=0;

//ГЕНЕРАТОР ИМПУЛЬСОВ ТАХОМЕТРА
unsigned long             timing3;
unsigned long             PeriodTaho=0; 
unsigned long             SkvajnostTaho=0;
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); 
digitalWrite(OUTSPEEDPIN, LOW);
digitalWrite(OUTTAHOPIN, LOW);
}
//********************************************************************


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;                        //Вычисление правильной скорости
  
  if((OutputSpeed>1)&&(OutputSpeed<220))
  {
    Period=600000/OutputSpeed;  
  }
  else
  {
  Period=0;                             //Вычисление периода импульса
  }

//Считаем тахометр
  if (sztaho != 0)
  {
    sztaho--;
  }
  else
  {
    sptaho = 0;
  }
  InputTaho=sptaho;                                    
  
  
  OutputTaho=InputTaho*popravkaTaho;                      //Вычисление правильной скорости
  int MPHfromSEC=OutputTaho*50;
  
  
  if((OutputTaho>1) && (OutputTaho<200))
  {
  PeriodTaho=600000/OutputTaho;    
  }
  else{
  PeriodTaho=0;                                       //Вычисление периода импульса
  }
  
Serial.println("");
Serial.print("Скорость:    ");  
Serial.print(OutputSpeed);
Serial.print("км/ч;      Коэффициент: ");
Serial.println(popravka);
Serial.print("Обороты ДВС: ");
Serial.print(MPHfromSEC);
Serial.print("об/сек;     Коэффициент: ");
Serial.println(popravkaTaho);
Serial.println("");

 }


//Генерируем импульсы для СПИДОМЕТРА
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;
}

У вас нет необходимых прав для просмотра вложений в этом сообщении.
8(928)376-99-75
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

Во время первой настройки, вышлел первый сюрприз. Оказывается некоторые спидометры имеют разные коээфиициенты поправок при разных скоростях. Причем нелинейным образом.
Т.е. условно при 20км поправка равна 0.6, при 40кмч поправка 0.51, а при 120кмч, вообще 0.75.

Я вношу сейчас изменения в код, чтобы была возможность калибровать прибор на разных скоростях. Чтобы стрелка показывала точные показания в сравнении с GPS
8(928)376-99-75
Аватара пользователя
Артур
Друг клуба
Сообщения: 1471
Зарегистрирован: 12 ноя 2009, 22:38
Бус: T3 2.8 VR6
Откуда: Ессентуки

Корректор электронного (стрелочного) спидометра на ARDUINO

Сообщение Артур »

Видео работы нового скетча с картой поправок:


Объяснение каким образом откатать поправки при помощи GPS в смартфоне.


Отправлено спустя 16 минут 21 секунду:
СВЕЖИЙ СКЕТЧ от 21 июля 2021г с картой поправок для спидометра
Теперь можно очень точно установить для каждой скорости отдельную поправку. Я внёс плавное изменение поправки от точки до точки, т.е. не ступенчато. Себе я выкатал скорости 0, 20, 40, 60, 80, 100, 120, 140 км/ч. Вы можете откатать другие. Причём количество точек может быть произвольным, их число вносится в скетч. Чтобы скетч скомпилировался, вы должны не просто поменять число точек Lengthkalibr, но и внести такое же количество элементов в массивах "kalibrsp"(скорость от датчика) и массив поправок kalibrporv (коэффициенты на что умножить, чтобы прибор показал нужную скорость):
У меня вот такие значения при датчике на 11 импульсов на оборот колеса резина R16/215, спидометр Golf3 (с максималкой 220кмч)
у вас могут быть другие значения, в зависимости от резины и используемого датчика

Код: Выделить всё

const int Lengthkalibr=8;
int kalibrsp[Lengthkalibr]={0, 19, 37, 55, 73, 92, 112, 133};         //ТАБЛИЦА КАЛИБРОВОК - ВХОДЯЩАЯ СКОРОСТЬ
int kalibrporv[Lengthkalibr]={38, 38, 52, 60, 65, 67, 69, 70};        //ТАБЛИЦА КАЛИБРОВОК - ПОПРАВКА 
//(в функции GetKalibr это число умножается на 0.01 на выходе имеем коэффициент умножения по таблице скорости) 
СКАЧАТЬ СКЕТЧ
korrektor.rar
У вас нет необходимых прав для просмотра вложений в этом сообщении.
8(928)376-99-75
Ответить