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

В этом проекте я покажу вам, как спроектировать и построить простую схему детектора для определения скорости движущегося автомобиля или любого движущегося объекта с использованием 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.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, скачано: 38)

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

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

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

Демонстрация работы проекта
Демонстрация работы проекта
Обсудить на форуме
ОЦЕНИТЬ:
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 5,00 из 5)
Загрузка...
Понравилась статья? Поделиться с друзьями:


Комментарии и отзывы

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