Допоможіть розробці сайту, ділитися статтею з друзями!

У цьому проекті я покажу вам, як спроектувати і побудувати просту схему детектора для визначення швидкості автомобіля, що рухається або будь-якого об'єкта, що рухається з використанням Arduino NANO і інфрачервоних датчиків (ІК).

Принцип роботи

ІК-датчики є основною частиною даного проекту. Практично ви можете реалізувати настройку ІК-датчиків різними способами, але в цьому проекті я використовував два ІК-датчика відбивної типу, розмістивши їх на відстані 30 см один від одного.

ІК-датчик включає в себе інфрачервоний світлодіод (передавач) і фототранзистор (приймач). Коли об'єкт проходить між датчиками, світло відбивається від об'єкта і падає на фототранзистор. Використовується операційний підсилювач IC (LM393), до якого підключений фототранзистор. Коли об'єкт виявляється перед датчиком, він посилає логічний сигнал HIGH в Arduino.

Тобто, коли автомобіль, що рухається досягає першого ІК-датчика, то він активується. З цього моменту запускається таймер, який буде продовжувати відраховувати час, поки автомобіль не досягне другого ІК-датчика.

Підбираючи відстань між датчиками в межах 5 метрів можна розрахувати швидкість, з якою автомобіль буде рухатися від першого датчика до другого, так як час руху вам вже відомо.

Використовувана формула: Speed = distance / Time, де

  • Speed - швидкість,
  • distance - відстань між датчиками,
  • Time - час виміряний модулем Ардуіно.

Всі розрахунки і збір даних виконуються Arduino, а остаточний результат відображається на ЖК-модулі 16X2.

використовувані компоненти

компонентСпецифікаціякількістьДе купити
ArduinoNano Rev3.01Посилання
ІК-датчикIR FC-512Посилання
LCD16X2 (1602A)1Посилання
Блок живлення12 Вольт1
перемикачSPST1Посилання
потенціометр10 кОм1Посилання

схема проекту

На наступному малюнку показана принципова електрична схема проекту детектора швидкості автомобіля.

Електрична схема детектора швидкості

В Arduino контакти D2 і D3 є переривань, де D2 - int.0, а D3 - int.1. Вихідні контакти ІК-датчиків підключені до цих контактах.

ЖК-дисплей підключений до висновків D4-D9 Arduino, де D4 підключений до RS, D5 підключений до E, а D6-D9 Arduino підключені до висновків D4-D7 ЖК-дисплея. Висновки 15 (A) і 16 (K) використовуються для підсвічування РК-дисплея.

Потенціометр R1 використовується для ручного налаштування контрасту дисплея через V0.

Опис контактів LCD модуля (1602A):

VSS«-» Харчування модуля
VDD«+» Харчування модуля
VOВисновок управління контрастом дисплея
RSвибір регістру
RWВибір режиму запису або читання
EДозвіл звернень до індикатора
DB0-DB7біти інтерфейсу
A«+» Харчування підсвічування
K«-» Харчування підсвічування

програмування

На початку коду заголовки оголошується з ім'ям «LiquidCrystal.h», який використовується для РК-дисплея. У наступному рядку контакти LCD вказані в функції «LiquidCrystal lcd (4, 5, 6, 7, 8, 9)». Тут цифра в дужках показує контакти Arduino, які підключені до LCD.

 #include LiquidCrystal lcd (4, 5, 6, 7, 8, 9); 

У рядках 4 і 5 sensor1 і sensor2 оголошені як цілі числа (integer) - це висновки Arduino, які підключені до ІК-датчикам.

 int sensor1 = 2; int sensor2 = 3; 

Після цього оголошуються 4 цілих числа з ім'ям Time1, Time2, Time і flag. Де «Time1» - це виміряний час, коли «sensor1» активований, а «Time2» - це виміряний час, коли «sensor2» активований. Time - це різниця між «Time1» і «Time2», яка еквівалентна часу, протягом якого автомобіль проїжджав між «sensor1» і «sensor2» або «sensor2» і «sensor1».

 int Time1; int Time2; int Time; int flag = 0; 

Потім ми оголошуємо целочисленную константу distance, яка є відстанню між датчиками IR1 і IR2 в сантиметрах. Для прикладу я взяв відстань рівним 30 см. Ви, звичайно ж, можете поміняти на своє значення (краще до 5 метрів).

 int distance = 30; 

Далі змінна Speed, оголошується як число з плаваючого коми (тип float). І вона використовується для зберігання швидкості автомобіля.

 float Speed; 

При запуску «void setup ()» спрацьовують 2 функції обробки зовнішніх переривань "attachInterrupt (0, fun1, RISING)" і "attachInterrupt (1, fun2, FALLING)". Наприклад, "attachInterrupt (0, fun1, RISING", означає, що коли IR2 виявить падаючу хвилю (int.0), то переривання запустить функцію fun1.

ЖК-дисплей запускається за допомогою функції «lcd.begin (16, 2)». А очищається за допомогою функції «lcd.clear ()». Повідомлення на екрані «SPEED MEASURMENT» друкується на за допомогою функції «lcd.print».

 void setup () {attachInterrupt (0, fun1, RISING); attachInterrupt (1, fun2, FALLING); lcd.begin (16, 2); lcd.clear (); lcd.print ( "SPEED MEASURMENT"); } 

void fun1 () запускається, коли активований «interrupt0 (int.0)». У цій функції даний час вимірюється за допомогою «Time1 = millis ()».

Функція void fun2 (), це те ж саме, що і «void fun1 ()», але запускається вона, коли активується «interrupt1 (int.1)».

 void fun1 () {Time1 = millis (); if (flag == 0) {flag = 1;} else {flag = 0;}} void fun2 () {Time2 = millis (); if (flag == 0) {flag = 1;} else {flag = 0;}} 

У «void loop ()», час Time вимірюється за допомогою «Time1» і «Time2». «Time» має бути позитивним, тому додатково використовується «if else». Але цей цикл виконується, коли flag = 0, тому використовується умова «if». Якщо «Time1» і «Time2» рівні, «Speed» буде нульовим.

У рядку 47 перевіряється if (Speed == 0). Якщо ця умова вірно, то на РК-дисплеї друкується «… .OK ….», Що вказує на те, що система готова до використання.

Рядки 51 і нижче відповідають за відображення на РК-дисплеї швидкості рухомого об'єкту, після того, як «Time1» і «Time2» стануть рівними нулю.

 void loop () {if (flag == 0) {if (Time1> Time2) {Time = Time1 - Time2; Speed = (distance * 1000) / Time;} else if (Time2> Time1) {Time = Time2 - Time1; Speed = (distance * 1000) / Time;} else {Speed = 0;}} if (Speed == 0) {lcd.setCursor (0, 1); lcd.print ( "……. OK ……."); } Else {lcd.setCursor (2, 1); lcd.print (Speed); lcd.print ( "cm / sec"); delay (10500); Time1 = 0; Time2 = 0; }} 

Повний скетч проекту:

Детектор швидкості рухомого об'єкту на Ардуіно (471 bytes, завантажено: 42)

демонстрація роботи

На анімації нижче ви можете подивитися демонстрацію роботи проекту. Датчики розташовані на відстані 30 см, а між ними моделюється рух ручкою. В даному випадку, швидкість руху ручки була зафіксована на рівні 17 см / с.

Звичайно, цю розробку можна перенести і на реальні умови - на дорогу, вимірявши швидкість руху автомобіля.

Демонстрація роботи проекту

Допоможіть розробці сайту, ділитися статтею з друзями!

Категорія: