- Bahan yang Diperlukan
- Menghubungkan Raspberry Pi dengan LoRa
- Menghubungkan Arduino dengan LoRa
- pyLoRa untuk Raspberry Pi
- Mengkonfigurasi modul Raspberry Pi untuk LoRa
- Pengaturcaraan Raspberry Pi untuk LoRa
- Arduino Code untuk LoRa berkomunikasi dengan Raspberry Pi
- Menguji Komunikasi LoRa antara Raspberry Pi dan Arduino
LoRa semakin popular dengan munculnya IoT, Connected Cars, M2M, Industry 4.0 dll. Kerana kemampuannya untuk berkomunikasi ke jarak jauh dengan kuasa yang sangat sedikit, ia lebih disukai digunakan oleh pereka untuk menghantar / menerima data dari bateri berkuasa. Kami telah membincangkan asas-asas LoRa dan cara menggunakan LoRa dengan Arduino. Walaupun pada awalnya teknologi ini dimaksudkan untuk LoRa Node untuk berkomunikasi dengan gateway LoRa, terdapat banyak senario di mana LoRa Node harus berkomunikasi dengan LoRa Node yang lain untuk bertukar maklumat dalam jarak jauh. Jadi, dalam tutorial ini kita akan belajar bagaimana menggunakan modul LoRa SX1278 dengan Raspberry piuntuk berkomunikasi dengan SX1278 lain yang disambungkan ke mikrokontroler seperti Arduino. Kaedah ini boleh berguna di banyak tempat kerana Arduino boleh bertindak sebagai Pelayan untuk mengambil data dari sensor dan menghantarnya ke Pi dalam jarak jauh melalui LoRa dan kemudian Pi yang bertindak sebagai Pelanggan dapat menerima maklumat ini dan memuat naiknya ke boleh kerana ia mempunyai akses ke internet. Bunyi menarik bukan? Oleh itu, mari kita mulakan.
Bahan yang Diperlukan
- Modul LoRa SX1278 433MHz - 2 Nos
- Antena LoRa 433MHz - 2Nos
- Arduino UNO- atau versi lain
- Raspberry Pi 3
Diandaikan bahawa Raspberry Pi anda sudah dilengkapi dengan sistem operasi dan dapat menyambung ke internet. Sekiranya tidak, ikuti tutorial Bermula dengan Raspberry Pi sebelum meneruskan. Di sini kita menggunakan Rasbian Jessie Raspberry Pi 3 yang dipasang.
Amaran: Sentiasa gunakan modul SX1278 LoRa anda dengan antena 433 MHz; jika tidak, modul itu mungkin rosak.
Menghubungkan Raspberry Pi dengan LoRa
Sebelum masuk ke dalam pakej perisian, mari siapkan perkakasan. The SX1278 adalah 16-pin Lora modul yang berkomunikasi menggunakan SPI pada 3.3V Logik. Raspberry pi juga beroperasi dalam tahap logik 3.3V dan juga mempunyai port SPI terbina dalam dan pengatur 3.3V. Oleh itu, kita boleh menghubungkan modul LoRa secara langsung dengan Raspberry Pi. Jadual sambungan ditunjukkan di bawahPai raspberi | Modul Lora - SX1278 |
3.3V | 3.3V |
Tanah | Tanah |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Dayakan |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Anda juga boleh menggunakan rajah litar di bawah untuk rujukan. Perhatikan bahawa rajah litar dibuat menggunakan modul RFM9x yang sangat mirip dengan modul SX1278, oleh itu penampilan mungkin berbeza pada gambar di bawah.
Sambungannya agak lurus ke depan, satu-satunya masalah yang mungkin anda hadapi ialah SX1278 tidak serasi dengan papan roti, jadi anda harus menggunakan wayar penyambung secara langsung untuk membuat sambungan atau menggunakan dua papan roti kecil seperti yang ditunjukkan di bawah. Tidak banyak orang mencadangkan untuk menghidupkan modul LoRa dengan rel elektrik 3.3V yang berasingan kerana Pi mungkin tidak dapat memperoleh arus yang mencukupi. Walau bagaimanapun Lora sebagai modul kuasa rendah harus berfungsi pada rel 3.3V Pi, saya menguji sama dan mendapati ia berfungsi tanpa masalah. Tetapi, tetap ambil dengan secubit garam. Penyediaan sambungan LoRa saya dengan Raspberry pi kelihatan seperti ini di bawah
Menghubungkan Arduino dengan LoRa
Sambungan untuk modul Arduino tetap sama seperti yang kami gunakan dalam tutorial sebelumnya. Satu-satunya perbezaan adalah daripada menggunakan perpustakaan dari Sandeep Mistry, kita akan menggunakan perpustakaan Rspreal berdasarkan Radio head yang akan kita bincangkan nanti dalam projek ini. Litar diberikan di bawah
Sekali lagi anda boleh menggunakan pin 3.3V di Arduino Uno atau menggunakan pengatur 3.3V yang berasingan. Dalam projek ini saya telah menggunakan pengatur voltan on-board. Jadual sambungan pin diberikan di bawah untuk membantu anda membuat sambungan dengan mudah.
Modul LoRa SX1278 | Lembaga Arduino UNO |
3.3V | 3.3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Oleh kerana modul tidak sesuai dengan papan roti, saya telah menggunakan wayar penyambung secara langsung untuk membuat sambungan. Setelah sambungan dibuat, persediaan Arduino LoRa akan kelihatan seperti ini di bawah
pyLoRa untuk Raspberry Pi
Terdapat banyak pakej python yang boleh anda gunakan dengan LoRa. Juga biasanya Raspberry Pi digunakan sebagai LoRaWAN untuk mendapatkan data dari beberapa nod LoRa. Tetapi, dalam projek ini, tujuan kami adalah untuk melakukan komunikasi Peer to Peer antara dua modul Raspberry Pi atau antara Raspberry Pi dan Arduino. Oleh itu, saya memutuskan untuk menggunakan pakej pyLoRa. Ia mempunyai modul rpsreal LoRa Arduino dan rpsreal LoRa Raspberry pi yang dapat digunakan pada lingkungan Arduino dan Raspberry Pi. Buat masa ini, mari kita fokus pada persekitaran Raspberry Pi.
Mengkonfigurasi modul Raspberry Pi untuk LoRa
Seperti yang diberitahu sebelumnya, modul LoRa berfungsi dengan komunikasi SPI, jadi kita harus mengaktifkan SPI pada Pi dan kemudian memasang pylora package. Ikuti langkah di bawah untuk melakukan perkara yang sama, setelah membuka tetingkap terminal Pi. Sekali lagi, saya menggunakan dempul untuk menyambung ke Pi saya, anda boleh menggunakan kaedah mudah anda.
Langkah 1: Masuk ke tetingkap konfigurasi menggunakan arahan berikut. Untuk mendapatkan tetingkap di bawah
sudo raspi-config
Langkah 2: Navigasikan ke pilihan antara muka dan aktifkan SPI seperti yang ditunjukkan dalam gambar di bawah. Kita harus mengaktifkan antara muka SPI kerana ketika kita membincangkan LCD dan PI berkomunikasi melalui protokol SPI
Langkah 3: Simpan perubahan dan kembali ke tetingkap terminal. Pastikan pip dan python dikemas kini dan kemudian pasang pakej RPi.GPIO menggunakan arahan berikut.
memasang pip RPi.GPIO
Kelas pakej ini akan membantu kami mengawal pin GPIO pada Pi. Sekiranya berjaya dipasang, skrin anda akan kelihatan seperti ini
Langkah 4: Begitu juga dengan memasang pakej spidev menggunakan arahan berikut. Spidev adalah pengikat python untuk Linux yang dapat digunakan untuk melakukan komunikasi SPI pada Raspberry Pi.
memasang pip spidev
Sekiranya pemasangan berjaya, terminal akan kelihatan seperti ini di bawah.
Langkah 5: Seterusnya mari pasang pakej pyLoRa menggunakan arahan pip berikut. Pakej ini memasang model Radio yang berkaitan dengan LoRa.
memasang pip pyLoRa
Sekiranya pemasangan berjaya, anda akan melihat skrin berikut.
Pakej PyLoRa juga menyokong komunikasi terenkripsi yang dapat digunakan dengan Arduino dan Raspberry Pi dengan lancar. Ini akan meningkatkan keselamatan data dalam komunikasi anda. Tetapi anda harus memasang pakej berasingan setelah langkah ini yang saya tidak lakukan kerana penyulitan tidak termasuk dalam skop tutorial ini. Anda boleh mengikuti pautan github di atas untuk maklumat lebih lanjut.
Setelah itu, langkah ini anda dapat menambahkan maklumat jalur pakej ke pi dan mencuba dengan program python yang diberikan pada akhir. Tetapi saya tidak dapat menambah jalan dengan jayanya dan oleh itu saya perlu memuat turun perpustakaan secara manual dan menggunakan yang sama secara langsung untuk program saya. Oleh itu, saya harus meneruskan langkah-langkah berikut
Langkah 6: Muat turun dan pasang pakej python-rpi.gpio dan spidev menggunakan arahan di bawah.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Tetingkap terminal harus memaparkan sesuatu seperti ini selepas kedua-dua pemasangan.
Langkah 7: Pasang juga git dan kemudian gunakan untuk mengklon direktori python untuk Raspberry Pi kami. Anda boleh melakukannya dengan menggunakan arahan berikut.
sudo apt-get install git sudo git clone
Setelah langkah ini selesai, anda harus mencari sub direktori SX127x dalam folder utama Raspberry Pi. Ini akan mempunyai semua fail yang diperlukan yang berkaitan dengan perpustakaan.
Pengaturcaraan Raspberry Pi untuk LoRa
Dalam komunikasi LoRa peer to peer modul yang menghantar maklumat disebut pelayan dan modul yang menerima maklumat tersebut disebut klien. Dalam kebanyakan kes, Arduino akan digunakan di lapangan dengan sensor untuk mengukur data dan Pi akan digunakan untuk menerima data ini. Oleh itu, saya memutuskan untuk menggunakan Raspberry Pi sebagai pelanggan dan Arduino sebagai pelayan dalam tutorial ini. The program pelanggan Raspberry Pi lengkap boleh didapati di bahagian bawah halaman ini. Di sini saya akan cuba menerangkan garis-garis penting dalam program ini.
Perhatian: Pastikan fail program berada di direktori yang sama dengan folder perpustakaan SX127x. Anda boleh menyalin folder ini dan menggunakannya di mana sahaja jika anda ingin memindahkan projek.
Programnya cukup mudah kita harus menetapkan modul LoRa untuk berfungsi dalam 433Mhz dan kemudian mendengar paket masuk. Sekiranya kami menerima apa-apa, kami mudah mencetaknya di konsol. Seperti biasa kita memulakan program dengan mengimport perpustakaan python yang diperlukan.
dari masa tidur import dari SX127x.LoRa import * dari SX127x.board_config import BOARD BOARD.setup ()
Dalam hal ini paket waktu digunakan untuk membuat penundaan, paket Lora digunakan untuk komunikasi LoRa dan board_config digunakan untuk mengatur parameter papan dan LoRa. Kami juga menyiapkan papan menggunakan fungsi BOARD.setup () .
Seterusnya kami membuat kelas python LoRa dengan tiga definisi. Oleh kerana kami hanya membuat program berfungsi sebagai klien raspberry, kelas hanya mempunyai tiga fungsi iaitu kelas init, kelas permulaan dan kelas on_rx_done . Kelas init memulakan modul LoRa dalam 433MHz dengan lebar jalur 125kHz seperti yang ditetapkan dalam kaedah set_pa_config . Kemudian ia juga meletakkan modul dalam mod tidur untuk menjimatkan penggunaan tenaga.
# Julat Medium Lalai selepas init adalah 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips / simbol, CRC pada 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (diri, verbose = Salah): super (LoRaRcvCont, self).__ init __ (verbose) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Fungsi permulaan adalah di mana kita mengkonfigurasi modul sebagai penerima dan memperoleh seperti RSSI (Penerima kekuatan isyarat isyarat), status, frekuensi operasi dll. Kami menetapkan modul untuk berfungsi dalam mod penerima berterusan (RXCONT) dari mod tidur dan kemudian menggunakan gelung sementara untuk membaca nilai seperti RSSI dan status modem. Kami juga mengalirkan data dalam penyangga bersiri ke terminal.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Akhirnya fungsi on_rx_done dilaksanakan setelah paket masuk dibaca. Dalam fungsi ini nilai yang diterima dipindahkan ke variabel yang disebut muatan dari penyangga Rx setelah menetapkan bendera penerimaan tinggi. Kemudian nilai yang diterima disahkod dengan utf-8 untuk mencetak data yang dapat dibaca pengguna pada shell. Kami juga mengembalikan modul ke mod tidur sehingga nilai lain diterima.
def on_rx_done (self): print ("\ nDiterima:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (payload).decode ("utf-8", 'abaikan'))) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Bahagian program yang tinggal hanyalah untuk mencetak nilai yang diterima di konsol dan menghentikan program menggunakan gangguan papan kekunci. Kami sekali lagi mengatur papan dalam mod tidur walaupun selepas penamatan program untuk menjimatkan kuasa.
cuba: lora.start () kecuali KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") akhirnya: sys.stdout.flush () cetak ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Arduino Code untuk LoRa berkomunikasi dengan Raspberry Pi
Seperti yang saya nyatakan sebelumnya, kod rpsreal menyokong Arduino dan Pi dan oleh itu komunikasi antara Arduino dan Pi adalah mungkin. Ia berfungsi berdasarkan Radiohead Library dari AirSpayce's. Oleh itu, anda mesti memasang perpustakaan kepala radio terlebih dahulu ke Arduino IDE anda.
Untuk melakukan itu, lawati halaman Github dan muat turun perpustakaan dalam folder ZIP. Kemudian letakkan di folder perpustakaan Arduino IDE anda. Sekarang, mulakan semula Arduino IDE dan anda akan menemui contoh fail untuk pustaka kepala Radio. Di sini kita akan memprogram Arduino untuk berfungsi sebagai pelayan LoRa untuk menghantar paket ujian seperti 0 hingga 9. Kod lengkap untuk melakukan perkara yang sama boleh didapati di bahagian bawah halaman ini seperti biasa. Di sini, saya akan menerangkan beberapa baris penting dalam program ini.
Kami memulakan program dengan mengimport perpustakaan SPI (dipasang secara lalai) untuk menggunakan protokol SPI dan kemudian perpustakaan RH_RF95 dari kepala Radio untuk melakukan komunikasi LoRa. Kemudian kami menentukan pin Arduino mana yang telah kami hubungkan dengan pin Chip select (CS), Reset (RST) dan Interrupt (INT) LoRa dengan Arduino. Akhirnya kami juga menentukan bahawa modul harus berfungsi dalam Frekuensi 434MHz dan memulakan modul LoRa.
#sertakan
Di dalam fungsi persediaan, kita akan menetapkan semula modul LoRa dengan menarik pin set semula ke rendah selama 10 mili saat untuk mula segar. Kemudian kami memulakannya dengan modul yang kami buat lebih awal menggunakan pustaka Kepala radio. Kemudian, kami menetapkan frekuensi dan kuasa penghantaran untuk pelayan LoRa. Semakin tinggi penghantaran, jarak perjalanan paket anda akan tetapi akan menggunakan lebih banyak tenaga.
batal persediaan () { // Permulaan Serial Monitor Serial.begin (9600); // Tetapkan semula Modul LoRa pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, RENDAH); kelewatan (10); digitalWrite (RFM95_RST, TINGGI); kelewatan (10); // Memulakan Modul LoRa sementara (! Rf95.init ()) { Serial.println ("Init radio LoRa gagal"); sementara (1); } // Tetapkan frekuensi lalai 434.0MHz jika (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency gagal"); sementara (1); } rf95.setTxPower (18); // Kekuatan penghantaran Modul Lora }
Di dalam fungsi gelung tak terhingga, kita hanya perlu menghantar paket data melalui modul LoRa. Data ini boleh menjadi seperti nilai sensor arahan pengguna. Tetapi untuk kesederhanaan kami akan menghantar nilai char 0 hingga 9 untuk setiap selang 1 saat dan kemudian menginisialisasi nilai kembali ke 0 setelah mencapai 9. Perhatikan bahawa nilainya hanya dapat dikirim dalam format array char dan jenis data harus unit8_t itu adalah 1 bait pada satu masa. Kod untuk melakukan perkara yang sama ditunjukkan di bawah
gelung kosong () { Serial.print ("Kirim:"); char radiopacket = char (nilai)}; rf95.send ((uint8_t *) radiopacket, 1); kelewatan (1000); nilai ++; jika (nilai> '9') nilai = 48; }
Menguji Komunikasi LoRa antara Raspberry Pi dan Arduino
Sekarang, setelah kami menyiapkan perkakasan dan program kami, kami hanya perlu memuat naik kod Arduino ke papan UNO dan lakaran python harus dilancarkan pada pi. Persediaan ujian saya dengan kedua-dua perkakasan tersambung, kelihatan seperti ini di bawah
Setelah lakaran pelanggan python dilancarkan pada Pi (gunakan python 3 sahaja), jika semuanya berfungsi dengan baik, anda harus melihat paket Arduino diterima dalam pi melalui jendela shell. Anda harus melihat "Diterima: 0" hingga 9 seperti yang ditunjukkan dalam gambar di bawah.
Kod pi Raspberry lengkap dengan semua perpustakaan yang diperlukan boleh dimuat turun dari sini.
Anda kini boleh memindahkan pelayan Arduino dan memeriksa julat modul; juga mungkin untuk memaparkan nilai RSSI pada shell jika diperlukan. Kerja- kerja lengkap projek boleh didapati dalam video yang dipautkan di bawah. Sekarang, setelah kita mengetahui bagaimana mewujudkan komunikasi LoRa daya rendah jarak jauh antara Arduino dan Raspberry pi, kita dapat terus menambahkan sensor di sisi Arduino dan platform awan di sisi Pi untuk membuat pakej IoT lengkap.
Harap anda memahami projek ini dan seronok membinanya. Sekiranya anda menghadapi masalah untuk membuatnya berfungsi, gunakan bahagian komen di bawah atau forum untuk pertanyaan teknikal lain.