Определение направления движения объекта с помощью двух ИК датчиков TSOP1736
Обновлено: 12 февраля 2026 г. 19:22Данная статья подробно описывает практическую реализацию системы, которая определяет направление движения объекта (например, человека, робота или предмета), пересекающего линию наблюдения, с помощью двух инфракрасных приёмников TSOP1736. Приведены схема подключения, алгоритм обработки сигналов, пример кода для микроконтроллера (Arduino), рекомендации по монтажу и калибровке.
Краткое описание идеи
Идея проста: два расположенных рядом ИК-приёмника (левый и правый) формируют виртуальную линию наблюдения. Когда объект пересекает последовательность срабатываний — сначала левый затем правый — система считает это направлением «слева→справа». В обратном порядке — «справа→слева». С помощью временной логики устраняются ложные срабатывания и фиксируются события входа/выхода.
Компоненты и их функции
- TSOP1736 — ИК-приёмник для модулированного 36 кГц сигнала; устойчив к внешней подсветке при правильной настройке трансмиттеров.
- ИК-передатчики (обычно ИК-светодиоды с модуляцией 36 кГц) — по одному напротив каждого приёмника.
- Микроконтроллер — пример: Arduino Uno / Nano для обработки логики.
- Питание — 5 В для приёмников и Arduino; резисторы для светодиодов, при необходимости драйверы.
- Ограничитель/корпус — для формирования направленной зоны обнаружения и защиты от рассеянного света.
Почему TSOP1736?
TSOP1736 — распространённый универсальный ИК-приёмник, рассчитан на приём модулированного 36 кГц сигнала. Он фильтрует постоянную подсветку и даёт цифровой выход (LOW при приёме модулированного ИК). Это упрощает логику и повышает помехозащищённость по сравнению с простыми фотодиодами.
Схема подключения
Базовая схема для каждого приёмника:
- Vcc → 5 В
- GND → GND
- OUT → вход цифрового пина микроконтроллера (например, D2 и D3)
Логика и алгоритм
Основная задача — фиксировать порядок срабатываний и отфильтровывать ложные короткие импульсы. Простейший алгоритм:
- Считать текущие состояния L и R (0 — приём сигнала, 1 — покой для TSOP при pull-up).
- Следить за переходами: покой → срабатывание (HIGH→LOW или digitalRead==LOW в зависимости от подтяжки).
- При первом срабатывании запомнить, какой датчик сработал (L или R) и отметить метку времени.
- Если в течение порога времени (например, 300–800 мс) срабатывает второй датчик и порядок L→R — событие считается движением слева→справа; при обратном порядке — справа→слева.
- После фиксации события игнорировать дальнейшие срабатывания в течение «блокирующего» интервала (например, 300–500 мс) чтобы избежать дребезга.
- Добавить детектирование повторных длинных пересечений (если объект застрял между датчиками) — обработать по доп. логике или считать отдельным состоянием.
Параметры для настройки
| Параметр | Рекомендуемое значение | Примечание |
|---|---|---|
| Максимальный интервал между срабатываниями | 300–800 мс | Зависит от скорости объекта и расстояния между датчиками |
| Дебаунс / минимальная длительность сигнала | 20–50 мс | Фильтрация шумов и кратких помех |
| Блокировка после события | 300–500 мс | Предотвращает множественные срабатывания |
| Расстояние между датчиками | 50–200 мм | Больше — удобнее распознавать направление, но требует большей зоны покрытия |
Пример кода для Arduino (с пояснениями)
Ниже — компактный пример логики. Предполагается, что выход TSOP даёт LOW при приёме (стандартно для TSOP1736 при pull-up).
// Пины
const int PIN_L = 2; // левый TSOP
const int PIN_R = 3; // правый TSOP
// Параметры (мс)
const unsigned long MAX_INTERVAL = 600;
const unsigned long DEBOUNCE = 30;
const unsigned long LOCKOUT = 400;
unsigned long firstTime = 0;
int firstSensor = 0; // 0 - none, 1 - L, 2 - R
unsigned long lastEvent = 0;
void setup(){
pinMode(PIN_L, INPUT_PULLUP);
pinMode(PIN_R, INPUT_PULLUP);
Serial.begin(115200);
}
void loop(){
int sL = digitalRead(PIN_L); // LOW = приём
int sR = digitalRead(PIN_R);
unsigned long now = millis();
// Игнорируем, если в lockout
if(now - lastEvent < LOCKOUT) return;
// Обработка сработавшего датчика (фильтр по длительности)
static unsigned long lStart=0, rStart=0;
static bool lActive=false, rActive=false;
// Левый
if(sL == LOW){
if(!lActive){ lActive = true; lStart = now; }
} else {
if(lActive){
if(now - lStart >= DEBOUNCE){
handleTrigger(1, now);
}
lActive = false;
}
}
// Правый
if(sR == LOW){
if(!rActive){ rActive = true; rStart = now; }
} else {
if(rActive){
if(now - rStart >= DEBOUNCE){
handleTrigger(2, now);
}
rActive = false;
}
}
}
void handleTrigger(int sensor, unsigned long time){
if(firstSensor == 0){
firstSensor = sensor;
firstTime = time;
return;
}
// Если второй сработал тот же самый — обновляем время (игнор)
if(sensor == firstSensor){
firstTime = time;
return;
}
unsigned long dt = time - firstTime;
if(dt <= MAX_INTERVAL){
if(firstSensor == 1 && sensor == 2){
Serial.println("Движение: слева → справа");
} else if(firstSensor == 2 && sensor == 1){
Serial.println("Движение: справа → слева");
}
lastEvent = time;
}
// Сброс состояния
firstSensor = 0;
}Практические советы по установке и помехам
- Используйте направляющие трубки или тубусы вокруг TSOP и IR-диодов, чтобы сформировать узкую зону обнаружения и уменьшить влияние бокового света.
- Разнесите приёмник и передатчик друг напротив друга с небольшим углом, чтобы уменьшить ложные срабатывания от отражений.
- Убедитесь, что используете модули передатчиков, генерирующие 36 кГц. Если вы используете ИК-светодиоды без модуляции, добавьте драйвер с осциллятором 36 кГц или используйте ШИМ микроконтроллера.
- При ярком солнечном освещении эффективность может снижаться — TSOP фильтрует постоянную составляющую, но сильная ИК-компонента солнца может вызвать проблемы; рассмотрите защитные кожухи или работу в тёмных зонах.
- Калибруйте DEBOUNCE и MAX_INTERVAL под реальную скорость объектов и расстояние между датчиками.
Расширения и улучшения
- Добавление третьего датчика посередине для повышения надёжности и распознавания застреваний.
- Использование шторки или физического канала (коридора), чтобы гарантировать только один объект проходит одновременно.
- Подсчёт количества проходов и направление с хранением в EEPROM или отправкой по последовательному порту/Wi‑Fi.
- Использование прерываний на пинах Arduino (digitalPinToInterrupt) для минимизации задержек вместо опроса в loop.
Типичные ошибки и как их избежать
- Положение передатчиков и приёмников: если направленность широкая — много отражений. Решение: сужать зону тубусом.
- Неправильная логика уровня: помните, что TSOP выдаёт LOW при приёме; неверная интерпретация приведёт к обратным событиям.
- Слишком короткие или слишком длинные временные пороги приводят к пропускам или множественным срабатываниям — тестируйте реальные случаи.
Заключение
Система из двух TSOP1736 позволяет просто и надёжно определить направление пересечения линии объектом при условии правильной установки, калибровки временных порогов и использования модулированных ИК-передатчиков. Представленный алгоритм и пример на Arduino — рабочая основа, которую можно адаптировать под конкретную задачу: подсчёт посетителей, контроль доступа, управление перекрытием или интеграция в робототехнику.
Похожие статьи:
