1 Отмазки.
Смотрю я на дату последней статьи и вижу — давненько я ничего не писал для блога :(. И причина даже не в том, что писать было не о чем, скорее наоборот, сразу взялся за столько проектов, что трудно было довести до ума хоть один из них. Кроме того, на работе в последнее время много работы 🙂 – не получается посидеть, поделать что-то для себя. Еще, начал двигать проект 1W-IR сети (устройство этой статьи является пилотным устройством сети) – хотелось сделать все правильно, поэтому и ушло много времени на создание алгоритмов и логики работы.
Ну вот, с отмазками закончили, переходим, наконец, к устройству.
2 Введение (ни о чем).
IR-удлинитель для UART специфичное устройство и в электронных проектах оно не будет сильно востребованным. Причины: небольшая скорость передачи, присутствие микроконтроллера в схеме, соответственно, увеличенная стоимость проекта. Существуют более простые и быстрые устройства (например, совсем свежая статья с avrdevices.ru). Несмотря на это было потрачено много времени на создание данного устройства, для того, чтобы отработать и обкатать алгоритмы реализации 1W-IR-сети.
Проект оказался для меня довольно примечательным и интересным.
— Во-первых — это реализация проекта на ATtiny13. С самого начала было решено реализовать работу сети именно на ATtiny13 (хватит тини – будет работать где угодно!). Из-за ограниченных ресурсов выбранного микроконтроллера (512 слов памяти, 1 таймер) было интересно продумывать и реализовывать алгоритм работы сети, формирование модулированного IR-сигнала, его прием TSOPом. В итоге вышел компактный и не ресурсоемкий код.
— Во-вторых, я использовал несколько новых для себя приемов программирования. В устройстве реализован полнодуплексный программный UART (прием и передача ведутся параллельно, независимо друг от друга) и, как бы это не странно звучало, полнодуплексный IR приемо-передатчик (при передаче IR сигнала передающее устройство принимает свою посылку). Для того чтобы заставить все это дело работать совместно и независимо друг от друга на одном 8-ми битном таймере (и не сломать себе голову при реализации этого) пришлось соорудить нечто наподобие операционной системы реального времени (RTOS).
Создание диспетчера задач было интересной задачей и, похоже, я буду широко использовать его и далее в своих проектах – очень удобно получилось! (обязательно сделаю подробное описание с примерами здесь в блоге или на форуме – может сгодиться не только мне.)
— В-третьих, проект показал мне недостаточность (необходимость) академических знаний по программированию — все приходилось придумывать с нуля. Был-бы профессиональным (читай обученным) программистом — было-бы намного легче. Ничего – будем восполнять пробелы в знаниях. Кто подскажет толковую книгу по программированию? Имеется в виду не определенному языку, а именно организации процесса создания программы/алгоритма.
3 Принцип работы удлинителя (уже ближе к теме).
Все довольно просто. Плата удлинителя является приемо-передатчиком IR-сигнала. Две платы ставятся в разрыв линий UART (TxD, RxD) между двумя устройствами. Далее устройства можно разнести на некоторое расстояние (не проверял предельную дальность, но в пределах комнаты работает без нареканий), при этом устройства не заметят, что сигнал UART передается не по 3 линиям (TxD, RxD , земля), а по IR каналу.
Платы удлинителей сами заботиться о передаваемых данных, никаких дополнительных действий, настроек, инициализаций не требуется – все начинает работать, как только подано питание.
Несмотря на небольшие возможности микроконтроллера ATtiny13 в нем получилось реализовать полноценного участника 1W-IR сети. Если Вам понадобиться обмениваться сообщения между тремя устройствами или более, изготавливайте нужное количество плат, и они будут совместно работать, сколько бы их не было. Более того, совместно в этой сети будут работать, не мешая друг другу, и другие устройства (в ближайшем времени сделаем несколько).
На плате есть выход на светодиод индикации работы сети. Он ставиться без каких либо сопротивлений — напрямую к ножкам. Распиновка платы имеет вот такой вид:
4 Удлинитель (1W-IR сеть) максимально бережно относиться к передаваемым данным:
— UART приемник имеет буфер, а это значит, что Вам не нужно беспокоиться о том, прошло ли предыдущее сообщение по сети или нет – просто передавайте сообщения по UART (в разумных пределах, конечно – буфер всего 16 байт), а устройство само будет контролировать передачу их по IR-сети.
— Удлинитель никогда не начнет передачу если в IR-эфире есть шумы, другая передача или сигналы от IR-пульта, он дождется освобождения эфира, сделает контрольную паузу и лишь потом начнет передачу.
— Каждая отправляемая посылка, имеет специальные калибровочные биты. Принимающее устройство по этим битам калибрует модуль IR-приемника — это исключает ошибки приема при уходе частоты задающего генератора передающего (или принимающего) устройства или, даже, при разных скоростях передачи.
— Так как модули IR-приемника и IR-передатчика в удлинителе независимы друг от друга и работают параллельно, свою передаваемую посылку удлинитель одновременно и принимает. По окончании приема посылка проверяется на целостность (при передаче возможны помехи от ламп, наложение передач от слепых устройств, IR-пультов и т.д.). В случае если посылка принялась с ошибкой удлинитель ее автоматически повторит.
— Все исходящие посылки дополняются циклическим избыточным кодом CRC8, полностью идентичному применяемому в Dallas/Maxim-устройствах для работы в 1Wire сети. Каждая принятая посылка проверяется на целостность при помощи этого кода. Сбойные или ошибочные посылки никогда не пройдут, удлинитель не будет реагировать на посторонние сигналы. Кроме того, если приемник обнаруживает ошибку, то он сразу выдает запрос на повторную передачу этой посылки, а передатчик, приняв этот запрос, повторит посылку.
В текущей версии устройства автоматические запросы повторов сбойных посылок отключены с целью максимальной разгрузки IR канала, но Вы всегда можете подавать эти команды в ручном режиме.
— Устройства 1W-IR-сети передают свои посылки поочередно, т.е. после каждой передачи посылки, устройство уступает приоритет передачи другому устройству и если другое устройство молчит, продолжает передавать следующую посылку. Это исключает случаи, когда цепочка посылок от одного устройства блокирует работу остальных устройств в сети;
— В алгоритме реализован механизм решения коллизий при передаче посылок (например одновременное начало передачи посылок от разных устройств).
5 Параметры работы удлинителя:
— Скорость передачи по IR каналу, составляет около 25 посылок в секунду (реализация протокола позволяет «на ходу» менять параметры посылки, поэтому скорость будет зависить от устройства);
— Дальность передачи зависит от применяемых IR-LED, TSOP, компонентов удлинителя, но в пределах комнаты работает без сбоев. Если необходима передача на большие расстояния, можно применить более мощные IR-светодиоды или сделать узконаправленное излучение у обычных;
— Частота IR-модуляции (тип TSOP) – 36 или 38кГц;
— Прием и передача по UART осуществляется на скорости 600 бод (можно и больше, но это не имеет смыла в виду малой скорости IR-передачи)
Boudrate=600, Parity=NO, Stopbit=1
6 Сборка удлинителя.
Собирать особо ничего и не нужно. Удлинитель работает на универсальной плате для IR устройств. Кто такой платы еще не имеет, идет по ссылке и читает как ее сделать >>. Единственным изменением будет замена обычного светодиода на IR-светодиод и замена токоограничивающего резистора для этого светодиода (на схеме указаны изменения для IR-светодиода).
Величина сопротивления, включенного последовательно со IR-светодиодом, обратно пропорциональна дальности передачи (мощности передачи). Занижать это сопротивление особо не рекомендую, так как IR-светодиод начинает работать в области за предельно допустимыми параметрами. Подберите достаточное, для каждой конкретной задачи, сопротивление.
7 Прошиваем плату.
Программатор подключаем к выходным штырькам платы — все необходимые сигналы там присутствуют.
079-IR-remote-UART.zip (2690 Загрузок)
079-source-IR-remote-UART.zip (2959 Загрузок)
Фьюзы:
Для Algorithm Builder и UniProf галочки ставятся как на картинке.
Для PonyProg, AVR Studio, SinaProg галочки ставяться инверсно.
Как правильно прошить AVR фьюзы
8 Запуск в работу.
Особых операций производить нет необходимости – все работает в автомате. Для проверки работоспособности установите в одной из плат перемычку на ножки UART TxD и RxD. Вторую плату подключите к терминалу (не забываем, на прямую к COM порту UART не подключается – нужен преобразователь MAX232). Отосланные из терминала строки будут эхом возвращаться назад. Для начала платы расположите рядом. Получив нормальную связь – разносите их дальше. Так можно найти предельный радиус уверенной работы.
Вариант с перемычкой наиболее труден для устройства, поэтому обычные посылки будут происходить более качественно.
Нужно понимать, что на качество связи влияют несколько факторов:
— наличие люминесцентного освещения (включая экономки) существенно уменьшает расстояние уверенного приема (особенно это сказывается, если TSOP напрямую направлен в лампу);
— незначительно сказывается освещенность в комнате. Старайтесь избегать прямой засветки TSOPа, но в общем случае это не критично;
— напряжение питания удлинителей может варьироваться в пределах от 3 до 6 вольт (это верно при использовании TSOP4836/38, другие типы TSOP могут быть жестко привязаны к 5 вольтам). Естественно, при пониженном питании мощность IR-передачи снизиться.
— IR- пульты особого влияния на связь не оказывают, так как сеть с ними работает как с устройствами сети (удлинитель даже умеет всовывать свои посылки в паузах автоповтора при непрерывном удержании клавиши пульта). Из этого утверждения могут быть исключения – пульты с экзотическими протоколами передачи данных. В худшем случае такие пульты просто будут блокировать передачу в сети на время нажатия клавиши.
— естественно, не прозрачные предметы ухудшат передачу. Если их невозможно устранить – направьте удлинители в потолок, отражаясь от потолка и стен, сигнал будет неплохо передаваться (в мобильных устройствах, роботах и т.д. – это лучший вариант, так он позволяет получить круговой прием);
9 Чего не_хватает/не_влезло в устройство:
Это то, что я планирую добавить в протокол в будующем
— при переполнении буфера хорошо был-бы возвращать по UART сигнал переполнения, соответственно, если буфер освободился – сигнал опустошения буфера. Это позволит контролировать ход передачи;
— каждое устройство 1W-IR сети имеет свой тип/идентификатор (удлинитель UART имеет тип «общие данные» (general-purpose data)). Кроме типа, устройство имеет номер, при помощи которого устройства одного типа можно различать. Удлинитель имеет нулевой номер – это значит, что все устройства «общие данные» будут участвовать в обмене в независимости от их номера. Нужна команда (или переключатель на ножках) которая смогла бы присвоить произвольный номер, любому устройству – это позволит отделять различные группы устройств друг от друга (они будут передавать данные только в пределах своей группы, не мешая другим);
— автоподстройка скорости UART – сомнительная необходимость, так как при такой низкой скорости (600 бод) допускается довольно значительные уходы частоты. Если появятся нарекания по работе модуля UART – сделаю автоподстройку;
— работа с посылками IR-пультов уже заложена в алгоритме, необходимо лишь разработать способ их (посылок) участия в работе устройства;
— в алгоритме передаче IR-посылок заложена возможность гибкого изменения параметров посылки – это можно использовать, например, для передачи повторов более мощным сигналом или для автоматической подстройки формата посылки под конкретные условия передачи.
— формат посылки подразумевает, что данные будут передаваться побайтно, но если есть необходимость передать массив данных в формате посылке зарезервированы поля для возможности организации длинных посылок – это позволит увеличить скорость передачи при больших объемах данных;
— изначально задумывалась инфракрасная сеть с возможностью соединения устройств помимо IR канала еще и по одному проводу (поэтому и название такое 1Wire-IR). Это будет удобно если разные модули расположены в одном устройстве (например, в роботе) и цеплять на каждый модуль пару светодиод-TSOP нецелесообразно. Реализовать это не сложно, необходима лиш одна ножка микроконтроллера.
В общем, все еще в стадии наработки … пишите здесь, в комментах, или на форуме, если есть предложения по развитию сети 1W-IR.