Prom Electric
+7 (812) 952-38-45
+7 (921) 952-38-45
СПб, ул. Швецова, 23Б

Определение направления движения объекта с помощью двух ИК датчиков 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)
TSOP LTSOP RIR LIR RДвижение объектаЛевая линияПравая линия
Рис. 1 — Схематичное расположение приёмников и ИК-передатчиков

Логика и алгоритм

Основная задача — фиксировать порядок срабатываний и отфильтровывать ложные короткие импульсы. Простейший алгоритм:

  1. Считать текущие состояния L и R (0 — приём сигнала, 1 — покой для TSOP при pull-up).
  2. Следить за переходами: покой → срабатывание (HIGH→LOW или digitalRead==LOW в зависимости от подтяжки).
  3. При первом срабатывании запомнить, какой датчик сработал (L или R) и отметить метку времени.
  4. Если в течение порога времени (например, 300–800 мс) срабатывает второй датчик и порядок L→R — событие считается движением слева→справа; при обратном порядке — справа→слева.
  5. После фиксации события игнорировать дальнейшие срабатывания в течение «блокирующего» интервала (например, 300–500 мс) чтобы избежать дребезга.
  6. Добавить детектирование повторных длинных пересечений (если объект застрял между датчиками) — обработать по доп. логике или считать отдельным состоянием.

Параметры для настройки

ПараметрРекомендуемое значениеПримечание
Максимальный интервал между срабатываниями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 — рабочая основа, которую можно адаптировать под конкретную задачу: подсчёт посетителей, контроль доступа, управление перекрытием или интеграция в робототехнику.

Полезно: для быстрой отладки используйте Serial.println, а затем замените вывод на события (сигнализация, счетчик, логирование).

Похожие статьи: