Как сделать тахометр на ардуино
Сообщества › Arduino для автомобиля › Блог › Измерение частоты с помощью Arduino (спидометр и тахометр)
Во многих проектах использования 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-х тактных двигателях за один оборот коленвала приходит два импульса зажигания.
Комментарии 55
Спидометр вижу тахометр нет …
Ребята помогите собрать на ардуине делитель импюльсов. Чтобы при установке япона моторов на газели и тд скорость и тахо работали правильно
Приветствую.
К какому пину ардуино подключается сенсор (в моём случае датчик холла)? В примере кода я не вижу знакомых букв (я не умею программировать, пытаюсь слепливать готовые скетчи), извините.
Нашел подобный по функциям код, но для тахометра, там функция не 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 варианта в зависимости от угла наклона горки (пологая, средняя, крутая).
Тахометр на Arduino
В этой статье мы рассмотрим, как использовать ИК-передатчик и приемник для изготовления тахометра с применением Arduino. Результат отображается на ЖК-дисплее 16х2.
Целью данного проекта является создание системы с одним входом и одним выходом. На входе устройства присутствует сигнал, изменяющийся с высокого (+5В) на низкий (+0В) уровень при нарушении связи. Согласно этому сигналу, Arduino будет увеличивать значение внутреннего счетчика. Потом проводится дополнительная обработка и расчет, и по прерыванию триггера на ЖК-дисплей будет выводиться рассчитанное RPM.
Для связи мы будем использовать ИК-луч от ИК-светодиода, включенного через низкоомный резистор так, чтобы светиться ярко. В качестве приёмника мы будем использовать фототранзистор, который при отсутствии света ИК-светодиода «закрывается». Компьютерный вентилятор будет размешен между ИК-передатчиком и приёмником и включен. ИК-приёмник включенный через транзисторную схему, будет генерировать прерывания. Для вывода результата будет использоваться Arduino LCD интерфейс, поэтому мы можем вывести окончательное значение RPM на ЖК-дисплей.
Элементы:
Arduino UNO
16×2 LCD
Макетная плата
Подстроечный резистор 5 кОм
Перемычки
SIP разъёмы
2x 2N2222 NPN транзистор
Инфракрасный светодиод
Фототранзистор
Резистор 10 Ом
Резистор 100 кОм
Резистор 15 кОм или 16 кОм
Компьютерный вентилятор
Подробный список элементов
Все элементы используемые в проекте указаны выше, но я более подробно опишу функции основных элементов.
Arduino UNO
Это плата Arduino, которую мы будем использовать для обработки импульсов от прерывания ИК-луча, которые сообщают о нахождении лопасти компьютерного вентилятора между приемником и датчиком. Arduino будет использовать эти импульсы наряду с таймером, чтобы вычислить RPM вентилятора.
ЖК-дисплей 16×2
После того, как Arduino вычислило RPM, эта значение будет отображаться на дисплее в понятном для пользователя виде.
Подстроечный резистор 5 кОм
Этот подстроечный резистор будет использоваться для регулировки контрастности ЖК-дисплея 16×2. Он дает аналоговое напряжение в диапазоне от 0 до +5В, позволяя настроить яркость ЖК-дисплея.
Инфракрасный светодиод и Фототранзистор
Фототранзистор открывается, когда мощный ИК-свет падает на него. Поэтому, когда ИК-светодиод горит, он держит фототранзистор открытым, но если ИК-светодиод закрывается например, лопастью вентилятора, то фототранзистор закрывается.
2N3904 и 2N3906
Эти транзисторы используются для преобразования уровня сигнала, с целью обеспечения выходных импульсов с фототранзистора для Arduino, в которых нет никаких напряжений кроме +0 и +5В.
Принципиальная схема
В схеме, интерфейс связи с ЖК-дисплеем упрощен и имеет только 2 линии управления и 4 линии передачи данных.
Особенности схемы
Интерфейс ЖК-дисплея 16×2
2 управляющих контакта и 4 для передачи данных подключены от Arduino к ЖК-дисплею. Это то, что указывает ЖК-дисплею, что и когда делать.
Схема обрыва ИК-луча
Сигнал обрыва ИК-луча идет на 2-ой цифровой контакт Arduino. Это прерывает Arduino, что позволяет ему засчитать импульс и позволяет тахометру получать данные.
Arduino LCD библиотека
Для этого проекта мы будем использовать Arduino LCD библиотеку. В основном мы будем просто обновлять значение RPM на второй строке на новое.
В качестве подготовки, посмотрите на код приведенный ниже, в котором при помощи этой библиотеки на ЖК-дисплей выводиться «Hello, World!» В тахометре мы будем использовать похожий код, особенно: «lcd.print(millis()/1000);».
Разберитесь в функциях этой ЖК-библиотеки как можно подробнее, прежде чем двигаться дальше. Она не слишком сложна и хорошо документирована на сайте Arduino.
Подсчет RPM при помощи Arduino
Так как мы собираемся подсчитать RPM компьютерного вентилятора, мы должны понимать, что для подсчета мы используем прерывание ИК-луча. Это очень удобно, но мы должны учитывать, что у компьютерного вентилятора 7 лопастей. Это значит, 7 прерываний равно 1 обороту.
Если мы будем отслеживать прерывания, мы должны знать, что каждое седьмое прерывание означает, что только что произошел 1 полный оборот. Если мы отследим время, необходимое для полного оборота, то мы легко вычислим RPM.
Время 1-го оборота = P * (µS/оборот)
RPM = кол-во оборотов/мин = 60 000 000 * (µS/мин) * (1/P) = (60 000 000 / P) * (кол-во оборотов/мин)
Для расчета RPM мы будем использовать формулу приведенную выше. Формула точная, и точность зависит от того, насколько хорошо Arduino сможет отслеживать время между прерываниями и посчитывать количество полных оборотов.
Сборка схемы
На фотографии ниже вы можете увидеть все необходимые детали и перемычки как на схеме.
Для начала подключается +5В и линии данных/управления ЖК-дисплея. Затем ЖК-дисплей, потенциометр контрастности и светодиод питания.
Схема обрыва ИК-луча собрана. Старайтесь, чтобы между ИК-светодиодом и фототранзистором было расстояние. На этой фотографии видно расстояние между ИК-светодиодом и фототранзистором, где я размещу компьютерный вентилятор.
Хватит разговоров о аппаратной части! Давайте начнем делать прошивку/программу, чтобы увидеть работу устройства!
Программная часть
Есть две основных части кода, которые показаны и подробно описаны ниже:
-Основной цикл обновления ЖК-дисплея
-Обновление времени прерываний
В основном цикле считаются обороты и обновления ЖК-дисплея. Поскольку основной цикл это гигантский while(1) цикл, то он будет работать всегда, RPM считаться, а ЖК-дисплей обновляться несколько раз в секунду. Функция в прерывании подсчитывает время между прерываниями ИК, поэтому считать RPM можно в основном цикле.
Помните, что компьютерный вентилятор имеет 7 лопастей, так что это тахометр предназначен для работы только с такими вентиляторами. Если ваш вентилятор или другое устройство дает только 4 импульса за оборот, измените в коде «(time*4)».
Обзор тахометра на Arduino
Вентилятор генерирует импульсы прерывания, а на выходе мы видим RPM. Хотя точность не 100%, а примерно 95%, при стоимости элементов 10$ есть смысл построить этот тахометр на Arduino.
Что теперь делать?
Системы на основе обрыва луча полезны не только при измерении RPM, но и в качестве других датчиков. Например, вы хотите знать, открыта дверь или закрыта. Возможно, вы хотите знать, не проходило-ли что то под роботом. Есть много применений обрыва луча, а схема используемая тут настолько проста, что есть много путей для улучшения и сборки других удивительных устройств.
Заключение
В целом, я считаю этот проект успешным. Но дело во времени и опыте.. Так или иначе, система работает как задумывалось и достаточно надежно, а мы получили ожидаемый результат. Надеюсь, вам понравилось прочитать эту статью и узнать как сделать свой собственный тахометр на Arduino!
Лада 21099 Папирус › Бортжурнал › Автоподсос на ардуино подключение тахометра// первые испытания
Всем привет, продолжаю тему автоподсоса на ардуино, добавил считывание оборотов двигателя, сделал ролик с подробным описанием процесса работы и первого успешного испытания.
Лада 21099 2000, двигатель бензиновый 1.5 л., 70 л. с., передний привод, механическая коробка передач — электроника
Машины в продаже
Лада 21099, 2002
Лада 21099, 1997
Лада 21099, 1996
Лада 21099, 2000
Комментарии 10
Я правильно понял, что угол управления заслонкой регулируется плавно в зависимости от температуры двигателя и оборотов? «Обороты плавают из-за плохого контакта» — это точно плохой контакт или сбой в работе тахометра?
Датчик холла выдает на выходе 12В или 5?
В любом случае нужна подтяжка вывода через резистор к земле, чтобы уменьшить количество ложных срабатываний. Если с холла идет 12В, нужен резистивный делитель напряжения 12->5 и желательно стабилитрон на 4,7В.
Диод на входе ардуино я хз зачем, на нем просто 0,6В падает и все.
Не совсем, у воздушной заслонки 3 положения, первое при котором она закрыта, второе при котором поддерживаются обороты в районе 1500, третье-он открыта.
Обороты плавают из за быстроразъемных коннекторов, сервопривод терял питание и вся плата сбоила, выдавала где то на 300 об/мин больше фактических, буду пробовать более надежные разъемы. Без сервопривода тахометр довольно четко показывал обороты.
Фактическое напряжение с выхода датчика холла 3В с лишним, иначе я бы спалил ардуинку, но мне кажется все таки амплитуда некоторых импульсов больше. Для делителя достаточно будет 10 кОм на вход, потому что второй резистор я включил программно:»digitalWrite(2, HIGH); // включаем подтягивающий резистор на 2 пине».
Диод отсекает просадку напряжения ардуино при запуске двигателя, например магнитолы бывает вырубаются при запуске стартера.
Встроенного в плату резистора не хватает от помех, лучше использовать внешнюю цепь. Его вообще ни на что не хватает, разве что цифровые сигналы принимать. С аналоговыми нужно делать внешние цепочки.
Если приходит 3В, то делитель напряжения не нужен, тут вы правы.
Диод отсекает разряд конденсатора на 2000 мкФ? На преобразователе, кстати, он есть на выходе, можете посмотреть. Имхо, в данной схеме диод не нужен.
Серву лучше на герметичный разъем посадить. Или вообще проводами напрямую кинуть, чтобы лишних просадок избежать.
D2 собственно и есть цифровой пин, когда крутишь стартер идет просадка бортовой сети до 10 вольт, соответственно напряжение падает и на линии 5 вольт — ардуинка при этом уходит в перезагрузку, диод и электролит для того чтобы убрать эту просадку и перезагруз на плате.
Серву я не могу напрямую сделать, нет ноутбука, приходится домой носить плату.
Я понимаю, что это цифровой пин, но сигнал-то принимается аналоговый с аналоговыми неточностями и погрешностями. Сигнал с датчика холла не является цифровым, поэтому его нужно фильтровать. И от качества фильтрования зависит дальнейшая работа программы.
По идее, 5В не должно проседать, оно же от преобразователя запитано, который должен работать при разных напряжениях на входе. Но я понимаю, что оно проседает и проц перезагружается.
Если будет время и желание, попробуйте выводы диода закоротить и посмотреть, будет ли разница с перезагрузками. Мне кажется, что не будет 🙂
2й пин считает переходы с LOW на HIGH, т.е. 0 и 1, он не измеряет напряжение как вольтметр на аналоговом пине, по моему все таки это цифра. Главное код заработал, остальное вопрос времени.
К цифровым сигналам предъявляются определенные требования, после применения которых фильтрация нужна иная, нежели для аналогового сигнала. Например, уровень нуля — 0В, а уровень логической единицы — 5В (или 3,3В для 3,3-вольтовой логики). Но самое главное — это максимальная похожесть на прямоугольники, а не трапеции. Какой сигнал идет с датчика — хз, никто его осциллографом не смотрел. Но что-то мне подсказывает, что цифровым он не является как раз из-за завалов импульса и возможных индуктивных вспышек от катушки. Но я тоже осциллографом не лазил и могу только предполагать.
Еще заметил, что у вас счет импульсов с датчика идет в основном цикле программы. Поищите информацию про прерывания, а именно про внешние прерывания. В программе могут идти долгие вычисления чего-либо и счетчик импульсов будет работать неправильно. Прерывания будут работать строго тогда, когда будет приходить импульс и счет (при должной фильтрации) будет происходить корректно.
2й пин считает переходы с LOW на HIGH, т.е. 0 и 1, он не измеряет напряжение как вольтметр на аналоговом пине, по моему все таки это цифра. Главное код заработал, остальное вопрос времени.
Короче, в дебри меня потянуло. Там же частота до 100 Гц, это крохи для микроконтроллера. Будет работать более-менее и так. Но резистор подтягивающий я бы все равно добавил, чтобы сигнал был более прямоугольный.
Вы большой молодец, что занялись этим вопросом 🙂
Конденсатор, который на 3,3 нФ надо подбирать, без него обороты растут до космических значений, ну и при добавлении новых блоков растет погрешность. Спасибо за помощь.
Пожалуйста. Интересно наблюдать за вашим проектом 🙂