В этом проекте я покажу вам, как спроектировать и построить простую схему детектора для определения скорости движущегося автомобиля или любого движущегося объекта с использованием Arduino NANO и инфракрасных датчиков (ИК).
Принцип работы
ИК-датчики являются основной частью данного проекта. Практически вы можете реализовать настройку ИК-датчиков разными способами, но в этом проекте я использовал два ИК-датчика отражательного типа, разместив их на расстоянии 30 см друг от друга.
ИК-датчик включает в себя ИК-светодиод (передатчик) и фототранзистор (приемник). Когда объект проходит между датчиками, свет отражается от объекта и падает на фототранзистор. Используется операционный усилитель IC (LM393), к которому подключен фототранзистор. Когда объект оказывается перед датчиком, он посылает логический сигнал HIGH в Arduino.
То есть, когда движущийся автомобиль достигает первого ИК-датчика, то он активируется. С этого момента запускается таймер, который будет продолжать отсчитывать время, пока автомобиль не достигнет второго ИК-датчика.
Подбирая расстояние между датчиками в пределах 5 метров можно рассчитать скорость, с которой автомобиль будет двигаться от первого датчика ко второму, так как время движения вам уже известно.
Используемая формула: Speed = distance / Time, где
- Speed — скорость,
- distance — расстояние между датчиками,
- Time — время измеренное модулем ардуино.
Все расчеты и сбор данных выполняются Arduino, а окончательный результат отображается на ЖК-модуле 16X2.
Используемые компоненты
Компонент | Спецификация | Количество | Где купить |
---|---|---|---|
Arduino | Nano Rev3.0 | 1 | [mask_link]Ссылка[/mask_link] |
ИК-датчик | IR FC-51 | 2 | [mask_link]Ссылка[/mask_link] |
LCD | 16X2 (1602A) | 1 | [mask_link]Ссылка[/mask_link] |
Блок питания | 12 Вольт | 1 | |
Переключатель | SPST | 1 | [mask_link]Ссылка[/mask_link] |
Потенциометр | 10 кОм | 1 | [mask_link]Ссылка[/mask_link] |
Схема проекта
На следующем рисунке показана принципиальная электрическая схема проекта детектора скорости автомобиля.
В 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;
}
}
Полный скетч проекта:
Детектор скорости движущегося объекта на Arduino
Демонстрация работы
На анимации ниже вы можете посмотреть демонстрацию работы проекта. Датчики расположены на расстоянии 30 см, а между ними моделируется движение ручкой. В данном случае, скорость движения ручки была зафиксирована на уровне 17 см/с.
Конечно, эту разработку можно перенести и на реальные условия — на дорогу, измерив скорость движения автомобиля.
Эмиль
Здравствуйте, если я собираю прибор на макетке — будет ли отличаться код?
Эмиль
Здравствуйте, а у вас нет подробной инструкции с лужением дорожек на текстолите и какой размер должен быть у данной платы?