Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Тахометр на Arduino

Тахометр - это полезный инструмент для подсчета RPM (оборотов в минуту) колеса или всего, что крутится. Самый простой способ сделать тахометр - это использовать ИК передатчик и приемник. Когда связь между ними прерывается, вы знаете, что что-то вращается и можете применять код для вычисления RPM, ориентируясь на частоту прерывания связи.

В этой статье мы рассмотрим, как использовать ИК-передатчик и приемник для изготовления тахометра с применением Arduino. Результат отображается на ЖК-дисплее 16х2.

Тахометр на Arduino

Целью данного проекта является создание системы с одним входом и одним выходом. На входе устройства присутствует сигнал, изменяющийся с высокого (+5В) на низкий (+0В) уровень при нарушении связи. Согласно этому сигналу, Arduino будет увеличивать значение внутреннего счетчика. Потом проводится дополнительная обработка и расчет, и по прерыванию триггера на ЖК-дисплей будет  выводиться рассчитанное RPM.

Для связи мы будем использовать ИК-луч от ИК-светодиода, включенного через низкоомный резистор так, чтобы светиться ярко. В качестве приёмника мы будем использовать фототранзистор, который при отсутствии света ИК-светодиода "закрывается". Компьютерный вентилятор будет размешен между ИК-передатчиком и приёмником и включен. ИК-приёмник включенный через транзисторную схему, будет генерировать прерывания. Для вывода результата будет использоваться Arduino LCD интерфейс, поэтому мы можем вывести окончательное значение RPM на ЖК-дисплей.

Элементы:
Arduino UNO
16x2 LCD
Макетная плата
Подстроечный резистор 5 кОм
Перемычки
SIP разъёмы
2x 2N2222 NPN транзистор
Инфракрасный светодиод
Фототранзистор
Резистор 10 Ом
Резистор 100 кОм
Резистор 15 кОм или 16 кОм
Компьютерный вентилятор

Подробный список элементов

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

Arduino UNO
Это плата Arduino, которую мы будем использовать для обработки импульсов от прерывания ИК-луча, которые сообщают о нахождении лопасти компьютерного вентилятора между приемником и датчиком. Arduino будет использовать эти импульсы наряду с таймером, чтобы вычислить RPM вентилятора.

ЖК-дисплей 16x2
После того, как Arduino вычислило RPM, эта значение будет отображаться на дисплее в понятном для пользователя виде.

Подстроечный резистор 5 кОм
Этот подстроечный резистор будет использоваться для регулировки контрастности ЖК-дисплея 16x2. Он дает аналоговое напряжение в диапазоне от 0 до +5В, позволяя настроить яркость ЖК-дисплея.

Инфракрасный светодиод и Фототранзистор
Фототранзистор открывается, когда мощный ИК-свет падает на него. Поэтому, когда ИК-светодиод горит, он держит фототранзистор открытым, но если ИК-светодиод закрывается например, лопастью вентилятора, то фототранзистор закрывается.

2N3904 и 2N3906
Эти транзисторы используются для преобразования уровня сигнала, с целью обеспечения выходных импульсов с фототранзистора для Arduino, в которых нет никаких напряжений кроме +0 и +5В.

Принципиальная схема

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

В схеме, интерфейс связи с ЖК-дисплеем упрощен и имеет только 2 линии управления и 4 линии передачи данных.

Особенности схемы

Интерфейс ЖК-дисплея 16x2
2 управляющих контакта и 4 для передачи данных подключены от Arduino к ЖК-дисплею. Это то, что указывает ЖК-дисплею, что и когда делать.

Схема обрыва ИК-луча
Сигнал обрыва ИК-луча идет на 2-ой цифровой контакт Arduino. Это прерывает Arduino, что позволяет ему засчитать импульс и позволяет тахометру получать данные.

Arduino LCD библиотека

Для этого проекта мы будем использовать Arduino LCD библиотеку. В основном мы будем просто обновлять значение RPM на второй строке на новое.

В качестве подготовки, посмотрите на код приведенный ниже, в котором при помощи этой библиотеки на ЖК-дисплей выводиться "Hello, World!" В тахометре мы будем использовать похожий код, особенно: "lcd.print(millis()/1000);".

LCD библиотека

Разберитесь в функциях этой ЖК-библиотеки как можно подробнее, прежде чем двигаться дальше. Она не слишком сложна и хорошо документирована на сайте 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)".

Два вентилятора работают на примерно 3000 оборотов в минуту и ​​2600 оборотов в минуту, с погрешностью около + / -100 оборотов в минуту.

Обзор тахометра на Arduino

Вентилятор генерирует импульсы прерывания, а на выходе мы видим RPM. Хотя точность не 100%, а примерно 95%, при стоимости элементов 10$ есть смысл построить этот тахометр на Arduino.

Что теперь делать?

Системы на основе обрыва луча полезны не только при измерении RPM, но и в качестве других датчиков. Например, вы хотите знать, открыта дверь или закрыта. Возможно, вы хотите знать, не проходило-ли что то под роботом. Есть много применений обрыва луча, а схема используемая тут настолько проста, что есть много путей для улучшения и сборки других удивительных устройств.

Заключение

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

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Плата Arduino
Arduino Uno
1 Поиск в магазине ОтронВ блокнот
T2, T3 Биполярный транзистор
2N2222
2 2N3904 и 2N3906Поиск в магазине ОтронВ блокнот
R1 Резистор
10 Ом
1 Поиск в магазине ОтронВ блокнот
R2 Резистор
100 кОм
1 Поиск в магазине ОтронВ блокнот
R3 Резистор
16 кОм
1 Поиск в магазине ОтронВ блокнот
R4 Подстроечный резистор5 кОм1 Поиск в магазине ОтронВ блокнот
LCD-дисплей16x21 Поиск в магазине ОтронВ блокнот
LED1 СветодиодИнфракрасный1 Поиск в магазине ОтронВ блокнот
T1 Фотодиод1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Теги:

Касьянов А. Опубликована: 2012 г. 0 2
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (19) | Я собрал (0) | Подписаться

0
Николай #
Подтверждаю, реально работает.
Пробовал на arduino pro mini, датчик индукционный с опторазвязкой, количество лопастей 18
Ответить
0
Александр #
А у меня не работает... пишутся значения то в минусе то в плюсе, и залипают
Ответить
0
Star #
Все собрал по схеме, но вместо экрана на комп скидываю значения, что-то не работает. Сначала идет 0, но после того как промелькну чем-то между диодом и фототранзистором, лезут какие-то значения, то положительные то отрицательные...
Current RPM:
0
0
0
5291
-2524
2767
-5048
243
243
Ответить
0
Star #
Заработало нормально с этим кодом:
volatile long unsigned int time = 0;
volatile long unsigned int time_last = 0;
long unsigned int rhm = 0;
long unsigned int time_avr = 0;
long unsigned int timecount = 0;

void setup()
{
attachInterrupt(0, fan_interrupt, FALLING);
Serial.begin(9600);
}

void loop()
{
if(time != time_last)
{


if( timecount < 10)
{
rhm = (time - time_last);
time_out += rhm;
timecount++;

} else
{
Serial.print("Avr RHM: ");
Serial.println(600000000/time_avr/7);
time_avr = 0;
timecount = 0;
}
time_last = time;
}

}

void fan_interrupt()
{
time = (micros());
}
Ответить
0
Алексей #
Код у вас не работает, можно по подробнее
Ответить
0
Liza #
Алексей, как подключить в этой схеме модуль LCD 1602 I2C вместо просто LCD 1602 и, соответственно, как нужно изменить скетч? Заранее Спасибо!
Ответить
0
Андрей #
этот код вообще не компилируется
exit status 1
'time_out' was not declared in this scope
Ответить
0
Кирилл #
Так какие все-таки транзисторы? 2х2n2222 или 2N3904 и 2N3906? 3904 и 3906 - npn и pnp! И какой где в схеме должен стоять? С 2n2222 собираю - ерунда получается, ничего не считает, цифры прыгают от - к + , тысячами. Кто делал, разъясните пожалуйста!
Ответить
0
Никита #
Тот же вопрос с транзисторами, какие использовать, 2 штуки 2N2222 или 2N3904 и 2N3906?
Ответить
0
Никита #
Я таки разобрался с транзисторами: Который левее на приведённой здесь схеме - NPN - 2N3904, который правее, и коллектор которого на втором пине Ардуинки - PNP - 2N3906
Ответить
0
Андрей #
Всё работает как тут написано! И код и схема. Правда я поставил транзисторы 2N3904 и аналог 2N3906 (BC557C). И даже кетч ардуины залил в атмегу8 и так же всё работает. Проверяйте всё тщательнее
Ответить
0
yuferss #
А 10000 и выше измерит? Нужно узнать обороты безымянного двигателя.
Ответить
0
6161010 #
Большая погрешность, показания скачут
Ответить
0
Александр #
Этот способ съёма данных чреват скачками значений из-за дребезга на фронтах
Ответить
0
Сергей #
А почему R1 всего 10 ом? Вроде он должен быть порядка 200 ом.
Ответить
0
Жека #
почему
rpm_array[4] = 60*(1000000/(time*7));
а не
rpm_array[4] = 60*(time/1000000*7); ?

по идее время одного оборота нужно делить на собственно секунду...
Ответить
0
Андрей #
Схему подобного типа сделал на обычном uart-usb. Возможно кому и понадобиться. Журнал «Соэл» 2019г N8-c56. Или скачать "соль" в использовании точности от кварца uart-usb а оптический преобразователь с алихекспреса.
Прикрепленный файл: tahometr_ot_uarta_v1.zip
Ответить
0
Aleksei Александрович Романов #
А кто-нибудь делал подобное, но с шаговым двигателем и на лед дисплее 128х64?
Ответить
0
Литвинов В.М. #
При чем тут time_avr ??!. Он задан равным 0 и нигде не вычисляется. Бред какой-то!
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Регулятор мощности 2 кВт LC-измеритель LC100-A
вверх