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

Обновлено: 05.07.2024

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

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

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

Два способа расчёта частоты

1) Когда частота высокая - мы считаем количество импульсов (колебаний) которое уместилось в заданный интервал времени.

2) Когда частота низкая - мы измеряем время одного периода, а далее, по формуле f=1/T определяем частоту.

В нашем случае частота достаточно низкая, поэтому мы будем использовать второй способ.

Компоненты схемы

Для того чтобы с каждым оборотом пластинки получать импульс - будем использовать огрызок белой бумаги и оптический датчик TCRT5000 , благо стоит он копейки. На момент написания статьи - 50р.

Математикой будет заниматься Arduino nano , а циферки нам покажет модуль ЖК-дисплея LCD1602 .

Питание всего этого - 5 вольт. Подойдёт либо зарядник от мобильника либо "повербанк" либо USB кабель подключенный к компьютеру.

Схема соединения модулей

Датчик подключается на второй пин ардуинки. Переменный резистор служит для настройки контрастности дисплея.

Метка из белой бумаги прикрепляется на край пластинки, а датчик размещается так, чтобы метка кратковременно проскакивала в поле зрения датчика.

Каждый раз когда белая метка проскакивает мимо датчика - срабатывает "прерывание". Программа считает сколько микросекунд прошло с момента прошлого прерывания до текущего.

Если пластинка вращается с частотой 33 оборота в минуту (точнее 33 и одна треть) тогда длина периодадолжна составить 1800000 микросекунд.

На дисплее в верхней строке будет отображаться время полного оборота в микросекундах, а в нижней угловая частота вращения пластинки в об/мин.

Скетч можно скачать по ссылке

И в дополнение небольшое видео

Понравилось - ставьте лайк :)

Подписывайтесь на канал - у меня много интересного: и Ардуино и ЧПУ-обработка, и реставрация ламповой техники, и многое другое

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

Для расчёта некоторых механизмов мне нужен тахометр. Например для расчёта скорости движения робота-пылесоса нужно знать скорость вращения электромотора и исходя из этого рассчитать передаточное число редуктора.

Тахометр я решил сделать на Ардуино, это конечно финансово и трудозатратно, но очень интересно, плюс свобода разработки. Быстрее и проще купить тахометр в Китае. Если вы всё же решитесь повторить мой проект, то вот вам список деталей для самодельного тахометра:

Arduino pro mini, или другие версии
Оптический инфракрасный датчик
OLED дисплей 0,96 дюйма или любой другой, что понравится
Кнопка питания (слайдер)
USB-разъём для зарядки аккумулятора
Li-ion аккумулятор, можно от старого мобильного телефона
Провода

Сначала я конечно же искал в Интернете самодельные тахометры на Ардуино, мне попался проект тахометра Алекса Гайвера. Загрузив прошивку я начал тестировать устройство, периодически в мониторе порта проскакивали отрицательные значения или показывало слишком завышенные обороты до миллиона единиц. Я думал что глюки связаны с моим датчиком, пробовал переписывать прошивку по своему, но результат всегда был один. Есть в Интернете проекты на этой прошивке, но у меня она почему-то не пошла.

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

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

В качестве экранчика я использовал маленький OLED-дисплей, на нем можно вместить много цифр. Питается устройство от аккумулятора старого мобильного, заряжается как телефон через USB-разъём. Железо получилось компактное, для него я смоделировал корпус и распечатал на 3д принтере.

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

Тахометр можно дополнить кнопками для задания количества лопастей на измеряемых вентиляторах, тогда не нужно будет вычислять на калькуляторе фактическое количество оборотов в минуту. Можно добавить кнопку для запоминания максимальных оборотов. На Ардуино используется всего несколько пинов, поэтому устройство можно дополнить множеством дополнительных функций. Также на экран можно выводить больше информации, установленный дисплей позволяет это делать. Вобщем тут есть пространство для творчества.

Наконец, я перемерил этим тахометром всё, что в доме вращается, моторчики, шуруповерт, миксер, колесо у заводной машинки, прибор очень интересный, игрушка для разработчика :)


Тахометр собранный с использованием датчика линии прост в подключении. Вам не нужно вносить конструктивные изменения в деталь, скорость вращения которой требуется измерить: сверлить отверстия, делать прорези, устанавливать дополнительные элементы и т.д. Достаточно нанести на неё контрастную линию (чёрную на светлой поверхности или белую на тёмной) и поднести датчик линии, Вы сразу получите точный результат, количество оборотов в минуту. Скетч не нуждается в корректировке, независимо от того, какого цвета будет линия.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеку:

  • Библиотека iarduino_4LED (для работы с четырёхразрядным LED индикатором).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE .

Видео:

Схема подключения:

LED индикатор подключается к любым двум выводам Arduino (как цифровым, так и аналоговым), номера указываются в скетче. Датчик линии подключается к любому аналоговому входу, номер указывается в скетче.

Схема тахометра на Arduino Uno

В данном уроке, LED индикатор подключён к цифровым выводам 2 и 3, а датчик линии подключён к аналоговому входу A0.

Основой настоящей лабораторной работы является датчик Холла. Датчик Холла – это полупроводниковый прибор, работающий на основе одноименного эффекта. Датчик подключается к внешнему источнику питания. При внесении датчика в магнитное поле на его выходе формируется логический сигнал низкого уровня. В отсутствие магнитного поля на выходе датчика наблюдается высокий уровень сигнала.

Простейшая схема подключения датчика представлена на следующем рисунке. Она включает цифровой датчик A3144. Постоянный резистор и может содержать или не содержать конденсатор постоянной емкости. Резистор, номиналом 10 ком служит для надежной работы датчика в качестве ключевого элемента. Конденсатор фильтрует высокочастотные пульсации выходного сигнала. Если смотреть на переднюю сторону датчика (маркировка), то левый первый контакт соединяется с источником питания. Средний – с общим проводом, землей, правый – является выходным.


Используется готовый модуль датчика Холла А3144. Он имеет как цифровой выход D0, так и аналоговый A0, который не используется.

Схема подключения модуля датчика Холла к Ардуино UNO представлена на рис. 2. Датчик Холла подключается напрямую к плате ардуино своими тремя контактами D0, VCC и GND. VCC и GND соединяются с соответствующими контактами Ардуино. Цифровой выход D0 следует присоединить к одному из цифровых входов Ардуино, связанных с аппаратными прерываниями. Для ардуино Уно это D2 или D3. В нашей работе мы используем цифровой вход D3.


Кроме датчика Холла лабораторная установка включает цифровой жидкокристаллический дисплей LCD1602. Но может использоваться и любой другой. От формата дисплея будет зависеть код управляющей программы микроконтроллера и доступный объем выводимой информации.

Цифровой дисплей можно подключать к ардуино через имеющийся параллельный интерфейс, как у моего дисплея LCD2004, либо через последовательный интерфейс шины I2C, которым может быть дополнительно снабжен дисплей, как вы видите на моем дисплее LCD1602.

Я выбрал последний вариант, так как он позволяет сократить число задействованных выходных линий Ардуино.

Для обмена данными по шине I2C линии последовательного интерфейса дисплея присоединяют к следующим выходам Ардуино: линию SDA к выходу А4, линию SCL к выходу А5, линии питания VCC и земли GND – к соответствующим линиям Ардуино.

Кроме того для регистрации сигнала и вывода индикации лабораторная установка содержит два светодиода, подключенных через резисторы сопротивлением 220 Ом к цифровым выходам D10 и D13.

Собираем лабораторную установку в соответствии со схемой.

Познакомимся с основными принципами измерения частоты цифровым способом.

Всего существует два принципа. Оба они основаны на сравнении периодов образцового и измерительного сигналов.

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


Импульс входного сигнала (передним или задним фронтом), поступающий от датчика Холла, запускает аппаратное прерывание Ардуино. При срабатывании функции прерывания запускается подсчет количества импульсов n встроенного тактового генератора, период следования которых T0 заранее известен, и продолжается до следующего срабатывания прерывания.

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

Частота определяется как величина обратная периоду:

А частота вращения, выраженная в об/мин будет в 60 раз больше:

Для получения длительности импульсов образцового сигнала встроенного генератора пользователю Ардуино доступна функция Micros (). Она показывает текущее значение времени в микросекундах с начала запуска программы. Таким образом, обращаясь к ней в моменты срабатывания функции прерывания, можно получить количество микросекунд между двумя срабатываниями. Так как длительность одного образцового импульса T0 равна 1 мкс=1/1000000 с, тогда формула приобретает вид:

Если на валу вращающегося двигателя установлен не один магнит, а несколько (z), то время T между ближайшими срабатываниями функции прерывания сокращается в z раз, а частота входного сигнала возрастает в z раз, тогда формула примет вид:


Второй способ отличается от первого тем, что ведется прямой подсчет числа импульсов k, поступивших от датчика Холла за большой период времени Tm. Этот способ поясняется вторым рисунком. Согласно этому способу частота вращения вала будет равна:

А в минуту – в 60 раз больше:

Если принять Tm=1 c., то формула приобретает вид:

Для управления работой Ардуино необходимо разработать управляющую программу.

Для начала подключаем необходимые библиотеки:

LiquidCrystal_I2C lcd(0x27,16,2); — указываем i2c адрес (наиболее распространенное значение), а также параметры экрана

Объявляем переменные и константы:

const int RPM_PIN=3; — константа определяющая номер цифрового входа для подключения датчика Холла

volatile int rpm = 0; — частота импульсов (сразу обнуляем)

volatile int rpm_k = 0; — счетчик импульсов входного сигнала (обнуляем)

volatile boolean kontrol;

volatile int rpm_array[3] = ; — массив промежуточных значений частоты вращения (не менее трёх значений) для усреднения (сразу обнуляем)

volatile int rpm_result = 0; — расчётная частота вращения вала (обнуляем)

Объявляем функцию прерывания, которая при срабатывании будет подсчитывать количество импульсов входного сигнала

digitalWrite(13, HIGH); — на долю секунды выводим сигнал на красный сетодиод при каждом поступившем импульсе входного сигнала (для контроля работы схемы и датчика)

delayMicroseconds(500); — длительность свечения красного светодиода

digitalWrite(13, LOW); — выключение красного светодиода

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

rpm = rpm_k; rpm_k = 0; записываем подсчитанное число импульсов с датчика Холла в переменную частоты вращения, а счетчик обнуляем

digitalWrite(10, HIGH); — на долю секунды выводим сигнал на зеленый сетодиод при каждом отсчете образцового сигнала (для контроля работы)

delayMicroseconds(500); digitalWrite(10, LOW);

Объявляем основную процедуру Ардуино

lcd.begin(); — инициализируем дисплей

pinMode(RPM_PIN,INPUT); — устанавливаем режим работы входной линии ардуино на ввод

attachInterrupt(digitalPinToInterrupt(RPM_PIN), rpm_count, RISING); — настраиваем функцию прерывания, срабатывание по переднему фронту

Timer1.attachInterrupt(SensorData); — настраиваем срабатывание прерывания по таймеру

Timer1.initialize(1000000); — указываем период работы таймера – 1 с.

pinMode(10, OUTPUT); — устанавливаем режим работы цифрового выхода 10 и 13 на вывод

Объявляем основной цикл программы

rpm_result = 0; — обнуляем итоговый результат

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