Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 18 фев 2020, 17:54
Артур
Добрый день!
Я тут пытался найти исходники корректора спидометра в интернете. В итоге сделал все сам, ибо нету. Нашел только исходник спидометра и применил его в своём проекте.
unnamed.jpg
Транзистор я применил какой валялся в ящике - kc238b, кажется это аналог обычного кт315, точно не помню. 3 цифровой pin на ARDUINO это сигнал с датчика скорости (у меня на бусе применен датчик фаз от 8 клапанного ВАЗ) 4 цифровой pin на ARDUINO это выход на стрелочный спидометр.
Спидометр я применил от УАЗ. Он дешевый и его легко встроить в нашу приборку вместо родного тросового.
A0 - аналоговый вход, сюда подключается потенциометр для регулировки. Можно любой.
Я применил 3,3kOm (контакты слева направо GND/СИГНАЛ/+5V)
//********************************************************************
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;
}
Отправлено спустя 3 минуты 33 секунды:
Только вместо Hz в прошивке км/ч . При 100hz показания равны 60км/ч
название переменных подправлю потом для феньшуя.
Все и так работает.
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 18 фев 2020, 18:20
РЕКЛАМА
То есть это электронный редуктор.
Правильно?
Можно сопрячь любой датчик скорости с любым спидометром?
Электронным естественно.
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 18 фев 2020, 19:02
Артур
Да.
Входящий сигнал квадратный. Меандр. 5в
Выходящий такой же.
Отправлено спустя 13 минут 6 секунд:
Теоретически я могу даже сделать корректор механического спидометра, если снабдить мою схему моторчиком и рулить его скоростью по показаним с датчика скорости который нужно повесить на трос спидометра. На вал моторчика сделать насадку квадрат и воткнуть его в спидометр.
Это просто, но это колхоз, лучше нормальный репер на шрус поставить и поставить другую приборку, или в нашу электронный спидометр воткнуть
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 18 фев 2020, 21:14
михалыч
Хорошая штука, эта плата способна ещё и корректировать тахометр, в случае изменений количества цилиндров. Вещь!
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 19 фев 2020, 00:09
Артур
Добавил корректор тахометра. Теперь изделие 2в1
В архиве скетч на 6 цилиндровые прибоки от мотора с 4 цилиндрами. Коэффициент в программе можно любой поставить. Сейчас коэффициент стоит 1.5
sketch_may30a.rar
У меня в планах сделать в итоге, повесить ардуину (arduino pro mini) в приборку, чтобы она не только мерила скорость, но и мерила количество бензина в баке от ВАЗ датчика и согласовывала со стрелкой в нашей приборке.
А также хочу на её основе климат-контроль в бусе сделать. Пинов свободных много - пусть замеряет температуру в салоне и заслонками рулит.
Если хватит её ресурсов, чтобы это все одна плата делала.
РЕКЛАМА писал(а): ↑18 фев 2020, 18:20
Можно сопрячь любой датчик скорости с любым спидометром
Можно хоть на сигнал от датчика ABS повесить (а там много зубов на оборот, около 60 шт). Только коэффициент правильно подобрать.
Любой репер можно, с любым количеством зубов. Главное чтобы датчик давал квадратный сигнал от 0 до 5 вольт и подобрать коэффициент умножения.
A0 pin ардуино - вход от потенциометра регулятора спидометра (у меня применен 3,3кОм)
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;
}
Отправлено спустя 33 минуты 9 секунд:
3_o5ru-ly.jpg
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 19 фев 2020, 06:23
ПРОЖЕКТОР
нравится образ мышления (подход к решению задачи), как было сказано в одном из анекдотов
Артур писал(а): ↑19 фев 2020, 00:09
А также хочу на её основе климат-контроль в бусе сделать. Пинов свободных много - пусть замеряет температуру в салоне и заслонками рулит.
Если хватит её ресурсов, чтобы это все одна плата делала.
должно хватить. Люди "умные" дома собирают на Ардуино и где-то я видел в инете проект человек делал что-то вроде Января для управления двиглом.
Я не сильно силен в электронике (сын помогает), но как Ардуина на помехи будет устойчива в авто? Делал как-то управление потенциометром скоростью маленького движка и оказалось, что ее может изрядно глючить, даже если движок сравнительно далеко от платы (около 1,5м)
п.с. мысль в голову: если планируешь решать много задач на Ардуино, то может быть имеет смысл поставить где-то TFT панельку сенсорную? сейчас можно сравнительно недорого взять 10-12". Причем программа для создания визуалиции прилагается и там уже много заготовленных кнопок, индикаторов и т.п. с досточно простой привязкой к контроллеру
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 19 фев 2020, 08:14
юрасик
Пипец! Маньяки! Что-то новое придумаете; выкладывайте: снова буду офигевать
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 19 фев 2020, 08:40
Артур
Было такое, если в нее просто проводок воткнуть 5см, то показания с этого пина начинают прыгать в большом диапазоне, действительно антена-помехолов получается. Ардуинщики предлагают через резистор на ноль соединять, чтобы когда сигнала нет, там на пине его действительно не было.
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 19 фев 2020, 09:02
romanes
В "прошлой" жизни был инженером-разработчиком автомобильной электроники, занимался в основном датчиками (на основе микроэл. технологий). Серьезной проблемой была именно помехозащищенность. ЭДС, например, при выключении дальнего света составляла пару сотен вольт, проводов всяких в машине много. Даже если не убивала (разработали потом ограничительный диод), то коррективы вносила серьезные, т.к. были еще "вторичные" наводки и диапазон температуры и много еще чего. Подкапотное пр-во это вообще веселое место.
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 19 фев 2020, 10:56
РЕКЛАМА
Да. Задействованные в работе ноги не должны висеть в воздухе никогда. Иначе на них может появляться потенциал, который Ардуина может интерпретировать как полезный сигнал и что-то включить-выключить не по плану.
Сам когда на ворота автоматику делал столкнулся с этим.
Сидишь себе такой дома, а ворота взяли и открылись...
Это при том что даже внутренний "виртуальный" подтяжечный резистор был включен на этой ноге.
Пришлось отключить и повесить настоящую подтяжку.
Корректор электронного (стрелочного) спидометра на ARDUINO
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 19 фев 2020, 15:33
Артур
Маньяк? Скорее щедрый скупердяй.
Такое устройство готовое стоит в магазине от 2000р и выше. Я же зажилил эти деньги и сделал дешево (300р)
и бесплатно всем раздал.
У меня есть. Просто я как-то не вижу смысла. Что туда выводить? Температуру в салоне или положение заслонок. А зачем, если это уже и так все будет крутилками выставлено. В салоне ночью лучше иметь поменьше всякой индикации, отвлекает.
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 19 фев 2020, 15:54
ПРОЖЕКТОР
по поводу смысла спорить не стану, хотя иногда смысл можно и за уши притянуть))
возможно на нее как-то удастся картинку с камеры задней вывести, первое, что пришло в голову по поводу смысла
а иллюминацию ночью вполне той-же Ардуиной контролить можно, когда панелька через пару минут после последней манипуляции уходит в режим ожидания и откликается лишь на касание вновь. Наверное это как-то можно реализовать
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 21 фев 2020, 11:11
юрасик
Артур писал(а): ↑19 фев 2020, 15:33
бесплатно всем раздал.
Странно! А мне ни чего не досталось почему-то
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 21 фев 2020, 11:22
ogurets
Хорошая штучка !
Делал подобное но только програмил в визуалке - там всё проще.
Прикольно получается когда макет с стола переносишь в реальность, там куча помех и шума, с обоих сторон лучше поставить оптический "забор"
Проходил это в промышленом примирении и автомобильном.
Ещё на заметку d2,d3 это пины внешнего прерывания - скоростные счетчики.
Корректор электронного (стрелочного) спидометра на ARDUINO
Архив с исходным кодом прикреплен к моему посту. Вот это и есть основная ценность - скачай и скопируй его в Arduino ide.
Отправлено спустя 2 минуты 18 секунд:
Артур писал(а): ↑19 фев 2020, 00:09
Добавил корректор тахометра. Теперь изделие 2в1
В архиве скетч на 6 цилиндровые прибоки от мотора с 4 цилиндрами. Коэффициент в программе можно любой поставить. Сейчас коэффициент стоит 1.5 download/file.php?id=177038
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 05 мар 2020, 15:58
Артур
Приступил к дополнению изделия -
ТЕПЕРЬ С КОРРЕКТОРОМ УКАЗАТЕЛЯ УРОВНЯ ТОПЛИВА.
Заказал AD8400ARZ1, Одноканальный цифровой потенциометр.
Как получу его, закончу изделие.
Идея такова:
Я использую цифровой потенциометр на 1кОм (с количеством шагов 250). Ардуино будет принимать сигнал от датчика уровня топлива и корректировать и записывать нужные показания в цифровой потенциометр.
Таким образом это нам позволит использовать абсолютно любой датчик уровня топлива (к примеру от ВАЗ).
на драйв.ру и у человека я подсмотрел наши показания:
пустой = 317ом
1/4 = 140ом
1/2 = 85ом
3/4 = 50ом
полный = 35ом
таким образом можно в скетче внести эти "табличые" значения и ардуинка будет рулить стрелкой.
Теперь плату в бак на поплавок ставьте от чего хотите, по барабану.
40-251919051k.jpg
Отправлено спустя 4 минуты :
Сравнение версий ардуино
20200305_155550.jpg
Большая это UNO,
Маленькая это Pro mini
20200305_155513.jpg
Собрал навесным монтажем.
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 05 мар 2020, 20:48
ПРОЖЕКТОР
Молодца , что еще тут можно сказать
на мини 56 выводов или меньше? сын вроде говорил что 56, но сам я ее в живую никогда не юзал
Корректор электронного (стрелочного) спидометра на ARDUINO
Добавлено: 06 мар 2020, 00:50
Артур
Откуда 56? Столько же, сколько и на uno, просто pro mini габаритные размеры меньше в три раза. Самое оно в приборку встраивать такую крошку.
Pro mini.
У нее нет встроенного ttl usb переходника. Но он и нафиг не нужОн. Один раз записал скетч в нее, снял переходник и забыл про него - больше не нужен.
Отправлено спустя 2 минуты 20 секунд:
671.970.png
Отправлено спустя 6 минут 58 секунд:
Наверно речь про ардуино мега
Там вроде много очень пинов
На драйве увидел правильные способы включения датчиков.
Тахометр и спидометр включены через оптрон с подтяжкой на 5в. Это правильно я считаю, ведь неизвестно какого уровня напряжения может прилететь импульс от датчика скорости, может пожечь ардуино.
Также я подключая датчик уровня не учел, что надо датчик в баке подтягивать к 5 вольтам через резюк, иначе ардуино сигнал с него не увидит.
1IAAAgF6OeA-960.jpg
ecAAAgF6OeA-960.jpg
Корректор электронного (стрелочного) спидометра на ARDUINO