ИК-приемник передатчик Высокая частота

ir

Я строю фотоворота, чтобы отслеживать бросание мяча. Работает нормально, если время задержки в основном цикле не превышает 40 миллисекунд. Проблемы начинаются, когда я задерживаю каждый цикл только на 20 миллисекунд, теперь мой светодиод, который показывает, что что-то прервало путь между ИК-светодиодом и ИК-приемником, иногда мигает, если я устанавливаю задержку на 10 миллисекунд и включаю, то светодиод гаснет на 2 секунды, затем начинает очень быстро мигать и горит все остальное время, пока я не прерву ИК-путь. Я думаю, что здесь происходит какая-то физика, которую я не понимаю.

Я также хотел бы спросить, возможно ли сузить путь ИК-волны, чтобы он был больше похож на лазер (идущий прямо в одном направлении), и как я могу контролировать чувствительность обнаружения ИК-волн

Это схема

ИК-передатчик ИК-приемник

Код:

//определяем пины. Я использовал пины 4 и 5
#define irLedPin 4          // ИК-светодиод на этом выводе
#define irSensorPin 5       // ИК-датчик на этом выводе
#define buzzerPin 2       // зуммер на этом выводе

int irRead(int readPin, int triggerPin); //прототип функции

void setup()
{
  pinMode(irSensorPin, INPUT);
  pinMode(irLedPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  Serial.begin(9600); 
  // печатает заголовок с переводом строки в конце
  Serial.println("Program Starting"); 
  // ждем отправки длинной строки
  delay(100); 
}

void loop()
{  

  bool isOn = irRead(irSensorPin, irLedPin);
  //Serial.println(isOn); //отображение результатов
  if(isOn == true)
  {
    digitalWrite(buzzerPin, HIGH);
  }
  else
  {
     digitalWrite(buzzerPin, LOW);
  }
  delay(10); 
}


int irRead(int readPin, int triggerPin)
{
  int halfPeriod = 13; //один период при 38,5khZ составляет примерно 26 микросекунд
  int cycles = 23; //26 микросекунд * 23 примерно равно 600 мкс
  int i;
  for (i=0; i <=cycles; i++)
  {
    digitalWrite(triggerPin, HIGH); 
    delayMicroseconds(halfPeriod);
    digitalWrite(triggerPin, LOW); 
    delayMicroseconds(halfPeriod - 1);     // - 1 для компенсации накладных расходов digitaWrite
  }
  return digitalRead(readPin);
}

, 👍1