Как из обычной лентяйки сделать пульт управления роботом

Пульт PhilipsВ любительских робототехнических проектах часто можно найти применение лентяйкам. Благодаря им можно, например, удаленно управлять роботом. В этой статье мы описали, как адаптировать пульт дистанционного управления для работы с собственными роботами. Описание будет на примере пульта Philips.

В этой статье мы постараемся использовать собранную ранее информацию на практике. Нами будет использоваться осциллограф, созданный в домашних условиях, который также может быть полезен для других приложений.

В любительских проектах часто можно встретить использование пульта ДУ. Благодаря ему мы можем запускать нашего робота с определенного расстояния (полезно во время соревнований), переключать режимы работы или просто управлять им удаленно. Практически все конструкции этого типа используют пульты стандарта RC5.

Недавно, когда нам самим понадобилось использовать пульт дистанционного управления, мы тоже выбрали RC5. Конечно, нетрудно догадаться, что данный пульт сработал не так, как мы ожидали. Но мы решили не сдаваться и расшифровать этот пульт. Результатами своей работы делимся в этой статье.

Как распознать ИК пульта ДУ?

Первым шагом было изучение существующих методов кодирования. Мы узнали, что есть два основных способа кодирования — манчестерское кодирование и импульсное кодирование.

Один кадр данных, помимо кода нажатой кнопки, также содержит код устройства и вспомогательные биты запуска, остановки, переключения и паузы.

Кроме того, коды дистанционного управления работают на разных частотах, например:

  • 36 кГц
  • 38 кГц
  • 40 кГц
  • 56 кГц

Для считывания модулированного сигнала используются интегрированные декодеры, такие как популярный TSOP. Для считывания общих частот кодирования были разработаны различные модели этой схемы. Ниже приведена таблица моделей TSOP22xx:

Таблица моделей

Обратите внимание, что ИК датчик воспринимает определенный диапазон частот в номинальной среде.

Чем шире диапазон, тем легче датчику получать данные из другого диапазона, например, 38 кГц вместо 36 кГц.

Обычно это негативно влияет на работу, потому что, таким образом, мы можем получать помехи от других пультов. Ниже приведена диаграмма из каталожной информации того же инфракрасного датчика TSOP22xx, показывающая силу генерируемого сигнала на отдельных частотах по отношению к номинальной:

Сила генерируемого сигнала

Важно правильно отфильтровать помехи в таком датчике. Лучше всего следовать рекомендациям производителя. Ниже представлена ​​схема, предложенная производителем ИК датчиков TSOP:

Схема ИК датчиков

Начинаем испытания

Итак, первая задача — определить частоту, на которой работает наш пульт. Возможно, есть более простой способ сделать это, но мы выбрали довольно грубое решение. Мы решили собрать на макете простую схему с ИК датчиком, микроконтроллером и несколькими диодами:

Схема с ИК датчиком

Эта схема понадобится вам практически для всех тестов. Мы используем внутренний резонатор 4МГц во всех программах. А также мы сделали вывод UART в схеме, который будет очень полезен для отладки позже.

Написали простую программу для увеличения значения, отображаемого на светодиодах, каждый раз, когда он обнаруживает сигнал на входе датчика. Мы надеялись, что пульт будет работать на частоте 36 кГц, наши надежды оправдались. Иначе пришлось бы тестировать датчики на разных частотах.

Стоит знать, что подавляющее большинство пультов дистанционного управления работают на частоте 36 или 38 кГц. Это касается как известных брендов, так и дешевых китайских аналогов.

У больших компаний есть много стандартов кодирования и иногда используется несколько частот, например Sony иногда использует 40 кГц. Возможно, образец, который мы тестировали, не был репрезентативным, но коды всех пультов дистанционного управления, которые у нас были, можно было прочитать с помощью ИК датчика TSOP2236.

Интерпретация фрейма данных

Как только мы поймем, что наш датчик считывает данные с пульта дистанционного управления, мы сможем перейти к основному пункту программы. Нашей задачей будет расшифровать фрейм данных с пульта ДУ и определить код отдельных кнопок.

Простой осциллограф

Лучше всего использовать осциллограф для отслеживания форм сигналов, генерируемых датчиком. Здесь есть одна серьезная проблема. Профессиональные осциллографы очень дорогие, и их вряд ли кто-то может себе позволить купить. Однако есть решение, и оно очень дешево стоит. Все, что нам нужно — это старый кабель от наушников. Кроме того, нам необходимо установить программу Soundcard Oscilloscope. Благодаря этой программе мы сможем использовать аналого-цифровой преобразователь нашей звуковой карты в качестве входа осциллографа, а цифро-аналоговый преобразователь в качестве генератора сигналов.

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

Однако его нельзя использовать для проверки всех форм сигналов. Звуковая карта рассчитана на напряжение не более 2В. Перед подключением пробника к компьютеру используйте тестер, чтобы убедиться, что массы системы и звуковой карты правильные, а максимальное напряжение не превышает 2 В. Несоблюдение этих правил может привести к повреждению звуковой карты, а в конечном итоге и всего компьютера.

Использование осциллографа

Входом по умолчанию нашего осциллографа является разъем для микрофона, а на выходе генератора — разъем для наушников. Звуковая карта адаптирована для генерации / приема сигналов на частотах в пределах слышимости человеческого уха, то есть в диапазоне примерно 20-22000 Гц. Программа очень проста в использовании.

Окно программы Soundcard Oscilloscope:

Soundcard Oscilloscope

Ручки Amplitude и Time масштабируют оси, используя значение Offset, мы смещаем начальное значение формы волны по оси Y для отдельных каналов. В кадре триггера мы можем установить режимы триггера. Возможные варианты:

Авто — осциллограмма постоянно отображается на экране, даже если порог срабатывания триггера не превышен.

Нормальный — новый сигнал появляется каждый раз при превышении порогового значения.

Одиночный — при нажатии кнопки Run / Stop отображается первая осциллограмма после превышения порогового значения триггера.

Ниже вы можете выбрать канал, для которого мы устанавливаем условия запуска, нарастающий или спадающий фронт формы сигнала (edge), а порог (threshold) должен превышать наклон, зарегистрированный осциллографом.

В нижнем левом углу диаграммы появляется кнопка «Save» , которая сохраняет формы сигналов как в виде изображения, так и в виде файла csv. Благодаря этому данные с осциллографа можно анализировать с помощью специальных программ.

Некоторые могут задаться вопросом, как мы должны исследовать сигнал с частотой 36 кГц с оборудованием принимающим частоты до 22 кГц.

Частота модуляции 36 кГц используется только для передачи сигнала, тогда как данные, считываемые датчиком, имеют в несколько раз меньшую частоту.

Вот поэтому, используя осциллограф со звуковой карты, вы также можете легко исследовать формы сигналов, модулированные с частотой 56 кГц.

Измерение

После подключения ИК датчика в соответствии с рекомендациями производителя и разводки выходов OUT и GND на пробник осциллографа, мы смогли начать тестирование форм сигналов. Мы установили осциллограф в одиночный режим и подняли порог срабатывания, чтобы он работал более точно. Последовательность нажатия кнопки «1» на пульте показана ниже:

Порог

TSOP2236 по умолчанию имеет высокий уровень и переходит на низкий уровень при получении данных. График на осциллографе показывает обратное. После быстрой проверки с помощью датчика мы пришли к выводу, что осциллограф показывает инвертированные значения.

Мы не знаем, почему это происходит, но вы должны помнить, что это всего лишь замена настоящему осциллографу. В конце концов, времена логических уровней в порядке, и смена полярности не вызывает особых проблем.

Для сравнения мы сохранили формы сигналов для кнопок 2, 3, 4 на пульте:

Кнопка 2Кнопка 3Кнопка 4

Расшифровка осциллограмм

Как мы видим на осциллограммах, каждый сигнал начинается с двух длинных импульсов. Затем есть несколько более коротких и еще более длинных. До этого момента каждый фрейм данных выглядел одинаково.

Они отличаются только последней серией коротких импульсов. Если мы сравним эти наблюдения с кодами, известных пульту, можно сделать вывод, что исходные длинные сигналы используются для инициализации. Следующая серия коротких импульсов — это системный код, поэтому он идентичен для каждой кнопки.

Последняя серия коротких импульсов должна содержать коды команд. Длины отдельных кадров отличаются друг от друга, поэтому мы имеем дело с кодированием по длине импульса. Теперь посмотрим на короткие серии.

Как видите, они состоят из 9 низких состояний (мы помним о дефекте осциллографа) одинаковой длины и восьми высоких состояний, длина которых принимает одно из двух значений (0 или 1). Мы можем присваивать эти значения по-своему и читать их как угодно. Мы же предпологаем, что 0 — короткий сигнал, а 1 — длинный сигнал .

Следующий шаг — узнать точное время. Для этого мы использовали Matlab, но это под силу любой программе обработки данных, даже обычной Excel. Мы отметили начальную и конечную точки для каждого типа импульса и рассчитали их длительность. Повторили операцию несколько раз, чтобы убедиться, что не ошиблись. Затем прочитали коды каждой кнопки и записали всю информацию о нашем пульте дистанционного управления:

Частота модуляции: 36 кГц кадров данных:

  • стартовый бит 1: 8 мс НИЗКИЙ
  • стартовый бит 2: 4 мс ВЫСОКИЙ
  • восемь системных битов
  • бит перерыва: 4 мс ВЫСОКИЙ
  • восемь командных битов
  • конец информации: ВЫСОКИЙ, пока не будет получен следующий кадр.

Системная битовая кодировка и команды:

  • низкий сигнал: 422us (микросекунды)
  • высокий уровень сигнала «0»: 422 us
  • высокий уровень сигнала «1»: 1,6 мс

Между восьмым битом данных и разрывом имеется еще один низкий уровень сигнала 422us.

  • системный код: 11000011

Список команд:

  • 0 — 11110000
  • 1 — 01001000
  • 2 — 01101000
  • 3 — 10 011 000
  • 4 — 00100000
  • 5 — 00110000
  • 6 — 00011010
  • 7 — 01110000
  • 8 — 10010000
  • 9 — 00111000
  • power — 00011000
  • mute — 01011000
  • prog — 01100000
  • audio — 11101000
  • sys — 01010000
  • lnb — 10111000
  • up — 11011000
  • down — 11001000
  • left — 01000000
  • right — 00111001
  • store — 11111000
  • next — 10101000
  • fav — 10001000
  • hv — 11010000
  • tone — 01111000
  • radio — 00000000
  • tvsat — 10100000
  • lock — 00101000

Чтобы быть уверенными, мы решили проверить осциллограммы на простой программе, написанной на языке ассемблера, используя USART для проверки правильности считывания данных. Его задача — прочитать состояние вывода в прерывании таймера, добавить его в буфер чтения, собрать восемь бит и отправить их на ПК.

Интересно, что раньше мы пытались проверить вывод в цикле, а не в прерывании, или использовать внешнее прерывание, а не таймер. Затем выяснилось, что значение при изменении в течение некоторого времени колеблется, вызывая эффект, похожий на вибрацию контактов на переключателях, но, конечно, длящийся намного короче.

К счастью, проверка прерывания таймера каждые 64 мкс полностью устранила эту проблему, и при чтении с терминала результаты такие, как и ожидались. Вот показания терминала в шестнадцатеричном коде для одного фрейма данных:

Отдельные фрагменты осциллограммы можно легко сравнить с соответствующими цепочками нулей и единиц на терминале. Благодаря этому мы можем быть уверены, что микроконтроллер сможет читать фрейм данных без каких-либо помех. Ниже приведен программный код на языке ассемблера. Если даже вы не знаете язык, у вас все равно не должно возникнуть проблем с его пониманием благодаря комментариям и документации Atmel:

Программа декодирования

Пришло время написать полный код удаленному декодеру. Мы снова выбрали ассемблер по нескольким причинам. Во-первых, это будет простое приложение, использующее в основном регистровые операции, и писать их на языке ассемблера очень просто.

Во-вторых, мы сможем детально отслеживать программу в отладчике AVR Studio 4 и быстрее находить ошибки. Кроме того, пока мы пишем, мы можем скачать некоторые отрывки из заметки по применению Atmel RC5. Внизу готовый код с описанием в комментариях:

После написания этих частей, считывающих следующие фрагменты кадра, стоит добавить линии, которые зажигают светодиоды, чтобы проверить, все ли сделано правильно.

Легче отлаживать на лету, чем искать ошибки позже. Наша программа прошла такой процесс отладки, что позволило нам справиться с ней довольно быстро .

Программа работает безотказно, распознает все коды кнопок точно так, как указано в спецификации выше. Однако у нее есть недостатки. Циклический опрос также все еще используется, несмотря на использование прерываний. Кроме того, было бы сложно использовать его как функцию в другой программе, если бы каждое чтение кнопки занимало десятки миллисекунд, в течение которых процессор не мог бы делать ничего другого.

Однако в более крупных проектах ассемблер не так удобен, и было бы неплохо иметь код C. Вот почему мы написали программу данного пульта на этом языке. Теперь мы можем успешно использовать ее как часть более крупного проекта.

Программа на C

Она выполняет все операции в прерывании. Несмотря на то, что разрыв кажется очень сложным, она состоит из множества условных операторов, и на самом деле каждый возможный путь выполняется довольно быстро.

Перерыв организован как набор состояний, в которых система может находиться в данный момент. Каждый раз, когда в ней проверяются условия перехода в другое состояние, и если они выполняются, то при следующем прерывании система перейдет в следующее состояние. Конечно, нет проблем с масштабированием программы для других значений осциллятора.

Вывод

Как видите, с помощью простых инструментов и небольших познаний в области дистанционного кодирования мы смогли адаптировать сигнал от неизвестного пульта к своим собственным целям.

С любым другим кодированием можно справиться, используя аналогичные методы. Наконец, давайте проанализируем форму сигнала от другого пульта дистанционного управления телевизором, который один из сотрудников нашел у себя дома. Мы больше не будем углубляться в саму работу, но процесс декодирования будет аналогичен описанному выше.

Пульт 1Пульт 2Пульт 3

Осциллограммы ясно показывают часть системного кода, перерыв в 20 мс и код команды.

Каждая часть начинается с двух сигналов инициализации. Кроме того, мы видим, что все проходы имеют одинаковую длину, т.е. мы имеем дело с манчестерской кодировкой.

В системном коде все биты имеют одинаковое значение, а в кодах команд легко увидеть, какие биты имеют разные значения. При расшифровке кода манчестерского типа стоит воспользоваться информацией относительно кода RC5.

Другой способ — прочитать полубиты, а затем программно заменить строки 01 и 10 соответствующими значениями. Однако оставляем это для ваших самостоятельных экспериментов.

С Уважением, МониторБанк

 

 

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *