다른 RF 데이터 전송 및 RF 신호 수신(LoRa 수신기는 아니지만)을 포함하여 라디오(ADC, PWM 및 I2S/SPI 버스를 사용하는 기타 무선 속임수) 없이 놀랍게도 900MHz LoRa 프레임을 전송합니다.
Hackaday 2024 마이크로컨트롤러 라디오 강연을 찾고 계시다면 여기를 클릭하세요.
LoLRa Merch(티셔츠 등)를 찾고 계시다면 여기를 클릭하세요.
메모
주의
우리는 고조파와 앨리어싱에 의존하기 때문에 마이크로 컨트롤러에서 방출되는 기본 주파수 구성 요소는 RF 전송이 금지된 RF 스펙트럼 부분에 속하게 됩니다. 출력을 필터링하거나 상당한 양의 RF가 누출될 가능성이 없는 영역에서 테스트를 수행하십시오. 전체 EIRP 출력은 장르적으로 수백 개의 방출 주파수에 걸쳐 분산된 전체 스펙트럼에 걸쳐 300uW이지만 의도적으로 이러한 주파수로 전송하는 장치가 필터링을 하더라도 FCC 파트 15 규정을 통과할 수 있는 방법은 거의 없습니다.
저는 항상 전용 무선 하드웨어가 없는 마이크로컨트롤러에서 무선 신호를 보내고 받는 것에 매료되어 왔습니다. 이 저장소는 예제 코드와 함께 이 디코딩을 수행하기 위해 수행한 많은 프로젝트에 대한 개요 역할을 합니다(일부는 제한적으로 라이센스가 부여되었지만).
일반적으로 저장소는 여러 프로젝트로 분할되지만 장치 유형별로 분류됩니다.
다양한 프로세서를 위한 펌웨어 전용 LoRa 전송. 다양한 일반 저가형 프로세서에서 라디오, 칩, 외부 하드웨어 또는 내장 라디오 없이 LoRa 패킷을 보냅니다. 실제 비트뱅킹은 아니지만 이 저장소는 시프트 레지스터(예: I2S 또는 SPI 포트) 또는 APLL을 사용하여 상용 LoRa 게이트웨이 및 기타 칩으로 디코딩할 수 있는 LoRa 패킷을 보낼 수 있는 방법을 보여줍니다.
이 저장소에서 작동하는 두 가지 주요 모드가 있습니다.
이 페이지의 YouTube 비디오 버전을 보려면 아래를 클릭하세요.
신호 상태가 낮음에서 높음으로 또는 높음에서 낮음으로 변경될 때마다 해당 와이어를 둘러싼 전자기장에 교란이 생성됩니다. 언제든지. 차이점은 엔지니어로서 그것을 두려워하고 뒤뚱뒤뚱하며 EMI가 일으킬 수 있는 모든 것을 두려워할 것입니까, 아니면 황소의 뿔을 잡고 장인이 만든 신호를 방출할 것입니까? 이해해야 할 주요 원칙은 다음과 같습니다.
두 번째 원리는 신호 혼합입니다. 신호를 생성한 다음 이를 고주파수와 "혼합"하면 해당 고주파수를 둘러싼 "이미지"를 얻게 됩니다. 믹싱은 다이오드, 특수 RF 장비를 사용하여 수행할 수 있으며, 시프트 레지스터를 사용하여 비트를 일정한 속도로 출력하는 것과 같은 샘플링만 수행할 수도 있습니다.
이제 이 두 가지 원칙이 실제로 함께 작동한다는 것을 깨달을 때 진정한 마법이 일어납니다. 기본 대역에서 이미지를 얻고, 샘플링 주파수 주변에서 반사된 이미지를 얻은 다음, 샘플링 주파수의 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로 작동합니다. 각 기호/처프는 위상 오프셋으로 비트 수를 나타낼 수 있습니다.
처프의 원시 "단계"는 비트 간의 비트 오류를 프로세스의 상위 계층으로 더 잘 분산시키기 위해 그레이 코딩됩니다. 예를 들어, 처프가 있다고 생각하는 위상과 관련하여 1씩 벗어난 경우 0b1111 및 0b10000의 경계를 넘어 5비트 오류가 발생할 수 있습니다. 그레이 코딩을 통해 하나 또는 몇 개의 위상에서 발생하는 비트 오류를 최소화합니다.
이 원시 비트스트림이 개별 처프에서 디코딩되고 LoRa-SDR-Code.h
에서 그레이 코딩 해제( encodeHamming84sx
참조)된 후 제거될 수 있는 임의의 하나의 기호( diagonalInterleaveSx
참조)가 비트를 대체/인터리브합니다. 하나의 손실된 기호를 복구하고 희화할 수 있도록 모든 오류를 분산시키십시오(나는 이것이 실제로 이 프로토콜에서 쓸모없는 단계라고 생각합니다. 내가 틀렸다면 정정하십시오). Sx1272ComputeWhitening
. 위의 화이트닝은 하위 레이어에서 발생할 수 있는 비트 오류를 수정하는 데 도움이 되는 오류 수정 레이어입니다( encodeFec
참조).
전반적으로 메시지에는 헤더와 페이로드가 있습니다. 헤더가 페이로드와 다른 인코딩 설정을 사용하는 경우가 있기 때문에 이는 약간 까다로울 수 있습니다. 그리고 그게 다입니다.
적절한 형식의 패킷을 생성하면 이를 삐 소리로 인코딩하여 유선으로 전송할 수 있습니다.
프로토콜에 대한 더 자세한 보기는 여기에서 찾을 수 있습니다. 더 학문적인 보기는 여기에서, 더 나은 예는 여기에서 찾을 수 있습니다(두 문서의 정확성/명확성에 대한 몇 가지 문제를 발견했지만).
내부에 내장된 APLL을 사용하여 신호를 출력하고 IOMUX를 통해 APLL/2 클럭을 라우팅할 수 있는지 확인하기 위해 ESP32-S2로 프로젝트를 시작했고 그 대답은 할 수 있다는 것이었습니다. 이는 단순한 구형파를 생성하고 구형파는 스펙트럼 위쪽에 F×3, F×5, F×7 등의 고조파를 가지므로 APLL을 139.06MHz로 설정하면 69.53MHz가 출력됩니다. 13차 고조파는 903.9MHz, 즉 첫 번째 125kHz LoRa 채널입니다. 그런 다음 최하위 PLL 제어 비트를 조정하여 903.9MHz - 62.5kHz에서 903.9 + 62.5kHz로 조정하고, APLL을 139.06MHz - 9.62kHz에서 139.06MHz + 9.62kHz로 조정하여 조정할 수 있습니다. 이를 통해 우리는 특징적인 LoRa 처프를 생성할 수 있으며 실제로 이것이 가능합니다!
ESP32-S2에는 또 다른 트릭이 있습니다. GPIO mux는 신호 또는 해당 신호의 역을 출력할 수 있습니다. 이렇게 하면 139.06MHz 신호를 차등적으로 생성하여 전력 출력을 3dB 높일 수 있습니다!
그러나 ESP32-S2에는 문제가 있습니다. 특히:
게다가 APLL을 탑재한 프로세서도 거의 없기 때문에 이러한 빠른 성공에도 불구하고 저는 다음 단계로 넘어가기로 결정했습니다.
몇 년 전 저는 직접 비트스트림 합성을 사용하여 ESP8266을 사용하여 채널 3에서 RF 컬러 NTSC TV 방송 또는 AM 라디오 전송을 위한 이더넷 패킷 사용과 같은 몇 가지 작업을 수행하는 여러 프로젝트를 수행했습니다. 깔끔한 트릭 중 하나는 SPI 또는 I2S 시프트 레지스터에서 비트스트림을 전송하면 F×3, F×5, F×7 등의 이미지와 함께 샘플 속도에서 앨리어싱이 발생한다는 것입니다. 부분은 스펙트럼의 이미지/별칭에서 전송된 파형의 크기/모양을 유지한다는 것입니다. 채널 3의 경우 65MHz 신호가 40MHz 샘플링 속도 근처에서 반사되었습니다. Harry Nyquist는 레몬을 깨물 수 있습니다.
이 기술은 비직관적으로 매우 열악한 상황에서도 믿을 수 없을 만큼의 충실도를 제공합니다. 예상할 수 있는 외부 어디에서나 놀랍도록 정확한 신호를 생성할 수 있습니다.
이를 수행하는 방법에는 여러 가지가 있지만 일반적으로 시프트 레지스터를 사용하는 것이 가장 쉽습니다. 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와 같은 게이트웨이가 필요합니다. 후자는 전 세계에 수천 개가 설정되어 있고 The Things Network에 연결되어 있기 때문에 여기에서 정말 흥미 롭습니다. 즉, 해당 게이트웨이 중 하나가 들을 수 있는 범위 내에서 올바른 형식의 LoRaWAN 패킷을 전송하면 지구상의 다른 곳에서도 프레임을 얻을 수 있습니다!
설정은 매우 간단합니다. 다음을 수행해야 합니다.
메모
우리는 프레임 카운터를 재설정하는 LoRa 프레임에만 초점을 맞춥니다. 그러나 마지막으로 전송된 패킷 ID를 부품 내의 비휘발성 플래시에 저장할 수 있다면 이 단계를 피할 수 있습니다. 이것이 없으면 장치가 재생 공격을 받을 수 있습니다.
메모
MikroTik LR9를 사용하는 경우 물리적으로 열고 내부 안테나를 연결하십시오. 공장출하시 외부포트에 연결되어 출고됩니다.
이 중 하나라도 알아낼 수 있다면 PR이 열려 있습니다! 나는 여기에 오기 전에 이 프로젝트에 쓸 계획인 모든 시간을 보냈습니다.
특히 LoRa의 경우 파동은 매우 잘 동작하며 타이머 회로를 사용하여 즉석에서 완전히 생성할 수 있어야 하며 사전 계산이 필요하지 않아야 하지만 아직 이에 대해서는 다루지 않았습니다. 이렇게 하면 장치에 플래시되는 울음소리를 위한 큰 테이블이 필요하지 않습니다.
또한 즉석에서 보다 쉽게 생성할 수 있는 맞춤형 비트 패턴을 사용하여 이 프로젝트를 수행해 보고 싶습니다. 또한 사용된 정확한 코드에 따라(아마도 골드 코드 관련 기술을 사용하여) 정확히 동일한 코딩으로 많은 신호를 동시에 수신할 수도 있습니다. 이렇게 하면 매우 낮은 프로세서 공간(및 성능) 오버헤드로 중앙 SDR에서 무선으로 수신할 수 있는 마이크로컨트롤러에 "printf"를 구현하는 것이 매우 적절해집니다.
또한 필터를 추가하거나 부품 없이 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 | 마이크로틱 LR9 | SF8/CR48 | 125 | 다운타운 벨뷰(도시) | 435' 132m | -98 / -9 | 지면 |
2024-02-23 | CH32V203 | 마이크로틱 LR9 | SF10/CR48 | 500 | 다운타운 벨뷰(도시) | 435' 132m | -90 / -18 | 지면 |
2024-02-26 | CH32V203 | TTGO 로라32 | SF8/CR48 | 125 | 미라몬트 파크(Light Suburban + Woods) | >576' >176m | -134 / -12 | 지면 |
2024-02-26 | CH32V203 | TTGO 로라32 | SF8/CR48 | 125 | 푸푸 포인트 트레일 기점(시골) | >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 | Meadowbrook(시골) 빛 강수량 | >4895' >1492m | -130 / -8 | 무인 비행기 |
2024-02-27 | ESP32-S2 + 펀테나 | TTGO 로라32 | SF10/CR48 | 125 | 메도우 브룩(시골) 빛 강수량 | 705' / 215m | -139 / -15 | 무인 비행기 |
2024-02-27 | ESP32-S2 + 비테나 | TTGO 로라32 | SF10/CR48 | 125 | Snoqualmie Trail, Dog Park에서 Ribary Creek까지(시골) 빛 투과 | 8460' / 2580m | -141 / -16 | 무인 비행기 |