Высокоскоростной тахометр на Arduino: новый алгоритм измерения RPM до 2 знаков после запятой
Компоненты и материалы
| Arduino UNO | 1 |
| ИК-датчик приближенности (рекомендуемый в проекте) | 1 |
| Перемычки | 3 |
| Лазерный диод 655 нм (красный) | 1 |
| DC-мотор (для тестов) | 1 |
| USB-кабель (Mini-USB) | 1 |
| Крона 9V | 1 |
Инструменты
| Припой без свинца |
| Паяльник (только для пайки проводов к мотору) |
Приложения и сервисы
| Arduino IDE |
О проекте

Проект разработан с нуля для точного измерения RPM (об/мин) различных моторов с помощью одного ИК-датчика, Arduino и ключевого ингредиента — красного лазерного указателя.
ИК-датчик улавливает слабое ИК-излучение красного лазера. Синий/зелёный лазер даёт слишком мало ИК — напряжение падает до ~0.
Когда лопасть вентилятора на валу мотора перекрывает луч, показание падает до 0. Лопасть вращается — периодическое перекрытие. Когда путь свободен — луч снова попадает на датчик.
НОВЫЙ АЛГОРИТМ «SINGLE SHOT DETECTION» ДЛЯ БЫСТРЫХ И ТОЧНЫХ ИЗМЕРЕНИЙ
Код использует уникальный алгоритм, измеряющий RPM за <40 мс с высокой точностью. Ключевая особенность — Single Shot Detection для Arduino.
Программа вычисляет RPM каждый раз, когда лопасть перекрывает луч. Перекрытие = 1/n оборота (n — число лопастей). Поэтому алгоритм чуток реагирует на малейшие изменения RPM (до 0.01) на каждом 1/n обороте. Это даёт экстремально точные значения и высокую чувствительность.

На скриншоте Serial Monitor видно: частота обновления ~2 раза в сек, RPM с двумя знаками после запятой.
Попробуйте проект, делитесь результатами и идеями в комментариях. Если понравилось — уважайте труд автора.
Профиль: @YASH36 — новые проекты.
Берегитесь и наслаждайтесь Arduino!!
Код
RPM_counter_101 (Arduino)
// code by YaSh
int sen = A0;
const float wid = 0.012; // ширина лопасти (м), подстройте под свой вентилятор
const float rad = 0.045; // радиус точки детектирования (м)
const float konst = 6.2832; // 2*PI
float time_1, time_2, vel, diff, tnet, rpm;
void setup() {
Serial.begin(9600);
pinMode(sen, INPUT);
Serial.print(" \n please start the motor at least 3 seconds prior.\n");
delay(3000);
}
void loop() {
if (analogRead(sen) < 950) {
time_1 = millis();
delay(30);
}
if (analogRead(sen) > 950) {
time_2 = millis();
diff = (time_2 - time_1);
vel = wid / diff; // угловая скорость
tnet = (konst * rad) / vel; // время полного оборота
rpm = 60000 / tnet; // мс -> мин -> RPM
}
Serial.print("\n The rpm is: ");
Serial.println(rpm);
}
Схемы
Размещение базы и компонентов:
Схема подключения датчика к Arduino:
Производственный процесс
- Создайте автоматизированную аэропоническую систему с Raspberry Pi и датчиком влажности
- Интеграция термопары с Arduino Portenta H7 через MAX6675
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Проект с датчиком DHT11: индикация температуры светодиодами и пьезо-динамиком на Arduino
- Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
- Unopad: Бесшовный Arduino MIDI-контроллер для Ableton Live
- Логгер температуры и влажности на Arduino с DHT11 и Ethernet Shield
- Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
- Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
- Клеточный автомат «Жизнь» Конвея на Arduino Nano с OLED 128x64