Передавайте кадры LoRa с частотой 900 МГц на удивительное расстояние без радио (и другие радиомахинации с использованием АЦП, ШИМ и шин I2S/SPI), включая отправку других радиочастотных данных, а также прием радиочастотных сигналов (хотя, по общему признанию, это не приемник LoRa).
Если вы ищете радиопередачу о микроконтроллерах Hackaday 2024, вы можете нажать здесь.
Если вы ищете товары LoLRa (например, футболки и т. д.), нажмите здесь.
Примечание
Осторожность
Поскольку мы полагаемся на гармоники и наложение спектров, основные частотные компоненты, излучаемые вашим микроконтроллером, будут находиться в тех частях радиочастотного спектра, где радиочастотная передача запрещена. Пожалуйста, отфильтруйте выходные данные или проведите тесты в месте, где вероятность значительной утечки радиочастотных сигналов мала. Общая выходная мощность EIRP составляет ≪300 мкВт по всему спектру, распределенному по сотням частот излучения, но практически невозможно, чтобы устройство, намеренно передающее на этих частотах, когда-либо могло соответствовать требованиям FCC часть 15, даже с фильтрацией.
Меня всегда увлекала передача и получение радиосигналов от микроконтроллеров, не имеющих специального радиооборудования. Этот репозиторий служит обзором многих проектов, которые я сделал для этого декодирования, а также примером кода (хотя некоторые из них имеют ограниченную лицензию).
Как правило, репозиторий разделен на множество проектов, но классифицирован по типам устройств.
Передача LoRa только через встроенное ПО для различных процессоров. Отправляйте пакеты LoRa без каких-либо радиомодулей, чипов, внешнего оборудования или встроенных радиопередатчиков на различных распространенных недорогих процессорах. Хотя этот репозиторий и не является чем-то особенным, он показывает, как с помощью сдвигового регистра (т. е. порта I2S или SPI) или APLL вы можете отправлять пакеты LoRa, которые могут быть декодированы с помощью готовых коммерческих шлюзов LoRa и других чипов.
Существует два основных режима, в которых работает этот репозиторий.
Нажмите ниже, чтобы просмотреть видеоверсию этой страницы на YouTube:
Каждый раз, когда сигнал меняет состояние с низкого на высокий или с высокого на низкий, в электромагнитных полях, окружающих этот провод, создаются помехи. В любое время. Разница в том, будете ли вы, как инженер, бояться его, хлюпать его, боясь любых электромагнитных помех, которые он может вызвать, или вы собираетесь схватить быка за рога и подавать какие-то искусно созданные сигналы? Основные принципы, которые вам необходимо понять:
Второй принцип – смешивание сигналов. Если вы создаете сигнал, а затем «смешиваете» его с высокой частотой, вы получаете «изображение», обернутое вокруг этой высокой частоты. Микширование может осуществляться с помощью диодов, специального радиочастотного оборудования или даже просто семплирования, например, с использованием сдвигового регистра, выдающего биты с постоянной скоростью.
Теперь происходит настоящее волшебство, когда вы понимаете, что эти два принципа действительно работают вместе. Вы получаете изображение в основной полосе частот, отраженное изображение около частоты дискретизации, затем около ×3 частоты дискретизации вы получаете еще два изображения, прямое и обратное. И ×5, и ×7 и т. д.
Благодаря этому, с достаточно точной тактовой частотой, мы можем произвольно генерировать любую частоту, какую пожелаем, при условии, что на GPIO нашего микроконтроллера остается достаточная полоса пропускания для ее генерации, даже если «реальный» сигнал, который мы генерируем, намного ниже по частоте. .
Внутренние генераторы в микроконтроллерах не только неточны, но и колеблются по частоте. Вы можете подумать, что это минус, но на самом деле использование внутреннего генератора, встроенного в микросхемы, часто может оказаться спасением, избавив вас от электромагнитных помех и электромагнитной совместимости. Поскольку внутренние генераторы не просто неточны, но и нестабильны, они предотвращают появление гармоник отдельных частот выше в спектре, поскольку тактовая частота очень сильно колеблется.
Кристаллический выход:
RC-выход:
В разделе ниже подробно рассказывается о том, как на самом деле работают сигналы LoRa, или о том, что ни один из других докторов наук в Интернете никогда не хотел вам об этом рассказывать.
LoRa обычно работает в диапазоне 433 МГц или 900 МГц, обычно с каналами 125 кГц. В принципе, LoRa создает чирпы, начиная с одной частоты, на 62,5 кГц ниже центра канала, затем в течение короткого периода времени (1,024 мкс на SF7) тон поднимается до 62,5 кГц выше центра канала.
Хотя LoRa можно использовать с различной шириной канала, очень хорошо поддерживаются 125 кГц и 500 кГц, тогда как другие ширины канала не настраиваются с помощью маршрутизаторов, таких как LR9.
На этой диаграмме по оси X показана частота, а по оси Y (сверху вниз) время. Вы можете увидеть:
Удобно, что окно для данного чирпа стабильно в зависимости от коэффициента расширения. Для вышеуказанного пакета с SF7 оно составляет 1024 мкс на символ, а для SF8 — 2048 мкс на символ. Каждый символ/чип может представлять несколько битов с помощью смещения фазы.
Необработанная «фаза» щебета кодируется серым кодом, чтобы лучше распределить битовую ошибку между битами на более высокие уровни процесса. Например, если вы отклоняетесь на единицу относительно фазы, на которой, по вашему мнению, находится чирп, она может выйти за границу, скажем, 0b1111 и 0b10000, что приведет к 5-битным ошибкам. Кодируя его по Грею, он минимизирует битовые ошибки, возникающие из-за отклонения на одну или даже несколько фаз.
После того, как этот необработанный битовый поток декодируется из отдельных чирпов и закодирован по-греемому (см. encodeHamming84sx
) в LoRa-SDR-Code.h
, мы транспонируем/чередуем биты, чтобы любой символ, который можно было бы вынуть (см. diagonalInterleaveSx
), в распределите все ошибки так, чтобы один потерянный символ можно было восстановить и отбелить (я считаю, что это на самом деле бесполезный шаг в этом протоколе, поправьте меня, если я неправильно) см. Sx1272ComputeWhitening
. Над отбеливанием находится слой коррекции ошибок, помогающий исправить любые битовые ошибки, которые могут произойти на нижнем уровне (см. encodeFec
).
В целом сообщения имеют заголовок и полезную нагрузку. Обратите внимание, что это может быть немного сложнее, поскольку заголовок иногда использует другие настройки кодировки, чем полезные данные. И все.
Как только вы сгенерируете правильно отформатированные пакеты, вы сможете закодировать их в сигналы и передать по сети.
Более подробное представление протокола можно найти здесь, более академическое представление и несколько лучших примеров здесь (хотя я обнаружил некоторые проблемы с правильностью/ясностью обоих документов).
Я начал проект с ESP32-S2, чтобы посмотреть, смогу ли я вывести сигнал, используя внутренний встроенный APLL, и направить тактовый сигнал APLL/2 через IOMUX, и ответ был: могу. Поскольку это генерирует простую прямоугольную волну, а прямоугольные волны имеют гармоники на уровне F×3, F×5, F×7 и т. д. вверх по спектру, если я установлю APLL на 139,06 МГц, на выходе будет 69,53 МГц. 13-я гармоника — 903,9 МГц или первый канал LoRa 125 кГц. Затем, настроив младшие биты управления PLL, мы сможем настроить его с 903,9 МГц – 62,5 кГц на 903,9 + 62,5 кГц, настроив APLL на 139,06 МГц – 9,62 кГц на 139,06 МГц + 9,62 кГц. Это позволяет нам генерировать характерные звуковые сигналы LoRa, и это действительно возможно!
У ESP32-S2 есть еще одна хитрость — мультиплексор GPIO способен выводить сигнал или инверсный этому сигналу. Таким образом, мы можем дифференциально создать сигнал частотой 139,06 МГц, увеличивая выходную мощность на 3 дБ!
Однако с ESP32-S2 есть проблемы. Примечательно, что:
Кроме того, очень немногие процессоры имеют APLL, поэтому, несмотря на столь быстрый успех, я решил перейти к...
Несколько лет назад я реализовал ряд проектов, в которых использовался прямой синтез битового потока для выполнения нескольких задач, таких как трансляция радиочастотного цветного телевидения NTSC на канале 3 с помощью ESP8266 или использование пакетов Ethernet для передачи AM-радио. Один из хитрых трюков заключается в том, что если вы передаете битовый поток через сдвиговый регистр SPI или I2S, это вызывает наложение псевдонимов на частоте дискретизации с изображениями в F×3, F×5, F×7 и т. д. часть заключается в том, что он сохраняет размер/форму передаваемого сигнала в изображениях/псевдонимах вверх по спектру. Для канала 3 сигнал частотой 65 МГц отражался около частоты дискретизации 40 МГц. Гарри Найквист может пойти и откусить лимон.
Эта техника дает невероятную точность даже в крайне плохих ситуациях, хотя это и не интуитивно понятно. Вы можете создавать удивительно точные сигналы далеко за пределами того места, где вы их ожидаете.
Есть несколько способов сделать это, но обычно проще всего использовать сдвиговый регистр. Такой сдвиговый регистр на шине I2S или SPI. А если вы используете DMA, вы можете легко загрузить в сдвиговый регистр больше данных, не пробуждая процессор в каждом цикле. Однако есть и другие способы, такие как прямое переключение ввода-вывода или использование таймера для включения и выключения ввода-вывода в нужное время, но проще всего написать код для генерации битового потока и его смещения.
Что касается сдвиговых регистров, необходимо принять несколько соображений, например, убедиться, что порядок байтов, разрядность и расположение памяти правильны, но в целом вы можете не отставать, и если нет задержки, например, времени между каждым словом, они обычно способны достаточно точно представить битовый шаблон на выходе, который необходимо передать и выдвинуть из вывода.
«Лоркат», описанный в видео, предполагает написание функции, которая в определенный момент времени определяет амплитуду сигнала. Эта функция может определять амплитуду очень высокочастотного сигнала, тогда частота дискретизации может быть любой доступной физически реализуемой частотой дискретизации. Это создаст изображение высокочастотного сигнала на гораздо более низкочастотном сигнале, создав его мощность в диапазоне от 0 до Fs/2.
Еще одна проблема — флэш-память: в некоторых системах доступ осуществляется нестабильно или плохо работает на определенных частотах. В таких случаях, как в ESP8266, таблицы необходимо считывать в ОЗУ и воспроизводить оттуда.
Кадры LoRa полностью инкапсулированы. Если бы ты хотел, мы могли бы остановиться здесь. Вы даже можете использовать коммерческий шлюз, но без использования LoRaWAN кадры нельзя будет отправлять таким брокерам, как The Things Network. Например, если вы используете шлюз Raspberry Pi, вы можете просто принимать любые старые кадры LoRa, которые захотите, но мы пошли еще дальше, помогая пакетам пересылаться по всему миру. LoRaWAN — это сквозное шифрование, при котором ни один из ваших соседей или шлюзов не может прочитать сообщения. Хотя любопытно: The Things Network МОЖЕТ читать ваши сообщения, потому что у них есть ключи шифрования.
Для удобства вы можете вызвать GenerateLoRaWANPacket
в lib/lorawan_simple.h
который выполнит всю необходимую инкапсуляцию. Просто используйте эту функцию для создания кадров и транслируйте их!
Мы можем передавать эти сообщения. Прохладный. Но теперь, чтобы их получить, нам понадобятся либо такие устройства, как LILYGO® T-Beam Meshtastic, либо шлюз, такой как MikroTik LR9. Последнее здесь действительно интересно, потому что их тысячи созданы по всему миру и подключены к The Things Network. Это означает, что если мы передадим правильно отформатированный пакет LoRaWAN в пределах слышимости одного из этих шлюзов, мы сможем получить кадр в другом месте на планете!
Настройка довольно проста. Вам нужно:
Примечание
Мы ориентируемся только на кадры LoRa, которые сбрасывают счетчики кадров, однако, если вы можете сохранить идентификатор последнего переданного пакета в энергонезависимой флэш-памяти внутри своей части, вы можете избежать этого шага. Без этого ваше устройство будет подвержено атакам повторного воспроизведения.
Примечание
Если вы используете MikroTik LR9, обязательно откройте его и подключите внутреннюю антенну. С завода он поставляется подключенным к внешнему порту.
Пиар открыт, если вы сможете разобраться в чем-либо из этого! Я просто потратил все время, которое планировал потратить на этот проект, до того, как приехал сюда.
В частности, для LoRa волны очень хорошо ведут себя, их можно полностью создавать с помощью таймерной схемы «на лету» и не требовать каких-либо предварительных вычислений, но я еще не дошел до этого. Это избавит от необходимости иметь большую таблицу для чипов, встроенных в устройство.
Я также хочу попробовать реализовать этот проект, используя специальные битовые шаблоны, которые легче создавать «на лету». Кроме того, в зависимости от точных используемых кодов (возможно, за счет использования технологий, связанных с золотыми кодами), можно даже сделать возможным одновременный прием многих сигналов с одним и тем же кодированием. Это сделало бы вполне уместным реализовать «printf» на микроконтроллерах, которые могут быть получены по беспроводной сети центральным SDR с очень низкими затратами на процессорное пространство (и производительность).
Кроме того, было бы интересно добавить фильтр или, возможно, попытаться встроить фильтр в печатную плату без каких-либо компонентов.
Еще, дополнительно было бы очень здорово попробовать собрать усилитель класса С для сигнала 900МГц. Это было бы очень здорово, потому что это могло бы быть эффективно, невероятно дешево и просто, а также обеспечить усиление до 10-20 дБ!
Тестирование в городе было проведено 23 февраля 2024 г., в пригороде — 26 февраля 2022 г., а тестирование в сельской местности — 27 февраля 2022 г.
Диапазоны – это пиковые диапазоны. Надежная эксплуатация заканчивается гораздо раньше.
Для TTGO Lora32 добавлена антенна +3dBi. В MikroTik LR9 использовалась внутренняя антенна.
Дата | Отправитель | Получатель | Сан-Франциско/Чехия | ЧБ | Примечание | Диапазон | Среднее значение RSSI/SNR | Основа |
---|---|---|---|---|---|---|---|---|
2024-02-23 | CH32V203 | МикроТик ЛР9 | SF8/CR48 | 125 | Центр города Бельвью (городской) | 435 футов 132 метра | -98 / -9 | Земля |
2024-02-23 | CH32V203 | МикроТик ЛР9 | SF10/CR48 | 500 | Центр города Бельвью (городской) | 435 футов 132 метра | -90 / -18 | Земля |
2024-02-26 | CH32V203 | ТТГО Лора32 | SF8/CR48 | 125 | Парк Мирамонт (Легкий пригород + лес) | >576 футов >176 м | -134 / -12 | Земля |
2024-02-26 | CH32V203 | ТТГО Лора32 | SF8/CR48 | 125 | Начало тропы Пу-Пу-Пойнт (сельская местность) | >1117 футов >340м | -123 / -6 | Земля |
2024-02-26 | CH32V203 | ТТГО Лора32 | SF8/CR48 | 125 | Пригород Иссакуа (+ Светлые деревья) | 2200 футов 669 метров | -133 / -10 | Земля |
2024-02-27 | CH32V203 | ТТГО Лора32 | SF8/CR48 | 125 | Медоубрук (сельский) Красная длинная антенна | 2220 футов 677 метров | -135 / -13 | Дрон |
2024-02-27 | CH32V203 | ТТГО Лора32 | SF10/CR48 | 500 | Медоубрук (сельский) Красная длинная антенна | 1752 футов 534 метра | -132 / -16 | Дрон |
2024-02-27 | CH32V203 | ТТГО Лора32 | SF8/CR48 | 125 | Медоубрук (сельская местность) OVERVOLT 5 В, красная, длинная антенна | 3996 футов 1218 метров | -131 / -12 | Дрон |
2024-02-27 | CH32V203 | ТТГО Лора32 | SF8/CR48 | 125 | Медоубрук (сельская местность) Серая согласованная антенна VNA | 2719 футов 829 метров | -131 / -11 | Дрон |
2024-02-27 | ESP8266 @ 80 МГц | ТТГО Лора32 | SF8/CR48 | 125 | Медоубрук (сельская местность) Серая согласованная антенна VNA | 2789 футов 850 метров | -138 / -13 | Дрон |
2024-02-27 | ESP8266 @ 173 МГц | ТТГО Лора32 | SF7/CR48 | 125 | Медоубрук (сельская местность) Серая согласованная антенна VNA | 2812 футов 857 метров | -131 / -8 | Дрон |
2024-02-27 | ESP32-S2 + Битенна | ТТГО Лора32 | SF10/CR48 | 125 | Медоубрук (сельский район) (Примечание 1) | 3428 футов 1044 метра | -137 / -13 | Земля |
2024-02-27 | ESP32-S2 + Битенна | ТТГО Лора32 | SF10/CR48 | 125 | Медоубрук (сельская местность) Небольшие осадки | >4895' >1492м | -130 / -8 | Дрон |
2024-02-27 | ESP32-S2 + Фунтенна | ТТГО Лора32 | SF10/CR48 | 125 | Ручей Луговой (Сельский) Легко Осадки | 705 футов / 215 м | -139 / -15 | Дрон |
2024-02-27 | ESP32-S2 + Битенна | ТТГО Лора32 | SF10/CR48 | 125 | Тропа Сноквалми, от собачьего парка до Рибари-Крик (сельская местность) | 8460 футов / 2580 м | -141 / -16 | Дрон |