Тахометр своими руками на arduino

Опубликовано: 16.05.2024

Наконецто появилось время сесть за тахометр …
В первой части я расскажу как я генерировал импульсы, считал и выводил их (это уже работает)
Во второй части будет развязка с бортовой сетью автомобиля…
В третьей части установка в автомобиль …
Купил все тут:eseal.ru/

Вопросы … по опторазвязке как организовать … на 12 вольт нашел здесь но в бортовой сети больше … а там указано макс 12 вольт
Для тех кому лень разбираться сразу фотки:
Со вспышкой (видно из чего собрано)

Без вспышки (видно подсчитаные обороты)

Схема включения
Нам понабобятся
1 Arduino UNO занимается подсчетом ипульсов и вывод оборотов на экран
2 Arduino UNO Является генератором импульсов
3 4-х разрядный 7-ми сегментный индикатор на базе чипа tm1637
4 Макетная плата 170 точек
5 Резистор на 10 кОм
6 Перемычки папа-папа 7 штук

Исходный код UNO 2 (генератора импульсов)

int pau = 66; //грубая задержа
int i;
unsigned long int time, time1;

void setup() <
pinMode(13, OUTPUT);
// Serial.begin(9600);
>

void loop() <
time=micros();
// Serial.println(time-time1); // необходимо для сведения данных между ардуино
digitalWrite(13, HIGH); // генерируем импульс на 13 порту
digitalWrite(13, LOW);
delay(pau);
for (i=0; i < 3000; i++) //3000 — точная задержка
<
>
time1=time;

Исходный код UNO 1 (счетчик импульсов, вывод на дисплей)

int taho = 2; //вход тахометра
volatile unsigned long int time1 = 0; // переменные для расччета оборотов
volatile unsigned long int time2 = 0;
unsigned long int time4 = 0;
volatile unsigned long int time, time5, time6, time7;

TM1637 tm1637(CLK, DIO); //создаем экземпляр объекта типа «TM1637», с которым будем далее работать и задаем пины.
// можно было и не определять константы, а написать проще — вместо трёх предыдущих строк одну:
// TM1637 tm1637(3,2);, но так как мы сделали наглядней
int n1, n2, n3, n4, n; //переменные для вывода на индикатор

void setup()
<
tm1637.init();// инициализация библиотеки «TM1637.h»
tm1637.set(BRIGHT_TYPICAL);//установка яркости указанная константа равна 2, значение по умолчанию
pinMode (taho, INPUT);
attachInterrupt(0, merilka, RISING);
>

void loop()
<
if (time2 — time4 > 100)
<
printdisplay();
time4 = micros();
>
>

void printdisplay ()
<
n = time;
n4 = n % 10;
n = n — n4;
n3 = ((n % 100) / 10);
n = n — n3 * 10;
n2 = ((n % 1000) / 100);
n = n — n2 * 100;
n1 = ((n % 10000) / 1000);
tm1637.display(0, n1); //1 цифра дисплея
tm1637.display(1, n2); //2
tm1637.display(2, n3); //3
tm1637.display(3, n4); //4
>

Держим старые цены на MEAN WELL весь июль!

Лазерный тахометр – прибор предназначенный для оперативного измерения частоты вращения (оборотов в единицу времени) различных вращающихся деталей и механизмов. Принцип работы такого тахометра основан на измерении частоты вращения с помощь лазерного луча, отраженного от контрастной маркерной ленты, наклеенной на движущийся предмет или вал. Стоимость подобных промышленных приборов достаточно высока даже для бюджетных вариантов. В статье мы рассмотрим вариант подобного прибора на Arduino, который не уступает по точности бюджетным промышленным приборам (Рисунок 1).

Бесконтактный лазерный тахометр на Arduino.
Рисунок 1. Бесконтактный лазерный тахометр на Arduino.

Для сборки тахометра понадобиться: плата Arduino Nano, модуль лазерного излучателя, модуль лазерного приемника (модуль лазерного датчика), модуль OLED дисплея 128×32 с интерфейсом I 2 C, тактовая кнопка, разъем для подключения 9-вольтового элемента питания типа «Крона».

Схема подключения модулей к плате Arduino изображена на Рисунке 2. Процессы сборки, подключения компонентов к плате Arduino, а также компоновки в корпусе, демонстрируются в видеоролике в конце статьи.

Схема лазерного тахометра на Arduino
Рисунок 2. Схема лазерного тахометра на Arduino (подключение модулей к плате
Arduino Nano).

Примененный модуль лазерного излучателя (модуль лазерного диода) имеет номинальное напряжение питания 5 В; генерируемое излучение в диапазоне 650 нм мощностью 5 мВт (Рисунок 3). Потребляемый лазером ток составляет не более 40 мА, поэтому допустимо его подключение к выходу 5 V платы Arduino (выход встроенного в плату Arduino регулятора напряжения 5 В).

Модуль лазерного излучателя.
Рисунок 3. Модуль лазерного излучателя.

Модуль лазерного сенсора использует приемник немодулированного лазерного излучения, поэтому при измерениях рекомендуется избегать засветки сенсора ярким солнечным светом или другими источниками света (Рисунок 4). При попадании лазерного излучения на датчик (в нашем случае – отраженный лазерный луч) на его выходе «Out» появляется высокий уровень, в отсутствии засветки датчика на выходе фиксируется низкий логический уровень. Номинальное напряжение питания модуля лазерного приемника составляет 5 В. Также на плате модуля лазерного приемника установлен светодиод, индицирующий подачу питания.

Модуль лазерного датчика.
Рисунок 4. Модуль лазерного датчика.

Примененный модуль OLED дисплея с разрешением 128×32 точки (на контроллере SSD1306) подключается к плате Arduino по интерфейсу I 2 C. Напряжение питания модуля дисплея равно 5 В (Рисунок 5).

Модуль OLED дисплея с интерфейсом I2C и разрешением 128×32 точки
Рисунок 5. Модуль OLED дисплея с интерфейсом I 2 C и разрешением
128×32 точки для лазерного тахометра.

Скетч Arduino доступен для скачивания в разделе загрузок. В скетче, помимо стандартных библиотек Arduino, используются библиотеки Adafruit_GFX.h и Adafruit_SSD1306.h для работы с OLED дисплеем. Если эти библиотеки не установлены в среде Arduino, их необходимо установить с помощью менеджера библиотек.

Для прибора разработан корпус, проектные файлы для печати корпуса на 3D принтере доступны для скачивания в разделе загрузок. При сборке прибора автор в корпусе совместил модуль лазерного излучателя и приемника.

Видео сборки прибора и демонстрация работы

Как вы можете заметить в видеоролике, начиная с 4:40 самодельный лазерный тахометр показывает примерно те же значения, что и промышленный прибор, но с боле высокой частотой обновления значений на дисплее. Автор проекта в комментариях к видеоролику утверждает, что прибор позволяет измерять скорость до 99,999 об/мин.

Тахометр на Ардуино

Тахометр на Ардуино

П ривет. В этой статье расскажу, как я сделал цифровой тахометр на Ардуино (Arduino) и датчике Холла для китайского шпинделя 0,5кВт диаметром 52 мм.

Комплектующие для сборки тахометра

Итак, тебе понадобятся:

И установи библиотеку tm1637 в свою Arduino IDE. Как это сделать? Просто добавь папку из архива в папку куда установлена Arduino. Например С > Program Files (x86) > Arduino > Libraries

Библиотека TM1637 скачать

Схема подключения тахометра на Ардуино

Тахометр на Ардуино схема подключения

Тахометр на Ардуино схема подключения

Скетч для тахометра на Ардуино

Сборка тахометра

Итак, начнем по порядку:

Индикатор

Индикатор тахометра TM1637

Индикатор тахометра TM1637

Плата датчика Холла

Для аккуратного крепления датчика Холла на шпиндель пришлось сделать новую печатную плату. Кому интересно как я делаю печатные платы читай в этой статье. После изготовления платы, я перенес все детали с KY-003, а так же добавил разъем XH2.54 3 pin. И еще вырезал изоляционную прокладку из какого-то пластика толщиной 3 мм и просверлил в ней небольшие отверстия, чтобы плата ложилась на прокладку всей плоскостью.

Плата тахометра вид сверху

Плата тахометра вид снизу

Прокладка

Печатная плата тахометра на Ардуино

Установка платы датчика Холла

Установка платы на шпиндель

Установка платы на шпиндель

Как протянуть провода от датчика, я расскажу в статье посвященной прокладке кабелей, а пока небольшое видео о работе тахометра на Arduino Nano и индикаторе TM1637

Если дома есть Arduino, в гараже машина или мотоцикл, а то и хоть мотособака, в голове туманные представления о программировании — возникает желание измерить скорость движения или обороты двигателя, посчитать пробег и моточасы.

В данной статье я хочу поделиться своим опытом по изготовлению подобных поделок.

Картинка для привлечения внимания

Немного физики

Для измерения частоты вращения нам понадобится датчик положения колеса/вала/круга/итп. Датчик ставится как правило один. Возможно, что он будет срабатывать не один раз на каждый оборот. Например, у вас датчик Холла и 4 магнита на колесе. Таким образом, для правильного вычисления частоты нужно знать:

  • количество срабатываний датчика на один оборот К;
  • минимальная ожидаемая частота Мин.
  • максимальная ожидаемая частота Макс.

То есть, если частота меньше разумного минимума, то считаем, что она равна нулю, если больше максимума — игнорируем показания.

С количеством срабатываний понятно, но зачем ещё эти мины и максы? Давайте рассмотрим сначала варианты расчёта частоты.

Со скоростью всё проще, достаточно знать число π, диаметр колеса, а частоту вращения мы уже знаем.

Болванка для кода

Так как мы имеем дело с такими нежными величинами как время и пространство, то лучше сразу освоить прерывания.

Обратите внимание на модификатор volatile у переменной counter. Все переменные, которые будут изменяться в обработчике прерывания (ISR) должны быть volatile. Это слово говорит компилятору, что переменная может изменяться неожиданно и доступ к ней нельзя оптимизировать.

Функция ISR() вызывается каждый раз, когда появляется единица на ноге fqPin. Мы эту функцию не вызываем, это делает сам контроллер. Он это делает, даже когда основная программа стоит в ступоре на функции delay(). Считайте, что ISR() обслуживает событие, от вас не зависящее и данное вам свыше как setup() и loop(). Контроллер прерывает выполнение вашей программы, выполняет ISR() и возвращается обратно в ту же точку, где прерывал.

Обратите внимание, что в функции loop() мы отключаем прерывания вообще любые для того, чтобы прочитать переменную counter и сохранить её во временную переменную cnt. Потом, конечно же, включаем снова. Так мы можем потерять один вызов, конечно же, но с другой стороны, переменная unsigned long имеет 32 бита, а процессор ATMega32 8-битный, вряд ли он скопирует данные за один такт, а ведь в процессе копирования может случиться прерывание и часть данных изменится. По этой же причине мы копируем значение counter локально так как значение этой переменной при использовании в разных местах программы может быть разным опять же из-за изменения её в прерывании.

Тело функции ISR() должно быть максимально коротким, точнее, сама функция должна выполняться максимально быстро. Это важно, так как прерывается выполнение вашего кода, который может оказаться чувствительным к непредвиденным задержкам. Некоторые библиотеки отключают прерывания для выполнения чувствительных с задержкам операций, например для управления светодиодной лентой WS2812.

Считаем обороты за единицу времени.

Первое, что приходит в голову, это взять интервал времени и посчитать количество измерений.

Как и у многих простых решений, у этого есть неочевидные минусы. Для повышения точности измерений вам необходим довольно большой интервал времени. Принцип тот же, что и у Шума квантования. При времени оборота колеса сравнимом с временем подсчёта, существенные изменения скорости вращения не будут замечены. Показания такого частотомера будут различаться до двух раз на каждый отсчёт.

Для повышени точности на малой скорости можно увеличить число К, как это сделано, скажем, в автомобильной технике для датчика ABS. Можно увеличить время подсчёта. Делая и то и другое мы подходим ко второй проблеме — переполнению счётчика. Да, переполнение легко лечится увеличением количества бит, но арифметика процессора Arduino не умеет считать 64-битные числа столь быстро, как хотелось бы и как она это делает с 16-разрядными.

Увеличение времени расчёта тоже не очень хорошо тк нам надо знать частоту прямо сейчас, вот при нажатии на газ, а не через пару секунд. Да и через пару секунд мы получим скорее некое среднее значение. За это время можно несколько раз сделать врумм-врумм.

Есть другой метод. Он лишён вышеописанных недостатков, но, как водится, имеет свои.

Считаем интервал между отсчётами

Мы можем засечь время одного отсчёта и другого, вычислить разницу. Величина, обратная вычисленному интервалу и есть частота. Круто! Но есть минусы.

Что делать, если наше колесо крутится еле-еле и измеренный интервал превышает разумные пределы? Выше я предложил считать частоты ниже разумного минимума за ноль.

Определённым недостатком метода можно считать шумы квантования на высоких частотах, когда целочисленный интервал снижается до нескольких двоичных разрядов.

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

Методом проб и ошибок я подобрал интервал отображения данных на дисплее в 250мс как оптимальный. Если чаще, то цифры размазываются, если реже — бесит тормознутость.

Комбинированный метод

Можно попробовать объединить достоинства обоих методов.

То есть, мы засекаем время не просто между отсчётами, а время между проверками данных и делим на количество отсчётов за это время. Получается усреднённый интервал между отсчётами, обратная величина от которого есть частота. Предоставим компилятору оптимизировать вычисления.

Обратите внимание, что за интервал считается не время опроса, как в первом примере, а время от последнего отсчёта до предыдущего последнего отсчёта в прошлом опросе. Это заметно поднимает точность вычисления.

Таким образом, мы можем получать вполне достоверные данные как на низких так и на высоких частотах.

Если использовать кооперативную многозадачнось, то можно сделать подсчёт, скажем раз 100мс, а вывод на дисплей раз в 250мс. Очень короткий интервал опроса снизит чувствительность к низким частотам.

Как говорят в рекламе, "но это ещё не всё".

Ошибки дребезга

Для устрашения вас предположу, что измеряем частоту вращения двигателя от индуктивного датчика зажигания. То есть, грубо говоря, на высоковольтный провод намотан кусок кабеля и мы измеряем индукцию в нём. Это довольно распространённый метод, не правда ли? Что же здесь сложного может быть? Самая главная проблема — современные системы зажигания, они дают не один импульс, а сразу пачку.




Но даже обычная система зажигания даёт переходные процессы:




Старинные же кулачковые контактные вообще показывают замечательные картинки.

Как с этим бороться? Частота вращения не может вырасти мгновенно, не даст инерция. Кроме того, в начале статьи я предложил ограничить частоту сверху разумными рамками. Отсчёты, что происходят слишком часто можно просто игнорировать.

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

Статистическая обработка в данном случае становится уже достаточно сложной для маленькой функции обработки прерывания и я готов обсудить варианты в комментариях.

Особенности измерения скорости движения и скорости вращения.

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

При измерении скорости движения частота обновления дисплея не имеет большого значения, особенно, если вы рисуете цифры, а не двигаете стрелку. Даже обновление информации раз в секунду не вызовет отторжения. С оборотами двигателя всё наоборот, индикатор должен откликаться гораздо быстрее на изменение оборотов.

Вывод информации

Типичная обида начинающего разработчика автомобильной и мотоциклетной электроники "стрелки дёргаются, цифры нечитабельны" лечится простым способом — надо обманывать клиента. Вы что думаете, автомобильный тахометр всегда показывает вам правду? Конечно же нет! Хотя вам этот обман нравится и вы хотите, чтобы ваш прибор дурил голову так же.

Стрелки

Если включить зажигание на новом модном автомобиле или мотоцикле, стрелки приборов сделают красивый вжух до максимума и медленнее опадут до нуля. Вот! Вот это нам и надо сделать. Надо, чтобы при показе максимальной величины стрелка не метнулась к ней мгновенно и не упала как акции лохотрона в ноль.

Итак, нам надо учитывать максимальную скорость стрелки на увеличение и максимальную на уменьшение показаний. Совсем хорошо сделать эти скорости нелинейными, чтобы стрелка сначала двигалась быстрее, а потом чуть помедленнее приближалась к заданному значению.

Вот пример с нелинейным выводом показаний:

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

Цифры

С цифрами всё намного сложнее. Быстрые изменения показаний приводят к тому, что несколько порядков сливаются в мутное пятно. Для скорости, как и писал выше, можно задать интервал раз в секунду и глаз успеет прочитать три цифры.

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

Я предлагаю менять частоту вывода информации на дисплей в зависимости от степени изменения величины. Если обороты меняются, скажем, на 5% от последнего подсчёта, а не показа — можно затупить и показывать раз в 300-500мс. Если на 20%, то показывать раз в 100мс.

Можно огрубить шкалу и показывать только две значащие цифры

С учётом мототематики, можно довольно точно показывать обороты холостого хода как описано чуть выше и огрублять вывод на оборотах от двух холостых. На высоких оборотах для гонщиков важнее делать блинкеры типа "передачу вниз", "передачу вверх" и "ты спалишь движок". То есть держать двигатель около максимального крутящего момента и не дать ему крутиться выше максимальных разрешённых оборотов. Блинкеры замечательно делаются с помощью SmartDelay когда можно унаследовать от этого класса свой с заданной ногой контроллера и частотой мигания, там есть методы для переопределения и они вызываются раз в заданное время.

Тахометр представляет собой счетчик числа оборотов в минуту (RPM counter). Существует два типа тахометров: механические и цифровые.

Внешний вид тахометра на Arduino

Общие принципы работы проектируемого тахометра

В этом проекте мы будем создавать цифровой тахометр на основе платы Arduino и модуля инфракрасного датчика для обнаружения вращения и подсчета числа оборотов любого вращающегося объекта. Принцип его действия основан на том, что инфракрасный передатчик излучает инфракрасные лучи которые затем отражаются обратно к инфракрасному приемнику и затем инфракрасный модуль генерирует импульс на своем выходе который обнаруживается контроллером Arduino когда мы нажимаем кнопку start. Он осуществляет счет в течение 5 секунд.

После этих 5 секунд плата Arduino рассчитывает число оборотов в минуту по следующей формуле:

RPM= Count x 12 для одиночного вращающегося объекта.

Но поскольку в этом проекте для демонстрации работы схемы мы используем потолочный вентилятор, то мы должны внести некоторые изменения в приведенную формулу:

RPM=count x 12 / objects
где
objects – число лопастей в вентиляторе.

Обобщенная структурная схема работы устройства представлена на следующем рисунке.

Структурная схема работы тахометра

Необходимые компоненты

  1. Плата Arduino Pro Mini (купить на AliExpress).
  2. Модуль инфракрасного датчика (купить на AliExpress).
  3. ЖК дисплей 16х2 (купить на AliExpress).
  4. Кнопка.
  5. Макетная плата.
  6. Батарейка на 9 В.
  7. Соединительные провода

Работа схемы

Схема тахометра на основе платы Arduino представлена на следующем рисунке.

Схема содержит плату Arduino Pro Mini, модуль инфракрасного датчика и ЖК дисплей. Плата Arduino управляет всем процессом функционирования устройства: считывание импульса с выхода модуля инфракрасного датчика, вычисление частоты вращения (в оборотах в минуту) и передача значения этой частоты на ЖК дисплей. Инфракрасный датчик используется для обнаружения объекта. Мы можем регулировать чувствительность данного датчика с помощью встроенного в него потенциометра. Модуль инфракрасного датчика состоит из инфракрасного передатчика и фотодиода, который обнаруживает инфракрасные лучи. Инфракрасный передатчик излучает инфракрасные лучи, когда эти лучи падают на поверхность, они отражаются от нее и улавливаются фотодиодом (более подробно об этих процессах можно прочитать в статье про робота, движущегося вдоль линии). Выход фотодиода подключен к компаратору, который сравнивает значение с выхода фотодиода с опорным напряжением и результат сравнения выдает на плату Arduino.

Выход модуля инфракрасного датчика напрямую подключен ко контакту 18 (A4) Arduino. Vcc и GND подсоединены к контактам Vcc и GND arduino. ЖК дсиплей подключен к плате Arduino в 4-битном режиме. Его управляющие контакты RS, RW и En напрямую подсоединены к контактам 2, GND и 3 Arduino. Контакты данных D4-D7 подключены к контактам 4, 5, 6 и 7 Arduino. В схеме также присутствует кнопка, которую необходимо нажать для подсчета числа оборотов. Наш тахометр на основе платы Arduino подсчитывает число оборотов в течение 5 секунд а потом по вышеприведенной формуле осуществляет пересчет этого значения в число оборотов в минуту. Кнопка подключена к контакту 10 Arduino.

Исходный код программы

В программе мы будем использовать функцию чтения значения с цифрового контакта Arduino чтобы считать значение с выхода модуля инфракрасного датчика. На основе этого считанного значения мы затем будем осуществлять расчет числа оборотов в минуту.

Читайте также: