Arduino

Лазерный тахометр (2 варианта)

Приветы самоделкиным!
В этой статье мы рассмотрим построение пару простых и небольших тахометров. Первый вариант построен на базе микропроцессора ATtiny1614, второй — на Arduino Nano.
Обычно такой прибор не нужен, но если вы занимаетесь изобретательством , то он может оказаться очень даже нужным. Напомню: тахометр — это прибор для измерения скорости вращения (вала, колеса, патрона и т.д.).

Лазерный тахометр (2 варианта)

ВАРИАНТ ПРИБОРА № 1

Лазерный тахометр (2 варианта)

Лазерный тахометр (2 варианта)

Для реализации проекта потребуются:
— Микропроцессор ATtiny1614 1шт,
— Модуль зарядки аккумулятора TP4056 1шт,
— Аккумулятор 3,7в 1шт,
— Микрокнопка для монтажа на плату 2шт,
— Модуль с дисплеем I2C OLED 128х32 1шт,
— Датчик лазерного излучения 1шт,
— Модуль KY-008 (лазерный диод) 1шт,
— Резистор SMD 33 Ом 1шт,
— Резистор SMD 10 кОм 1шт,
— резистор SMD 0 Ом (?????) 1шт,
— Конденсатор SMD 0,1 мкФ 1шт,
— Arduino IDE
— 3D-принтер
— Паяльник

Все необходимое, если что то отсутствует в ваших запасниках, можете найти самостоятельно. Сами знаете где вам удобней покупать.Рассмотрим схему. Тут видно что главным компонентом является микропроцессор ATtiny1614. У него очень низкое потребление энергии в дежурном режиме и имеет маленькие габариты для минимилизации размеров проекта.

Лазерный тахометр (2 варианта)

Так же можно посмотреть каким образом смоделирована печатная плата. В конце статьи по первому варианту будет предоставлена возможность скачать файл для программы EAGLE.

Лазерный тахометр (2 варианта)

Для проекта можно использовать детали от модуля KY-008 или если есть в наличии другие подходящие детальки. В статье показан пример на основании отдельного лазерного диода 5 мВт.

Лазерный тахометр (2 варианта)

Лазерный тахометр (2 варианта)

К используемуму лазерному диоду был впаян резистор 33 Ом. В данном случае его нужно выпаять и закоротить контакты просто припаяв кусок провода.

Лазерный тахометр (2 варианта)

Подготовка закончена. Теперь можно приступать к электромонтажу. Плату вы можете вытравить сами или заказать у тех, кто этим занимается. Сначала следует смонтировать минимальные компоненты. Поэтому производится монтаж SMD деталей. Дальше впаивается на плату микропроцессор.

Лазерный тахометр (2 варианта)

Затем можно добавить на плату необходимые разъемы для программатора и зарядного модуля.

Лазерный тахометр (2 варианта)

На обратной стороне платы нужно установить (припаять) пару кнопочек. Для удобства использования их, можно использовать пару сгоревших светодиодов. Просто стоит обкусить ножки и припилить для получения ровной поверхности. Потом просто приклеить, получится очень даже не плохо для нажимания мелких кнопок.

Лазерный тахометр (2 варианта)

Следующим шагом будет впайка в плату 4-х пиного разъемы для модуля с дисплеем. Рекомендуется на плату уложить (приклеить) прокладку на толщину в соответствии с высотой контактов и по габаритам приблизительно подходящими к модулю дисплея. Теперь можно установить дисплей на свое место.

Лазерный тахометр (2 варианта)

Затем можно установить модуль заряда аккумуляторов на заранее приготовленное место.

Лазерный тахометр (2 варианта)

Вот так будет выглядеть почти собранная электронная начинка в профиль:

Лазерный тахометр (2 варианта)

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

Лазерный тахометр (2 варианта)

Лазерный тахометр (2 варианта)

Лазерный тахометр (2 варианта)

Лазерный тахометр (2 варианта)

Для завершения электромонтажа осталось добавить датчик обнаружения лазерного излучения.
У каждого уважающего себя самоделкина должен иметься минимальный набор для мелких работ:

Лазерный тахометр (2 варианта)

Такой инструмент понадобится для изгиба ножек датчика под сложными углами. Примерно это должно выглядеть вот так:

Лазерный тахометр (2 варианта)

Лазерный тахометр (2 варианта)

После завершения работ с платой, можно приступить к сборке. В корпус , напечатанный на 3D-принтере устанавливается готовая плата. (файлы корпуса будут предоставлены позже).

Лазерный тахометр (2 варианта)

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

Лазерный тахометр (2 варианта)

Еще нужно позаботиться о добавлении плат megaTinyCore в Arduinno IDE. Информации так же полным полно во всемирной паутине.

Лазерный тахометр (2 варианта)

При использовании тахометра важно учесть что направляемый лазерный луч должен отражаться обратно, к датчику, причем с перерывом. Думаю не составит сложности наклеить что то матовое или наоборот отражающее в зависимости от поверхности на которую будете светить лазером. Таким образом на вход микроконтроллера будут поступать импульсы с частотой 1 оборот/импульс. Ну а дальше контроллер просто производит математические действия, считая количество импульсов за определенное время.

Лазерный тахометр (2 варианта)

ФАЙЛЫ ДЛЯ СКАЧИВАНИЯ для первого варианта:
— Файлы корпуса измерителя (формат .STL)
— Схема (формат .PNG)
— Печатная плата (формат .JPG)
— Схема и печатная плата в формате Eagle (форматы .SCH и .BRD)- Код программы (формат .INO)
Так же код программы можно скопировать из спойлера ниже:

Лазерный тахометр (2 варианта)

 
// Laser Tachometer V1
// Based on a design by Elite Worm (https://www.hackster.io/Elite_Worm/build-a-laser-tachometer-c5a320)
//
//
// V1: jlb (jbrad2089@gmail.com)
// — Wrote software for a ATtiny1614 and 128×32 I2C OLED display
///**
* ATTiny1614 Pins mapped to Ardunio Pins
*
* +———+
* VCC + 1 14 + GND
* (SS) 0 PA4 + 2 13 + PA3 10 (SCK)
* 1 PA5 + 3 12 + PA2 9 (MISO)
* (DAC) 2 PA6 + 4 11 + PA1 8 (MOSI)
* 3 PA7 + 5 10 + PA0 11 (UPDI)
* (RXD) 4 PB3 + 6 9 + PB0 7 (SCL)
* (TXD) 5 PB2 + 7 8 + PB1 6 (SDA)
* +———+
*/#include
#include
#include #define MEASURE_BTN 0 //PA4 D0
#define ON_BTN 1 //PA5 D1
#define SENSOR 9 //PA2 D9
#define LASER 10 //PA3 D10U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);volatile uint32_t pulseStartTime = 0; //Time revolution started
volatile uint32_t pulseDuration = 0; //Duration of revolutionchar textBuffer[20]; //Used for text measurement//Used to store a running average
#define AVG_SIZE 128
#define AVG_MASK 0x7F
uint32_t runningTotal = 0;
uint16_t runningCount = 0;
uint8_t runningHead = 0;
uint8_t runningTail = 0;
uint32_t runningValues[AVG_SIZE];#define PULSE_TIMEOUT 5000
#define UPDATE_TIME 300
uint32_t updateTimeout;//——————————————————————————
//Initialise Hardware
void setup()
{
//Serial.begin(9600); pinMode(LASER, OUTPUT);
digitalWrite(LASER, LOW);
pinMode(SENSOR, INPUT);
attachInterrupt(digitalPinToInterrupt(SENSOR), SensorInterrupt, RISING);

//ON button Interrupt will wake up from sleep mode
pinMode(ON_BTN, INPUT_PULLUP);
pinMode(MEASURE_BTN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ON_BTN),SwitchInterrupt,CHANGE); u8g2.begin();
u8g2.clearBuffer(); // clear the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display

systemSleep();
}//——————————————————————————
//Handle pin change interrupt when ON button is pressed
// — This will wake up the microprocessor
// — Code will continue after the sleep_mode() command in the systemSleep() function.
void SwitchInterrupt()
{
}//——————————————————————————
//Handle pin change interrupt when ON button is pressed
// — This will trigger on the rising edge of the sensor
void SensorInterrupt()
{

pulseDuration = micros() — pulseStartTime;
pulseStartTime = micros();
}//———————————————————————
// Show splash screenvoid showSplashScreen()
{
//Splash screen
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_helvB12_tr); // helvetica bold
u8g2.drawStr(20,14,»ATtiny1614″); // x,y,text
u8g2.drawStr(15,29,»Laser Tacho»);
u8g2.sendBuffer(); // transfer internal memory to the display
delay(3000); strcpy(textBuffer, «Ready»);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso20_tr); // helvetica bold
int width = u8g2.getStrWidth(textBuffer);
u8g2.drawStr((128-width)/2,26,textBuffer);
u8g2.sendBuffer(); // transfer internal memory to the display
}//——————————————————————————
//Main Program Loop
void loop()
{
uint32_t started;
uint32_t duration;
uint32_t rpm;

while (digitalRead(ON_BTN) == HIGH)
{
if (digitalRead(MEASURE_BTN) == LOW)
{
//Switch on laser
digitalWrite(LASER, HIGH);
delay(10);

//Start reading the sensor
noInterrupts();
pulseDuration = 0; //Wait for at least one revolution
pulseStartTime = micros(); //If no intertupts, we can test this for a timeout
interrupts(); //Clear out any old running totals
runningTotal = 0;
runningCount = 0;
runningHead = 0;
runningTail = 0;

while (digitalRead(MEASURE_BTN) == LOW)
{
noInterrupts();
started = pulseStartTime;
duration = pulseDuration;
interrupts(); if (duration == 0 && (millis() — started) > PULSE_TIMEOUT)
{
//No pulse so we aren’t measuring anything
rpm = 0;
}
else if (duration > 0)
{
//Get the RPM and add to running average
rpm = (60000000 / duration);
if (runningCount == AVG_SIZE)
{
//Remove oldest value from running total
runningTotal = runningTotal — runningValues[runningTail];
runningTail = (runningTail + 1) & AVG_MASK;
runningCount—;
}
//Add new value to running total
runningValues[runningHead] = rpm;
runningHead = (runningHead + 1) & AVG_MASK;
runningTotal = runningTotal + rpm;
runningCount++;
rpm = runningTotal / runningCount;
} //Display running average
if (millis() > updateTimeout)
{
displayNumber(rpm);
updateTimeout = millis() + UPDATE_TIME;
}
}

//Switch off laser
digitalWrite(LASER, LOW);
}
delay(100);
}

//Wait until ON button is released
while (digitalRead(ON_BTN) == LOW)
{
delay(100);
}
//Shut down unit
systemSleep();
}//———————————————————————
// display current RPM
void displayNumber(uint32_t number)
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso20_tr); // helvetica bold
sprintf(textBuffer,»%5lu»,number);
int twidth = u8g2.getStrWidth(textBuffer);
u8g2.setFont(u8g2_font_helvB12_tr); // helvetica bold
strcpy(textBuffer,» rpm «);
int rwidth = u8g2.getStrWidth(textBuffer);
int tx = max(128 — (twidth + rwidth), 0);
u8g2.drawStr(tx + twidth,30,textBuffer);
sprintf(textBuffer,»%5lu»,number);
u8g2.setFont(u8g2_font_logisoso20_tr); // helvetica bold
u8g2.drawStr(tx,30,textBuffer);
u8g2.sendBuffer(); // transfer internal memory to the display
}//——————————————————————————
//Shut down OLED and put ATtiny to sleep
//Will wake up when LEFT button is pressed
void systemSleep()
{
interrupts();
u8g2.clearBuffer(); // clear the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
u8g2.setPowerSave(true);
//cbi(ADCSRA,ADEN); // switch Analog to Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable();
sleep_mode(); // System actually sleeps here
sleep_disable(); // System continues execution here when watchdog timed out
//sbi(ADCSRA,ADEN); // switch Analog to Digitalconverter ON
u8g2.setPowerSave(false);
//Wait until on button is released
while (digitalRead(ON_BTN) == LOW)
{
delay(100);
}
showSplashScreen();
updateTimeout = 0;
}
Так же понадобится подключить библиотеки для Arduino IDE:
— OneWire.h
— avr/sleep.h
— U8g2lib.h
Теперь рассмотрим другой вариант.ВАРИАНТ ПРИБОРА № 2

Лазерный тахометр (2 варианта)

На мой взгляд этот прибор более прост в сборке и вообще более удачен. Принцип работы аналогичен предыдущему аппарату, но тут не нужно использовать дополнительный программатор.
Весь процесс сборки и пробных измерений можно посмотреть на YouTube-канале. Кстати там приводится сравнение самодельного и промышленного тахометра. О результатах сравнения судить вам.

Для реализации этого проекта потребуются:
— Arduino Nano 1шт,
— Модуль с дисплеем I2C OLED 128х32 1шт,
— Аккумулятор или батарея 9в 1шт,
— Датчик лазерного излучения 1шт,
— Модуль KY-008 с лазерным диодом 1шт,
— Разъем для подключения батареи питания 1шт,
— Кнопка для монтажа на плату 1шт.Схема подключения модулей выглядит примерно вот так (побыстренькому набросал компонентов в программе Fritzing следуя описанию):

Лазерный тахометр (2 варианта)

Что бы не ошибиться, опишу словами как следует подключать модули между собой.Следует подключить дисплей к Arduino Nano следующим образом:
— GND к GND (земля к земле),
— Контакт VCC дисплея к выводу Arduino 5V,
— Контакт SCL дисплея к выводу А5 Arduino,
— Контакт SDA дисплея к выводу А4 Arduino.Припаять разъем питания
— черный (минусовой) провод к контакту GND платы Arduino,
— красный (+9в) к контакту кнопки,
— второй контакт кнопки, (задействованный) припаять к контакту VIN платы Arduino.Лазерные модули соединить следующим образом:
— GND соединить на обоих модулях,
— питание +5в также соединить между собой,
— теперь общее GND соединить с аналогичным выводом платы Arduino ,
— питание +5в нужно снять с контакта 5V платы Arduino,
— Выход датчика лазерного излучения OUT подключить к контакту D2 платы Arduino.Оcталось загрузить скетч в ардуинку и можно приступать к сборке. На видео выше все показано до меличайших подробностей. В принципе ничего сложного.

Лазерный тахометр (2 варианта)

ФАЙЛЫ ДЛЯ СКАЧИВАНИЯ для второго варианта:
— Оригинальные файлы для распечатки корпуса (формат .STL)
— Скетч для заливки в ардуино (формат .INO)
или просто можно скопировать текст программы из спойлера ниже:

Лазерный тахометр (2 варианта)

 
//Laser Tachometer by Elite Worm (YouTube.com/c/EliteWorm)
//Version 1.0.0//Make sure you have all the libraries installed!#include
#include
#include
#include #define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);const byte sensor = 2;volatile unsigned long t_pulse_started_volatile = 0;
volatile unsigned long t_pulse_duration_volatile = 0;
unsigned long t_pulse_started = 0;
unsigned long t_pulse_duration = 0;long rpm_sum = 0;
long rpm_reading[100];
long rpm_average = 0;
byte n_max = 0;
byte n = 0;volatile bool timeout = 1;
volatile bool newpulse = 0;void setup() {

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;);
}

pinMode(sensor, INPUT);
attachInterrupt(digitalPinToInterrupt(sensor), ISR_sensor, RISING);

}void loop() {

noInterrupts();
t_pulse_started = t_pulse_started_volatile;
t_pulse_duration = t_pulse_duration_volatile;
interrupts();

if(((micros() — t_pulse_started) > 2000000) && timeout == 0 && newpulse == 0) {

timeout = 1;
rpm_average = 0;
n = 0; };

if(timeout == 0){

if(newpulse){

rpm_reading[n] = (60000000 / t_pulse_duration);
n_max = constrain(map(rpm_reading[n], 60, 100000, 0, 100), 0, 100);
n++;
newpulse = 0;

if(n > n_max){

for (byte i = 0; i = 10 && rpm_average < 100) x = 62;
if(rpm_average >= 100 && rpm_average < 1000) x = 44;
if(rpm_average >= 1000 && rpm_average < 10000) x = 26;
if(rpm_average >= 10000 && rpm_average < 100000) x = 8;

display.setTextColor(SSD1306_WHITE);

if(rpm_average < 100000){

display.setCursor(x, 6);
display.print(rpm_average);
display.setTextSize(1);
display.setCursor(104, 20);
display.print(F(«RPM»));
display.display();

} else {

display.setTextSize(2);
display.setCursor(13, 8);
display.print(F(«MAX LIMIT»));
display.display();

}

}void ISR_sensor() {

t_pulse_duration_volatile = micros() — t_pulse_started_volatile;
t_pulse_started_volatile = micros();
timeout = 0;
newpulse = 1;

}
Если у вас не установлены в среде Arduino IDE следующие библиотеки, то скачать их можно тут:
— SPI.h
— Wire.h
— Adafruit_GFX.h
— Adafruit_SSD1306.hНу и напоследок. Вот так выглядят модули с лазерным диодом и с сенсором распознавания этого лазера.

Лазерный тахометр (2 варианта)

Лазерный тахометр (2 варианта)

У меня все. Всем добра!!!!

Источник

Теги

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

Добавить комментарий

Ваш адрес email не будет опубликован.

Кнопка «Наверх»
Закрыть
Закрыть