![]() |
![]() |
||||||||||||
Радиоканал передачи данных на модулях A110LR09A
Автор: Сергей Безруков (aka Ser60) Радиомодуль и его параметры Недавно мне понадобились радиомодули для передачи в здание с железобетонными стенами информации от сенсоров, находящихся снаружи. Эксперименты, проведенные с модулями RF2500 работающими в диапазоне 2.4 ггц в университетском кэмпусе повсеместно оснащенным WiFi раутерами, не увенчалась успехом. Передатчик при этом был установлен на улице на высоте человеческого роста, а приемник находился примерно в 50 м от него в дальнем углу комнаты на 4-м этаже здания с окнами обращенными в сторону передатчика. Гораздо лучших результатов при этом удалось добиться на субгигагерцовых диапазонах 315 мгц, 430 мгц, 868 мгц, и 915 мгц. На одном из Дней Технологии, организуемых компанией TexasInstruments (TI), я долго бродил среди киосков производителей радиочастотных модулей и общался с представителями их изготовителей. Особенно мне понравились модули фирмы Anaren. Модули эти собраны на основе микросхемы трансивера CC110L фирмы TI, который, как и его старший собрат CC1101, может работать во всех упомянутых выше субгигагерцовых диапазонах в зависимости от обвязки из пассивных компонентов. Модули на его основе уже содержат на плате все необходимые трансиверу компоненты (под металлическим экраном), включая разъем для внешней антенны, или печатную антенну. Из-за необходимости соблюдения норм FCC (FederalCommunicationsCommission), решено было остановиться на диапазоне 915 мгц. Габариты большего модуля с печатной антенной для этого диапазона всего около 9×16×2 мм. Таким образом, для описываемой односторонней реализации канала P2P трансивер сенсора работает в течении очень короткого времени только на передачу данных постоянно работающей (только) в режиме приема базовой станции. Модуль A110LR09A поддерживает несколько способов модуляции и скоростей передачи вплоть то 500 kBps. Я остановился на скорости 100 kBps и модуляции 2-FSK (BFSK), так что передача информационного пакета из 8 байт занимает порядка 1.5 мсек (включая передачу преамбулы, байтов синхронизации, и CRC). В результате среднее токопотребление передатчика при периоде посылки пакетов 5 сек составляет около 10 мкА. В таких условиях становится реальным питание устройства с внешним сенсором от маломощных источников, включая солнечные батареи. При большем интервале времени между посылками среднее токопотребление соответственно уменьшается. Ниже приведена схема соединения плат радиомодуля и МК, входящего в состав набора LaunchPad. Как отмечалось выше, радиомодуль A110LR09A аппаратно поддерживает пакетную обработку информации. Структура пакета, заимствованная из ДШ на CC110L, показана ниже. Он начинается с двух областей, формируемых передатчиком автоматически - преамбула и слово синхронизации. Не вдаваясь в подробности, отмечу лишь, что слово синхронизации можно изменить в конфигурации и таким образом автоматически (аппаратно) различать передающие стороны. Хотя, конечно, никто не мешает передавать адрес отправителя в области данных пакета. Следом за этими полями в пакете идет длина информационной части. Она по идее не должна превосходить размера FIFO передатчика (64 байт). Сразу за длиной имеется опция поместить адрес приемника. Этот адрес сравнивается с соответствующим байтом конфигурации и при несоответствии имеется возможность автоматического удаления пакета из FIFO приемника (при отключении этой опции адрес приемника можно не передавать). После информационной части передатчик автоматически вставляет 2 байта контрольной суммы (CRC) передаваемого пакета. Эту опцию также можно отключить программно. При несоответствии контрольных сумм также имеется возможность автоматического удаления пакета из FIFO. Я сдесь бегло отметил лишь небольшое число опций настроек. Для получения более точной информации читателю рекомедуется найти время на освоение ДШ. Длина информационной части пакета в нашей демо-программе равна 8 байт, включая байт спецификации длины. После длины идет байт с адресом приемника (установлен как 0х11 с включенной в приемнике опцией удаления пакета из FIFO при несовпадении) и байт идентификатора передатчика 0хАА - может быть любым, в настоящей версии программы этот адрес пока не используется. Задействовать его планируестя в будующем при установке нескольких сенсоров с передатчиками, обслуживаемыми той-же приемной станцией. Следом за ID идет байт с порядковым номером пакета. Он в программе пока используется только для контроля функционирования канала (см ниже), и зарезервирован для реализации протокола отсылки подтверждений (при необходимости). Последние 4 байта собственно информационные. Первые 2 из них – показания встроенного в МК датчика температуры, а послединие 2 зарезервированы для передачи данных от (пока не установленного) сенсора влажности. Как видно, при передаче для простоты не используется режим LBT (Listen Before Talk), характерный для многих сетевых протоколов, хотя модуль предоставляет аппаратную поддержку для такого режима. Таким образом, структура программы такова: после инициализации портов МК производится установка его тактовой частоты 8 мгц, настройка модуля eUSCI_B0 для SPI с тактовой частотой 4 мгц, настройка АЦП для обслуживания встроенного датчика температуры, и таймера А0 на генерацию прерывания каждые 5 секунд. После этого в регистры радиомодуля засылаются 47 байт конфигурации и производится установка выходной мощности передатчика. Таймер A0 работает от встроенного низкочастотного генератора (VLO, около 12 кгц), который работоспособен в режиме LPM3 сна МК. При этом токопотребление МК и всей системы не превосходит 0.6 мкА. Токопотребление замерялось на контактах VCC джампера J3 на плате LaunchPad (для измерения джампер, конечно, следует временно удалить). Переполнение таймера вызывает пробуждение МК, измерение температуры, формирования пакета передачи и загрузки его в радиомодуль с последующей передачей в эфир. МК при этом насколько это возможно долго содержится в режиме малого токо-потребления LPM0 или LPM3. Программа (файл sensor.s43) написана на языке ассемблера и предназначена для компиляции в системе IAR Embedded Workbench, Kickstart edition. Проект загружается в IDE путем открытия файла sensor.eww. Для надежной работы устройства собранного на плате LaunchPad следует разомкнуть оба джампера J5 (показаны в зеленом кружке на фото ниже. Эти джамперы подключают светодиоды на те-же пины, что используются для коммуникации с радиомодулем. Положение джамперов J3 в верхнем кружке для передатчика не важно. Отладочная плата LaunchPad оснащена преобразователем USB-UART и при ее подключении к компьютеру создается виртуальный COM порт. Имеется возможность подключить линии RХ и TX порта к МК, используя либо аппаратный, либо программный драйвер UART. Мы используем аппаратный UART драйвер МК, поэтому на плате приемника следует установить джамперы J3, показанные в верхнем зеленом кружке на фото выше, в положение HW UART. Также, как и на плате передатчика, следует разомкнуть оба джампера J5 (нижний зеленый кружок) по тем-же причинам. Далее, если Вы используете Windows7, то Вам нужно будет установить программу работы с терминалом, в качестве которой я рекомендую использовать Parallax Serial Terminal. Она находится в свободном доступе на сайте parallax.com и мне лично нравится больше всех. Скриншот ее работы представлен внизу. В ее настройках следует выбрать опцию “Wrap text to Pane”. Вместо этой программы можно использовать, например, Putty. В этом случае в категории Terminal ее настроек следует поставить галку на “Implicit LF in every CR”. Обе эти программы состоят из одного файла и не требуют инсталляции. Для подключения их к плате LaunchPad следует задать номер витруального COM порта, который Windows открыла для работы с платой. Этот номер можно определить в окне диспетчера устройств Windows. Помимо этого, программу следует настроить на скорость 9600 Bps с опциями 8N1 (8-битные посылки с одним стоповым битом без контроля четности). После загрузки в МК программы из прилагаемого проекта hub и запуске программы в отладчике IAR, можно открыть Parallax Serial Terminal. Любопытно, что и отладчик и терминальная программа могут быть подключены к плате LaunchPad одновременно (через один и тот-же USB кабель). При работающем передатчике на другой плате LaunchPad каждые 5 сек в терминальном окне появится новая строчка, как показано ниже. Прилагаемая программа hub.s43, как и программа передатчика, написана на языке ассемблера и предназначена для компиляции в среде IAR Embedded Workbench. Она начинается с конфигурации портов ввода/вывода, установки частоты тактового генератора 8 мгц, конфигурации модуля eUSCI_B0 в МК для работы с SPI и модуля eUSCI_A0 в приемнике для работы с UART, и засылки 47 байтов конфигурации в регистры радиомодуля. После этого она переходит в бесконечный цикл. На каждой итерации этого цикла производится прием пакета с последующим выводом новой строки в терминальное окно. Прием пакета в программе производится функцией Receive_Packet(). Она начинается с перевода радиомодуля в режим приема командой SRX (см. ДШ). После этого ожидается прерывание от пина GDO0. Нарастающий уровень сигнала на этом выводе появляется после приема байтов преамбулы, а последующий падающий уровень сигнализирует об окончании приема пакета. Радиомодуль при этом (благодаря конфигурации регистров) автоматически переходит в состояние IDLE. Здесь есть одна тонкость. Именно, описанное поведение пина GDO0 в режиме приема будет таким-же и при автоматическом сбросе пакета если его длина превышает установленную в регистре конфигурации (в данном случае 61). В этом случае FIFO будет пустой и из нее не следует ничего читать. Поэтому перед чтением FIFO программа проверяет содержимое регистра RXBYTES, содержащего число байт в буфере FIFO. Только если это число ненулевое, программа копирует содержимое пакета из FIFO в буфер RAM с последующей выдачей новой строки в окно терминала. В условиях описанных в начале статьи с этой программой и примененными модулями удалось установить передачу данных на расстоянии около 100 м.
Файлы: Все вопросы в Форум.
|
|
||||||||||||
![]() |
![]() |
![](/templates/radiokot_classic_neew/images/datasheet.png)
![](/templates/radiokot_classic_neew/images/dorogi.png)
![]() |
![]() |
|||
|
||||
![]() |
![]() |