
Во многих проектах использования Arduino в автомобиле, существует необходимость считывать показания датчика скорости или обороты двигателя.
В общем случае задача сводится к измерению частоты импульсов и перевода в км/ч или об./мин. Ниже приведен код для спидометра, использующий внешнее прерывание.
//********************************************************************
unsigned long micros_sp;
volatile int sz; //счетчик обнуления
volatile int sp; //скорость
//********************************************************************
void setup(){
Serial.begin(115200); //инициализация ком порта
attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса
}
//********************************************************************
void loop(){
Serial.print (sp);
sz = sz — 1;
if (sz == 0){
sp = 0;
}
delay(50);
}
//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
sp=(600000.0/(micros() — micros_sp));
micros_sp= micros();
sz = 30;
}
Код работает следующим образом:
При получении фронта импульса на входе с прерыванием, срабатывает обработчик прерывания void speedometr(). В обработчике из текущего значения системного таймера "micros()" отнимается предыдущее значение этого таймера, записанное в переменную micros_sp. Таким образом мы получаем время между импульсами, то бишь период, в микросекундах. Зная период вычисляем частоту "f = 1000000/(micros() — micros_sp) Гц". Переводим Гц в км/ч "sp = 0.6 *1000000/(micros() — micros_sp)" (для 6-ти импульсного датчика скорости). Запоминаем текущее значение таймера "micros_sp= micros()" для использования в обработке следующего импульса. Переменная
"sz" служит для обнуления значения скорости, если с момента прихода последнего импульса блок "void loop()" выполнился 30 раз, то есть если скорость равна нулю и новые импульсы не приходят. Для некоторых датчиков прерывание по фронту (RISING) может не корректно обрабатываться. В этом случае следует использовать прерывание по спаду(FALLING). Аналогичным образом обрабатывается сигнал зажигания. При переводе Гц в об/мин. следует помнить что в 4-х цилиндровых 4-х тактных двигателях за один оборот коленвала приходит два импульса зажигания.











Комментарии 56
Если что, то для тахометра нужно выставить вместо 600 000 -> 30 000 000
Тестовый скетч, чтобы менять частоту нужно подключить потенциометр в PB1
// Код для STM32F103C8T6 Blue Pill
unsigned long tmr, tmrSpeed;
int speed = 0; //скорость
int potRead = 0, szero = 0;
void setup() {
Serial.begin(9600);
pinMode(PA8, INPUT_PULLDOWN); // SPEED или RPM
pinMode(PA6, INPUT_PULLDOWN); // Подача импульсов с PA6 на PA8 по проводу
attachInterrupt(digitalPinToInterrupt(PA8), SpeedResult, FALLING); // Прерывание срабатывает когда есть импульсы
//RPM максимум 239 Гц ~7200 об/м — это для bosch 7.9.7 или Январь 7.2
//SPEED максимум 320(365) Гц 220 км/ч — это для bosch 7.9.7 или Январь 7.2
}
void loop() {
Speed();
potRead = map(analogRead(PB1), 0, 4095, 0, 365); // Чтение с потенциометра на PB1
tone(PA6, potRead); // Подача частоты с PA6
delay(100); // Задержка чтобы генерируемая частота была стабильной
}
void Speed() {
if (millis() — tmr >= 100) {
tmr = millis();
Serial.print("Speed ");
Serial.println(speed);
szero != 0 ? szero-- : speed = 0; // Обнуление скорости когда нет импульсов
}
}
void SpeedResult() {
speed = (600000.0 / (micros() — tmrSpeed)); // rpm 30 000 000, speed 600 000
tmrSpeed = micros();
szero = 3;
}
Спидометр вижу тахометр нет …
Ребята помогите собрать на ардуине делитель импюльсов. Чтобы при установке япона моторов на газели и тд скорость и тахо работали правильно
Приветствую.
К какому пину ардуино подключается сенсор (в моём случае датчик холла)? В примере кода я не вижу знакомых букв (я не умею программировать, пытаюсь слепливать готовые скетчи), извините.
Нашел подобный по функциям код, но для тахометра, там функция не micros a millis с данными 60 импульсов на оборот, какой множитель нужен, если на редукторе 6 магнитов? Спасибо, и еще раз простите за такие лёгкие и глупые для вас вопросы. Я пол часа только пытался скомпилировать и исправлял ошибки, т.к. простое копирование текста привело к замене символов ))
А как сделать наоборот что бы аналоговый сигнал тахометра поступал в какую-то схему а из этой схемы выходили два провода типо кан шины и поступали по этим проводам в панель приборов уже цифровой сигнал и заставил работать стрелку тахометра. Вот задача так задача. Вот немцы до этого додумались но ценник бешеный
Прошу прощения, но! я так понимаю что используется 20 порт ардуино мега или Уно? или 21 у леонардо… Я прав? если нет то подскажите пожалуйста порт… и с чего конкретно можно взять датчик?
не могли бы подсказать как сделать так чтобы конвертировать импульсы? для свапа обычно делают коректор спидометра
Интересная идея, спасибо!
Если ардуино будет видеть (понимать) обороты двигателя — то я смогу настроить заранее запрограммированные обороты двигателя на круизе.
То есть сделать "память круиза"
-разогнался на пятой передаче до 80-90 км/час
-включил кнопку "ПАМЯТИ КРУИЗА", = цель достижение 3тыс. оборотов двигателя и Ардуино сама будет плюсовать "кнопкой круиза" пока не увидит с датчика тахометра эти обороты (надо найти как подлючиться к нему)
===============================
В планах это, покритикуйте!
Безопасность управления круизом:
— Нажатие на педаль ТОРМОЗА отключает (обесточивает) питание АРДУИНО управления круизом.
— Линия управления круизом ДОПОЛНИТЕЛЬНО разрывается от Ардуино механическим переключателем на торпеде
— Перед началом каждого действия АРДУИНО зажигает на 70 мС красный 0,5вт светодиод на панели проборов — предупреждая о начале работы автоматизиции.
Алгоритмы управления круизом:
1) Быстрый разгон — нажать за 1 секунда 5-6 раз кнопку "ПЛЮС" круиза.
2) Плавный (экономичный) разгон — нажимать кнопку "ПЛЮС" круиза 1 раз каждую секунду, пока не достигнута нужная скорость
3) Быстрое торможение двигателем — нажать кнопку "МИНУС" круиза 5-6 раз
4) Плавное торможение двигателем — нажимать кнопку "МИНУС" круиза 1 каждую секунду, пока не достигнута нужная скорость.
5) Снижение скорости круиза в горку и восстановление скорости на прежний уровень после горки:
— для начала работы снижения скорости круизом авто должно быть на ровном (угол наклона менее 5 градусов) участке дороги не менее 60 секунд. Этим мы отключаем работу автоматики при езде в горку на ручном режиме — автоматика должна работать ТОЛЬКО если мы с ровного места начинаем ехать в горку.
— нажать один раз кнопку "МИНУС" круиза через 20 секунд после того, как угол наклона составляят более 15 градусов. — продолжать нажимать кнопку "МИНУС" ещё три раза, по одному разу каждые 10 секунд если угол наклона не уменьшается.
— если угол наклона (горка) стала меньше 5 градусов — начать нажимать "ПЛЮС" круиза четыре раза с интервалом 10 секунд между нажатиями.
Пункт 5
— подобрать уровень наклона, количество коррекций круиза и интервалы между коррекциями опытным путём.
— сделать 2-3 варианта в зависимости от угла наклона горки (пологая, средняя, крутая).
Всем привет набросайте кто-то схему подключения к ВАЗУ 21099 инжектор с номиналами деталюшек и пинами на контроллере
взял в разработку. в процессе свапа двига с кпп деряю датчик скорости ибо у донора скорость с абс снимается. посредством ардуино планирую также с репера колесного снимать импульсы .пересчитывать и гнать на приборку и мозги. Спасибо за идейку.
arduino.cc/en/Reference/pulseIn
так попроще
Боюсь что не проще ))) Жаль что Вы этого не понимаете.
Так, объясните, может, я осилю )
pulseIn измеряет длину импульса, не всегда длина импульса соответствует половине периода и получить точное значение частоты не возможно. Кроме того пока pulseIn ждет изменения уровня, другой код не выполняется.
это я понимаю, и согласен с этим, это конечно важно, особенно атомарность.
Только это не усложняет, а, скажем так, ограничивает область использования.
Если речь идет о простых спидометрах или тахометрах, то вполне можно обойтись pulsein.
Они и сами по себе прилично сглаживают, нет необходимости считать до каждого импульса, если Вы конечно, не ЭБУ программируете.
Таймаут в мкс у pulsein есть, а на больших периодах стрелка показометра все равно лежит.
Добрый день. Интересует следующая возможность ардуины =) После свапа движка и коробки спидометр и тахометр, лежат мертвым грузом, при подключении к датчику скорости вторичного вала коробки спидометр зашкаливает на первой передаче. Известно то что на родной коробке было 4 зуба которых считывал датчик и давал естественно 4 импульса в период времени, сейчас же 12 зубов, и поэтому стрелку кладет. Реально ли с помощью ардуино реализовать что то типа делителя импульсов?
можно довольно легко
Но я понимаю что будет небольшая задержка, но не особо критичная? =)
Задержка зависит от того как именно реализовывать
Думаю можно реализовать даже на лету… т.е. на выход подавать импульс, через каждый 3 входных импульса. Соответственно задержка будет на 2 ненужных импульса :-/
Хммм, надо бы себе прикупить датчик скорости да потестить, найти его на мой тазик будет сложно…
Вот как то без задания начальных значений в переменных некрасиво… Сразу sz в "-" уходит, проходит весь [- int…+int], доходит до "0" c 50 мс интервалами… и только потом sp=0.
micros_sp задается после первой интерации, и первоначально равно черти чему, не исключено что "0". И тогда делителем является каждый раз разное число… Все таки это как то не очень красиво…
Согласен что код можно доработать, но он и в таком виде прекрасно работает
Ну, работать то работает, ибо здесь точность нужна как при подсчете гречи ;) Но "начинающим" подобные примеры дают неправильное направление в написании собственного кода… Это когда уже знаешь, где чем можно пренебречь, можно и расслабится. А по началу — лучше точно себе представлять, что творится в твоей программе…
Поддерживаю! =)
Хорошо расписан принцип измерения. А куда его вставить каждый сам для себя решает.
Не знаю… Но я наверное бы, для этой цели, использовал __ pulseIn(pin, value, timeout) __
pulseIn измеряет длину импульса, не всегда длина импульса соответствует половине периода. Кроме того пока pulseIn ждет изменения уровня, другой код не выполняется.
Вот это интересно. Допустим мне надо считать скорость, обороты и расход. сигнал расхода берется с форсунок, и высчитывается из времени открытия форсунки. Как организовать таким образом чтобы эти три прерывания не мешали друг другу работать?
так же дизлайк потому что тратить столько денег на покупку ардуино и комплектующих ради КАКОГО то там тахометра, пф.
Не видите дальше собственного носа. Точнее представленного примера. Это только принцип измерения, а куда вы уже его примените — это зависит только от вашей фантазии. Если кроме того, как спидометр или одометр сделать на ардуине не можете придумать, то конечно глупо заниматься.
Просто кто-то придумывает новые коды и схемы (как автор поста), а кто-то может только содрать готовое и потому требует выдать схему и код на готовое устройство (как denisn73). Серым веществом надо пользоваться…
Вы если не знаете не стоит оскорблять. Мне ваши схемы и простые коды не нужны, они нужны начинающим. У меня своих разработок немерено которым позовидуешь!
Извините, не было умысла обидеть.
Считаю этой инфы достаточной для реализации части кода программы. А насчет подключения — ну да, можно было-бы предложить вариант.
Дизлайк за пост! Какой смысл от кода если его некуда залить даже. Выложили бы схему (СВОЮ), фото устройства, с описанием работы, и от чего импульсы брать. Ведь на реальном устройстве в зависимости от схемы и способа снятия сигнала будет зависить работоспособность устройства.
данный код используется в нескольких проектах. Постить все схемы нет смысла, они разные
Можно вопрос, не хочу тему отдельную создавать как подключить ардуину для измерения оборотов на ваз 2107 с БСЗ, откуда брать сигнал?
можно с датчика положения коленвала через оптопару, только изменить коэффициент пересчета частоты в обороты.
у меня нет датчика положения коленвала, извини забыл написать что карб, пробовал с датчика хола через оптопару машина не держит холостой, а если через вход тахометра он идет с минуса катушки зажигания, нужны ли какие резисторы или тоже через оптопару можно?
У себя на карбе беру именно с датчика холла, с фишки коммутатора. Пробовал с катушки — помех много
Я когда оптопару подключал к датчику хола то машина глохла и на газ, неодекватна реагировала вся дергалась, может я что не так подключил, можешь схемку нарисовать. А когда я подключил к катушке, подумал минус на катушке резисторов и прочего не надо и пальнул ардуинку вот жду с китая новую, не хочется и новую спалить
я через делитель подключал. 47к/100к
47к к среднему контакту датчика хола а 100к к минусу правильно?
Наоборот. www.drive2.ru/l/5209954/ здесь схема моего подключения. 6-я фишка коммутатора — датчик Холла
спасибо очень помогло, а скетч мне не можешь скинуть?
Frud
Наоборот. www.drive2.ru/l/5209954/ здесь схема моего подключения. 6-я фишка коммутатора — датчик Холла
Подскажи, пожалуйста, на копейке 73 года импульсы снять можно только с катушки? Если с первичной обмотки стабилизировать 12 с помощью L7812 и понизить делителем 120/100кОм, то можно получить чистые 2 импульса на 1 оборот дрыгателя)))) если не прав — поправьте плиз)))
Lexxx007
у меня нет датчика положения коленвала, извини забыл написать что карб, пробовал с датчика хола через оптопару машина не держит холостой, а если через вход тахометра он идет с минуса катушки зажигания, нужны ли какие резисторы или тоже через оптопару можно?
хоть с минуса катушки — защити вход сопротивлением в 100кОм зашунтированным сопротивлением в 0.1мкф и получишь импульс когда срабатывает катушка.
исходная частота умножается на 30 и получаешь обороты.
DenisFPV
Дизлайк за пост! Какой смысл от кода если его некуда залить даже. Выложили бы схему (СВОЮ), фото устройства, с описанием работы, и от чего импульсы брать. Ведь на реальном устройстве в зависимости от схемы и способа снятия сигнала будет зависить работоспособность устройства.
Это сообщество АРДУИНЩИКОВ и схема здесь одна … и всем она известна …
а есть в реальном исполнение?
данный код успешно используется на нескольких автомобилях
а можно будет замутить в графическом стиле?имею ввиду сделать на экране на не большом
А как грамотно ввести коррекцию скорости от размера резины, что б человек в меню мог ввести размерность колеса и все…
Либо надо заставить вводить длинну окружности колеса?
Нужно умножать значение скорости на коэффициент. K = длина окружности не стандартной резины/длина окружности стандартной резины.
поидее можно вбить основные размеры резины для той машины, для которой разрабатывается БК да и все?
размеров 30-40 не более будет. Не сильно много ж хранить в пзу получается…
Наверное проще вычислять L = Pi * d.
К примеру длина окружности колеса 155/70R13 = Pi * (155 * 2 * (70/100) + 13 * 25,4) = 1718,208 мм
от полученного можно отнять износ протектора в мм. :)
Можно и давление в колесе учитывать )))
Dobrinia
А как грамотно ввести коррекцию скорости от размера резины, что б человек в меню мог ввести размерность колеса и все…
Либо надо заставить вводить длинну окружности колеса?
запостил свой вариант корректора VSS.
на машине не тестировал, поэтому вынес на обсуждение отдельным постом.