пульт дистанционного управления (ИК ПДУ) - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 20.07.2018, 13:03
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: GRACH, Serg  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » пульт дистанционного управления (ИК ПДУ) (расшифровка протокола, использование в своих проектах)
    пульт дистанционного управления (ИК ПДУ)
    m_wДата: Пятница, 23.11.2012, 03:51 | Сообщение # 1
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    В интернете немало статей о дистанционном управлении основанном на ИК технологии. Начиная от описания различных протоколов обмена данными и заканчивая готовыми устройствами. Есть схемы и программы для организации управления различными устройствами посредством бытовых ИК пультов. Есть описания самодельных пультов для различной бытовой техники. Есть алгоритмы работы с различными протоколоми. Если поискать, можно нийти универсальные алгоритмы, которые "понимают" протоколы многих пультов. Поэтому, ничего нового сказать я не смогу. Но, мне эта тема интересна. И здесь я решил поделится своими достижениями в данной области. Надо сказать, что процесс работы над каким-либо устройством меня интересует не меньше, чем результат этой работы. Возможно поэтому я не очень люблю копировать чужие устройства. Я пытаюсь разобраться во всем сам. Разумеется, я изучаю различные материалы по интересующему вопросу. Но, в итоге разрабатываю свои схемы и пишу свои программы. Думаю, достаточно общих слов. Пора переходить к конкретике. Протоколов для ИК связи существует множество. И мне очень хотелось увидеть как выглядят протоколы моих пультов. Лучше всего для этого подходит осциллограф. Но, у меня его нет. И я пошел своим путем. В схеме устройства для визуализации протокола пульта нет ничего сложного. TSOP подключается к микроконтроллеру, а микроконтроллер через USB-USART переходник соединяется с компьютером. Работает это так: TSOP улавливает сигналы передаваемые пультом, затем МК измеряет их длительность и результат этих измерений передается в компьютер. И уже от компьютерной программы зависит насколько красиво будет смотрется протокол в мониторе. Паять я не очень люблю. Поэтому собрал эту штуку из готовых модулей. Для изготовления этого устройства я использовал: модуль ИК приемника на TSOP, платку с микроконтроллером ATmega32U4 (именно такой микроконтроллер используется в Arduino Leonardo) и USB-USART переходник на CP2102.

    Мой блог http://justforduino.blogspot.ru/

    Сообщение отредактировал m_w - Пятница, 23.11.2012, 03:58
     
    m_wДата: Пятница, 30.11.2012, 08:06 | Сообщение # 2
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Некоторые пояснения по соединению модулей.

    USB-USART --- ATmega32U4

    5V --- VCC
    TxD --- PD3
    RxD --- PD2
    GND --- GND

    TSOP --- ATmega32U4

    S --- PD0
    + --- VCC
    - --- GND

    реле --- ATmega32U4

    VCC --- VCC
    GND --- GND
    IN1 --- PF4
    IN2 --- PF5
    IN3 --- PF6
    IN4 --- PF7

    Добавлено (23.11.2012, 05:09)
    ---------------------------------------------
    Осталось написать программу для МК и ПК. Но, сначала необходимо произвести некоторые расчеты. Чаще всего светодиод в пульте дистанционного управления мигает с частотой 36 КГц. TSOP4836 может "видеть" от 10 до 70 таких вспышек подряд.

    Посчитаем минимальное время необходимое для этого:

    (1.0 / 36000.0) * 10.0 * 1000000.0 = 277.778 мкс (us)

    После периода таково мигания следует период, когда светодиод мигать не должен. Его длительность сравнима с ранее рассчитанной величиной.

    Теперь посчитаем скорость передачи данных USART. Для любимой мною скорости 9600 bps 8 бит данных передаются приблизительно:

    (1.0 / 9600.0) * 10.0 * 1000000.0 = 1041.667 мкс (us)

    Многовато будет. К счастью USART способен работать быстрее. При тактовой частоте ATmega32U4 в 16 МГц и скорости USART в 76800 bps ошибки передачи данных составят 0.2%. Приемлемо. В любом случае, не хуже чем при 9600 bps. При этом для передачи 8 бит необходимо:

    (1.0 / 76800.0) * 10.0 * 1000000.0 = 130.208 мкс (us)

    Эта цифра в несколько раз меньше минимально необходимой. Проблем с передачей данных быть не должно.

    Обрабатывать сигналы с TSOP лучше всего с использованием прерывания по внешнему сигналу. Его можно так настроить, что при изменении логического уровня на ножке микроконтроллера будет вызываться обработчик прерывания. Это проще, чем писать свой код анализа уровней. И работать будет быстрее.

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

    Максимальный период времени, который может измерить 16 битный таймер/счетчик без предделителя составит:

    (1.0 / 16000000.0) * 65536.0 * 1000000.0 = 4096 мкс (us)

    Маловато будет. При этом за 1 мкс (us) таймер сделает 16 тиков. Точность немного избыточна.

    А, с предделителем 8 получим:

    (1.0 / (16000000.0 / 8.0)) * 65536.0 * 1000000.0 = 32768 мкс (us)

    Неплохо. Только теперь за 1 мкс (us) таймер сделает всего два тика. Тем не менее, точность вполне достаточна для решаемой задачи.

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

    Вроде, всё интересное рассказал. Пора показать программу.

    Добавлено (23.11.2012, 05:43)
    ---------------------------------------------
    http://narod.ru/disk....ip.html

    Чтобы можно было понять какой логический уровень был на сигнальной линии в тот или иной период, программа передает сведения об этом в нулевом бите. Одного бита достаточно так как, возможно всего два состояния: high level (высокий логический уровень) и low level (низкий логический уровень). На результат счета таймера это оказывает несущественное влияние.

    Результат работы МК можно наблюдать с помощью любого ПО для ПК способного визуализировать обмен данными через COM порт. Например, есть маленькая и удобная программка Terminal. Только, разобраться в этом нагромождении чисел будет непросто.

    Но, всегда можно написать свою программу. И это интереснее. Я написал своё ПО на python (http://www.python.org/). Чтобы программа на python могла работать с COM портом необходимо установить специальный модуль pyserial (http://pypi.python.org/pypi/pyserial).

    Добавлено (23.11.2012, 05:55)
    ---------------------------------------------
    http://narod.ru/disk....ip.html

    В программе предусмотрена работа только с COM3. А, если операционная система присвоила Вашему USB-USART переходнику другой порт, то нужно либо изменить это в настройках операционной системы, либо изменить код программы.

    Итак, программа забирает данные присылаемые микроконтроллером, обрабатывает их и мы видим, вполне читаемое, описание протокола.

    Код
    level time
    1 0
    0 8988
    1 4413
    0 610
    1 491
    0 633
    1 486
    0 633
    1 491
    0 615
    1 487
    0 637
    1 487
    0 605
    1 518
    0 610
    1 487
    0 637
    1 487
    0 633
    1 1589
    0 637
    1 1612
    0 615
    1 1607
    0 610
    1 1616
    0 638
    1 1612
    0 610
    1 1612
    0 633
    1 1594
    0 637
    1 1607
    0 615
    1 486
    0 637
    1 1611
    0 610
    1 1611
    0 633
    1 495
    0 610
    1 1607
    0 610
    1 518
    0 610
    1 491
    0 633
    1 486
    0 633
    1 1594
    0 637
    1 487
    0 605
    1 518
    0 610
    1 1612
    0 633
    1 491
    0 610
    1 1611
    0 633
    1 1593
    0 637
    1 1607
    0 615
    1 0
    0 8987
    1 2163
    0 637
    1 0
    0 8992
    1 2158
    0 615


    Добавлено (23.11.2012, 05:59)
    ---------------------------------------------
    Здесь уже нетрудно увидеть некоторые закономерности. Однако, числа, которые должны быть одинаковы, немного различаются. Причина этого в нестабильности частоты передатчика, в помехах и т.д. и т.п. Незначительные отклонения можно игнорировать.

    Что можно сделать с полученной информацией? Конечно же разобрать на составляющие.

    Начинается передача со специальной стартовой последовательности. Когда сигнальная линия TSOP переходит в low level (низкий логический уровень) на 8988 us (мкс) и затем поднимается в high level (высокий логический уровень) на 4413 us (мкс). Далее передается 32 бита (4 байта). 1 или 0 зависит от продолжительности нахождения линии в high level (высокий логический уровень). А, low level (низкий логический уровень) служит лишь разделителем. Если долго не отпускать кнопку пульта, то повторной передачи данных не будет. В данном протоколе есть специальная последовательность показывающая, что кнопка все еще нажата. Выглядит эта последовательность так: 8992 us (мкс) low level (низкий логический уровень), 2158 us (мкс) high level (высокий логический уровень) и 615 us (мкс) low level (низкий логический уровень).

    Если 491 us (мкс) high level (высокий логический уровень) принять за "1", а 1607 us (мкс) high level (высокий логический уровень) принять за "0", то код кнопки из ранее приведенного фрагмента вывода программы будет: 11111111 00000000 10010111 01101000 или FF009768.

    Добавлено (23.11.2012, 05:59)
    ---------------------------------------------
    Код
    level time bit
    1 0
    0 8988 start
    1 4413
    0 610
    1 491  1
    0 633
    1 486  1
    0 633
    1 491  1
    0 615
    1 487  1
    0 637
    1 487  1
    0 605
    1 518  1
    0 610
    1 487  1
    0 637
    1 487  1
    0 633
    1 1589 0
    0 637
    1 1612 0
    0 615
    1 1607 0
    0 610
    1 1616 0
    0 638
    1 1612 0
    0 610
    1 1612 0
    0 633
    1 1594 0
    0 637
    1 1607 0
    0 615
    1 486  1
    0 637
    1 1611 0
    0 610
    1 1611 0
    0 633
    1 495  1
    0 610
    1 1607 0
    0 610
    1 518  1
    0 610
    1 491  1
    0 633
    1 486  1
    0 633
    1 1594 0
    0 637
    1 487  1
    0 605
    1 518  1
    0 610
    1 1612 0
    0 633
    1 491  1
    0 610
    1 1611 0
    0 633
    1 1593 0
    0 637
    1 1607 0
    0 615
    1 0
    0 8987 repeat
    1 2163
    0 637
    1 0
    0 8992 repeat
    1 2158
    0 615


    Добавлено (23.11.2012, 06:02)
    ---------------------------------------------
    Старший байт это код устройства. Как я это определил? Он одинаков для всех кнопок. Следующий за ним байт представляет собой инвертированный байт кода устройства. Далее идет байт команды. Он разный для каждой кнопки. Последний байт является инвертированным байтом команды. Все. Теперь можно попытаться написать простую программу распознавания кнопок пульта для МК.

    Добавлено (23.11.2012, 06:06)
    ---------------------------------------------
    http://narod.ru/disk....ip.html

    В программе учитывается лишь младший байт кода кнопки ПДУ. Просто и сердито.

    В заключении фото всего этого безобразия smile


    Купить реле четвертное http://dvrobot.ru/shop/i257.rele_chetvertnoe..htm
    Купить комплект ИК управления http://dvrobot.ru/shop/i187.ik%20upravlenie
    Купить ПДУ плюс ИК приемник http://dvrobot.ru/shop/i156.pdu_plyus_ik_priemnik.htm

    Добавлено (30.11.2012, 08:06)
    ---------------------------------------------
    Видео демонстрация http://www.youtube.com/watch?v=MJvRaZR82T0
    Прикрепления: 6232781.jpg(126.3 Kb)


    Мой блог http://justforduino.blogspot.ru/

    Сообщение отредактировал m_w - Пятница, 23.11.2012, 05:08
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » пульт дистанционного управления (ИК ПДУ) (расшифровка протокола, использование в своих проектах)
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат