Академический Документы
Профессиональный Документы
Культура Документы
ВВЕДЕНИЕ ...................................................................................................... 7
НГТУ.434851.001 ПЗ
Изм Лист № докум Подпись Дата
.
Разраб Эрнандес Литера Лист Листов
Пров Радченко Разработка системы связи на 5 124
основе технологии LoRa.
Н. Контр. Богомолов Пояснительная записка
Утв Синельников
2.9 Масштабируемость lorawan сети ........................................................ 36
ЗАКЛЮЧЕНИЕ .............................................................................................. 59
ПРИЛОЖЕНИЯ .............................................................................................. 61
Лист
НГТУ.434851.001 ПЗ 6
Изм. Лист № документа Подпись Дата
ВВЕДЕНИЕ
Лист
НГТУ.434851.001 ПЗ 7
Изм. Лист № документа Подпись Дата
1 АНАЛИТИЧЕСКИЙ ОБЗОР ЛИТЕРАТУРЫ
LoRa (Long Range – связь дальнего радиуса действия) – это технология
беспроводной сети, действующей на физическом уровне предложенной модели
OSI. Технология LoRa можно сопоставить со известным стандартом IEEE 802.11
(используется технология Wi-Fi на физическом уровне), которая обеспечивает
беспроводную связь межу различными устройствами, таких как смартфон, роутер,
ноутбук и т.д.
Интересные особенности технологии LoRa представляет собой высокая
энергопотребление и хорошая дальность связи, благодаря ее низкой пропускной
способности, и при этом LoRa может передавать небольшой объем данных, способ
которого имеет применение на автономных устройствах, к примеру датчики
(температуры, влажности, давления, радиоактивности и т.д.). LoRa может
обеспечить срок работы 2 или 3 года с простой батарейки AA, расположенная
далеко от базовой станции для сбора данных.
Устройства LoRa, работающие в нелицензируемых частотах согласно
международному правилу для диапазона частот ISM (от Англ. Industrial, Scientific
and Medical – индустриальные, научные и медицинские), то есть для использования
некоммерческих целей, являющихся открытым без лицензии (самая популярная
сеть на данный момент- беспроводные Wi-Fi и Bluetooth). Данная технология
предполагает настройку диапазона частот, зависящая от расположения стран и их
правил на частоте 433 МГц (Азия), 868 МГц (Европа, Индия) и 915 МГц (США,
Канада, Австралия). Подобное разрешение без присутствия государственных
органов пользователи получают беспроводную сеть Wi-Fi, которое позволяет
каждому ее установить, работающие на частоте 2.45 ГГц или 5 ГГц.
Беспроводные сети, использующие нелицензируемые частоты, имеются
ограничения по максимальной мощности излучаемого сигнала и на пропускную
способность (ширину полосы пропускания) и также имеются ограничения по
времени для использования каналов (от англ. Duty-cycle – нагрузочный цикл). К
примеру, в Европе применяется ISM диапазон на частоте 868 МГц, при котором
Лист
НГТУ.434851.001 ПЗ 8
Изм. Лист № документа Подпись Дата
присутствует ограничение на нагрузочный цикл, зависящее от используемого
канала, иными словами, каждое устройство (модуль) LoRa может вещать в эфире
согласно местному правилу не более 3.6 (0.1%) или 36 (1%) секунд за час.
Лист
НГТУ.434851.001 ПЗ 10
Изм. Лист № документа Подпись Дата
Частотная избыточность широкополосного радиосигнала обуславливает его
высокую помехоустойчивость, а узкая корреляционная функция – высокую
точность временной синхронизации.
Широкополосный радиосигнал LoRa представляет собой сигнал с линейной
частотной модуляцией (ЛЧМ) или CSS (Chirp Spread Spectrum). Частота CSS
радиосигнала может как увеличиваться (up-chirp), так и уменьшаться (down-chirp).
Математически ЛЧМ сигнал представляется в виде выражения (1):
(1)
Лист
НГТУ.434851.001 ПЗ 11
Изм. Лист № документа Подпись Дата
Рисунок 1 – Линейная частотная модуляция сигнала во временной области
Лист
НГТУ.434851.001 ПЗ 12
Изм. Лист № документа Подпись Дата
Рисунок 3 – Спектр ЛЧМ сигнала при базе равной 4096 (SF=12)
Лист
НГТУ.434851.001 ПЗ 13
Изм. Лист № документа Подпись Дата
1.4 Синхронизация приемника и передатчика
Для успешного функционирования любой системы обмена информацией
необходима взаимная синхронизация приемника и передатчика, позволяющая
определить временные границы приема-передачи как целого блока данных (или
кадра), так и единичных символов.
Технология LoRa использует асинхронный режим приема-передачи, при котором
передатчик может начать генерацию радиосигнала в любой момент времени. В
этом случае требуется механизм, обеспечивающий синхронизацию приемника по
сигналу от передатчика (аналог "старт-бита" протокола RS232). В качестве такого
механизма используется преамбула, предшествующая каждому сеансу связи.
Преамбула включает в себя последовательность символов, позволяющих
приемнику обнаружить активность передатчика, определить используемый
передатчиком коэффициент расширения спектра (SF) и выполнить символьную
синхронизацию. Длительность преамбулы является конфигурируемой величиной
и должна быть не менее, чем T1+2•T2, где T1 определяет максимальное время
нахождения приемника в состоянии "сна" (Sleep), T2 – определяет время поиска
приемником преамбулы (Рисунок 5).
Лист
НГТУ.434851.001 ПЗ 14
Изм. Лист № документа Подпись Дата
По завершении преамбулы следует слово синхронизации (Sync Word) и
блок данных физического уровня. Длина слова синхронизации настраивается в
диапазоне от 1 до 8 байт. Спецификацией LoRa определен ряд специфических
значений Sync Word – 0x34 для публичных сетей (public networks), 0x12 – для
частных сетей (private networks) и 0xC194C1 – для каналов с FSK модуляцией.
На рисунке 6 приведена общая структура кадра, обеспечивающего передачу одного
блока данных.
Лист
НГТУ.434851.001 ПЗ 15
Изм. Лист № документа Подпись Дата
Таблица 1 – Региональные частотные диапазоны
Лист
НГТУ.434851.001 ПЗ 16
Изм. Лист № документа Подпись Дата
1.6 Физический уровень (PHY Layer)
На физическом уровне обеспечивается негарантированная передача блоков
данных между конечным устройством (End Node) и шлюзом LoRa (Gateway).
На стороне передающего устройства выполняется:
- прием блока данных от MAC уровня (PHYPayload);
- формирование физического заголовка пакета (PHDR + PHDR_CRC);
- кодирование физического заголовка пакета (PHDR + PHDR_CRC) с
фиксированной скоростью 4/8;
- вычисление контрольной суммы блока полезных данных PHYPayload (CRC);
- кодирование блока полезных данных (PHYPayload + CRC) с
предустановленной скоростью CR;
- передача по радиоканалу преамбулы;
- модуляция и передача по радиоканалу физического блока данных.
На стороне приемного устройства выполняется:
- обнаружение преамбулы и определение начала физического блока данных;
- демодуляция сигнала;
- декодирование физического заголовка пакета (PHDR + PHDR_CRC) и проверка
его контрольной суммы;
- декодирование блока полезных данных (PHYPayload + CRC) и проверка его
контрольной суммы;
- подтверждение принятых данных (для соответствующих типов сообщений);
- передача данных на MAC уровень.
На рисунке 7 ниже приведены форматы физических блоков данных нисходящего
(DL) и восходящего (UL) каналов:
Лист
НГТУ.434851.001 ПЗ 17
Изм. Лист № документа Подпись Дата
Рисунок 7 – форматы физических блоков данных нисходящего (DL) и
восходящего (UL) каналов
Здесь:
Лист
НГТУ.434851.001 ПЗ 18
Изм. Лист № документа Подпись Дата
1.7 Классы устройств LoRa
Класс А
Лист
НГТУ.434851.001 ПЗ 19
Изм. Лист № документа Подпись Дата
Класс В
Класс C
(2)
Лист
НГТУ.434851.001 ПЗ 20
Изм. Лист № документа Подпись Дата
Передачи символов блока данных физического уровня широкополосного
радиосигнала происходит путем частотного смещения относительно
опорного линейной частотной модуляции сигнал .
Информационный символ k имеет диапазон k=0,1, 2,…,2SF, размерностью SF бит.
Это соотношение (3) можно записать так:
(3)
Лист
НГТУ.434851.001 ПЗ 21
Изм. Лист № документа Подпись Дата
Рисунок 11 – Совокупность беспроводных сетей, сравнивая с технологии LoRa
Лист
НГТУ.434851.001 ПЗ 23
Изм. Лист № документа Подпись Дата
2 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
2.1 Модуляция LoRa
Метод модуляции LoRa является методом расширения спектра, который
работает на основе линейной частотной модуляции (от англ. chirp spread spectrum,
CSS), в беспроводных сетях LPWAN и его открытый протокол LoRaWAN.
Линейная частотная модуляции – это тип модуляции по частоте, у которого частота
несущего сигнала изменяется по линейному закону. следовательно, эта модуляция
является частным случаем систем связи с расширением спектра где применяет
способ для повышения эффективности передачи информации при помощи
модулированных сигналов по каналу связи с сильными линейными искажениями
(замираниями), который приводит к увеличению базы сигнала.
(4)
Лист
НГТУ.434851.001 ПЗ 24
Изм. Лист № документа Подпись Дата
а) б) в)
Лист
НГТУ.434851.001 ПЗ 26
Изм. Лист № документа Подпись Дата
Рисунок 13 – Пример графика ЛЧМ-сигнала (CSS)
Лист
НГТУ.434851.001 ПЗ 27
Изм. Лист № документа Подпись Дата
приемника инверсного сигнала (inverse chirp) c принятым LoRa сигналом,
получается сигнал, который изображен справа и уже состоит из декодированных
символов.
Каждый чэрп является одним символом, который в свою очередь может
хранить в себе некоторое количество бит информации. Таким образом, каждый
сдвиг в возрастающей линейной последовательности приводит во время
демодуляции к образованию сигнала, частота которого постоянна на протяжении
некоторого времени. Множество этих сигналов с постоянными частотами
напоминают «полочки» и называются символами. Результирующая постоянная
частота («высота полочки») определяется величиной сдвига относительно
исходной последовательности, и определяет какую информацию несет данный
чэрп. Так как сигнал распределен во времени, у приемника есть некоторое время,
в течении которого он может более точно определить, какие именно данные
поступили. Имеются 128 возможных символов (сдвигов относительно исходной
последовательности), которые позволяют закодировать 7 бит в каждый чэрп.
Реализация демодуляции таким образом позволила создать технологию,
которая мало чуствительна к шуму. На рисунке 14, помимо принятого сигнала
LoRa, также имеется узко-частотный шум (жёлтый сигнал, narrowband interferer).
Интересно то, что в процессе демодуляции, когда складываются принятый сигнал
с инверсным чэрпом, шум преобразовывается из сигнала с примерно постоянной
частотой в сигнал с переменной частотой, который уже не мешает процессу
распознавания декодированных символов. Полезные символы таким образом
различимы даже при большом количестве шума на различных частотах спектра.
Термин SF (Spreading Factor – коэффициент протяженности) условно
означает угол наклона (скорость увеличения частоты) косых, линейных линий
LoRa сигнала. Каждый шаг в SF означает, что чэрп длится два раза дольше по
времени, а следовательно передаются в два раза меньше чэрпов за одно и то же
время. Это дает приемнику больше времени для обнаружения переданного
символа, что позволяет демодулировать более слабые или зашумленные сигналы.
Лист
НГТУ.434851.001 ПЗ 28
Изм. Лист № документа Подпись Дата
Другими словами, увеличивая SF, увеличивается дальность, но уменьшается
скорость передачи в два раза.
Дополнительными плюсами такой модуляции являются стойкость к
доплеровскому сдвигу, что позволяет передатчикам постоянно быть в движении
без ухудшения качества сигнала, и низкие требования к тактовому генератору
приемника благодаря этапу синхронизации и простоты демодуляции.
(5)
Лист
НГТУ.434851.001 ПЗ 30
Изм. Лист № документа Подпись Дата
Где BW (Bandwidth) – ширина полосы пропускания.
(6)
𝑓 − частота в герцах.
Режима SF12 позволяет распознать сигнал, который находится 20dB под уровнем
шума, поэтому:
Лист
НГТУ.434851.001 ПЗ 35
Изм. Лист № документа Подпись Дата
zone), которая протекает через площадь земли, являющаяся препятствием для
электромагнитных радиоволн.
Лист
НГТУ.434851.001 ПЗ 36
Изм. Лист № документа Подпись Дата
базовой станцией. Так же существует немаловажный фактор, что при добавлении
второй и последующих базовых станций, передатчики становятся ближе к хотя бы
одной из них, что позволяет использовать более скоростные режимы передачи
данных и меньше времени находиться в эфире, что еще больше уменьшает
загруженность канала.
Для функционирования вышеупомянутой идеи переключения скоростного
режима (SF), в LoRaWAN предусмотрена вещь под названием ADR (Adaptive Data
Rate – адаптивная скорость передачи данных, или более правильно – адаптивный
SF). Она работает примерно следующим образом: если базовая станция получила
пакет от передатчика и видит, что SNR равен, к примеру, -10dB, то она, согласно
таблице 1, подбирает оптимальный SF для данного передатчика (обычно SNR -
5dB, то есть -15dB в нашем примере) и посылает пакет передатчику, который
сообщает о том, что он может переключиться на SF10 (предельный SNR = 15).
Лист
НГТУ.434851.001 ПЗ 37
Изм. Лист № документа Подпись Дата
3 ИССЛЕДОВАТЕЛЬСКАЯ ЧАСТЬ
Лист
НГТУ.434851.001 ПЗ 38
Изм. Лист № документа Подпись Дата
Рисунок 20 – Отладочная плата STM32VLDiscovery с микроконтроллером
STM32F100RBT6B
Лист
НГТУ.434851.001 ПЗ 39
Изм. Лист № документа Подпись Дата
самому является справочником, которые ориентирует реализацию данной схемы.
Пройдя все по этапам, далее создается модель в программное обеспечение Altium
Designer. Соединив все компоненты в схеме, проверяется на правильное
подключение и оформление ее по Госту.
В дальнейшем принимается решение передать готовую схемотехническую сборку
на разработку модели печатной платы для ее реализации. И в результате переходит
уже на изготовление печатной платы.
Лист
НГТУ.434851.001 ПЗ 42
Изм. Лист № документа Подпись Дата
Рисунок 22 – Временная диаграмма оценки RSSI на приемнике
Лист
НГТУ.434851.001 ПЗ 43
Изм. Лист № документа Подпись Дата
Рисунок 23 – Прототип устройства приемника, собранный на макете
Модуль LoRa
Лист
НГТУ.434851.001 ПЗ 45
Изм. Лист № документа Подпись Дата
Рисунок 24 – Прототип устройства передатчика с датчиком температуры.
Лист
НГТУ.434851.001 ПЗ 46
Изм. Лист № документа Подпись Дата
Во время разработки печатной платы были учтены все явления при
соединениях дорожек, такие как пересечение дорожек обоих слоев, чтобы
предупредить повреждение функционала работоспособности устройства из-за
электромагнитных воздействий, а также ошибки на полученных символах во время
приема из-за внешних помех.
Но в данном случае можно пренебречь этими влияниями, так как скорость
передачи значительно мала на десятки килобайт.
Контур печатной платы, изображенного на рисунке 25 и рисунке 26,
подвирается конструкция и дизайн, чтобы поместить на ее корпусе, а также
делается круговой вырез для закрепления болтами и прямоугольный вырез для
того, чтобы разместить проводы в упорядоченном положении.
1 2
X 2 1 2
2 1
2 1
1
X
X
X
X X
2 1
1 2
2
1 2
X
2 1
X
3
1
X
2 1 2 1
2
X
1
1 2
2 1
2 1 X
X
X
X
X
X
X
X
X X
X 1 2
X X
X
1 X
X
X X
X
2
2 1
X
X
X 2
X X
X
X X
X X
X X
X X
X
X
X
1
X
X
2
X X
X
X 2 1
X
1 X
1
X
X
X
X X X X
X
X
2
X X
X
X
2 2
1 2
1
2 1 1
X X
X X
10 9 2 1 1
1 16
8 7
X
2
2 15
6 5 X
X
3
X X
3 14
X X
4 3
4 13
X
X X
X X
2 1
5 12
1 1
2 2
6 11
7 10
8 9
2 2
2 1 2
1 1
1
X X
1 2 3 4 1 2 3 4 5 6 7 8
X
Лист
НГТУ.434851.001 ПЗ 47
Изм. Лист № документа Подпись Дата
Рисунок 26 – Спроектированная плата, изготовленная на производстве
Лист
НГТУ.434851.001 ПЗ 48
Изм. Лист № документа Подпись Дата
4 ЭКОНОМИЧЕСКАЯ ЧАСТЬ
Зпт = 𝑡 ∙ Сттариф
Зп = Кр ∙ (Зпт + 0.2 ∙ Зпт ) = 1.2 ∙ (68 757.2 + 0.2 ∙ 68 757.2) = 99 010.37 руб
• Командировочные расходы;
• Больничный, медицинское обследование и военные сборы;
• Разовые премии, предусмотренные организацией;
• Прохождение сотрудником обучения;
• Ежегодный отпуск;
• Отпуск по уходу за ребенком (декретный отпуск);
Лист
НГТУ.434851.001 ПЗ 50
Изм. Лист № документа Подпись Дата
Таблица 4 – Тарифная ставка для каждого этапа разработки
Время Тарифная
Наименование этапа Ответственный за Сумма,
выполнения, ставка,
разработки выполнение руб.
час руб.\час
Обзор технологий,
Инженер-
платформ, существующих 90 180.94 16 284.6
программист
решений, обзор литературы
180.94 Инженер-
Испытания и анализ ПО 10 1 809.4
программист
Инженер-
Рефакторинг ПО 30 180.94 5 428.2
программист
ИТОГО 68 757.2
Лист
НГТУ.434851.001 ПЗ 51
Изм. Лист № документа Подпись Дата
Дополнительная часть заработной платы составляет 12% в учреждениях,
занимающихся разработкой программного обеспечения.
Лист
НГТУ.434851.001 ПЗ 53
Изм. Лист № документа Подпись Дата
Зр = Ск ∙ 𝑘р = 40000 ∙ 0,15 = 6000 руб
Лист
НГТУ.434851.001 ПЗ 54
Изм. Лист № документа Подпись Дата
5 РАЗДЕЛ ОХРАНЫ ТРУДА
Актуальность проблемы безопасности человека, в частности на производстве
признана во всем мире.
Безопасность жизнедеятельности (БЖД) — наука о закономерностях
формирования опасностей и мерах по предупреждению их воздействия на
человека. БЖД включает в себя следующие составные части:
• БЖД на производстве (охрану труда);
• БЖД в чрезвычайных ситуациях;
• Охрану окружающей среды.
Как гласит аксиома о потенциальной опасности деятельности – любая
деятельность потенциально опасна. Ежедневно от техногенных, социальных или
природных катастроф погибают сотни человек. Именно поэтому первостепенной
задачей безопасности жизнедеятельности является защита человека от
неблагоприятных факторов окружающей природной и техносферной среды и
создание комфортных условий труда.
В связи с темой диплома, а точнее с условиями труда, связанными с этой
темой, наибольшее внимание в данном разделе мы уделим теме охраны труда.
Охрана труда — система сохранения жизни и здоровья работника в процессе
его трудовой деятельности, включающая в себя правовые, социально-
экономические, организационно-технические, санитарно-гигиенические, лечебно-
профилактические, реабилитационные и иные мероприятия, и тесно связана с
гигиеной труда.
Гигиена труда основана на изучении производственной среды и ее влияния
на условия труда и здоровье рабочих с целью разработки комплекса
организационных, санитарно-гигиенических и лечебно-профилактических
мероприятий, необходимых для улучшения этих условий, повышения
производительности труда и работоспособности работника.
Лист
НГТУ.434851.001 ПЗ 55
Изм. Лист № документа Подпись Дата
Условия труда определяются технологией производства, его организацией и
трудовым процессом, с одной стороны, и окружающей работающего санитарно -
гигиенической обстановкой – с другой.
Технология производства тесно взаимодействует с трудовым
производственным процессом. К санитарно-гигиеническим условиям труда
относят воздействие на организм человека метеорологического фактора
(температуры, влажности, скорости движения воздуха, барометрического
давления), загрязнения воздуха парами, газами, пылью, воздействие шума,
вибрации, электромагнитных излучений, ионизирующей радиации и т. д. Все эти
понятия изучает такая наука, как производственная санитария и гигиена труда.
Производственная санитария [9] — это система организационных и
санитарно-технических мероприятий и средств, предотвращающих воздействие
вредных производственных факторов.
Одним из основных факторов, влияющих на здоровье и трудоспособность
работников, является микроклимат производственного помещения. При
длительном и систематическом пребывании человека в оптимальных
микроклиматических условиях сохраняется нормальное функциональное и
тепловое состояние организма без перегрузки механизмов терморегуляции.
Микроклимат включает в себя:
• температуру воздуха;
• скорость движения воздуха;
• относительную влажность воздуха;
• интенсивность теплового излучения.
Оптимальные параметры микроклимата – сочетание значений показателей
микроклимата, которые при длительном и систематическом воздействии на
человека обеспечивают нормальное тепловое состояние организма при
минимальном напряжении механизмов терморегуляции и ощущение комфорта не
менее чем у 80 % людей, находящихся в помещении.
Лист
НГТУ.434851.001 ПЗ 56
Изм. Лист № документа Подпись Дата
Допустимые параметры микроклимата — сочетания значений показателей
микроклимата, которые при длительном и систематическом воздействии на
человека могут вызвать общее и локальное ощущение дискомфорта, ухудшение
самочувствия и понижение работоспособности при усиленном напряжении
механизмов терморегуляции не вызывают повреждений или ухудшения состояния
здоровья.
Оптимальные параметры микроклимата распространяются на всю рабочую
зону производственных помещений без разделения рабочих мест на постоянные и
непостоянные. Если по технологическим требованиям, технически и экономически
обоснованным причинам оптимальные параметры микроклимата не могут быть
обеспечены, то устанавливают пределы их допустимых значений.
Длительное воздействие на человека неблагоприятных условий
микроклимата резко ухудшает его самочувствие, снижает работоспособность и
приводит к заболеваниям.
Так, высокая температура окружающего пространства способствует быстрой
утомляемости организма, в некоторых случаях может привести к тепловому удару.
Низкая температура в свою очередь может вызвать местное или общее
переохлаждение организма, стать причиной простудного заболевания, либо, в
крайнем случае, обморожения.
Влажность влияет на терморегуляцию организма человека. Высокая
относительная влажность при высокой температуре воздуха способствует
перегреванию организма, при низкой температуре усиливает теплоотдачу с
поверхности кожи, что приводит к переохлаждению организма работника. Низкая
влажность в производственном помещении приводит к пересыханию слизистых
оболочек.
Подвижность воздуха эффективно способствует теплоотдаче организма
работника и положительно проявляет себя при высоких температурах, но
отрицательно при низких.
Лист
НГТУ.434851.001 ПЗ 57
Изм. Лист № документа Подпись Дата
Для создания нормальных условий труда в производственных помещениях
обеспечивают соблюдение нормативных значений параметров микроклимата, а
именно температуры воздуха, его относительной влажности и скорости движения,
а также интенсивности теплового излучения.
Лист
НГТУ.434851.001 ПЗ 58
Изм. Лист № документа Подпись Дата
ЗАКЛЮЧЕНИЕ
Данная выпускная квалификационная работа посвящена разработке
Программного обеспечения (прошивки) с использованием синхронного
соединения SPI, принципиальной схемы, печатной платы и его изготовленной
реализации.
Во все разны обзорах были рассмотрены все виды разработки
программирования и моделирования в Altium designer.
Изучены технологии LoRa и ее модуляции, а также интерфейс передачи
данных между ведущим и ведомым устройством.
Были изучены программирование на микроконтроллер STM32F100RBT6B
и решение задачи управления данных приемно-передатчика на языке
программирования СИ.
В процессе выполнения разработки, моделирования и решения задачи
выпускной квалификационной работы были выполнены следующие пункты:
• Была разработана прошивку на языке программирования для
управления микроконтроллера и модули LoRa.
• Разработана и смоделирована схема электрическая принципиальная.
• Была разработана проведена трассировки на печатной плате.
• Было тестировано результирующее устройство на работоспособности
и дальность технологии LoRa.
• Было проведено моделирование погрешностей такого алгоритма
оценивания, в ходе которого было выявлено, что при определённом
уровне СКО входного аддитивного белого гауссовского шума,
алгоритм показывает удовлетворительные результаты.
В результате разработки был проведен тестирования на устройство, и тест
показал хорошую оценку на измерение температуры из датчика и состояние
отправки их данных температуры приемо-передатчика LoRa.
Лист
НГТУ.434851.001 ПЗ 59
Изм. Лист № документа Подпись Дата
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
Лист
НГТУ.434851.001 ПЗ 60
Изм. Лист № документа Подпись Дата
ПРИЛОЖЕНИЯ
Приложение А
Test_TX.c
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_usart.h"
#include "onewireTx.h"
#include <stddef.h>
//#include "stm32f10x_dma.h"
#include "stm32f10x_tim.h"
#include <stdlib.h>
#include <math.h>
#include "humidity_sensor.h"
#include "misc.h"
// length of packet
#define payload_length 7 //15 //25
// tx packet
//unsigned char txbuf[payload_length]= {'W', 'e', '_', 'i', 'n', '_', 't', 'h', 'e', '_', 'U', 'n', 'i',
'v', 'e', 'r', 's', 'i', 't', 'y', '_', 'N', 'S', 'T', 'U'};//{'s','e','n','d','_','t','e','s','t'};
//unsigned char txbuf[payload_length] = {'C', 'e', 'm', 'a', '_', 'e', 's', '_', 'm', 'a', 'r', 'i', 'c',
'o', 'n'};
// rx packet
unsigned char rxbuf[30];
/*******************************************************************/
//????????? ??????????
GPIO_InitTypeDef port;
SPI_InitTypeDef spi;
//ADC_InitTypeDef adc;
//uint8_t sendData;
Лист
НГТУ.434851.001 ПЗ 62
Изм. Лист № документа Подпись Дата
//uint16_t counter;
//uint16_t data;
//uint8_t needUpdate;
//uint8_t data1;
uint8_t ButtonState;
uint8_t SPIData=0;
//Leds
#define BLUE_ON GPIO_SetBits(GPIOC, GPIO_Pin_8)
#define Green_ON GPIO_SetBits(GPIOC, GPIO_Pin_9)
#define BLUE_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_8)
#define Green_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_9)
/*******************************************************************/
/********************LoRa Communication*****************************/
//define Module Registers
#define RegOpMode 0x01
Лист
НГТУ.434851.001 ПЗ 63
Изм. Лист № документа Подпись Дата
#define RegDioMapping2 0x41
#define Reset 0x00
#define RegPaRamp 0x06
#define RegModemConfig 0x75
#define RegHopChannel 0x5C
/**********************************************************************
******/
// IO definition
#define LED_TX p1_0 // output,led of tx
#define LED_RX p1_1 // output,led of rx
#define MOSI p1_4 // output,SPI MOSI
#define nCS p1_5 // output, SPI enable
#define SCK p1_6 // output,SPI clock
#define RF_RST p1_7 // output,SX1276 reset
#define rx_en p3_7 // output,rx antenna switch
#define tx_en p4_5 // output,tx antenna switch
#define MISO p4_7 // output,SPI MISO
typedef struct
{
Лист
НГТУ.434851.001 ПЗ 64
Изм. Лист № документа Подпись Дата
unsigned char reach_tx : 1;
unsigned char is_tx : 1;
unsigned char rf_reach_timeout : 1;
} FlagType;
FlagType Flag;
int tes_temp(void);
/******************************Lora
Registers*******************************************************/
void initAll()
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
Лист
НГТУ.434851.001 ПЗ 66
Изм. Лист № документа Подпись Дата
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
port.GPIO_Mode = GPIO_Mode_AF_PP;
port.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
port.GPIO_Mode = GPIO_Mode_IPU;
port.GPIO_Pin = GPIO_Pin_6;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_4;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
port.GPIO_Mode = GPIO_Mode_IPD;
port.GPIO_Pin = GPIO_Pin_0;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_12;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &port);
Лист
НГТУ.434851.001 ПЗ 67
Изм. Лист № документа Подпись Дата
port.GPIO_Mode = GPIO_Mode_IPU;
port.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &port);
//GPIO_Init(GPIOF,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);//cs
//ADC_StructInit(&adc);
//adc.ADC_ContinuousConvMode = ENABLE;
//adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//ADC_Init(ADC1, &adc);
/******????????????? ??????????*****************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//===========================================?PC8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//CS_ON();
Лист
НГТУ.434851.001 ПЗ 68
Изм. Лист № документа Подпись Дата
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//===========================================?PC8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/******????????????? SPI*****************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
//SPI_StructInit(&spi);
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi.SPI_Mode = SPI_Mode_Master;
spi.SPI_DataSize = SPI_DataSize_8b;
spi.SPI_CPOL = SPI_CPOL_Low;
spi.SPI_CPHA = SPI_CPHA_1Edge;
spi.SPI_NSS = SPI_NSS_Soft;
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
spi.SPI_FirstBit = SPI_FirstBit_MSB;
spi.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &spi);
SPI_Cmd(SPI1, ENABLE);
Лист
НГТУ.434851.001 ПЗ 69
Изм. Лист № документа Подпись Дата
}
void SX1278_Config(void)
{
delay(100); ;
// In setting mode, RF module should turn to sleep mode
Lora_Write(RegOpMode, 0x08); //low frequency mode,sleep mode
Lora_Write(RegFrMsb, 0x6C);
Lora_Write(RegFrMid, 0x80);
Lora_Write(RegFrLsb, 0x00);//Frequency in Default = 434 MHz "0x6C8000"
Лист
НГТУ.434851.001 ПЗ 70
Изм. Лист № документа Подпись Дата
Lora_Write(RegPreambleLsb, 0x00);
Lora_Write(RegPreambleMsb, 16);
Lora_Write(RegPaDac, 0x87);// High Power +20dbm for PA_HP
Lora_Write(RegHopPeriod, 0x00); // no hopping
Lora_Write(RegDioMapping2, 0x01); //
DIO5=ModeReady,DIO4=CadDetected
Lora_Write(RegOpMode, 0x09); // standby mode
//Lora_Write(RegOpMode | 0x80, 0x8B);// Low freq + Transmit (TX)
//Lora_Write(RegIrqFlags1, RegIrqFlags1);//Reserved
Лист
НГТУ.434851.001 ПЗ 71
Изм. Лист № документа Подпись Дата
}
temper = ds_buff[1];
temper = temper<<8;
temper |= ds_buff[0];
temper =temper>>4;//отбрасываем дробную чать
if(temper > 1000)//если температура <0
{
Лист
НГТУ.434851.001 ПЗ 72
Изм. Лист № документа Подпись Дата
temper = 4096 - temper;
znak = '-';
}else znak = '+';
/*
void tx_mode ()
{
unsigned char addr,temp;
Lora_Write(DIOMAPPING1,0x41); //
DIO0=TxDone,DIO1=RxTimeout,DIO3=ValidHeader
Лист
НГТУ.434851.001 ПЗ 73
Изм. Лист № документа Подпись Дата
Lora_Write(RegOpMode,0x8B); // enter tx mode
Flag.is_tx = 1; // tx flag
rf_timeout = 0;
Flag.rf_reach_timeout = 0; // clear tx timeout flag
Лист
НГТУ.434851.001 ПЗ 74
Изм. Лист № документа Подпись Дата
break;
}
}
return;
}
*/
/*
unsigned char * converter_temp(double *div)
{
//div_t arr1;
int del = *div / 10;
// double n, m;
// n = 8;
//m = 2;
float rem = fmod(*div, 10);
short rain = 0;
char c, dec, u = 0;
void tx_send_temp ()
{
unsigned char addr,temp;
temper = ds_buff[1];
temper = temper<<8;
Лист
НГТУ.434851.001 ПЗ 76
Изм. Лист № документа Подпись Дата
temper |= ds_buff[0];
temper =temper>>4;//отбрасываем дробную чать
if(temper > 1000)//если температура <0
{
temper = 4096 - temper;
znak = '-';
}else znak = '+';
/*
double tt = 30.25;
double *t = &tt;
unsigned char *var = converter_temp(t);
*/
unsigned char d = (0x30 + (temper / 10));
unsigned char r = (0x30 + (temper % 10));
//unsigned char *del = NULL;
//unsigned char *rem = NULL;
//unsigned char pas = ds_buff[1];
// del = &d;
//rem = &r;
char size1 = sizeof(d);
char size2 = sizeof(r);
//char sizeDef1 = sizeof(del);
//char sizeDef2 = sizeof(rem);
//int i;
value_mes = get_adc_value();
value_mes = value_mes >> 2;
Лист
НГТУ.434851.001 ПЗ 77
Изм. Лист № документа Подпись Дата
rain = (short)(100.0f * ((1023.0f - (float)value_mes) / (1023.0f + 0.0f)));
unsigned char var[payload_length] = {d, r,' ','C', c, dec, u};//{d, r,' ','C', c, dec, u};//,
value_mes};//*si4432_Send
Lora_Write(DIOMAPPING1,0x41); //
DIO0=TxDone,DIO1=RxTimeout,DIO3=ValidHeader
Лист
НГТУ.434851.001 ПЗ 78
Изм. Лист № документа Подпись Дата
Lora_Write(RegOpMode,0x8B); // enter tx mode
Flag.is_tx = 1; // tx flag
rf_timeout = 0;
Flag.rf_reach_timeout = 0; // clear tx timeout flag
temp = Lora_Read(RegIrqFlags);
return;
}
int main()
{
initAll();
init();
__ASM("nop");
__ASM("nop");
Лист
НГТУ.434851.001 ПЗ 80
Изм. Лист № документа Подпись Дата
__ASM("nop");
__ASM("nop");
__ASM("nop");
unsigned char addr,temp, mer;
//Green_ON;
// BLUE_ON;
__ASM("nop");
Lora_Reset();
SX1278_Config();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
adc_init();
__enable_irq();
//TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//TIM_Cmd(TIM3, ENABLE);
//TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
//ADC_ExternalTrigConvCmd(ADC1, ENABLE);
// NVIC_EnableIRQ(TIM3_IRQn);
// TIMER4
/*TIM_TimeBaseInitTypeDef TIMER_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
Лист
НГТУ.434851.001 ПЗ 81
Изм. Лист № документа Подпись Дата
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructInit(&TIMER_InitStructure);
TIMER_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//84MHz
TIMER_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIMER_InitStructure.TIM_Prescaler = 255;
TIMER_InitStructure.TIM_Period = 700;
TIMER_InitStructure.TIM_RepetitionCounter = 0x00;
TIM_TimeBaseInit(TIM4, &TIMER_InitStructure);
//TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM4, ENABLE);
///NVIC Configuration
// Enable the TIM4_IRQn Interrupt
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);*/
while(1)
{
// if(value_mes != 0)
// {
// GPIOC ->ODR ^= GPIO_Pin_8;
// }
Лист
НГТУ.434851.001 ПЗ 82
Изм. Лист № документа Подпись Дата
if(Flag.reach_tx == 0) // transmit packet on
time, and wait for the reply
{
Flag.reach_tx = 0;
// transmit packet
// Lora_Write(RegFifo,
0x48);//send Data
//tx_mode();
//delay(1000);
// delay(500);
tx_send_temp();
Лист
НГТУ.434851.001 ПЗ 83
Изм. Лист № документа Подпись Дата
}
SPI_I2S_SendData(SPI1, Data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_ReceiveData(SPI1);
SPI_I2S_SendData(SPI1, 0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
Data = SPI_I2S_ReceiveData(SPI1);
// Wait until transmit complete
GPIO_SetBits(GPIOA,GPIO_Pin_4); //NSS=1
delay(650);
Green_OFF;
BLUE_OFF;
return Data;
}
Лист
НГТУ.434851.001 ПЗ 84
Изм. Лист № документа Подпись Дата
{
//Green_ON;
//BLUE_ON;
delay(650);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0
SPI_I2S_ReceiveData(SPI1);
//while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==
RESET){};
SPI_I2S_ReceiveData(SPI1);
delay(650);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//NSS=1
return;
}
void SPIBurstWrite_LoRa(unsigned char addr, const unsigned char *ptr, unsigned char
len)
{
unsigned char i;
SPI_I2S_ReceiveData(SPI1);
delay(200);
for(i=0; i<len; i++){
SPI_I2S_SendData(SPI1, ptr[0]);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==
RESET){};
SPI_I2S_ReceiveData(SPI1);
delay(650);
ptr++;
}
GPIO_SetBits(GPIOA, GPIO_Pin_4);//NSS=1
}
}
void Lora_Reset(void)
{
LoraRst_High;
Delay_reset(200);
LoraRst_Low;
Delay_reset(500);
}
/*
void TIM3_IRQHandler()
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
*/
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
Лист
НГТУ.434851.001 ПЗ 87
Изм. Лист № документа Подпись Дата
Приложение Б
Test_RX.C
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_usart.h"
#include "Sx1276.h"
#include <stddef.h>
#include <string.h>
#include "ssd1306.h"
#include "ssd1306_i2c.h"
#include "fonts.h"
#include "hd44780_driver.h"
#include <math.h>
#include <stdio.h>
#include "stm32f10x_tim.h"
/*******************************/
uint8_t status_OK = 0;
uint8_t si4432_Send[16] = {"I'm here!!"};
float Packet_Strength_dBm2 = 0;
int PacketSnr = 0;
int SNR_dB = 0;
uint8_t ButtomState = 0;
Лист
НГТУ.434851.001 ПЗ 88
Изм. Лист № документа Подпись Дата
/*******************************************************************/
//????????? ??????????
GPIO_InitTypeDef port;
SPI_InitTypeDef spi;
//ADC_InitTypeDef adc;
//uint8_t sendData;
//uint16_t counter;
//uint16_t data;
//uint8_t needUpdate;
//uint8_t data1;
//uint8_t ButtonState;
uint8_t SPIData= 0;
uint8_t presStButt = 0;
#define longitud 4
//Leds
#define BLUE_ON GPIO_SetBits(GPIOC, GPIO_Pin_8)
#define Green_ON GPIO_SetBits(GPIOC, GPIO_Pin_9)
#define BLUE_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_8)
#define Green_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_9)
Лист
НГТУ.434851.001 ПЗ 89
Изм. Лист № документа Подпись Дата
#define SET_ON GPIO_SetBits(GPIOC, GPIO_Pin_12)
#define SET_OFF GPIO_ResetBits(GPIOC, GPIO_Pin_12)
/*******************************************************************/
/******************************Lora
Registers*******************************************************/
Лист
НГТУ.434851.001 ПЗ 90
Изм. Лист № документа Подпись Дата
#define RegSymbTimeoutLsb 0x1F
#define RegPayloadLength 0x22
#define RegIrqFlagsMask 0x11
#define DIOMAPPING1 0x40
#define DIOMAPPING2 0x41
#define RegFifoRxCurrentAddr 0x10
#define RegRxNbBytes 0x13
#define RegFifoRxBaseAddr 0x0F
#define RegPreambleLsb 0x21
#define RegModemStat 0x18
#define RegRssiWideband 0x2C
#define RegPktRssiValue 0x1A
#define RegRssiValue 0x1B
#define RegPktSnrValue 0x19
// length of packet
#define payload_length 7
// rx packet
unsigned char rxbuf[30];
unsigned char rxbuf_tem[4];
Лист
НГТУ.434851.001 ПЗ 91
Изм. Лист № документа Подпись Дата
unsigned char rf_timeout = 0;
// unsigned char state_rx = 0;
typedef struct
{
unsigned char reach_tx : 1;
unsigned char is_tx : 1;
unsigned char rf_reach_timeout : 1;
} FlagType;
FlagType Flag;
/********************LoRa Communication*****************************/
//define Module Registers
#define RegOpMode 0x01
//char RegDioMapping2 = 0x41;
#define Reset 0x00
#define RegPaRamp 0x06
#define RegModemConfig 0x75
#define RegHopChannel 0x5C
/**********************************************************************
******/
void delay(unsigned int time);
Лист
НГТУ.434851.001 ПЗ 92
Изм. Лист № документа Подпись Дата
void usart_rec(unsigned char *ptr, unsigned char len);
void SPIBurstRead(unsigned char addr, unsigned char *ptr, unsigned char len);
uint8_t count = 0;
uint8_t state;
int PacketRssi = 0;
int Rssi = 0;
int RSSI_dbm = 0;
int Packet_Strength_dbm = 0;
uint16_t previousState = 0;
// void Timer_init()
// {
// TIM_TimeBaseInitTypeDef timer;
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
//---------------------------------------------------------------------------
void initAll()
{
SystemInit();
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
port.GPIO_Mode = GPIO_Mode_AF_PP;
port.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
port.GPIO_Mode = GPIO_Mode_IPU;
port.GPIO_Pin = GPIO_Pin_6;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_4;
Лист
НГТУ.434851.001 ПЗ 94
Изм. Лист № документа Подпись Дата
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
//
port.GPIO_Mode = GPIO_Mode_IPD;
port.GPIO_Pin = GPIO_Pin_0;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);
//GPIO_Init(GPIOF,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);//cs
//ADC_StructInit(&adc);
//adc.ADC_ContinuousConvMode = ENABLE;
//adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//ADC_Init(ADC1, &adc);
/******????????????? ??????????*****************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//===========================================?PC8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//CS_ON();
Лист
НГТУ.434851.001 ПЗ 95
Изм. Лист № документа Подпись Дата
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//===========================================?PC8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO_Mode_Out_OD
GPIO_Mode_Out_PP GPIO_Mode_IPU
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/******????????????? SPI*****************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
//SPI_StructInit(&spi);
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi.SPI_Mode = SPI_Mode_Master;
spi.SPI_DataSize = SPI_DataSize_8b;
spi.SPI_CPOL = SPI_CPOL_Low;
spi.SPI_CPHA = SPI_CPHA_1Edge;
spi.SPI_NSS = SPI_NSS_Soft;
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
spi.SPI_FirstBit = SPI_FirstBit_MSB;
spi.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &spi);
SPI_Cmd(SPI1, ENABLE);
Лист
НГТУ.434851.001 ПЗ 96
Изм. Лист № документа Подпись Дата
/************USART*************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,
ENABLE);
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,
ENABLE);
USART_InitTypeDef usart;
/* Параметры по умолчанию: 9600 бод, 8 бит данных, 1
стоп-бит */
USART_InitTypeDef USART_InitStructure;
Лист
НГТУ.434851.001 ПЗ 97
Изм. Лист № документа Подпись Дата
USART_InitStructure.USART_Parity = USART_Parity_No;
//четность - нет
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None; // управлени потоком - нет
USART_InitStructure.USART_Mode = USART_Mode_Rx |
USART_Mode_Tx; // разрешаем прием и передачу
USART_StructInit(&usart);
USART_Init(USART1, &usart);
USART_Cmd(USART1, ENABLE);
}
//---------------------------------------------------------------------------------------
void SX1278_Config(void)
{
delay(800); delay(800);
// In setting mode, RF module should turn to sleep mode
Lora_Write(RegOpMode, 0x08); //low frequency mode,sleep mode
Lora_Write(RegFrMsb, 0x6C);
Lora_Write(RegFrMid, 0x80);
Лист
НГТУ.434851.001 ПЗ 98
Изм. Лист № документа Подпись Дата
Lora_Write(RegFrLsb, 0x00);//Frequency in Default = 434 MHz "0x6C8000"
Lora_Write(DIOMAPPING2, 0x01); //
DIO5=ModeReady,DIO4=CadDetected
Lora_Write(RegOpMode, 0x09); // standby mode
Лист
НГТУ.434851.001 ПЗ 99
Изм. Лист № документа Подпись Дата
//Lora_Write(RegPayloadLength | 0x80, RegPayloadLength);//Lora
payload length
//Lora_Write(RegIrqFlags1, RegIrqFlags1);//Reserved
}
//-------------------------------------------------------------------------------------------/
void rx_init(void)
{
unsigned char addr;
//tx_en=0;
//rx_en=1; // open rx antenna switch
Flag.is_tx = 0;
Лист
НГТУ.434851.001 ПЗ 100
Изм. Лист № документа Подпись Дата
Lora_Write(DIOMAPPING1,0x01); //DIO0=00, DIO1=00,
DIO2=00, DIO3=01 DIO0=00--RXDONE
Lora_Write(RegIrqFlagsMask,0x3F); // enable rxdone and rxtimeout
'0x3f'
Lora_Write(RegIrqFlags,0xFF); // clear interrupt
//-------------------------------------------------------------------------------------/
uint8_t Uart_oneSymb(char uart)
{
while ((USART1->SR & USART_SR_TXE) == 0);
USART_SendData(USART1, uart);
return 1;
}
//----------------------------------------------------------------------------------/
//--------------------------------------------------------------------------------------------/
short Rx_lora(void)
{
//Debug_LoraRx = 0;
//Green_ON;
//BLUE_ON;
Debug_LoraRx = Lora_Read(RegModemStat); /// Debug on Error
lora in the Receiver module
//Rssi = Lora_Read(RegRssiValue);
// rf_timeout++;
Лист
НГТУ.434851.001 ПЗ 102
Изм. Лист № документа Подпись Дата
if((temp)) //if(temp == 0x01 || temp == 0x40) //|| Debug_LoraRx
== 0x24 || Debug_LoraRx == 0x25) // wait for rxdone
{
//(temp & 0x40)
//Debug_LoraRx = Lora_Read(RegModemStat);
Lora_Write(RegIrqFlags,0xFF); // clear
interrupt
Rssi = Lora_Read(RegRssiValue); //Current RSSI value
temp = Lora_Read(RegFifoRxCurrentAddr); //
read RxCurrentaddr
Lora_Write(RegFifoAddrPtr,temp); //
RxCurrentaddr -> FiFoAddrPtr
RSSI_Control = Lora_Read(RegRssiWideband);
Лист
НГТУ.434851.001 ПЗ 103
Изм. Лист № документа Подпись Дата
RSSI_dbm = -164 + Rssi;
Packet_Strength_dbm = -164 + Rssi;
PacketSnr = Lora_Read(RegPktSnrValue);
SNR_dB = PacketSnr / 4;
Packet_Strength_dBm2 = -164 + PacketRssi +
PacketSnr*0.25;
rssi_value = -164 + (16/15)*PacketRssi;
/*
if(RSSI_dbm < 0)
{
sig = '-';
}
else {
sig = ' ';
}
c = (0x30 + ((abs(RSSI_dbm))/ 100));
d = (0x30 + (((abs(RSSI_dbm)) % 100) / 10));
u = (0x30 + ((abs(RSSI_dbm)) % 10));
*/
//unsigned char str[4] = {sig, c, d, u};
Лист
НГТУ.434851.001 ПЗ 104
Изм. Лист № документа Подпись Дата
/*
while(RSSI_dbm!=0)
{
short byte = RSSI_dbm%sout;
RSSI_dbm/=sout;
out--;
if(byte<10)
out = 48 + byte;
else
out = 55 + byte;
}
*/
// display_buf[packet_size];
//
// for(i = 0; i < packet_size; i++)
// {
// display_buf[packet_size] = rxbuf_tem[i];
// }
SSD1306_DrawCircle(78, 35, 4,
SSD1306_COLOR_WHITE); //рисуем белую окружность в позиции 10;33 и
радиусом 7 пикселей
SSD1306_GotoXY(0, 10);
SSD1306_Puts("Temperature", &Font_11x18,
SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
SSD1306_Fill(SSD1306_COLOR_BLACK);
//break;
// }
//rx_init();
//usart_rec(rxbuf, 25);
Uart_oneSymb('\n');
Uart_oneSymb('\r');
usart_rec("Start LoRa receiver", 19);
Лист
НГТУ.434851.001 ПЗ 107
Изм. Лист № документа Подпись Дата
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
usart_rec("temperature measurement: On", 27);
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
usart_rec("Temperature: ", 13);
usart_rec(&rxbuf_tem[0], 1);//packet_size
usart_rec(&rxbuf_tem[1], 1);
usart_rec(" ",1);
//Uart_oneSymb('\r');
//Uart_oneSymb('\r');
usart_rec(&rxbuf_tem[3], 1);
usart_rec(&rxbuf_tem[4], 1);
Uart_oneSymb('\n');
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Лист
НГТУ.434851.001 ПЗ 108
Изм. Лист № документа Подпись Дата
status_OK = 1;
//Debug_LoraRx = 0;
// temp = 0;
//state_rx = 1;
//rxbuf_tem[packet_size] = 0;
//delay(10000);
}
/*
else if((rxbuf_tem[packet_size]) == 0)
{
rx_init(); // restart Rx when
data is not correct.
GPIOC ->ODR ^= GPIO_Pin_9; // All
restart, flash the LED Green
delay(0x100000);
Uart_oneSymb('\n');
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
usart_rec("error in the received 'symbol' or
'string'", 42);
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
//USART_SendData(USART1, "error of the
driver");
delay(100);
status_OK = 0;
Лист
НГТУ.434851.001 ПЗ 109
Изм. Лист № документа Подпись Дата
SSD1306_GotoXY(0, 10);
SSD1306_Puts("Error symbol", &Font_7x10,
SSD1306_COLOR_WHITE);
SSD1306_GotoXY(0, 30);
SSD1306_Puts("check your driver", &Font_7x10,
SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
SSD1306_Fill(SSD1306_COLOR_BLACK);
rxbuf_tem[packet_size] = 0;
Debug_LoraRx = 0;
temp = 0;
//xbuf_tem[packet_size]++;
}
*/
//Debug_LoraRx = 0;
//temp = 0;//Lora_Read(RegIrqFlags);
//Rssi = 0;
//Lora_Write(RegIrqFlags, 0xFF);
//temp = Lora_Read(RegIrqFlags);
//temp = 0;//Lora_Read(RegIrqFlags);
//temp = Lora_Read(RegFifoRxCurrentAddr);
//Lora_Write(RegIrqFlagsMask,0xFF);
rssi_value ^= 0;
}
Лист
НГТУ.434851.001 ПЗ 110
Изм. Лист № документа Подпись Дата
else if((rssi_value <= -101)) //if((Debug_LoraRx == 0x24) ||
(Debug_LoraRx == 0x25) || (Debug_LoraRx == 0x00))//Rssi == 0x00000000)//&&
temp != 0x00) //|| Debug_LoraRx == 0x04 || temp == 0x00)//if(Debug_LoraRx == 0x00
)
{
SSD1306_GotoXY(0, 10);
SSD1306_Puts("Network error", &Font_7x10,
SSD1306_COLOR_WHITE);
SSD1306_GotoXY(0, 30);
SSD1306_Puts("LoRa not working",
&Font_7x10, SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen();
SSD1306_Fill(SSD1306_COLOR_BLACK);
Uart_oneSymb('\n');
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
//delay(5000000);
usart_rec("LoRa network disconnected, please
check the connection of your device", 69);
Uart_oneSymb('\n');
Uart_oneSymb('\r');
Uart_oneSymb('\n');
//Debug_LoraRx ^= 0;
//temp ^= 0;
//////////////////////Leds
GPIOC ->ODR ^= GPIO_Pin_8;
delay(0x10000);
GPIOC ->ODR ^= GPIO_Pin_9;
delay(0x10000);
Лист
НГТУ.434851.001 ПЗ 111
Изм. Лист № документа Подпись Дата
}
//(Lora_Write(RegModemStat, 0x00)); /// Debug on Error
lora in the Receiver module Debug_LoraRx
//(Lora_Write(RegRssiValue, 0x00));//
(Lora_Write(RegModemStat, 0x00)); /// Debug on
Error lora in the Receiver module Debug_LoraRx
(Lora_Write(RegRssiValue, 0x00));//Rssi
//Debug_LoraRx = 0;
Rssi = 0;
}
return rssi_value;//pointer;
short simbolo = 0;
char var, cent, dec, uni;
int read = 0;
short percent = 0;
//--------------------------------------------------------------------------------------------------------
-/
Лист
НГТУ.434851.001 ПЗ 112
Изм. Лист № документа Подпись Дата
//-------------------------------------------------------------------------------------------/
int main()
{
initAll();
//Lora_Reset();
lcd_init();
unsigned char i, j, RSSI_Control;
SSD1306_Init();
ssd1306_I2C_Init();
//Timer_init();
__ASM("nop");
__ASM("nop");
__ASM("nop");
__ASM("nop");
__ASM("nop");
Лист
НГТУ.434851.001 ПЗ 113
Изм. Лист № документа Подпись Дата
__ASM("nop");
//CS_OFF_P8();
//lcd_clear();
//lcd_set_4bit_mode();
//NVIC_EnableIRQ(TIM4_IRQn);
while(1)
{
read = Rx_lora();
//;
Лист
НГТУ.434851.001 ПЗ 115
Изм. Лист № документа Подпись Дата
//lcd_clear();
//delay(500);
//lcd_delay();
if(percent == 0x64)
{
char value_percent[3] = {cent, dec, uni};
lcd_out("Percent:"); //Âûâîäì íàäïèñü â íóëåâóþ ñòðîêó
lcd_out(value_percent);
lcd_out("%");
lcd_set_xy(0,0); //ïåðåâîäèì êóðñîð â ïåðâóþ ñòðîêó
//lcd_send(0,DATA);
lcd_set_state(LCD_ENABLE, CURSOR_DISABLE,
NO_BLINK); //0x0E cursor no blink
}
else
{
char value_percent[3] = {' ',dec, uni};
Лист
НГТУ.434851.001 ПЗ 116
Изм. Лист № документа Подпись Дата
lcd_out("Percent:"); //Âûâîäì íàäïèñü â íóëåâóþ ñòðîêó
lcd_out(value_percent);
lcd_out("%");
lcd_set_xy(0,0); //ïåðåâîäèì êóðñîð â ïåðâóþ ñòðîêó
//lcd_send(0,DATA);
lcd_set_state(LCD_ENABLE, CURSOR_DISABLE,
NO_BLINK); //0x0E cursor no blink
}
//Rx_lora();
//read = NULL;
//GPIOC ->ODR ^= GPIO_Pin_9;
//delay(0x100000);
//Green_OFF;
//rxbuf_tem[i] = 0;
//packet_size = 0;
//rxbuf_tem[packet_size] = NULL;
//rxbuf_tem[packet_size] = 0;
// ButtomState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
// if(ButtomState == 1)
// {
// SET_ON;
// delay(1000);
// ButtomState = 0;
// }
// else
Лист
НГТУ.434851.001 ПЗ 117
Изм. Лист № документа Подпись Дата
// {
// SET_OFF;
// delay(1000);
// ButtomState = 1;
// }
//Debug_LoraRx = 0;
//temp = 0;
}
}
//--------------------------------------------------------------/
void delay(unsigned int time)
{
unsigned int i=0;
for(i=0;i<time;i++);
}
//----------------------------------------------------/
//void TIM4_IRQHandler(void)
//{
//
//
// TIM_ClearFlag(TIM4, TIM_FLAG_Update);
// if (previousState == 0)
// {
// previousState = 1;
// //GREEN_ON;
Лист
НГТУ.434851.001 ПЗ 118
Изм. Лист № документа Подпись Дата
// //BLUE_ON;
// //timer.TIM_Period = 50 - 1;
// //TIM_TimeBaseInit(TIM3, &timer);
// GPIO_SetBits(GPIOB,GPIO_Pin_7);
// GPIO_SetBits(GPIOB,GPIO_Pin_6);
// TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
// }
// else
// {
// previousState = 0;
// //GREEN_OFF;
// //BLUE_OFF;
// //timer.TIM_Period = 250 - 1;
// //TIM_TimeBaseInit(TIM3, &timer);
// GPIO_ResetBits(GPIOB,GPIO_Pin_7);
// GPIO_ResetBits(GPIOB,GPIO_Pin_6);
// TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
// }
//
//}
//*********************************************************************
*******************/
Лист
НГТУ.434851.001 ПЗ 119
Изм. Лист № документа Подпись Дата
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0
SPI_I2S_SendData(SPI1, read_addr);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_ReceiveData(SPI1);
SPI_I2S_SendData(SPI1, 0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
read_addr = SPI_I2S_ReceiveData(SPI1);
// Wait until transmit complete
GPIO_SetBits(GPIOA,GPIO_Pin_4); //NSS=1
delay(650);
//Green_OFF;
//BLUE_OFF;
return read_addr;
}
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0
Лист
НГТУ.434851.001 ПЗ 120
Изм. Лист № документа Подпись Дата
SPI_I2S_SendData(SPI1, addr | 0x80);// 0x01 0x83
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){};
SPI_I2S_ReceiveData(SPI1);
//while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==
RESET){};
SPI_I2S_ReceiveData(SPI1);
delay(650);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//NSS=1
return;
}
void Delay_reset(unsigned int t)
{
unsigned char j;
while(t--)
{
for(j=0;j<100;j++);
}
}
void Lora_Reset(void)
{
SET_ON;
Delay_reset(200);
SET_OFF;
Лист
НГТУ.434851.001 ПЗ 121
Изм. Лист № документа Подпись Дата
Delay_reset(500);
}
// read RX data, combine with DR mask (we only accept a max of 9 Bits)
//if(len<=1)
//return;
//else
//{
for(int i = 0; i < len; i++)
{
USART_SendData(USART1, *ptr);
while ((USART1->SR & USART_SR_TXE) == 0);
// delay(650);/\n\r
ptr++;
}
// while ((USART1->SR & USART_SR_TXE) == 0);
// USART_SendData(USART1, '\n');
// while ((USART1->SR & USART_SR_TXE) == 0);
//USART_SendData(USART1, '\r');
/*
while ((USART1->SR & USART_SR_TXE) == 0);
USART_SendData(USART1, '_');
Лист
НГТУ.434851.001 ПЗ 122
Изм. Лист № документа Подпись Дата
while ((USART1->SR & USART_SR_TXE) == 0);
while ((USART1->SR & USART_SR_TXE) == 0);
USART_SendData(USART1, '\n');
while ((USART1->SR & USART_SR_TXE) == 0);
USART_SendData(USART1, '\r');*/
// }
//return;
}
void SPIBurstRead(unsigned char addr, unsigned char *ptr, unsigned char len)
{
unsigned char i;
if(len<=1) // length>1,use burst mode
return;
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//NSS=0
SPI_I2S_SendData(SPI1, addr);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){};
SPI_I2S_ReceiveData(SPI1);
delay(200);
for(i=0;i<len;i++)
{
SPI_I2S_SendData(SPI1, 0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)
== SET){};
ptr[0] = SPI_I2S_ReceiveData(SPI1);
Лист
НГТУ.434851.001 ПЗ 123
Изм. Лист № документа Подпись Дата
// Wait until transmit complete
delay(650);
ptr++;
}
GPIO_SetBits(GPIOA,GPIO_Pin_4);//NSS=1
}
}
/*
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
*/
Лист
НГТУ.434851.001 ПЗ 124
Изм. Лист № документа Подпись Дата
Разработка системы связи на основе технологии LoRa
АННОТАЦИЯ
Данная выпускная квалификационная работа бакалавра посвящена
разработке системы связи на основе технологии LoRa и ее модуляции, которая дает
возможность передачи информации, не пропуская внешние шумы, что позволяет
совершать передачу на большие расстояния.
Объем работы составляет 121 страниц, которые содержат 5 таблиц и 26
рисунков. В процессе исследования было использовано 6 литературных
источников.
Работу составляют: введение, 8 глав, заключение и список использованных
источников. Во введении рассматривается актуальность работы, формулируются
задачи, решаемые в процессе выполнения выпускной квалификационной работы,
раскрывается практическая значимость решения.
В данной работе совершен обзор таких программно-аппаратных средств как
STM32F100RBT6B, технология LoRa, интерфейс SPI, и язык программирования, в
частности язык Си, произведена разработка печатной платы, электрической
принципиальной схемы и описано разработанное программное решение. Также
описан процесс тестирования результирующего устройства (приемо-передатчика
LoRa) на работоспособность.
ABSTRACT
This final work of the bachelor is dedicated for the development of a
communication system based on LoRa technology and its modulation, which it makes
possible to transmit information without missing external noises that can be transmitted
over long distances.
The amount of page in this work is 121. This work contains 5 tables and 26
drawings, and 6 literary sources were being used in the research process.
The work consists of introduction, 8 chapters, conclusion and list of literary
sources had been used. In the introduction, the relevance of the work is considered, the
tasks to be solved in the process of completing the final qualifying work are formulated,
the practical significance of the solution is disclosed.