Mengirimkan frame LoRa 900MHz secara mengejutkan jauh tanpa radio (Dan kejahatan radio lainnya menggunakan ADC, PWM, dan bus I2S/SPI) termasuk mengirim data RF lainnya, serta menerima sinyal RF (Meskipun memang bukan penerima LoRa).
Jika Anda sedang mencari pembicaraan radio mikrokontroler Hackaday 2024, Anda bisa klik di sini.
Jika Anda mencari Merch LoLRa (Seperti kaos, dll), klik di sini.
Catatan
Peringatan
Karena kami mengandalkan harmonik dan aliasing, komponen frekuensi primer yang dipancarkan mikrokontroler Anda akan berada di bagian spektrum RF di mana transmisi RF dilarang. Harap filter keluaran Anda atau lakukan pengujian di area yang kecil kemungkinannya Anda akan membocorkan RF secara signifikan. Output EIRP keseluruhan umumnya ≪300uW di seluruh spektrum yang tersebar di ratusan frekuensi emisi, namun hampir tidak mungkin perangkat yang dengan sengaja melakukan transmisi pada frekuensi ini dapat melewati kepatuhan FCC bagian 15, bahkan dengan penyaringan.
Saya selalu terpesona dengan pengiriman dan penerimaan sinyal radio dari mikrokontroler yang tidak memiliki perangkat keras radio khusus. Repo ini berfungsi sebagai ikhtisar dari banyak proyek yang telah saya lakukan untuk melakukan decoding ini, bersama dengan kode contoh (Meskipun beberapa di antaranya memiliki lisensi terbatas)
Secara umum repo dibagi menjadi banyak proyek, namun dikategorikan berdasarkan jenis perangkat.
Transmisi LoRa khusus firmware, untuk berbagai prosesor. Kirim paket LoRa, tanpa radio, chip, perangkat keras eksternal, atau radio internal sama sekali pada berbagai prosesor umum dan murah. Meskipun tidak terlalu menarik, repositori ini menunjukkan bagaimana menggunakan register geser (yaitu port I2S atau SPI) atau APLL, Anda dapat mengirim paket LoRa yang dapat didekodekan secara komersial oleh gateway LoRa dan chip lainnya.
Ada dua mode utama yang digunakan oleh repositori ini.
Klik Di Bawah untuk versi Video Youtube halaman ini:
Setiap kali sinyal berubah keadaan dari rendah ke tinggi atau tinggi ke rendah, gangguan terjadi pada medan elektromagnetik di sekitar kabel tersebut. Kapan pun. Perbedaannya adalah, apakah Anda, sebagai seorang insinyur, akan takut terhadapnya, menekannya saat berjalan terhuyung-huyung, takut terhadap EMI apa pun yang mungkin ditimbulkannya, atau apakah Anda akan menangkap tanduk banteng tersebut dan memancarkan sinyal yang dibuat secara artisanal? Prinsip utama yang perlu Anda pahami adalah:
Prinsip kedua adalah pencampuran sinyal. Jika Anda membuat sinyal, lalu "mencampurnya" dengan frekuensi tinggi, Anda mendapatkan "gambar" yang melilit frekuensi tinggi itu. Pencampuran dapat dilakukan dengan dioda, peralatan RF khusus, atau bahkan hanya pengambilan sampel, seperti yang dilakukan dengan menggunakan register geser, menghasilkan bit-bit dengan kecepatan tetap.
Sekarang keajaiban sesungguhnya terjadi, ketika Anda menyadari kedua prinsip ini benar-benar bekerja sama. Anda mendapatkan gambar di pita dasar, gambar yang dipantulkan di sekitar frekuensi pengambilan sampel, lalu di sekitar ×3 frekuensi pengambilan sampel, Anda mendapatkan 2 gambar lagi, maju dan mundur. Dan ×5, dan ×7, dst.
Dengan ini, dengan jam yang cukup tepat, kita dapat menghasilkan frekuensi apa pun yang kita inginkan, asalkan ada cukup bandwidth yang tersisa di GPIO mikro kita untuk menghasilkannya, bahkan jika sinyal "sebenarnya" yang kita hasilkan memiliki frekuensi yang jauh lebih rendah. .
Osilator internal pada mikrokontroler tidak hanya tidak akurat, tetapi frekuensinya juga berubah-ubah. Anda mungkin menganggap ini negatif, namun kenyataannya, menggunakan osilator internal yang terpasang pada mikro sering kali dapat menjadi penyelamat, membuat Anda melampaui EMI/EMC. Karena osilator internal tidak hanya tidak tepat tetapi juga gelisah, mereka mencegah harmonisa frekuensi individu yang lebih tinggi dalam spektrum karena laju jam sangat berubah-ubah.
Keluaran Kristal:
Keluaran RC:
Lihat bagian di bawah untuk mengetahui seluk beluk cara kerja sinyal LoRa atau hal-hal yang tidak pernah ingin diberitahukan oleh PhD lain di internet kepada Anda.
LoRa biasanya beroperasi pada spektrum 433MHz atau 900MHz, biasanya dengan saluran 125kHz. Pada prinsipnya, LoRa menciptakan kicauan, dimulai pada satu frekuensi, 62,5kHz di bawah pusat saluran, kemudian dalam waktu singkat (1,024uS di SF7) nadanya merambat hingga 62,5kHz di atas pusat saluran.
Meskipun LoRa dapat digunakan dengan banyak lebar saluran yang berbeda, 125kHz dan 500kHz keduanya didukung dengan sangat baik, sedangkan lebar saluran lainnya tidak dapat dikonfigurasi dengan router seperti LR9.
Diagram ini menunjukkan frekuensi pada sumbu X, dan waktu pada sumbu Y (atas ke bawah)... Anda dapat melihat:
Mudahnya, jendela untuk kicauan tertentu stabil tergantung pada faktor penyebarannya. Untuk paket di atas, dengan SF7, hasilnya adalah 1.024us per simbol, atau untuk SF8, 2.048us per simbol. Setiap simbol/kicauan dapat mewakili sejumlah bit, dengan offset fase.
"Fase" mentah dari sebuah kicauan diberi kode abu-abu untuk menyebarkan kesalahan bit antar bit dengan lebih baik ke lapisan proses yang lebih tinggi. Misalnya, jika Anda salah satu fase dalam fase yang Anda yakini berada pada kicauan tersebut, mungkin saja kicauannya melewati batas, katakanlah 0b1111 dan 0b10000 dan akan menyebabkan kesalahan 5 bit. Dengan pengkodean abu-abu, ini meminimalkan kesalahan bit yang disebabkan oleh satu atau bahkan beberapa fase.
Setelah bitstream mentah ini didekodekan dari masing-masing kicauan dan menghilangkan kode abu-abu (lihat encodeHamming84sx
) di LoRa-SDR-Code.h
, lalu kami mengubah urutan/menyisipkan bit-bit tersebut sehingga salah satu simbol yang dapat dihilangkan (lihat diagonalInterleaveSx
) menjadi sebarkan kesalahan apa pun sehingga satu simbol yang hilang dapat dipulihkan dan diputihkan (saya yakin ini sebenarnya adalah langkah yang tidak berguna dalam protokol ini, koreksi saya jika saya salah) lihat Sx1272ComputeWhitening
. Pemutihan di atas adalah lapisan koreksi kesalahan untuk membantu memperbaiki kesalahan bit apa pun yang dapat terjadi pada lapisan bawah (lihat encodeFec
).
Secara keseluruhan pesan memiliki header dan payload. Perhatikan bahwa ini bisa sedikit rumit, karena header terkadang menggunakan pengaturan pengkodean yang berbeda dari payload. Dan itu saja.
Setelah Anda membuat paket yang diformat dengan benar, Anda dapat menyandikannya menjadi kicauan dan mengirimkannya melalui kabel.
Tampilan protokol yang lebih rinci dapat ditemukan di sini, untuk pandangan yang lebih akademis dan di sini untuk beberapa contoh yang lebih baik (walaupun saya menemukan beberapa masalah dengan kebenaran/kejelasan kedua dokumen).
Saya memulai proyek dengan ESP32-S2 untuk melihat apakah saya dapat mengeluarkan sinyal menggunakan APLL bawaan internal, dan merutekan jam APLL/2 melalui IOMUX, dan jawabannya adalah saya bisa. Karena ini menghasilkan gelombang persegi sederhana, dan gelombang persegi memiliki harmonik pada F×3, F×5, F×7, dll... pada spektrumnya, jika saya mengatur APLL ke 139,06 MHz, hasilnya adalah 69,53MHz. Harmonik ke-13 adalah 903,9 MHz, atau saluran LoRa 125kHz pertama. Kemudian dengan menala bit kontrol PLL yang paling tidak signifikan, kita dapat menalanya dari 903,9 MHz - 62,5kHz menjadi 903,9 + 62,5kHz, dengan menala APLL menjadi 139,06 MHz - 9,62kHz hingga 139,06 MHz + 9,62 kHz. Hal ini memungkinkan kami menghasilkan kicauan khas LoRa dan memang ini dapat diterima!
ESP32-S2 juga memiliki trik lain - mux GPIO mampu mengeluarkan sinyal atau kebalikan dari sinyal tersebut. Dengan begitu kita dapat membuat sinyal 139,06MHz secara berbeda, meningkatkan output daya sebesar 3dB!
Namun ada masalah dengan ESP32-S2. Khususnya:
Selain itu, sangat sedikit prosesor yang memiliki APLL, jadi meskipun sukses dengan cepat, saya memutuskan untuk beralih ke...
Beberapa tahun yang lalu, saya melakukan sejumlah proyek yang menggunakan sintesis bitstream langsung untuk melakukan beberapa hal, seperti Menyiarkan televisi RF Color NTSC di Saluran 3 dengan ESP8266 atau Menggunakan Paket Ethernet untuk mengirimkan radio AM. Salah satu trik yang menarik adalah, jika Anda mengirimkan bitstream keluar pada register geser SPI atau I2S, hal itu menyebabkan aliasing pada laju sampel, dengan gambar pada F×3, F×5, F×7, dll. bagiannya adalah mempertahankan ukuran/bentuk gelombang yang ditransmisikan pada gambar/alias spektrum. Untuk Saluran 3, sinyal 65MHz dipantulkan di sekitar laju pengambilan sampel 40MHz. Harry Nyquist bisa makan lemon.
Teknik ini memberikan ketelitian yang luar biasa bahkan dalam situasi yang sangat buruk, secara tidak intuitif. Anda dapat menciptakan sinyal yang sangat tepat di luar tempat yang Anda harapkan.
Ada beberapa cara untuk mencapai hal ini, tapi biasanya yang paling mudah adalah dengan register geser. Register geser seperti itu di bus I2S atau SPI. Dan, jika Anda menggunakan DMA, Anda dapat dengan mudah memasukkan register geser dengan lebih banyak data tanpa membangunkan CPU setiap siklusnya. Namun ada cara lain, seperti mengubah IO secara langsung, atau menggunakan pengatur waktu untuk menghidupkan dan mematikan IO pada waktu yang tepat, namun yang paling mudah adalah menulis kode untuk menghasilkan bitstream dan menggesernya keluar.
Untuk register geser, beberapa pertimbangan harus dibuat, seperti memastikan bahwa endianness dan lebar bit serta pengaturan memori sudah benar, namun, secara umum, Anda dapat mengikutinya, dan kecuali ada jeda, seperti waktu antara setiap kata, mereka biasanya mampu mewakili pola bit pada output dengan cukup setia untuk ditransfer dan digeser keluar dari pin.
"Lohrcut" yang dijelaskan dalam video melibatkan penulisan fungsi yang, pada suatu titik waktu, menentukan amplitudo sinyal. Fungsi ini dapat digunakan untuk menentukan amplitudo sinyal frekuensi sangat tinggi, kemudian laju sampel dapat berupa laju sampel apa pun yang dapat direalisasikan secara fisik yang tersedia. Ini akan membuat gambar sinyal frekuensi tinggi pada sinyal frekuensi jauh lebih rendah, sehingga menghasilkan daya antara 0 dan Fs/2.
Kekhawatiran lainnya adalah flash, pada beberapa sistem akses tidak konsisten atau tidak berfungsi dengan baik pada frekuensi tertentu. Dalam kasus tersebut, seperti pada ESP8266, tabel harus dibaca ke dalam RAM dan dimainkan dari sana.
Bingkai LoRa sepenuhnya dienkapsulasi. Jika Anda mau, kita bisa berhenti di sini. Anda bahkan dapat menggunakan gateway komersial, tetapi tanpa menggunakan LoRaWAN, frame tidak dapat dikirim ke broker seperti The Things Network. Misalnya, jika Anda menjalankan gateway raspberry pi, Anda dapat menerima frame LoRa lama apa pun yang Anda inginkan, namun, kami mengambil langkah lebih jauh dengan membantu paket diteruskan ke seluruh dunia. LoRaWAN adalah enkripsi "end to end", di mana tidak ada tetangga atau gateway Anda yang dapat membaca pesan tersebut. Namun, hal ini membuat penasaran - The Things Network DAPAT membaca pesan Anda karena mereka memiliki kunci enkripsi.
Mudahnya, Anda dapat menelepon, GenerateLoRaWANPacket
di lib/lorawan_simple.h
menangani semua enkapsulasi yang diperlukan. Cukup gunakan fungsi ini untuk menghasilkan frame Anda, dan siarkan!
Kami dapat mengirimkan pesan-pesan ini. Dingin. Namun sekarang untuk menerimanya, kita memerlukan perangkat seperti LILYGO® T-Beam Meshtastic atau gateway seperti MikroTik LR9. Yang terakhir ini sangat menarik di sini karena ada ribuan yang didirikan di seluruh dunia, dan terhubung ke The Things Network. Artinya jika kita mengirimkan paket LoRaWAN yang diformat dengan benar dalam jangkauan pendengaran salah satu gateway tersebut, kita bisa mendapatkan frame tersebut di tempat lain di planet ini!
Penyiapannya cukup mudah. Anda perlu:
Catatan
Kami hanya fokus pada frame LoRa yang mengatur ulang penghitung frame, namun, jika Anda dapat menyimpan id paket yang terakhir dikirimkan ke flash non-volatile di bagian Anda, Anda dapat menghindari langkah ini. Tanpa ini, perangkat Anda akan terkena serangan replay.
Catatan
Jika menggunakan MikroTik LR9, pastikan membukanya secara fisik dan mencolokkan antena internal. Dari pabrik, dikirim terhubung ke port luar.
PR terbuka jika Anda bisa mengetahuinya! Saya hanya menghabiskan seluruh waktu yang saya rencanakan untuk proyek ini sebelum saya tiba di sini.
Khususnya untuk LoRa, gelombang berperilaku sangat baik dan harus benar-benar dapat dibuat dengan sirkuit pengatur waktu dengan cepat dan tidak memerlukan perhitungan awal apa pun, tetapi saya belum sempat melakukannya. Hal ini menghilangkan kebutuhan untuk memiliki meja besar untuk memasang kicauan ke dalam perangkat.
Saya juga ingin mencoba menjalankan proyek ini menggunakan pola bit yang dipesan lebih dahulu yang lebih mudah dibuat saat itu juga. Selain itu, tergantung pada kode persis yang digunakan (mungkin dengan menggunakan teknologi yang terkait dengan kode emas), seseorang bahkan dapat menerima banyak sinyal dengan kode yang sama persis secara bersamaan. Melakukan hal ini akan membuatnya cukup tepat untuk menerapkan "printf" pada mikrokontroler yang dapat diterima secara nirkabel oleh SDR pusat dengan overhead ruang prosesor (dan kinerja) yang sangat rendah.
Selain itu, akan menyenangkan untuk menambahkan filter, atau mungkin mencoba membuat filter ke dalam PCB tanpa komponen.
Selain itu, akan sangat keren untuk mencoba membuat amplifier Kelas C untuk sinyal 900MHz. Ini akan sangat keren karena efisien, sangat murah dan sederhana dan juga memberikan penguatan sebanyak 10-20dB!
Pengujian perkotaan dilakukan pada 23-02-2024, pengujian pinggiran kota pada 26-02-2022, dan pengujian pedesaan dilakukan pada 27-02-2022.
Rentang adalah rentang puncak. Operasi yang andal berakhir jauh lebih awal.
Untuk TTGO Lora32, ada tambahan antena +3dBi. Untuk MikroTik LR9 menggunakan antena internal.
Tanggal | Pengirim | Penerima | SF/CR | BW | Catatan | Jangkauan | Rata-rata Akhir RSSI/SNR | Dasar |
---|---|---|---|---|---|---|---|---|
23-02-2024 | CH32V203 | MikroTik LR9 | SF8/CR48 | 125 | Pusat Kota Bellevue (Perkotaan) | 435' 132m | -98 / -9 | Tanah |
23-02-2024 | CH32V203 | MikroTik LR9 | SF10/CR48 | 500 | Pusat Kota Bellevue (Perkotaan) | 435' 132m | -90 / -18 | Tanah |
26-02-2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Miramont Park (Pinggiran Kota Terang + Hutan) | >576' >176m | -134 / -12 | Tanah |
26-02-2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Jalur Poo Poo Point (Pedesaan) | >1117' >340m | -123 / -6 | Tanah |
26-02-2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Pinggiran Kota Issaquah (+Pohon Cahaya) | 2200' 669m | -133 / -10 | Tanah |
27-02-2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antena Merah Panjang Meadowbrook (Pedesaan). | 2220' 677m | -135 / -13 | Dengung |
27-02-2024 | CH32V203 | TTGO Lora32 | SF10/CR48 | 500 | Antena Merah Panjang Meadowbrook (Pedesaan). | 1752' 534m | -132 / -16 | Dengung |
27-02-2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Meadowbrook (Pedesaan) OVERVOLT 5V Antena Merah Lebih Panjang | 3996' 1218m | -131 / -12 | Dengung |
27-02-2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antena Cocok VNA Abu-abu Meadowbrook (Pedesaan). | 2719' 829m | -131 / -11 | Dengung |
27-02-2024 | ESP8266 @ 80MHz | TTGO Lora32 | SF8/CR48 | 125 | Antena Cocok VNA Abu-abu Meadowbrook (Pedesaan). | 2789' 850m | -138 / -13 | Dengung |
27-02-2024 | ESP8266 @ 173MHz | TTGO Lora32 | SF7/CR48 | 125 | Antena Cocok VNA Abu-abu Meadowbrook (Pedesaan). | 2812' 857m | -131 / -8 | Dengung |
27-02-2024 | ESP32-S2 + Bitenna | TTGO Lora32 | SF10/CR48 | 125 | Meadowbrook (Pedesaan) (Catatan 1) | 3428' 1044m | -137 / -13 | Tanah |
27-02-2024 | ESP32-S2 + Bitenna | TTGO Lora32 | SF10/CR48 | 125 | Curah Hujan Ringan Meadowbrook (Pedesaan). | >4895' >1492m | -130 / -8 | Dengung |
27-02-2024 | ESP32-S2 + Antena | TTGO Lora32 | SF10/CR48 | 125 | Curah Hujan Ringan Sungai Padang Rumput (Pedesaan). | 705' / 215m | -139 / -15 | Dengung |
27-02-2024 | ESP32-S2 + Bitenna | TTGO Lora32 | SF10/CR48 | 125 | Snoqualmie Trail, Dog Park hingga Ribary Creek (Pedesaan) Curah Hujan Ringan | 8460' / 2580m | -141 / -16 | Dengung |