在没有无线电(以及使用 ADC、PWM 和 I2S/SPI 总线的其他无线电恶作剧)的情况下传输 900MHz LoRa 帧令人惊讶地远,包括发送其他 RF 数据,以及接收 RF 信号(尽管不可否认不是 LoRa 接收器)。
如果您正在寻找 Hackaday 2024 微控制器无线电演讲,您可以单击此处。
如果您正在寻找 LoLRa 商品(如 T 恤等),请单击此处。
笔记
警告
因为我们依赖谐波和混叠,所以微控制器发出的主频率分量将位于 RF 频谱中禁止 RF 传输的部分。请过滤您的输出或在不太可能泄漏大量射频的区域进行测试。在分布于数百个发射频率的整个频谱中,总体 EIRP 输出一般为 ≪300uW,但即使有滤波,故意在这些频率上传输的设备实际上也无法通过 FCC 第 15 部分合规性。
我一直对从没有专用无线电硬件的微控制器发送和接收无线电信号着迷。该存储库概述了我为进行此解码而完成的许多项目,以及示例代码(尽管其中一些受到限制性许可)
一般来说,存储库分为许多项目,但按设备类型分类。
仅固件 LoRa 传输,适用于各种处理器。在各种常见、廉价的处理器上发送 LoRa 数据包,无需任何无线电、芯片、外部硬件或内置无线电。虽然不是真正的位碰撞,但该存储库展示了如何使用移位寄存器(即 I2S 或 SPI 端口)或 APLL,发送可由商用现成 LoRa 网关和其他芯片解码的 LoRa 数据包。
该存储库有两种主要工作模式。
单击下面查看此页面的 Youtube 视频版本:
每当信号从低到高或从高到低改变状态时,该电线周围的电磁场就会产生干扰。任何时间。不同之处在于,作为一名工程师,您是否会害怕它,将其摇摇晃晃地压制住,害怕它可能引起的任何 EMI,还是会抓住公牛的角并发出一些手工制作的信号?您需要了解的主要原则是:
第二个原则是信号混合。如果您创建一个信号,然后将其与高频“混合”,您就会得到围绕该高频的“图像”。混合可以用二极管、特殊的射频设备来完成,甚至只是采样,就像使用移位寄存器那样,以稳定的速率输出位。
现在,当您意识到这两个原则实际上可以协同工作时,真正的奇迹就发生了。您会在基带处获得一个图像,在采样频率附近获得一个反射图像,然后在采样频率的 ×3 附近,您会获得另外 2 个图像,即正向图像和反向图像。还有×5、×7等。
有了这个,有了足够精确的时钟,我们就可以任意生成我们想要的任何频率,只要我们的微控制器的 GPIO 上有足够的带宽来生成它,即使我们生成的“实际”信号频率要低得多。
微控制器中的内部振荡器不仅不准确,而且频率也会抖动。您可能认为这是一个缺点,但事实上,使用微控制器内置的内部振荡器通常可以成为救星,让您摆脱 EMI/EMC。由于内部振荡器不仅不精确而且不稳定,因此它们可以防止频谱中较高的各个频率的谐波,因为时钟速率漂移如此之大。
水晶输出:
RC 输出:
请参阅下面的部分,了解 LoRa 信号实际工作原理的细节,或者互联网上其他博士都不愿意告诉您的事情。
LoRa 通常在 433MHz 或 900MHz 频谱下运行,通常具有 125kHz 通道。原则上,LoRa 会产生线性调频脉冲,从一个频率(低于通道中心 62.5kHz)开始,然后在短时间内(SF7 为 1.024uS)音调爬升到高于通道中心 62.5kHz。
虽然 LoRa 可以与许多不同的通道宽度一起使用,但 125kHz 和 500kHz 都得到很好的支持,而其他通道宽度则无法使用 LR9 等路由器进行配置。
该图在 X 轴上显示频率,在 Y 轴上显示时间(从上到下)...您可以看到:
方便的是,给定线性调频脉冲的窗口是稳定的,具体取决于扩频因子。对于上述数据包,对于 SF7,计算结果为每个符号 1,024us,对于 SF8,计算结果为每个符号 2,048us。每个符号/线性调频脉冲可以通过相位偏移来表示多个比特。
线性调频脉冲的原始“相位”是灰色编码的,以便更好地将位之间的位错误分散到过程的更高层。例如,如果您认为线性调频脉冲所在的相位相差一位,则它可能会超出 0b1111 和 0b10000 的边界,并会导致 5 位错误。通过格雷编码,它可以最大限度地减少由相位偏差甚至少数相位产生的误码。
在LoRa-SDR-Code.h
中从各个线性调频脉冲中解码该原始比特流并进行去灰度编码(请参阅encodeHamming84sx
)后,我们对这些位进行转置/交织,以便可以取出任何一个符号(请参阅diagonalInterleaveSx
)分散所有错误,以便可以恢复和美化单个丢失的符号(我相信这实际上是该协议中毫无价值的步骤,如果我错了,请纠正我)参见Sx1272ComputeWhitening
。上面的白化是一个纠错层,可帮助修复较低层可能发生的任何位错误(请参阅encodeFec
)。
总的来说,消息有一个标头和一个有效负载。请注意,这可能有点棘手,因为标头有时使用与有效负载不同的编码设置。就是这样。
一旦生成格式正确的数据包,您就可以将它们编码为线性调频脉冲并将其传输到线路上。
可以在此处找到该协议的更详细视图,以获得更学术的观点,并在此处找到一些更好的示例(尽管我发现这两个文件的正确性/清晰度存在一些问题)。
我从 ESP32-S2 开始这个项目,看看是否可以使用内部内置 APLL 输出信号,并通过 IOMUX 将 APLL/2 时钟路由出去,答案是可以。因为这会生成一个简单的方波,而方波在频谱上具有 F×3、F×5、F×7 等处的谐波,因此如果我将 APLL 设置为 139.06 MHz,它将输出 69.53 MHz。第 13 次谐波为 903.9 MHz,或第一个 125kHz LoRa 通道。然后,通过调整最低有效 PLL 控制位,我们可以将其从 903.9 MHz - 62.5kHz 调整到 903.9 + 62.5kHz,通过将 APLL 调整到 139.06 MHz - 9.62kHz 到 139.06 MHz + 9.62 kHz。这让我们可以生成特有的 LoRa 线性调频脉冲,而且实际上这是可以接收的!
ESP32-S2 还有另一个技巧 - GPIO 多路复用器能够输出信号或该信号的反相。这样我们就可以差分产生 139.06MHz 信号,将功率输出提高 3dB!
然而,ESP32-S2 存在一些问题。值得注意的是:
此外,很少有处理器甚至拥有 APLL,因此尽管取得了如此快速的成功,我还是决定继续......
几年前,我做了许多使用直接比特流合成来完成一些任务的项目,例如使用 ESP8266 在频道 3 上广播 RF 彩色 NTSC 电视或使用以太网数据包传输 AM 无线电。巧妙的技巧之一是,如果您在 SPI 或 I2S 移位寄存器上传输比特流,则会导致采样率出现混叠,图像为 F×3、F×5、F×7 等。部分是它保留了频谱上图像/别名处传输波形的大小/形状。对于通道 3,65MHz 信号在 40MHz 采样率附近反射。哈利·奈奎斯特可以去咬一个柠檬。
即使在极其恶劣的情况下,这种技术也能提供令人难以置信的保真度,这是不直观的。您可以在您期望的任何地方创建令人惊讶的精确信号。
有多种方法可以实现此目的,但通常使用移位寄存器最简单。类似于 I2S 或 SPI 总线中的移位寄存器。而且,如果您使用 DMA,您可以轻松地向移位寄存器提供更多数据,而无需在每个周期唤醒 CPU。不过,还有其他方法,例如直接切换 IO,或使用计时器在正确的时间打开和关闭 IO,但最简单的方法是编写代码来生成比特流并将其移出。
对于移位寄存器,必须考虑一些因素,例如确保字节序、位宽和内存排列正确,但是,一般来说,您可以跟上,除非存在滞后,例如每个字之间的时间,否则它们通常能够足够忠实地表示要从引脚传输和移出的输出上的位模式。
视频中描述的“lohrcut”涉及编写一个函数,该函数在给定时间点的情况下确定信号的幅度。该函数可以确定甚高频信号的幅度,然后,采样率可以是可用的任何物理上可实现的采样率。这将以低得多的频率信号创建高频信号的图像,并使用 0 到 Fs/2 之间的功率构建它。
另一个问题是闪存,在某些系统上访问不一致或在某些频率下无法正常工作。在这些情况下,就像在 ESP8266 上一样,必须将表格读入 RAM 并从那里播放。
LoRa 帧是完全封装的。如果你愿意的话,我们可以停在这里。您甚至可以使用商业网关,但如果不使用 LoRaWAN,帧就无法发送到像 The Things Network 这样的代理。例如,如果您运行树莓派网关,您可以接受任何您想要的旧 LoRa 帧,但是,我们更进一步,帮助数据包在世界各地转发。 LoRaWAN 是“端到端”加密,您的邻居或网关都无法读取消息。不过,奇怪的是——物联网可以读取你的消息,因为它们有加密密钥。
您可以方便地调用lib/lorawan_simple.h
中的GenerateLoRaWANPacket
来处理所有所需的封装。只需使用此功能即可生成帧并广播它们!
我们可以传输这些消息。凉爽的。但现在要接收它们,我们要么需要 LILYGO® T-Beam Meshtastic 之类的设备,要么需要 MikroTik LR9 之类的网关。后者在这里非常有趣,因为世界各地有数以千计的此类设备,并连接到物联网。这意味着,如果我们在这些网关之一的听力范围内传输格式正确的 LoRaWAN 数据包,我们就可以在地球上的其他地方获取该帧!
设置非常简单。您需要:
笔记
我们只关注重置帧计数器的 LoRa 帧,但是,如果您可以将最后传输的数据包 ID 存储到部件内的非易失性闪存中,则可以避免此步骤。如果没有这个,您的设备将受到重放攻击。
笔记
如果使用 MikroTik LR9,请务必将其打开并插入内部天线。从工厂发货时,它已连接到外部端口。
如果您能解决其中任何一个问题,PR 将开放!在我来到这里之前,我刚刚把计划花在这个项目上的所有时间都花完了。
特别是对于 LoRa,波的表现非常好,应该完全可以通过定时器电路动态创建,并且不需要任何预先计算,但我还没有抽出时间来处理它。这样就不需要有一个大表来将线性调频脉冲闪现到设备中。
我还想尝试使用更容易即时创建的定制位模式来执行此项目。此外,根据所使用的确切代码(可能通过采用与黄金代码相关的技术),甚至可以同时接收具有完全相同编码的许多信号。这样做将非常适合在微控制器上实现“printf”,该微控制器可以由中央 SDR 无线接收,并且处理器空间(和性能)开销非常低。
此外,添加一个滤波器会很有趣,或者尝试在没有任何组件的 PCB 中构建一个滤波器。
此外,尝试为 900MHz 信号构建 C 类放大器会非常酷。这会非常酷,因为它高效、极其便宜且简单,并且还提供高达 10-20dB 的增益!
城市测试于2024年2月23日进行,郊区测试于2022年2月26日进行,农村测试于2022年2月27日进行。
范围是峰值范围。可靠运行结束得更早。
TTGO Lora32 添加了 +3dBi 天线。 MikroTik LR9 使用内置天线。
日期 | 发件人 | 接收者 | SF/CR | 体重 | 笔记 | 范围 | 平均结束 RSSI/SNR | 基础 |
---|---|---|---|---|---|---|---|---|
2024-02-23 | CH32V203 | MikroTik LR9 | SF8/CR48 | 125 | 贝尔维尤市中心(市区) | 435' 132m | -98 / -9 | 地面 |
2024-02-23 | CH32V203 | MikroTik LR9 | SF10/CR48 | 500 | 贝尔维尤市中心(市区) | 435' 132m | -90 / -18 | 地面 |
2024-02-26 | CH32V203 | TTGO 劳拉32 | SF8/CR48 | 125 | 米拉蒙特公园(轻郊区+树林) | >576' >176m | -134 / -12 | 地面 |
2024-02-26 | CH32V203 | TTGO 劳拉32 | SF8/CR48 | 125 | Poo Poo Point Trail 起点(乡村) | >1117' >340m | -123 / -6 | 地面 |
2024-02-26 | CH32V203 | TTGO 劳拉32 | SF8/CR48 | 125 | 伊瑟阔郊区(+灯光树) | 2200'669m | -133 / -10 | 地面 |
2024-02-27 | CH32V203 | TTGO 劳拉32 | SF8/CR48 | 125 | Meadowbrook(乡村)红色加长天线 | 2220'677m | -135 / -13 | 无人机 |
2024-02-27 | CH32V203 | TTGO 劳拉32 | SF10/CR48 | 500 | Meadowbrook(乡村)红色加长天线 | 1752' 534m | -132 / -16 | 无人机 |
2024-02-27 | CH32V203 | TTGO 劳拉32 | SF8/CR48 | 125 | Meadowbrook(乡村)OVERVOLT 5V 红色加长天线 | 3996' 1218m | -131 / -12 | 无人机 |
2024-02-27 | CH32V203 | TTGO 劳拉32 | SF8/CR48 | 125 | Meadowbrook(乡村)灰色 VNA 匹配天线 | 2719' 829m | -131 / -11 | 无人机 |
2024-02-27 | ESP8266@80MHz | TTGO 劳拉32 | SF8/CR48 | 125 | Meadowbrook(乡村)灰色 VNA 匹配天线 | 2789' 850m | -138 / -13 | 无人机 |
2024-02-27 | ESP8266@173MHz | TTGO 劳拉32 | SF7/CR48 | 125 | Meadowbrook(乡村)灰色 VNA 匹配天线 | 2812' 857m | -131 / -8 | 无人机 |
2024-02-27 | ESP32-S2 + 比特天线 | TTGO 劳拉32 | SF10/CR48 | 125 | Meadowbrook(乡村)(注1) | 3428'1044m | -137 / -13 | 地面 |
2024-02-27 | ESP32-S2 + 比特天线 | TTGO 劳拉32 | SF10/CR48 | 125 | 梅多布鲁克(乡村)光降水 | >4895' >1492m | -130 / -8 | 无人机 |
2024-02-27 | ESP32-S2 + Funtenna | TTGO 劳拉32 | SF10/CR48 | 125 | 梅多布鲁克(乡村)光降水 | 705'/215m | -139 / -15 | 无人机 |
2024-02-27 | ESP32-S2 + 比特天线 | TTGO 劳拉32 | SF10/CR48 | 125 | 斯诺夸尔米步道、狗公园至里巴里溪(乡村)光降水 | 8460' / 2580m | -141 / -16 | 无人机 |