С помощью датчика Холла и платы Ардуино можно измерять скорость вращения к примеру колеса велосипеда или самоката, в общем в любых механизмах и машинах, которым необходимы измерения скорости.
В этом проекте мы делали спидометр из кольца адресных светодиодов под управлением компактной платы Ардуино Нано версии с CH340.
1. Аппаратная часть
Для реализации тахометра с применением адресных светодиодов на понадобится:
- Цифровой датчик Холла 3144
- Arduino Nano
- Модули адресных RGB светодиодов ws2812
- Магнит
- Макетная плата на 400 или 800 точек
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 дисплее.