Как работает ввод с ИК-приемника на плату Arduino UNO?
У меня есть очень простая схема с модулем ИК-приемника Elegoo, подключенным к Arduino UNO. Три провода подключены правильно, а провод данных (Y) подключен к контакту 8. Код работает нормально, так как каждый раз, когда я нажимаю кнопку на пульте дистанционного управления, Serial Monitor отображает соответствующее описание кнопки.
Однако я не понимаю, как контакт 8 Arduino знает, какая ИК-кнопка была нажата. Насколько я понимаю, контакт 8 может считывать либо 5 В, либо 0 В, но чтобы узнать, какая из 20+ кнопок дистанционного управления была нажата, ему нужно будет прочитать ШИМ. Но рядом с контактом 8 нет значка ШИМ, и все же он работает нормально. Разве значок ШИМ не относится только к выходу контакта? Или есть другой способ, о котором я не смог найти информацию?
Спасибо!
@yannism, 👍1
Обсуждение2 ответа
Пульт дистанционного управления излучает закодированные ИК-импульсы (каждая кнопка имеет свой код), которые датчик преобразует в электрические импульсы (ссылка 6. здесь: http://eeshop.unl.edu/pdf/VS1838-Infrared-Receiver-datasheet.pdf). На Arduino эти импульсы декодируются с помощью соответствующей библиотеки. Это означает, что контакт 8 считывает не аналоговый или ШИМ-сигнал, а логику ТТЛ при напряжении 5 В.
Спасибо. Буду читать подробнее о TTL-логике., @yannism
Здесь вы путаете разные технологии.
ШИМ – это только выход, а не вход. Таким образом, каждый контакт, отмеченный символом PWM, может ВЫВОДИТЬ сигнал PWM. Чтение сигнала — это совершенно другая задача, требующая использования другого оборудования.
ИК-приемник не выводит ШИМ-сигнал (что означает широтно-импульсную модуляцию) на Arduino. Он выводит демодулированный ИК-сигнал.
Итак, вот что происходит: Пульт дистанционного управления представляет собой код, состоящий из разных периодов включения и выключения света (импульсы разной длины, которые кодируют данные из двоичного формата). Поскольку вы хотите отделить сигнал пульта от любого другого ИК-сигнала, который может бродить по воздуху, пульт также модулирует импульсы со специальной частотой (часто это 38 кГц, но может быть и другая частота). Это означает, что каждый импульс будет разбит на более короткие импульсы с заданной частотой. Это означает что-то вроде: "свет включается и выключается с частотой 38 кГц на время x" --> "свет выключается" --> "свет включается и выключается с частотой 38 кГц на время y" --> ...
Модуль приемника улавливает поступающий ИК-свет и электронным образом отбрасывает все сигналы, не имеющие специальной частоты, и выполняет демодуляцию. Выходной сигнал больше не имеет частоты 38 кГц. Просто импульсы разной длины, которые кодируют данные, т.е.
Затем Arduino считывает длину импульсов (состоящих только из последовательностей 0 В и 5 В) и декодирует их в число. Это число представляет собой нажатую кнопку.
Подходящая библиотека для Arduino может считывать различные протоколы данных, используемые в обычных ИК-пультах.
Потрясающий! В общем, мое понимание было правильным в том смысле, что входной контакт Arduino считывает импульсы, но я думал, что это просто еще один экземпляр ШИМ, а это не так. Спасибо!, @yannism
- Генерация сигнала частотой 38 кГц без таймеров
- Какой из них ИК-светодиод?
- Включите и выключите инфракрасный светодиод, чтобы имитировать инфракрасный сигнал
- Следуйте по черной и белой линии одновременно
- Проблема с отправкой ИК-сигнала с at ATmega328P-PU
- Проблемы при гонках с несколькими роботами Arduino с ИК-управлением
- Нужна помощь с функцией отправки Arduino IR Remote
- Установите частоту ШИМ на 25 кГц.
Что вы на самом деле подразумеваете под «значком» ШИМ?, @Sim Son
@yannism означает, что контакт 8 не является контактом ШИМ, посмотрите на расположение контактов Arduino UNO., @MatsK
Последовательный RX тоже работает на одном контакте., @Juraj
Значок ШИМ говорит о том, что вывод можно использовать как выход ШИМ. Пульт отправляет серию импульсов (например, [здесь](https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol) есть краткий анализ протокола NEC — имейте в виду, что там существует гораздо больше). Вам нужно будет декодировать длину импульсов, чтобы получить код, представляющий ключ. В помощь в этой задаче была сделана библиотека [IRRemote](http://z3t0.github.io/Arduino-IRremote/) (я использовал ее один раз для управления роботом с помощью пульта дистанционного управления), @frarugi87