ИК-приемник передатчик Высокая частота
Я строю фотоворота, чтобы отслеживать бросание мяча. Работает нормально, если время задержки в основном цикле не превышает 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);
}
@kosnkov, 👍1
Обсуждение1 ответ
Во время выполнения delay()
вы не можете делать ничего другого, в том числе следить за тем, не был ли мяч сломан.
Вы не должны использовать delay()
в своем эскизе, вместо этого используйте millis()
, как в примере эскиза BlinkWithoutDelay в меню IDE Файл -> Примеры.
То, как вы работаете с вашей ИК-системой, тоже неправильно. Сначала вы генерируете короткую прямоугольную волну, а затем смотрите, что было получено. Вместо этого вам нужно генерировать прямоугольную волну и одновременно смотреть, принимается ли эта прямоугольная волна. Обычно это достигается с помощью одного из выходов ШИМ Arduino, настроенного на правильную частоту, чтобы генерировать постоянную форму волны, которую приемник затем все время считывает.
- Использование VS1838B с Arduino
- Как выбрать вывод передачи в библиотеке IRremote для Arduino Uno?
- Как увеличить расстояние обнаружения на датчике обхода препятствий Arduino KY-032?
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Как подключить ИК-передатчик и модуль приемника?
- Tone() конфликтует с библиотекой IRremote (множественное определение `__vector_7')
- Как остановить вращение сервопривода?
- ESP32 ИК-пульт
Если вам нужен луч, вы можете приобрести ИК-лазерные диоды., @pjc50
Или вы можете использовать красный лазерный луч и использовать его в качестве источника ИК-излучения., @Avamander
@Avamander, вау, это странно, я только что проверил, и это работает, но как? Мой красный лазер имеет 570 нм и ИК-приемник 950 нм, и это работает, как?, @kosnkov
У лазера достаточно близкая длина волны, то же самое работает и с красными светодиодами., @Avamander