В принципе, управлять компьютером с пульта ДУ (дистанционного управления) - это не бог весть какая задача. Даже более того, плата Марсоход для этой задачи несколько избыточна. Все из-за того, что существует такой open-source проект LIRC (Linux Infrared Remote Control). Есть подобный проект и для Windows. Он называется WinLIRC.
Проект LIRC - это набор программ и простейшего аппаратного устройства для приема сигналов от пультов дистанционного управления. Я думаю в интернете вы без труда найдете схемы такого приемника.
Тем не менее, позвольте мне все таки выполнить свой проект. Возможно я изобретаю велосипед, но в процессе этой работы мы поймем, как все это работает. Ведь нам это самое главное? Кроме того, этот мой проект - это ступенька к следующему проекту, который я уже готовлю (и скоро вы о нем узнаете)...
Я предлагаю следующее. У нас уже был проект "Последовательный порт". В нем был реализован Verilog модуль приемо-передатчика последовательного порта - он нам пригодится. В том проекте плата Марсоход подключалась к последовательному порту компьютера через преобразователь уровней, который еще тогда я спаял. Там же есть его фото и схема. Еще у нас был проект "ИК приемник". В той статье как раз рассказывалось, что из себя представляет сигнал, принятый приемником ИК излучения от пульта ДУ. Я сделаю новый проект платы Марсоход, в котором соединю ИК приемник и последовательный порт. Наше устройство будет передавать в компьютер уже готовые "коды" нажатых клавиш. Для компьютера я напишу на "С" (Microsoft Visual Studio) простую программку, которая будет печатать принятые коды, ну и выполнять на компьютере какие-то назначенные действия.
Как и раньше, я буду использовать микросхему ИК приемника ILMS5360 (
Итак, как же выглядит сигнал принятый от ИК пульта приемником? Формат пакета был подробно описан в нашей статье "ИК приемник":
Повторюсь: в начале каждого пакета идет "префикс" (длинный ноль и потом длинная единица), а потом 32 бита данных (код кнопки пульта), где ноль кодируется совсем коротеньким импульсом, а единица - чуть подлиннее. При этом бит "ноль" получается чуть меньше 550мкс, а бит "единица" примерно в три раза длиннее. Еще более длинный импульс - это префикс.
Таким образом, становится понятным алгоритм приема кода. Нужно измерять длину входных импульсов и по этой длине решать, что мы получили, очередной бит данных или начало пакета из четырех байт.
Весь проект для платы Марсоход вот здесь:
В этом же архиве есть и программка для Windows (ir_ctrl.exe) с исходниками, которая открывает последовательный порт и читает из него коды от пульта. Программа печатает принятые коды и на некоторые из них выполняет действие на компьютере. Я симулирую нажатие некоторых клавиш компьютера, связанных с программой плеера. Я использую пульт от телевизора Samsung, посмотрел какие он присылает коды. Обрабатываются следующие коды:
0xE0E0E01F volume up
0xE0E0D02F volume down
0xE0E052AD pause
0xE0E0A25D prev
0xE0E012ED next
0xE0E0E21D play
0xE0E0629D stop
Программа ir_ctrl.exe принимает имя последовательного порта, например, COM4 в коммандной строке.
Я написал код приемника ИК сигнала на Verilog, там есть много комментариев и я думаю вы сможете разобраться.
Код приемника-передатчика для последовательного порта вот здесь.
Чтобы была возможность получше понять, что там внутри этих двух модулей происходит я написал Verilog "тестбенч". Я опять использую программу Icarus Verilog для симуляции модулей проекта.
Ниже несколько снимков экрана симулированных сигналов (просмотр сигналов был сделан с помощью программы GtkWave). Кликните на картинку, что бы увеличить ее:
Обратите внимание, что ИК сигнал гораздо "медленнее", чем интерфейс последовательного порта, который я запрограммировал на скорость 38400 бит/секунду. Именно по этому я не стал принимать 32-х битный код от пульта, а сразу передаю байт за байтом по мере их прихода от ИК приемника. Вот здесь видно крупнее: от ИК приемника принят 3-й байт 0x52 и передается в последовательный порт:
Теперь, чтобы продемонстрировать, что у меня получилось я покажу небольшое видео:
Подробнее...