Апр
12

Детектор скорости движущегося автомобиля на Ардуино

Author Remontnik    Category Статьи     Tags

В этом проекте я покажу вам, как спроектировать и построить простую схему детектора для определения скорости движущегося автомобиля или любого движущегося объекта с использованием Arduino NANO и инфракрасных датчиков (ИК).

Содержание

  1. Принцип работы
  2. Используемые компоненты
  3. Схема проекта
  4. Программирование
  5. Демонстрация работы

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

ИК-датчики являются основной частью данного проекта. Практически вы можете реализовать настройку ИК-датчиков разными способами, но в этом проекте я использовал два ИК-датчика отражательного типа, разместив их на расстоянии 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.h>
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, скачано: 3)

Демонстрация работы

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

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

Детектор скорости движущегося автомобиля на Ардуино

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

Прокомментировать

Рубрики

Это вы еще не читали

Биржа ссылок Gogetlinks
Биржа статей Webartex