他の RF データの送信や RF 信号の受信 (明らかに LoRa 受信機ではありませんが) を含め、無線 (および ADC、PWM、I2S/SPI バスを使用したその他の無線不正行為) なしで 900 MHz LoRa フレームを驚くほど遠くまで送信します。
Hackaday 2024 のマイクロコントローラーに関するラジオ トークをお探しの場合は、ここをクリックしてください。
LoLRa グッズ (T シャツなど) をお探しの方は、ここをクリックしてください。
注記
注意
高調波とエイリアシングに依存しているため、マイクロコントローラーが発する主な周波数成分は、RF 送信が禁止されている RF スペクトルの部分に含まれることになります。出力をフィルタリングするか、重大な RF が漏れる可能性が低い領域でテストを実行してください。全体的な EIRP 出力は、数百の放射周波数に広がるスペクトル全体でジャンル的には ≪300uW です。しかし、これらの周波数で意図的に送信するデバイスが、フィルタリングを行ったとしても FCC パート 15 準拠をパスすることは事実上不可能です。
私は、専用の無線ハードウェアを持たないマイクロコントローラーから無線信号を送受信することに常に魅了されてきました。このリポジトリは、このデコードを行うために私が行った多くのプロジェクトの概要と、コード例を示しています (ただし、一部のライセンスは制限付きです)。
一般に、リポジトリは多くのプロジェクトに分割されていますが、デバイスの種類ごとに分類されています。
さまざまなプロセッサー向けのファームウェアのみの LoRa 送信。無線、チップ、外部ハードウェア、内蔵無線を一切使用せずに、一般的な安価なさまざまなプロセッサ上で LoRa パケットを送信します。真のビットバンギングではありませんが、このリポジトリは、シフト レジスタ (I2S または SPI ポート) または APLL のいずれかを使用して、市販の既製 LoRa ゲートウェイやその他のチップでデコードできる LoRa パケットを送信できる方法を示しています。
このリポジトリが動作する主なモードは 2 つあります。
このページの Youtube ビデオ バージョンについては、以下をクリックしてください。
信号の状態がローからハイ、またはハイからローに変化するたびに、そのワイヤの周囲の電磁場に外乱が発生します。いつでも。違いは、あなたがエンジニアとして、それを恐れ、ヨチヨチ歩きながら牛を押しのけ、それが引き起こす可能性のあるEMIを恐れるつもりなのか、それとも雄牛の角を掴んで職人が作った信号を発するつもりなのか、ということです。理解する必要がある主な原則は次のとおりです。
2 番目の原理は信号の混合です。信号を作成し、それを高周波と「ミックス」すると、その高周波に包まれた「イメージ」が得られます。ミキシングは、ダイオード、特殊な RF 機器を使用して行うことも、シフト レジスタを使用して安定したレートでビットを出力することによって行われるような、単なるサンプリングでも行うことができます。
これら 2 つの原則が実際に連携して機能することがわかると、本当の魔法が起こります。ベースバンドでの画像、サンプリング周波数付近の反射画像、次にサンプリング周波数の約 3 倍で、さらに順方向と逆方向の 2 つの画像が得られます。そして×5、×7など。
これにより、十分に正確なクロックがあれば、生成する「実際の」信号の周波数がはるかに低い場合でも、マイクロの GPIO にそれを生成するのに十分な帯域幅が残っている限り、任意の周波数を任意に生成できます。 。
マイクロコントローラーの内部発振器は不正確であるだけでなく、周波数もジッターします。これはマイナスなことだと思われるかもしれませんが、実際には、マイクロチップに組み込まれた内部発振器を使用すると、EMI/EMC を回避できる救世主となることがよくあります。内部発振器は不正確なだけでなくジッターが多く、クロックレートの変動が激しいため、スペクトルの上位にある個々の周波数の高調波を防ぎます。
クリスタル出力:
RC出力:
LoRa 信号が実際にどのように機能するか、またはインターネット上の他の博士号がこれまで誰も教えてくれなかった内容については、以下のセクションを参照してください。
LoRa は通常、433MHz または 900MHz スペクトルで動作し、通常は 125kHz チャネルを使用します。原則として、LoRa は、チャネル中心から 62.5kHz 下の 1 つの周波数からチャープを作成し、その後短期間 (SF7 で 1.024uS) でトーンがチャネル中心から 62.5kHz 上まで徐々に上昇します。
LoRa はさまざまなチャネル幅で使用できますが、125kHz と 500kHz は両方とも非常によくサポートされていますが、他のチャネル幅は LR9 などのルーターでは構成できません。
この図は、X 軸に周波数、Y 軸 (上から下) に時間を示しています。次のことがわかります。
都合の良いことに、特定のチャープのウィンドウは拡散率に応じて安定します。上記のパケットの場合、SF7 ではシンボルあたり 1,024us、SF8 ではシンボルあたり 2,048us になります。各シンボル/チャープは、位相オフセットによってビット数を表すことができます。
チャープの生の「位相」は、ビット間のビット エラーをプロセスの上位層にうまく分散させるためにグレー コード化されます。たとえば、チャープがあると考えられる位相が 1 つずれている場合、それは、たとえば 0b1111 と 0b10000 の境界を超えている可能性があり、5 ビット エラーが発生します。グレーコーディングすることで、1 つずつ、またはいくつかの位相のずれによって生じるビット エラーを最小限に抑えます。
この生のビットストリームが個々のチャープからデコードされ、 LoRa-SDR-Code.h
で逆グレーコーディング ( encodeHamming84sx
を参照) された後、ビットを転置/インターリーブして、取り出される可能性のある任意の 1 つのシンボル ( diagonalInterleaveSx
を参照) を単一の失われたシンボルを回復して白色化できるように、エラーを分散します (これは、このプロトコルでは実際には価値のないステップだと思います。間違っていたら訂正してください)間違っています) Sx1272ComputeWhitening
参照してください。ホワイトニングの上にあるのは、下位層で発生する可能性のあるビット エラーの修正に役立つエラー修正層です ( encodeFec
参照)。
全体として、メッセージにはヘッダーとペイロードがあります。ヘッダーではペイロードとは異なるエンコード設定が使用される場合があるため、これは少し難しい場合があることに注意してください。それで終わりです。
適切にフォーマットされたパケットを生成したら、それをチャープにエンコードしてネットワークに送信できます。
プロトコルのより詳細なビューは、より学術的な見解についてはここで、いくつかのより良い例についてはここで見つけることができます(ただし、両方の文書の正確性/明確さに関していくつかの問題が見つかりました)。
ESP32-S2 でプロジェクトを開始し、内部の内蔵 APLL を使用して信号を出力し、APLL/2 クロックを IOMUX 経由でルーティングできるかどうかを確認しました。その答えは、できるということでした。これにより単純な方形波が生成され、方形波にはスペクトルの F×3、F×5、F×7 などに高調波が含まれるため、APLL を 139.06 MHz に設定すると、69.53 MHz が出力されます。 13 次高調波は 903.9 MHz、つまり最初の 125kHz LoRa チャネルです。次に、最下位の PLL 制御ビットを調整することで、APLL を 139.06 MHz - 9.62kHz ~ 139.06 MHz + 9.62 kHz に調整することで、903.9 MHz - 62.5kHz から 903.9 + 62.5kHz に調整できます。これにより、LoRa 特有のチャープ音を生成できるようになり、実際に受信可能です。
ESP32-S2 には別のトリックもあります。GPIO マルチプレクサは信号またはその信号の反転を出力できます。そうすることで、139.06MHz 信号を差動で作成し、出力電力を 3dB 高めることができます。
ただし、ESP32-S2 には問題があります。特に次の点に注意してください。
さらに、APLL を備えているプロセッサーもほとんどないため、この急速な成功にも関わらず、次のステップに進むことにしました。
数年前、私は直接ビットストリーム合成を使用して、ESP8266 を使用してチャネル 3 で RF カラー NTSC テレビを放送したり、イーサネット パケットを使用して AM ラジオを送信したりするなど、いくつかのプロジェクトを実行しました。巧妙なトリックの 1 つは、SPI または I2S シフト レジスタでビットストリームを送信すると、F×3、F×5、F×7 などのイメージでサンプル レートでエイリアシングが発生することです。一部は、スペクトルのイメージ/エイリアスで送信された波形のサイズ/形状を保存することです。チャンネル 3 では、65MHz 信号が 40MHz サンプリング レート付近で反射されていました。ハリー・ナイキストはレモンをかじってもいいよ。
このテクニックは、直感的にはわかりませんが、非常に劣悪な状況でも信じられないほどの忠実度を実現します。予想外のどこにいても、驚くほど正確な信号を作成できます。
これを実現するにはいくつかの方法がありますが、通常はシフト レジスタを使用するのが最も簡単です。 I2S または SPI バスのようなシフト レジスタ。また、DMA を使用すると、サイクルごとに CPU をウェイクアップすることなく、より多くのデータをシフト レジスタに簡単に供給できます。ただし、IO を直接切り替える方法や、タイマーを使用して適切なタイミングで IO をオンまたはオフにする方法など、他の方法もありますが、ビットストリームを生成してシフトアウトするコードを作成するのが最も簡単です。
シフト レジスタの場合、エンディアン、ビット幅、メモリの配置が正しいかどうかを確認するなど、いくつかの考慮事項を行う必要がありますが、一般的には、各ワード間の時間などの遅れがない限り、維持することができます。通常、転送されピンからシフトアウトされる出力上のビット パターンを十分に忠実に表現できます。
ビデオで説明されている「lohrcut」では、特定の時点で信号の振幅を決定する関数を作成します。この機能は、非常に高い周波数信号の振幅を決定するものであり、サンプル レートは物理的に実現可能な利用可能なサンプル レートであれば何でも構いません。これにより、高周波信号のイメージがはるかに低い周波数信号で作成され、0 ~ Fs/2 のパワーから構築されます。
もう 1 つの懸念はフラッシュです。一部のシステムでは、アクセスが一貫性を持たなかったり、特定の周波数でうまく動作しなかったりします。 ESP8266 の場合と同様、そのような場合は、テーブルを RAM に読み込んで、そこから再生する必要があります。
LoRa フレームは完全にカプセル化されています。もしよかったら、ここで止まってもいいよ。商用ゲートウェイを使用することもできますが、LoRaWAN を使用しないと、The Things Network などのブローカーにフレームを送信できません。たとえば、Raspberry pi ゲートウェイを実行している場合は、必要な古い LoRa フレームをそのまま受け入れることができますが、パケットが世界中に転送されるようにすることで、これをさらに一歩進めました。 LoRaWAN は「エンドツーエンド」暗号化であり、隣接するゲートウェイやゲートウェイのいずれもメッセージを読み取ることができません。ただし、興味深いことに、Things Network は暗号化キーを持っているため、メッセージを読み取ることができます。
便利なことに、 lib/lorawan_simple.h
のGenerateLoRaWANPacket
を呼び出すと、必要なカプセル化がすべて処理されます。この関数を使用してフレームを生成し、ブロードキャストするだけです。
私たちはこれらのメッセージを伝えることができます。いいね。しかし、これらを受信するには、LILYGO® T-Beam Meshtastic などのデバイスか、MikroTik LR9 などのゲートウェイが必要になります。後者は、世界中に何千ものこれらが設置され、The Things Network に接続されているため、非常に興味深いものです。つまり、これらのゲートウェイの 1 つから聞こえる範囲内で適切にフォーマットされた 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 | BW | 注記 | 範囲 | 平均終了 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 | ミラモント パーク (明るい郊外 + 森) | >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 | メドーブルック (田舎) 赤い長いアンテナ | 2220' 677m | -135 / -13 | ドローン |
2024-02-27 | CH32V203 | TTGO ローラ 32 | SF10/CR48 | 500 | メドーブルック (田舎) 赤い長いアンテナ | 1752' 534m | -132 / -16 | ドローン |
2024-02-27 | CH32V203 | TTGO ローラ 32 | SF8/CR48 | 125 | メドーブルック (田舎) OVERVOLT 5V 赤の長いアンテナ | 3996' 1218m | -131 / -12 | ドローン |
2024-02-27 | CH32V203 | TTGO ローラ 32 | SF8/CR48 | 125 | メドーブルック (田舎) グレー VNA 整合アンテナ | 2719' 829m | -131 / -11 | ドローン |
2024-02-27 | ESP8266 @ 80MHz | TTGO ローラ 32 | SF8/CR48 | 125 | メドーブルック (田舎) グレー VNA 整合アンテナ | 2789' 850m | -138 / -13 | ドローン |
2024-02-27 | ESP8266 @ 173MHz | TTGO ローラ 32 | SF7/CR48 | 125 | メドーブルック (田舎) グレー VNA 整合アンテナ | 2812' 857m | -131 / -8 | ドローン |
2024-02-27 | ESP32-S2 + バイテナ | TTGO ローラ 32 | SF10/CR48 | 125 | メドーブルック(地方)(注1) | 3428' 1044m | -137 / -13 | 地面 |
2024-02-27 | ESP32-S2 + バイテナ | TTGO ローラ 32 | SF10/CR48 | 125 | メドーブルック (地方) 小降水量 | >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 | スノコルミー トレイル、ドッグ パークからリブリー クリーク (田園地帯) までの少雨 | 8460' / 2580m | -141 / -16 | ドローン |