Тахометр-спидометр на Arduino

С помощью датчика Холла и платы Ардуино можно измерять скорость вращения к примеру колеса велосипеда или самоката, в общем в любых механизмах и машинах, которым необходимы измерения скорости.

В этом проекте мы делали спидометр из кольца адресных светодиодов под управлением компактной платы Ардуино Нано версии с CH340.

1. Аппаратная часть

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

2. Схема и программная часть

После подбора компонентов для сборки, собираем небольшую схему

Схема подключения тахометра на breadboard Принципиальная схема тахометра

Получаем

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

Совет

Кольцо можно временно отключить, чтобы просто не мешалось.

Проверяем схему еще раз и загружаем в Arduino следующий скетч

#include <Adafruit_NeoPixel.h>
const int LED_PIN = 6; // выход на модуль
const int TACH_PIN = 2; //вход тахометра
const int BRIGHTNESS = 50; //яркость
const int LED_COUNT = 15; //количество светодиодов
const int REDLINE = 7500; //количество красных
const int WARN_RPM = 6000;
const int WARN_INTERVAL = 70;
bool blinkState = true;
unsigned long lastBlinkUpdate = 0;
volatile unsigned long lastIgnitionTime = 0;

void recordIgnition() {
    detachInterrupt(digitalPinToInterrupt(TACH_PIN));
    lastIgnitionTime = millis();
    attachInterrupt(digitalPinToInterrupt(TACH_PIN), calculateRpm, RISING);
}

void calculateRpm() {
    detachInterrupt(digitalPinToInterrupt(TACH_PIN));
    unsigned long ignitionTimeDelta = millis() - lastIgnitionTime;
    int rpm = 1000.0 / ignitionTimeDelta * 60 *2;
    Serial.print("RPM: ");//Пишем частоту в монитор порта
    Serial.println(rpm);
    setRpm(rpm);
    attachInterrupt(digitalPinToInterrupt(TACH_PIN), recordIgnition, RISING);
}
void setup() {
    Serial.begin(9600);
    pinMode(TACH_PIN, INPUT);
    strip.begin();
    strip.setBrightness(BRIGHTNESS);
    strip.show(); // Initialize all pixels to 'off'
    attachInterrupt(digitalPinToInterrupt(TACH_PIN), recordIgnition, RISING);
}

void loop() {
}

void setRpm(int rpm) {
    int rpmPerLed = REDLINE / LED_COUNT;
    if(rpm >= WARN_RPM) {
        unsigned long currentTime = millis();
        if(currentTime - lastBlinkUpdate > WARN_INTERVAL) {
            lastBlinkUpdate = currentTime;
            blinkState = !blinkState;
        }
    }
    else
        blinkState = true;
    for(int led = 0; led < LED_COUNT; led++) {
        if(!blinkState && (led+2)*rpmPerLed > WARN_RPM) {
            strip.setPixelColor(led, 0, 0, 0);
            continue;
        }
        if((led+1)*rpmPerLed <= rpm)
            strip.setPixelColor(led, getColor((led+1)*rpmPerLed, 1));
        else if(led*rpmPerLed < rpm && (led+1)*rpmPerLed > rpm) {
            strip.setPixelColor(led, getColor(rpm, (double)(rpm-(led)*rpmPerLed)/rpmPerLed));
        }
        else
            strip.setPixelColor(led, 0, 0, 0);
    }
    strip.show();
}
int32_t getColor(int rpm, double intensity) {
    int red = rpm/(double)REDLINE * 255 * intensity;
    int green = (1-rpm/(double)REDLINE) * 255 * intensity;
    int blue = 0;
    return strip.Color(red, green, blue);
}

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

Отсутствие сигнала

Осциллограмма — отсутствие сигнала с датчика Холла

Наличие сигнала

Осциллограмма — наличие сигнала с датчика Холла

После проверки работоспособности подключаем кольцо на светодиодах WS2812 и вращая рядом с датчиком диском с магнитом получаем частоту вращения диска.

Важно

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

Смотрим что получилось.

Заключение

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

Примечание

P.S. Осциллограф используемый для измерения собран на ArduinoPro micro и TFT дисплее.