- Vật liệu thiết yếu
- Kết nối Raspberry Pi với LoRa
- Kết nối Arduino với LoRa
- pyLoRa dành cho Raspberry Pi
- Định cấu hình Raspberry Pi cho mô-đun LoRa
- Lập trình Raspberry Pi cho LoRa
- Mã Arduino cho LoRa để giao tiếp với Raspberry Pi
- Kiểm tra giao tiếp LoRa giữa Raspberry Pi và Arduino
LoRa ngày càng trở nên phổ biến với sự ra đời của IoT, Ô tô được kết nối, M2M, Công nghiệp 4.0, v.v. Do khả năng giao tiếp với khoảng cách xa với rất ít năng lượng, nó được các nhà thiết kế ưu tiên sử dụng để gửi / nhận dữ liệu từ Thing chạy bằng pin. Chúng ta đã thảo luận về những điều cơ bản về LoRa và cách sử dụng LoRa với Arduino. Mặc dù công nghệ này ban đầu được thiết kế để một LoRa Node giao tiếp với một cổng LoRa, nhưng có nhiều trường hợp trong đó một LoRa Node phải giao tiếp với một LoRa Node khác để trao đổi thông tin trong khoảng cách xa. Vì vậy, trong hướng dẫn này, chúng ta sẽ học cách sử dụng mô-đun LoRa SX1278 với Raspberry piđể giao tiếp với SX1278 khác được kết nối với vi điều khiển như Arduino. Phương pháp này có thể hữu ích ở nhiều nơi vì Arduino có thể hoạt động như một Máy chủ để lấy dữ liệu từ các cảm biến và gửi nó đến Pi trong một khoảng cách dài thông qua LoRa và sau đó Pi hoạt động như một Máy khách có thể nhận những thông tin này và tải nó lên có thể vì nó có quyền truy cập vào internet. Nghe thật thú vị phải không? Vậy hãy bắt đầu.
Vật liệu thiết yếu
- Mô-đun LoRa SX1278 433MHz - 2 Nos
- Anten LoRa 433MHz - 2Nos
- Arduino UNO- hoặc phiên bản khác
- Raspberry Pi 3
Giả định rằng Raspberry Pi của bạn đã được cài sẵn hệ điều hành và có thể kết nối với internet. Nếu không, hãy làm theo hướng dẫn Bắt đầu với Raspberry Pi trước khi tiếp tục. Ở đây chúng tôi đang sử dụng Rasbian Jessie đã cài đặt Raspberry Pi 3.
Cảnh báo: Luôn sử dụng mô-đun SX1278 LoRa của bạn với ăng-ten 433 MHz; nếu không mô-đun có thể bị hỏng.
Kết nối Raspberry Pi với LoRa
Trước khi chúng ta đi vào các gói phần mềm, hãy chuẩn bị sẵn sàng phần cứng. Các SX1278 là một 16-pin Lora mô-đun giao tiếp sử dụng SPI trên 3.3V logic. Raspberry pi cũng hoạt động ở mức logic 3.3V và cũng có cổng SPI tích hợp và bộ điều chỉnh 3.3V. Vì vậy, chúng tôi có thể kết nối trực tiếp mô-đun LoRa với Raspberry Pi. Bảng kết nối được hiển thị bên dướiRaspberry Pi | Lora - Mô-đun SX1278 |
3,3V | 3,3V |
Đất | Đất |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Enable |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Bạn cũng có thể sử dụng sơ đồ mạch bên dưới để tham khảo. Lưu ý rằng sơ đồ mạch được tạo bằng mô-đun RFM9x rất giống với mô-đun SX1278, do đó hình ảnh bên dưới có thể khác.
Các kết nối khá đơn giản, vấn đề duy nhất bạn có thể gặp phải là SX1278 không tương thích với breadboard, do đó bạn phải sử dụng dây kết nối trực tiếp để tạo kết nối hoặc sử dụng hai breadboard nhỏ như hình dưới đây. Ngoài ra, một số người đề xuất cấp nguồn cho mô-đun LoRa bằng đường ray điện 3,3V riêng biệt vì Pi có thể không đủ nguồn dòng điện. Tuy nhiên Lora là một mô-đun công suất thấp nên hoạt động trên đường ray 3.3V của Pi, tôi đã thử nghiệm tương tự và thấy nó hoạt động mà không có vấn đề gì. Nhưng, vẫn phải chấm với một chút muối. Thiết lập kết nối LoRa của tôi với Raspberry pi trông giống như sau
Kết nối Arduino với LoRa
Kết nối cho mô-đun Arduino vẫn giống như kết nối mà chúng tôi đã sử dụng trong hướng dẫn trước. Sự khác biệt duy nhất sẽ là thay vì sử dụng thư viện từ Sandeep Mistry, chúng ta sẽ sử dụng thư viện Rspreal dựa trên Radio head mà chúng ta sẽ thảo luận sau trong dự án này. Mạch được đưa ra bên dưới
Một lần nữa, bạn có thể sử dụng chân 3.3V trên Arduino Uno hoặc sử dụng bộ điều chỉnh 3.3V riêng biệt. Trong dự án này, tôi đã sử dụng bộ điều chỉnh điện áp trên bo mạch. Bảng kết nối pin được cung cấp bên dưới để giúp bạn thực hiện kết nối dễ dàng.
Mô-đun LoRa SX1278 | Bảng Arduino UNO |
3,3V | 3,3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Vì mô-đun không vừa với bảng mạch nên tôi đã sử dụng dây kết nối trực tiếp để tạo kết nối. Sau khi kết nối được thực hiện, thiết lập Arduino LoRa sẽ trông giống như sau
pyLoRa dành cho Raspberry Pi
Có nhiều gói python mà bạn có thể sử dụng với LoRa. Cũng thường Raspberry Pi được sử dụng làm LoRaWAN để lấy dữ liệu từ nhiều nút LoRa. Tuy nhiên, trong dự án này, mục đích của chúng tôi là thực hiện giao tiếp ngang hàng giữa hai mô-đun Raspberry Pi hoặc giữa Raspberry Pi và Arduino. Vì vậy, tôi quyết định sử dụng gói pyLoRa. Nó có mô-đun rpsreal LoRa Arduino và rpsreal LoRa Raspberry pi có thể được sử dụng trên Arduino và môi trường Raspberry Pi. Hiện tại, hãy tập trung vào môi trường Raspberry Pi.
Định cấu hình Raspberry Pi cho mô-đun LoRa
Như đã nói trước đó, mô-đun LoRa hoạt động với giao tiếp SPI, vì vậy chúng ta phải kích hoạt SPI trên Pi và sau đó cài đặt gói pylora . Làm theo các bước dưới đây để thực hiện tương tự, sau khi mở cửa sổ đầu cuối của Pi. Một lần nữa, tôi đang sử dụng putty để kết nối với Pi của tôi, bạn có thể sử dụng phương pháp thuận tiện của mình.
Bước 1: Vào cửa sổ cấu hình bằng lệnh sau. Để có được cửa sổ bên dưới
sudo raspi-config
Bước 2: Điều hướng đến tùy chọn giao diện và bật SPI như thể hiện trong hình dưới đây. Chúng ta phải kích hoạt giao diện SPI vì như chúng ta đã thảo luận, LCD và PI giao tiếp thông qua giao thức SPI
Bước 3: Lưu các thay đổi và quay lại cửa sổ dòng lệnh. Đảm bảo rằng pip và python được cập nhật và sau đó cài đặt gói RPi.GPIO bằng lệnh sau.
pip cài đặt RPi.GPIO
Lớp gói này sẽ giúp chúng ta kiểm soát chân GPIO trên Pi. Nếu cài đặt thành công, màn hình của bạn sẽ như thế này
Bước 4: Tương tự tiến hành cài đặt gói spidev bằng lệnh sau. Spidev là một liên kết python dành cho Linux có thể được sử dụng để thực hiện giao tiếp SPI trên Raspberry Pi.
pip cài đặt spidev
Nếu quá trình cài đặt thành công, thiết bị đầu cuối sẽ trông giống như sau.
Bước 5: Tiếp theo cho phép cài đặt gói pyLoRa bằng lệnh pip sau. Gói này cài đặt các mô hình Radio được liên kết với LoRa.
pip cài đặt pyLoRa
Nếu cài đặt thành công, bạn sẽ thấy màn hình sau.
Gói PyLoRa cũng hỗ trợ giao tiếp được mã hóa có thể được sử dụng liền mạch với Arduino và Raspberry Pi. Điều này sẽ cải thiện bảo mật dữ liệu trong giao tiếp của bạn. Nhưng bạn phải cài đặt gói riêng biệt sau bước này mà tôi không thực hiện vì mã hóa không nằm trong phạm vi của hướng dẫn này. Bạn có thể theo các liên kết github ở trên để biết thêm chi tiết.
Sau bước này, bạn có thể thêm thông tin đường dẫn gói vào pi và thử với chương trình python được đưa ra ở cuối. Nhưng tôi không thể thêm đường dẫn thành công và do đó phải tải xuống thư viện theo cách thủ công và sử dụng trực tiếp cùng một cho các chương trình của tôi. Vì vậy, tôi phải tiến hành các bước sau
Bước 6: Tải xuống và cài đặt gói python-rpi.gpio và gói spidev bằng lệnh dưới đây.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Cửa sổ đầu cuối sẽ hiển thị một cái gì đó như thế này sau cả hai lần cài đặt.
Bước 7: Cũng cài đặt git và sau đó sử dụng nó để sao chép thư mục python cho Raspberry Pi của chúng tôi. Bạn có thể làm điều đó bằng cách sử dụng các lệnh sau.
sudo apt-get install git sudo git clone
Khi bước này hoàn tất, bạn sẽ tìm thấy thư mục con SX127x trong thư mục chính của Raspberry Pi. Điều này sẽ có tất cả các tệp bắt buộc được liên kết với thư viện.
Lập trình Raspberry Pi cho LoRa
Trong giao tiếp LoRa ngang hàng, mô-đun đang truyền thông tin được gọi là máy chủ và mô-đun nhận thông tin được gọi là máy khách. Trong hầu hết các trường hợp, Arduino sẽ được sử dụng tại hiện trường với một cảm biến để đo dữ liệu và Pi sẽ được sử dụng để nhận những dữ liệu này. Vì vậy, tôi quyết định sử dụng Raspberry Pi làm máy khách và Arduino làm máy chủ trong hướng dẫn này. Các chương trình trọn gói khách hàng Raspberry Pi có thể được tìm thấy ở dưới cùng của trang này. Ở đây tôi sẽ cố gắng giải thích những dòng quan trọng trong chương trình.
Thận trọng: Đảm bảo rằng tệp chương trình nằm trong cùng một thư mục có thư mục thư viện SX127x. Bạn có thể sao chép thư mục này và sử dụng nó ở bất cứ đâu nếu bạn muốn chuyển dự án.
Chương trình khá đơn giản, chúng ta phải thiết lập mô-đun LoRa hoạt động ở 433Mhz và sau đó lắng nghe các gói tin đến. Nếu chúng tôi nhận được bất kỳ thứ gì, chúng tôi chỉ cần in chúng trên bảng điều khiển. Như mọi khi, chúng tôi bắt đầu chương trình bằng cách nhập các thư viện python được yêu cầu.
từ thời gian nhập ngủ từ SX127x.LoRa nhập * từ SX127x.board_config nhập BOARD BOARD.setup ()
Trong trường hợp này, gói thời gian được sử dụng để tạo ra độ trễ, gói Lora được sử dụng cho giao tiếp LoRa và board_config được sử dụng để thiết lập các tham số của board và LoRa. Chúng tôi cũng thiết lập bảng bằng cách sử dụng hàm BOARD.setup () .
Tiếp theo, chúng ta tạo lớp python LoRa với ba định nghĩa. Vì chúng ta chỉ thụt lề để làm cho chương trình hoạt động như một ứng dụng khách mâm xôi nên lớp chỉ có ba chức năng là lớp init, lớp bắt đầu và lớp on_rx_done . Lớp init khởi tạo mô-đun LoRa ở 433MHz với băng thông 125kHz như được đặt trong phương thức set_pa_config . Sau đó, nó cũng đặt mô-đun ở chế độ ngủ để tiết kiệm điện năng tiêu thụ.
# Giá trị mặc định dải trung bình sau init là 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips / ký hiệu, CRC trên 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (verbose) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Chức năng khởi động là nơi chúng ta cấu hình các module như nhận và có được như RSSI (Nhận cường độ tín hiệu Indicator), tình trạng, tần số hoạt động vv. Chúng tôi đặt mô-đun hoạt động ở chế độ thu liên tục (RXCONT) từ chế độ nghỉ và sau đó sử dụng vòng lặp trong khi để đọc các giá trị như RSSI và trạng thái modem. Chúng tôi cũng chuyển dữ liệu trong bộ đệm nối tiếp vào thiết bị đầu cuối.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) trong khi True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Cuối cùng, hàm on_rx_done được thực thi sau khi gói đến được đọc. Trong hàm này, các giá trị nhận được được chuyển vào một biến được gọi là tải trọng từ bộ đệm Rx sau khi đặt cờ nhận ở mức cao. Sau đó, các giá trị nhận được được giải mã bằng utf-8 để in dữ liệu người dùng có thể đọc được trên shell. Chúng tôi cũng đặt mô-đun trở lại chế độ ngủ cho đến khi nhận được giá trị khác.
def on_rx_done (self): print ("\ nReceive:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (byte (payload).decode ("utf-8", 'ignore ")) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Phần còn lại của chương trình chỉ là in các giá trị nhận được trên bàn điều khiển và kết thúc chương trình bằng cách sử dụng ngắt bàn phím. Chúng tôi lại đặt bo mạch ở chế độ nghỉ ngay cả sau khi kết thúc chương trình để tiết kiệm điện.
thử: lora.start () ngoại trừ KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") cuối cùng: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Mã Arduino cho LoRa để giao tiếp với Raspberry Pi
Như tôi đã đề cập trước đó, mã rpsreal hỗ trợ cả Arduino và Pi và do đó có thể giao tiếp giữa Arduino và Pi. Nó hoạt động dựa trên Thư viện Radiohead của AirSpayce. Vì vậy, trước tiên bạn phải cài đặt thư viện đầu radio vào Arduino IDE của mình.
Để làm điều đó, hãy truy cập trang Github và tải xuống thư viện trong thư mục ZIP. Sau đó, đặt nó vào thư mục thư viện của Arduino IDE của bạn. Bây giờ, khởi động lại Arduino IDE và bạn sẽ tìm thấy các tệp ví dụ cho thư viện đầu Radio. Ở đây chúng tôi sẽ lập trình Arduino hoạt động như một máy chủ LoRa để gửi các gói thử nghiệm như 0 đến 9. Bạn có thể tìm thấy mã Hoàn thành để làm điều tương tự ở cuối trang này như mọi khi. Ở đây, tôi sẽ giải thích một vài dòng quan trọng trong chương trình.
Chúng tôi bắt đầu chương trình bằng cách nhập thư viện SPI (được cài đặt theo mặc định) để sử dụng giao thức SPI và sau đó là thư viện RH_RF95 từ đầu Radio để thực hiện giao tiếp LoRa. Sau đó, chúng tôi xác định chân nào của Arduino mà chúng tôi đã kết nối chân Chip select (CS), Reset (RST) và Interrupt (INT) của LoRa với Arduino. Cuối cùng, chúng tôi cũng xác định rằng mô-đun phải hoạt động ở Tần số 434MHz và khởi tạo mô-đun LoRa.
#include
Bên trong chức năng thiết lập, chúng tôi sẽ đặt lại mô-đun LoRa bằng cách kéo chốt đặt lại của nó xuống thấp trong 10 mili giây để bắt đầu làm mới. Sau đó, chúng tôi khởi tạo nó bằng mô-đun mà chúng tôi đã tạo trước đó bằng cách sử dụng thư viện đầu Radio. Sau đó, chúng tôi đặt tần số và công suất truyền cho máy chủ LoRa. Khoảng cách truyền cao hơn thì gói tin của bạn sẽ di chuyển nhiều hơn nhưng sẽ tiêu tốn nhiều điện năng hơn.
void setup () { // Khởi tạo Serial Monitor Serial.begin (9600); // Đặt lại pinMode mô-đun LoRa (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); chậm trễ (10); digitalWrite (RFM95_RST, HIGH); chậm trễ (10); // Khởi tạo Mô-đun LoRa while (! Rf95.init ()) { Serial.println ("LoRa radio init fail"); trong khi (1); } // Đặt tần số mặc định 434.0MHz if (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); trong khi (1); } rf95.setTxPower (18); // Công suất truyền của Mô-đun Lora }
Bên trong chức năng vòng lặp vô hạn, chúng ta chỉ cần gửi gói dữ liệu qua mô-đun LoRa. Dữ liệu này có thể là bất kỳ thứ gì như giá trị cảm biến của lệnh người dùng. Nhưng để đơn giản hơn, chúng tôi sẽ gửi giá trị char 0 đến 9 cho mỗi khoảng thời gian 1 giây và sau đó khởi tạo giá trị trở lại 0 sau khi đạt đến 9. Lưu ý rằng các giá trị chỉ có thể được gửi ở định dạng mảng char và loại dữ liệu phải là unit8_t đó là 1 byte tại một thời điểm. Mã để làm điều tương tự được hiển thị bên dưới
void loop () { Serial.print ("Gửi:"); char radiopacket = char (value)}; vô tuyến rf95.send ((uint8_t *), 1); chậm trễ (1000); giá trị ++; if (value> '9') value = 48; }
Kiểm tra giao tiếp LoRa giữa Raspberry Pi và Arduino
Bây giờ, chúng ta đã sẵn sàng cả phần cứng và chương trình, chúng ta chỉ cần tải mã Arduino lên bảng UNO và phác thảo python sẽ được khởi chạy trên pi. Thiết lập thử nghiệm của tôi với cả phần cứng được kết nối, trông giống như sau
Khi bản phác thảo ứng dụng khách python được khởi chạy trên Pi (chỉ sử dụng python 3), nếu mọi thứ hoạt động bình thường, bạn sẽ thấy các gói Arduino nhận được trong pi thông qua cửa sổ shell. Bạn sẽ thấy “Đã nhận: 0” thành 9 như trong hình bên dưới.
Bạn có thể tải xuống mã Raspberry pi hoàn chỉnh với tất cả các thư viện cần thiết từ đây.
Bây giờ bạn có thể di chuyển máy chủ Arduino và kiểm tra phạm vi của mô-đun; nó cũng có thể hiển thị giá trị RSSI trên shell nếu được yêu cầu. Hoạt động hoàn chỉnh của dự án có thể được tìm thấy trong video được liên kết bên dưới. Bây giờ, chúng ta đã biết cách thiết lập giao tiếp LoRa công suất thấp khoảng cách xa giữa Arduino và Raspberry pi, chúng ta có thể tiến hành thêm cảm biến ở phía Arduino và nền tảng đám mây ở phía Pi để tạo thành một gói IoT hoàn chỉnh.
Hy vọng bạn hiểu dự án và thích xây dựng nó. Nếu bạn gặp vấn đề trong việc làm cho nó hoạt động, hãy sử dụng phần bình luận bên dưới hoặc các diễn đàn về các câu hỏi kỹ thuật khác.