Pull to refresh

Comments 29

Странно, что в статье не прозвучали слова «манчестерский код» и Biphase mark coding (кажется, у вас именно он): en.wikipedia.org/wiki/Biphase_mark_code

Кстати, вы не пробовали отправлять такую последовательность используя UART, и скармливать ему сразу байты (скорость в 2 раза увеличить, байты предварительно закодировать)?
На самом деле отсутствие упоминания алгоритмов кодирования закономерно — для меня это совершенно темный лес. Поэтому первая попытка и заключалась в обычном повторении формы сигнала.

Собственно, я даже идею отправки через UART не понимаю.
Я сейчас буду гордо кидаться теорией :)

USART позволяет записать в буфер 1 байт данных, которые на выходе выплюнутся в ножку микросхемы. www.atmega8.ru/wiki/view/doc.17.html. Скорость, в которой биты выплёнываются в провод настраивается.
Кодирование, которое вы описали, увеличивает в 2 раза количество данных, то есть 1 бит информации (допустим, 0) превращается в 2 бита в проводе (01 или 10). То есть 1 байт данных после кодирования превратится в 2 байта. Никакой магии, алгоритм просто и понятен, примерно это у вас изображено в функции selectPulse().

Если совместить эти 2 факта — то можно максимально разгрузить вычислительное ядро атмеги и заставить работать блок USART. Тут подставу могут организовать старт-стоп биты и контроль чётности, придётся поэкспериментировать в эмуляторе или с осциллографом, ну или с той же audacity. Возможно, придётся использовать USART в режиме SPI-мастера и использовать ножку передачи данных.

Я такое на практике не делал, но поэкспериментировать в этом направлении определённо имеет смысл.
Теория интересная, но я, пожалуй ее не освою (

К тому же кодирование в примере не в два раза увеличивает количество данных: это «0» кодируется двумя «битами», а «1» как была одним «битом» в проводе, так и осталась. Скорость конкретно передачи важна, но не максимальная, а правильная. Иначе приемник не поймет — он понимает только импульсы определенной длины.
Единица тоже в два бита превращается, 11 или 00.
В протоколе, который в моих выключателях — не превращается никак. Если мы про этот протокол говорим, конечно.
Выражаю вам огромное уважение за проделанную работу и за неисчерпаемое усердие))
Вы меня просто вдохновили встать и пойти делать))

А по поводу протоколов я бы хотел пояснить.

TosSHiC все правильно сказал, но достаточно сумбурно и я совершенно не удивлен что вы не уловили смысл с первого раза. Постараюсь прояснить и поведать свои мысли так чтобы и вы и другие уважаемые читатели все поняли =)

Итак.
1) Замер производится всегда в центра импульса. Не в начале, как можно было бы подумать))
Что это означает в нашем случае — нужно интерпретировать сигнал немного иначе. Я буду опираться на ваши картинки.
2) Интерпритация логики такова что у нас есть четыре состояния импульса, а именно:
а) Переход сверху вниз (Предположим, 00)
б) Низ без перехода (Предположим, 01)
в) Переход снизу вверх (Предположим, 10)
г) Верх без перехода (Предположим, 11)

Таким образом битовая скорость у нас в два раза больше скорости бодовой (канальной).

Вот именно это, как мне кажется, ToSHiC и хотел сказать))

Дальнейший анализ протокола имеет исключительно академический интерес.
Потому как практически все уже стабильно работает.

Но мне очень интересно поковырять протокол)))
Спасибо за пояснения ) Я начинаю понимать, что действительно мало, что понимаю. Но хотя бы подогнал решение задачи под ответ — и то хорошо.
Судя по картинкам, превращается. «Долгий» импульс — это всего лишь два одинаковых коротких подряд.
По измерениям «на глаз» соотношение между ними 1:3, но в целом все может быть. Я понемногу пересматриваю свои заявления, поскольку мне объясняют, где именно и как именно я ошибаюсь.
Смотрите, давайте на примере покажу.
image
Исходная последовательность бит 00011001000000001111000
после кодирования 10 10 10 11 00 10 10 11 01 01 01 01 01 01 01 01 00 11 00 11 01 01 01
Да, я уперся рогом в свое видение, а оно ошибочно. Но, кажется, уже начинаю немного понимать о чем идет речь. И, похоже, у меня есть что почитать на этих выходных )
У меня встречный вопрос: я использовал приемник с амплитудной модуляцией. Разве возможно таким приемником принять и демодулировать сигнал с фазовой модуляцией?
Ваш приемник уже демодулировал АМ, то что вы видите это демодулированный после АМ сигнал(ИК приемник, если прочитать на него документацию имеет инверсный выход — разомкнут когда нет сигнала и притягивает выход к нулю когда ИК-сигнал есть, за счет подтяжки к +5В он имеет высокий уровень при отсутствии сигнала). Он в свою очередь промодулирован цифровой фазовой модуляцией, модуляция получается как матрешка — одна в другой, а та в третьей и т.д.
Кодирование, которое вы описали, увеличивает в 2 раза количество данных, то есть 1 бит информации (допустим, 0) превращается в 2 бита в проводе (01 или 10). То есть 1 байт данных после кодирования превратится в 2 байта. Никакой магии, алгоритм просто и понятен, примерно это у вас изображено в функции selectPulse().

Правильней привязываться к фронту сигнала.
0 кодируется переходом от низкого уровня к высокому.
1 кодируется переходом от высокого уровня к низкому.

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

Одинаковая часть в начале каждого пакета — это импульсы для настройки приемника. По ним он подстраивается на правильный прием данных.
А это точно так? Дело в том, что эта часть разная у разных пультов, но, разумеется, одинаковая для всех кнопок-кодов одного и того же пульта.

Или это просто так сложилось, что идентификатор пульта одновременно выполняет функции настройки приемника?
Я про несколько одинаковых нулей в самом начале посылки.
А так все правильно — протоколы у пультов разные. Иначе бы можно было любым пультом управлять любой техникой.
Мне кажется, с нулями не все так однозначно. Я не приводил сигналы второго пульта, поскольку подумал, что особого смысла в них нет. Но вот так выглядит его пакет импульсов:



Моя изначальная теория гласит, что многократное повторение позволяет физическому приемнику (АРУ) успеть надежно захватить радиосигнал, и то же самое многократное повторение позволяет логическому приемнику «зацепиться» за стартовый импульс.

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

Возможно, что и родной приемник работает по похожему принципу. Ну или я, как обычно, ошибаюсь.
Я почему-то сразу узрел в этом коде простую цифровую фазовую модуляцию. «1» передается импульсами фиксированной длительности 0-1 а «0» импульсами 1-0 как-то так. когда соединяются вместе 0 и 1 или 1 и 0 получается длинный импульс, когда идут подряд 111 или 000 — короткие импульсы.
Такой же алгоритм кодирования bi-phase (но возможно с другими длительностями) — в протоколе RC5. А вот здесь описан простой способ дешифровки. Я около полугода назад тоже намучился, пока разобрался с этим протоколом и научился безошибочно расшифровывать посылки (на микроконтроллере msp430).
Зашел из-за заголовка, но подробное описание зубочистки не нашел.
Она у меня скромная.
Хочу сказать большое спасибо автору, все собрал и оно работает! Осталось прикрутить к ардуинке вайфай.
Рад, что все получилось!
Кстати, если кому-то (например для интеграции с Blynk) понадобится версия библиотеки для nodejs, то вот пожалуйста: https://github.com/crankru/nodejs-livolo
Only those users with full accounts are able to leave comments. Log in, please.