Корректор электронного (стрелочного) спидометра на ARDUINO
- Артур
- Друг клуба
- Сообщения: 1621
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Нет, залил - поехал. Внимание: код я не проверял на работоспособность. Напиши пожалуйста, если старый код у тебя работает, а новый не будет, исправлю.
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
К сожелению не заработал. но это видимо из за того что датчик абс у меня двухпроводной. На столе от генератора импульсов жизнь была. Есть ли возможность изменить код под двухпроводной датчик? Датчик бош на 128 ом сопротивлением. Одной ногой на минусе...
Корректор электронного (стрелочного) спидометра на 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 = 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;
}
Вот этот работает. правда стрелка порой скачет . но это на столе. в машине не пошел...
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;
}
Вот этот работает. правда стрелка порой скачет . но это на столе. в машине не пошел...
- Артур
- Друг клуба
- Сообщения: 1621
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
В коде нечего менять.
Датчик надо правильно подключать.
Видимо нет резистором подтяжки на 5 вольт
Датчик надо правильно подключать.
Видимо нет резистором подтяжки на 5 вольт
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
Видимо все же дело в датчике, он у меня аналоговый. Переводить из аналога в цифру то ещё занятие...
Корректор электронного (стрелочного) спидометра на ARDUINO
Как настроить последний код? У меня спидометр и тахометр, и тот и другой врут, Тахо занижает а спидо наоборот завышает
Корректор электронного (стрелочного) спидометра на ARDUINO
Как откатать для точного показометра?
- Артур
- Друг клуба
- Сообщения: 1621
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
последний код я не доделал, он не имеет калибровок спидометра по шагам, только один общий коэффициент на весь диапазон от нуля до бесконечности.
Арифметически, разгоняешся до 100км/ч по GPS, смотришь что показывает твой стрелочный спидометр, к примеру он у тебя показывает 86км/ч.
Сто делишь на восемьдесят шесть, будет равно 1,16. Вот твой коэффициент. Если показывает больше ста, пусть 140, всё тоже самое
100 : 140=0,714.
Вносишь 0,714 в код программы, заливаешь в ардуино. PROFIT.
Для тахометра либо методом на глаз, либо если ты знаешь, сколько твой датчик тахометра выдаёт импульсов на оборот, прямо в арудинке можешь выводить в монитор порта количество импульсов с датчика тахометра (или с ЭБУ), далее смотришь на экране компьютера , сколько импульсов даёт, сопоставляешь со своим стрелочным. Арифметически находишь коэффициент, записываешь в скетч, прошиваешь. PROFIT.
Арифметически, разгоняешся до 100км/ч по GPS, смотришь что показывает твой стрелочный спидометр, к примеру он у тебя показывает 86км/ч.
Сто делишь на восемьдесят шесть, будет равно 1,16. Вот твой коэффициент. Если показывает больше ста, пусть 140, всё тоже самое
100 : 140=0,714.
Вносишь 0,714 в код программы, заливаешь в ардуино. PROFIT.
Для тахометра либо методом на глаз, либо если ты знаешь, сколько твой датчик тахометра выдаёт импульсов на оборот, прямо в арудинке можешь выводить в монитор порта количество импульсов с датчика тахометра (или с ЭБУ), далее смотришь на экране компьютера , сколько импульсов даёт, сопоставляешь со своим стрелочным. Арифметически находишь коэффициент, записываешь в скетч, прошиваешь. PROFIT.
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
Грустно, у меня спедо нелинейная шкала, до 60км терпимо, разбег около 4кмч, а вот выше разбег почти в 20км на 140кмч
-
- Сообщения: 1
- Зарегистрирован: 19 ноя 2023, 17:28
- Бус: Т2
Корректор электронного (стрелочного) спидометра на ARDUINO
Подниму тему.Всем здравствуйте! Кто небудь собирал адаптер датчика топлива.Собрал,прошил ардуинку не работает,стрелка прыгает и все!( Пните пж в нужную сторону.
- Виктор Викторович
- Друг клуба
- Сообщения: 7525
- Зарегистрирован: 03 дек 2010, 23:57
- Бус: Т-3 1,8 ABS, ADZ
- Откуда: Ростов-на-Дону
Корректор электронного (стрелочного) спидометра на ARDUINO
Mono-Motronic 1.2.3
Люблю Су - 27, баню и футбол.
Люблю Су - 27, баню и футбол.
- Артур
- Друг клуба
- Сообщения: 1621
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
ИванИванович, в этой теме нет готового рабочего решения, не знаю что за прошивку и куда вы залили. Я пытался, у меня не получилось, так как нет подходящего по номиналам электронного потенциометра, эмулировать штатный датчик нечем.
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
Привет, на днях буду тестить. Сегодня испытывал на столе с 555 - выявил, что оптопара без резистора и с чересчур большим (10к при 5В) - не работает, либо работает с определенной скорости. На днях буду допиливать, внедрять. Год назад читал тему, думал сделать корректор спидометра на 10% и корректор тахометра в 1.5 раза. А тут судьба намотала косу датчика скорости на кардан и датчик скорости окончательно помер. Датчик от 50к стоит, а аналоги выдают сигнал в 2-4 раза меньшей частоты чем завод. Боязнь что дуинка будет помехи ловить и глючить. Если бы дело было просто в показометре - плевать. Но с показометра сигнал идет в ЭБУ-ЭБУ акпп, а они уже могут и будут ругаться на неправильный сигнал. Буду изучать как защитить от помех помимо 7805+кондеры+дроссели+экранирование.