Страница 5 из 9

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

Добавлено: 15 май 2021, 17:11
brat4791
Что то я не увидел там про спидометр,тахометр.
Разве тупо подавать на вход сигнал. Должно быть некий код дописан

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

Добавлено: 15 май 2021, 19:04
Артур
Ну это уже самостоятельно надо изобретать. По ссылке там этот драйвер подключен к ардуино и рулит мотором, кусок кода с примером как им рулить. Остальное сам изобретай, скетч пиши.

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

Добавлено: 10 июн 2021, 12:56
Андрюха Бух
Ребята всем привет,может у кого есть эскиз с размерами диска на шрус для индуктивного датчика.Не знаю как он правильно называется.

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

Добавлено: 12 июн 2021, 14:45
Андрюха Бух
Изображение

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

Добавлено: 12 июн 2021, 18:27
Артур
нету

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

Добавлено: 25 июн 2021, 22:04
Артур
UPDATE:
Для тех, у кого не заработал корректор тахометра - сделайте подтяжку 12 вольт через резистор 10кОм к проводу на тахометр после транзистора кс238. Опробовано на приборке от Golf 3.
Приборка не видит сигнал, т.к. фактически ардуино просто отключает-включает массу, уровень сигнала 0 вольт, а должно быть 12 вольт. УАЗ приборы работают, фольц не хочет. Резистор устраняет проблему.

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

Добавлено: 26 июн 2021, 10:08
Артур
123.jpg
Подозреваю, что на некоторых прибоках подтяжка на 12 вольт понадобится и для спидометра тоже.

Отправлено спустя 34 минуты 42 секунды:
Подключение тахометра
123.jpg

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

Добавлено: 14 июл 2021, 17:04
Артур
Новая схема подключения датчика скорости. (или сигнала тахометра)

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

Была проблема, что сигнал не мог пройти через оптопару, в итоге ничего не работало. Исправил.
Schematic_speedometr-taho_2021-07-14.png

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

Добавлено: 15 июл 2021, 23:42
Артур
Резистор R7 на схеме делает притяжку к 5 вольтам.
Для тахометра гольф 3 притяжка к 12 вольтам.
R8 для спидометра гольф 3 отсутствует.

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

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

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


//ТАХОМЕТР
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;
}


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

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

Я вношу сейчас изменения в код, чтобы была возможность калибровать прибор на разных скоростях. Чтобы стрелка показывала точные показания в сравнении с GPS

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

Добавлено: 21 июл 2021, 22:23
Артур
Видео работы нового скетча с картой поправок:


Объяснение каким образом откатать поправки при помощи 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

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

Добавлено: 30 июл 2021, 23:50
genzemarta
Очень круто!
На старой прошивке и на старой схеме с оптопарой накатал уже 2500км, всё отлично! Штрафов с камер нет!☺ Сменил главную пару, посчитал коффициент для новой пары, и просто записал его, не откатывая по gps потом проверил с gps 2500об/мин =100км/ч и всё совподает! Рад как удав😆.

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

Добавлено: 04 авг 2021, 15:59
arristo
Здравствуйте. Я повторил схему. Ардуино Нано. Вход на оптроне транзистор 3102, выход на одном резисторе и транзисторе кт315. Питание - регулируемое на 5В.
Есть проблемы. Их две.
1. Количество герц (сигнал) учитывается приборкой в 2 раза больше. Скорость указана в скетче, скажем 50, на спидометре 100.
2. Стрелка дергается. От "туда-сюда" до "ложится". Все это на столе, конечно.
Видео этого дела:
https://youtu.be/_R6ii7nAo7w
Что-то посоветуете в этой ситуации, плиз?

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

Добавлено: 04 авг 2021, 18:24
Артур
По первой проблеме: в мониторе порта отображается скорость которую ардуино приняла от датчика скорости. Это условное значение, ни с прибором спидометра, ни с реальной скоростью никак не связано. Вычисляется по формуле СКОРОСТЬ=600000/ВХОДЯЩИЕ ИМПУЛЬСЫ.
Т.е. так и должно быть.
arristo писал(а): 04 авг 2021, 15:59 Скорость указана в скетче, скажем 50, на спидометре 100.
это ты уже будешь потенциометр крутить в дороге, по GPS искать нужный коэффициент поправки. Оно и не должно совпадать.

По второй проблеме. Тут есть варианты. Давай через ватсап или вконтакте. Номер мой в подписи к сообщению написан.


В скетче в разделе кода СЧИТАЕМ СПИДОМЕТР, найди строку:

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

InputSpeed=sp;
popravka=popravka=GetKalibr(InputSpeed); 
И ЗАМЕНИ НА

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

InputSpeed=100;
popravka=1;
Отцепи потенциометр. (можно и не отцеплять, после изменения кода он просто не учитывается)
залей скетч в ардуино.
У тебя должна стрелка стать на какую либо отметку как вкопанная, без колебаний. Это изменение отключит вход и ардуинка вместо корректора станет простым генератором импульсов. тем самым можно проверить хорошо ли работает выход


Нужно выцепить, откуда появляются помехи (на входе, ошибка в скетче или на выходе).

Попробуй эту схему выхода
123.jpg
Кроме того, я не пробовал КТ315 в качестве выходного. КС238 немного мощнее, немного другие параметры. Некоторые спидометры начинают так глючить из-за не правильного напряжения подтяжки (т.е. 5 вольт вместо 12), прибор от гольф 3 отказался работать, если включить в разрыв резистор больше чем 0,7кОм, в пограничном режиме прыгал, на 1кОм не работал вовсе.
Проверял работу датчика скорости светодиодной лентой. Минус сегмента светодиодной ленты на сигнал от датчика, Плюс на +12вольт.

Нужно проверить не прыгает ли у тебя сигнал от потенциометра. Что очень может быть.

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

Добавлено: 05 авг 2021, 08:51
arristo
По проблеме прыганья стрелки разобрался. Это скакал потенциометр. ЕГо надо подключать как RC-фильтр, то есть сигнал через 10 ком, и мелкая (0.1) емкость с сигнала после резистора на GND, тогда дребезжание будет фильтроваться. Я его отключил совсем, и все стало гут.

Проблема не тех показаний разбилась на две проблемы:
1. Я экспериментирую на мильной приборке с переразметкой шкалы под километры. Пробег считается в милях, поэтому подсчет импульсов будет в 1.7 раза ниже (выше). А стоит рабочая приборка - километровая. Хз, короче. Придется возить ноут рядом с километровой приборкой и смотреть все это на экране с отработкой на месте.

2. ввиду брехания приборки на фиксированное количество километров, не получилось ввести коэффициент-множитель. Пришлось тупо применить поправку суммирующую. Вроде показывает, но опять-таки мили брешут, скорее всего.

Короче, всё подошло к тому, что надо отсекать по GPS на ходу поправки на спидометр и на действительную скорость и вычислять либо множитель (что представляется проблематичным), либо делать массив граничных значений.

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

Добавлено: 05 авг 2021, 10:30
arristo
А вот еще вопрос.
Вот этот момент:
//Генерируем импульсы для СПИДОМЕТРА
Skvajnost= Period/2 ; //такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(OUTSPEEDPIN, HIGH);
Status=1;

Serial.println("out High");
}
}

if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(OUTSPEEDPIN, LOW);
Status=0;
Serial.println("out Low");
}
}

Это должно писаться попеременно после каждого вычисления скорости? Или должно писаться сразу друг за другом, сперва High, потом Low?
У меня получается так:

Speed=70Скорость 1=70Скорость 2=78
out High
Speed=70Скорость 1=70Скорость 2=78
out Low


Вычисляется сперва одна скорость, пишется High, потом вычисляется вторая скорость, пишется Low. У меня идет смена скоростей через 1.5 секунды, опрос идет раз в 50 миллисек.

Собственно вот скетч без опроса спидометра, только поправка:


//СПИДОМЕТР
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 Speed = 0;
volatile unsigned int OutputSpeed = 0;
double popravka = 1;

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

//ГЕНЕРАТОР ИМПУЛЬСОВ СПИДОМЕТРА
unsigned long timing2;
unsigned long Period;
unsigned long Skvajnost;
bool Status=0;
int rotator,rotaprev, promro;
String ss;

//ПИНЫ
int OUTSPEEDPIN=4; //ПИН ВЫХОДА - НА СПИДОМЕТР
int INPEEDPIN=7; //ПИН ВЫХОДА - имитатор датчика скорости
#define PIN_POT A7 //ПИН СИГНАЛА ОТ ПОТЕНЦИОМЕТРА ПОПРАВКИ

//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
if(!st){micros_sp = micros();}
else {sp = (600000/(micros() - micros_sp));}
st = !st;
sz = 30;
}
//********************************************************************
void setup(){
Serial.begin(115200); //инициализация ком порта
attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса

pinMode(PIN_POT, INPUT);
pinMode(OUTSPEEDPIN, OUTPUT);

digitalWrite(OUTSPEEDPIN, LOW);

}
//********************************************************************


void loop()
{



if (millis() - timing > 50)
{
timing = millis();

if (millis() - timer > 1500) //циклическое изменение скорости
{
timer = millis();
Speed=Speed+10;
InputSpeed=Speed;
}

OutputSpeed=InputSpeed+8; //*popravka; //Вычисление правильной скорости


if (OutputSpeed>110 ) //зацикливание вывода скорости
{
Speed=0;
OutputSpeed=0;
InputSpeed=0;
}
else
{

if (OutputSpeed>1) //если скорость положительная, то делаются все вычисления и вывод в монитор
{
Period=600000/OutputSpeed;

ss="Speed="+String(Speed)+" Скорость 1="+String(InputSpeed)+" Скорость 2="+String(OutputSpeed);
Serial.println(ss);

//Генерируем импульсы для СПИДОМЕТРА с периодичностью 50 мсек
Skvajnost= Period/2 ; //такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(OUTSPEEDPIN, HIGH);
Status=1;

Serial.println("out High");
}
}

if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(OUTSPEEDPIN, LOW);
Status=0;
Serial.println("out Low");
}
}

}
else
{
Period=0; //Вычисление периода импульса
}

}
}
}

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

Добавлено: 05 авг 2021, 11:05
Артур
Ну позвони мне, или напиши.

Блин, ну зачем ты тронул код генерации импульсов, это вообще не так работает. Я не пойму зачем ты написал вывод в порт смену hight и low. Что ты хочешь этим посмотреть? Этот код генерирует шим с 50% скважности от периода. Период вычисляется по формуле 600000/входящую скорость. Его вообще не трогай. И убери вывод в порт. Hight low формирует импульс. Вычисляется период, сколько времени длится импульс, допустим 2 милисекунды. Значит 1 миллисекунду надо подавать +12 вольт ( hight) и 1 миллисекунду НОЛЬ (low).

Позвони, обьясню.

Отправлено спустя 13 минут 29 секунд:
Зачем ты сделал сдвиг +8. ?

Отправлено спустя 2 минуты 16 секунд:

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


if (OutputSpeed>110 ) //зацикливание вывода скорости
{
Speed=0;
OutputSpeed=0;
InputSpeed=0;
}
else

Зачем это?

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

Добавлено: 05 авг 2021, 12:20
arristo
Немного не понял трагизма ситуации.

Вывод в порт вывел просто посмотреть как исполняются команды записи импульса. Получилось, что длительность импульса устанавливается в цикле опроса спидометра в строке
if (millis() - timing > 50) //ведь это цикл опроса?
{
timing = millis();
Потому как пишется сперва 12 в, потом ввиду того, что Status изменился, уходит на новый цикл и только потом пишется low.
чтобы писать именно импульс, надо делать delay на длину импульса.

Зацикливание вывода скорости - чтобы менялась скорость на выводе. Доводилась до предельной и опять обнулялась. Чисто тестовый параметр, чтобы не перезаливать прогу с заменой скорости каждый раз.

Сдвиг 8 это и есть постоянная поправка, чтобы не умножать, а тупо прибавлять. Тестовый параметр.
-------------------
Это простые тестовые решения для теста работы скетча, ничего глобального они не делают. А вот исполнение полупериода реального импульса это странно. Или я чего-то не понимаю.

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

Добавлено: 05 авг 2021, 12:39
arristo
digitalWrite(OUTSPEEDPIN, HIGH);
delayMicroseconds(Skvajnost);
digitalWrite(OUTSPEEDPIN, LOW);