Допоможіть розробці сайту, ділитися статтею з друзями!
У цьому проекті я покажу вам, як спроектувати і побудувати просту схему детектора для визначення швидкості автомобіля, що рухається або будь-якого об'єкта, що рухається з використанням Arduino NANO і інфрачервоних датчиків (ІК).
Принцип роботи
ІК-датчики є основною частиною даного проекту. Практично ви можете реалізувати настройку ІК-датчиків різними способами, але в цьому проекті я використовував два ІК-датчика відбивної типу, розмістивши їх на відстані 30 см один від одного.
ІК-датчик включає в себе інфрачервоний світлодіод (передавач) і фототранзистор (приймач). Коли об'єкт проходить між датчиками, світло відбивається від об'єкта і падає на фототранзистор. Використовується операційний підсилювач IC (LM393), до якого підключений фототранзистор. Коли об'єкт виявляється перед датчиком, він посилає логічний сигнал HIGH в Arduino.
Тобто, коли автомобіль, що рухається досягає першого ІК-датчика, то він активується. З цього моменту запускається таймер, який буде продовжувати відраховувати час, поки автомобіль не досягне другого ІК-датчика.
Підбираючи відстань між датчиками в межах 5 метрів можна розрахувати швидкість, з якою автомобіль буде рухатися від першого датчика до другого, так як час руху вам вже відомо.
Використовувана формула: Speed = distance / Time, де
- Speed - швидкість,
- distance - відстань між датчиками,
- Time - час виміряний модулем Ардуіно.
Всі розрахунки і збір даних виконуються Arduino, а остаточний результат відображається на ЖК-модулі 16X2.
використовувані компоненти
компонент | Специфікація | кількість | Де купити |
---|---|---|---|
Arduino | Nano Rev3.0 | 1 | Посилання |
ІК-датчик | IR FC-51 | 2 | Посилання |
LCD | 16X2 (1602A) | 1 | Посилання |
Блок живлення | 12 Вольт | 1 | |
перемикач | SPST | 1 | Посилання |
потенціометр | 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 см / с.
Звичайно, цю розробку можна перенести і на реальні умови - на дорогу, вимірявши швидкість руху автомобіля.
