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

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

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

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

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

    

  

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

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

Получаем

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

Проверяем схему еще раз и загружаем в 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 дисплее.

0

Изменено: