• Interfacing LoRa SX1278 with STM32 – Sender & Receiver

QC

Interfacing LoRa SX1278 with STM32 – Sender & Receiver

 

Interfacing LoRa SX1278 with STM32 – Sender & Receiver

Giao diện LoRa SX1278 với STM32 - Người gửi & Người nhận

Tổng quát

Trong hướng dẫn này, chúng ta sẽ tìm hiểu Giao diện của Mô-đun LoRa SX1278 với Vi điều khiển STM32 Bluepill. Mô-đun Ra-02 sử dụng IC SX1278 và hoạt động trên tần số 433MHz. Sử dụng tính năng nhảy tần, nó mang lại sự cân bằng tuyệt vời của việc truyền tín hiệu chất lượng — sẽ bao gồm dải tần 420-450MHz. LoRa SX1278 hoạt động với giao thức truyền thông SPI nên nó có thể được sử dụng với bất kỳ bộ vi điều khiển nào hỗ trợ SPI. Mô-đun SX1278 có thể dễ dàng giao tiếp với chip STM32F103.

Hướng dẫn bao gồm hai ví dụ. Trong ví dụ đầu tiên, chúng tôi sẽ gửi một tin nhắn đơn giản “Xin chào thế giới” từ Người gửi / Người chuyển LoRa đến Người nhận. Nhưng trong ví dụ thứ hai, chúng tôi sẽ gửi dữ liệu cảm biến không dây. Cảm biến áp suất khí quyển BME280 cung cấp thông tin về Áp suất khí quyển, Nhiệt độ, Độ ẩm & Khoảng. Độ cao. Bộ gửi LoRa STM32 sẽ gửi dữ liệu cảm biến đến Bộ nhận LoRa STM32.

Nếu bạn đang đọc bài đăng này từ khu vực Bắc Mỹ, thì bạn có thể làm việc với Mô-đun LoRa 915MHz SX1276.

Bill of Materials

S.N.COMPONENTS NAMEDESCRIPTIONQUANTITY
1STM32 MicrocontrollerSTM32F103C Bluepill Board2
2LoRa ModuleRa-02 SX12782
3Barometric Pressure SensorBME2801
4Power Supply5V DC Adapter or 3.7V Battery2
5Connecting WiresJumper Wires20
6Breadboard-1

LoRa Module SX1278


Chip SX1278 Ra-02 được sản xuất bởi Semtech. Mô-đun SX1278 RF chủ yếu được sử dụng cho giao tiếp trải phổ tầm xa. Nó có thể chống Giảm thiểu mức tiêu thụ hiện tại & có độ nhạy cao -148 dBm với công suất đầu ra là +20 dBm. Có thể đạt được khoảng cách truyền xa gần 5km với độ tin cậy cao. Do đó, SX1278 rất phù hợp cho các ứng dụng IoT để gửi dữ liệu cảm biến lên đám mây trên phạm vi dài.

Mô-đun này sử dụng IC SX1278 của SEMTECH và hoạt động trên tần số 433MHz. Nhảy tần — mang lại cho bạn sự cân bằng tuyệt vời của việc truyền tín hiệu chất lượng sẽ bao phủ dải 420-450 MHz. Khả năng không dây tầm xa này được đóng gói trong một gói nhỏ (17 x 16mm) và được phân phối mà không có ăng-ten.

SX1278 Pinout


Chân 1: ANT - Chân này để gắn vào ăng-ten.

Chân 2, 9, 16: GND - Chân nối đất chung với bộ nguồn và bộ điều khiển.

Chân 3: 3.3V - Để cấp nguồn cho thiết bị, chân 3 sẽ giúp cấp nguồn.

Chân 4: ĐẶT LẠI - Chân 4 là để đặt lại mô-đun thông qua tín hiệu bên ngoài.

Chân 5, 6, 7, 8, 10, 11: DIO0, DIO1, DIO2, DIO3, DIO4, DIO5 - Để thực hiện chức năng I / O tổng quát thông qua mô-đun, các chân DIO sẽ giúp ích. Các chân này có thể tùy chỉnh như một chân ngắt.

Chân 12: SCK - Chân SCK dành cho xung đồng hồ trong quá trình giao tiếp SPI.

Chân 13: MISO - MISO có nghĩa là Master in và Slave out giúp truyền dữ liệu từ Mô-đun đến Bộ điều khiển. Master là một bộ điều khiển & SX1278 là Slave.

Chân 14: MOSI - MOSI có nghĩa là Master out Slave In. Vì vậy, chân này sẽ nhận dữ liệu từ Controller.

Chân 15: NSS - NSS là chân chọn / kích hoạt chip sẽ giúp kích hoạt nô lệ.

LoRa Frequency Allocation

Tần suất LoRa không phải là hợp pháp ở mọi nơi. Tôi đến từ Ấn Độ và ở đây Dải tần không được cấp phép là từ 865MHz đến 867MHz. Vì vậy tôi chỉ được phép sử dụng dải tần này. SX1278 có tần số 433MHz nên tôi không được phép sử dụng nó trong thời gian dài ngoài mục đích học tập. Tương tự, hãy kiểm tra Dải tần được phép ở quốc gia của bạn và xác nhận rằng bạn được phép sử dụng dải tần thực tế. Các mô-đun LoRa có sẵn các dải tần số khác nhau, phổ biến nhất là 433MHz, 915MHz và 868MHz.

Interfacing LoRa SX1278 with STM32

Bây giờ, hãy để chúng tôi giao diện Mô-đun LoRa SX1278 với Bảng STM32F103C và tạo một Thiết bị nhận Người gửi LoRa STM32 đơn giản. Kết nối giữa SX1278 & STM32F103 như sau:


Sơ đồ được đưa ra dưới đây. Bạn có thể lắp ráp các cặp mạch trên breadboard. Một trong các mạch sẽ hoạt động như một máy phát hoặc người gửi và mạch kia đóng vai trò là máy thu.


LoRa Library for STM32

Thư viện Arduino LoRa không được hỗ trợ bởi Bảng STM32F103. Đó là lý do tại sao có một thư viện được sửa đổi cho Bảng STM32F103 cho Arduino IDE. Thư viện STM32 LoRa được sử dụng để gửi và nhận dữ liệu bằng bộ đàm LoRa.

Thư viện này hiển thị trực tiếp đài LoRa và cho phép bạn gửi dữ liệu đến bất kỳ đài nào trong phạm vi có cùng thông số vô tuyến. Tất cả dữ liệu được phát đi và không có địa chỉ.

Tải xuống: Thư viện LoRa STM32

Sender & Receiver Code




Sender Code

#include <SPI.h>
#include <LoRa_STM32.h>
 
#define SS PA4
#define RST PB0
#define DI0 PA1
 
#define TX_P 17
#define BAND 433E6
#define ENCRYPT 0x78
 
int counter = 0;
 
void setup() {
  Serial.begin(115200);
  while (!Serial);
 
  Serial.println("LoRa Sender");
 
  LoRa.setTxPower(TX_P);
  LoRa.setSyncWord(ENCRYPT);
  
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND))
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}
 
void loop() {
  Serial.print("Sending packet: ");
  Serial.println(counter);
 
  // send packet
  LoRa.beginPacket();
  LoRa.print("hello ");
  LoRa.print(counter);
  LoRa.endPacket();
 
  counter++;
 
  delay(5000);
}


Receiver Code


#include <SPI.h>
#include <LoRa_STM32.h>
 
#define SS PA4
#define RST PB0
#define DI0 PA1
 
#define TX_P 17
#define BAND 433E6
#define ENCRYPT 0x78
 
void setup()
{
  Serial.begin(115200);
  while (!Serial);
 
  Serial.println("LoRa Receiver");
  LoRa.setTxPower(TX_P);
  LoRa.setSyncWord(ENCRYPT);
  
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND))
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}
 
void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // received a packet
    Serial.print("Received packet '");
 
    // read packet
    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }
 
    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }
}

Kết quả.

Sending Sensor Data Wirelessly using LoRa Module

Bây giờ chúng ta hãy xem qua ví dụ thứ hai. Trong ví dụ này, chúng ta sẽ kết nối SX1278 với cảm biến STM32 và BME280 tới mạch người gửi. BME280 là một cảm biến môi trường tích hợp được phát triển đặc biệt cho các ứng dụng di động có độ tuyến tính và độ chính xác cao cho các phép đo áp suất, độ ẩm và nhiệt độ.


Cảm biến hoạt động trên Giao thức I2C nên các Chân I2C của nó, tức là SDA & SCL được kết nối tương ứng với PB7 & PB6. Chúng tôi sẽ gửi kết quả đọc không dây của Cảm biến BME280 từ Bộ gửi LoRa STM32 đến Bộ nhận LoRa STM32.

Kiểm tra dự án tương tự trước đó tại đây: Gửi dữ liệu cảm biến không dây bằng LoRa & Arduino

Source Code/Program

   Mã Người gửi và Người nhận LoRa SX1278 STM32 được đưa ra bên dưới. Mã Người gửi yêu cầu Thư viện BME280. Tải xuống Thư viện BME280 từ liên kết này: Thư viện BME280


Sender Code

#include <Wire.h>
#include <SPI.h>
#include <LoRa_STM32.h>
 
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
 
#define NSS PA4
#define RST PB0
#define DI0 PA1
 
#define TX_P 17
#define BAND 433E6
#define ENCRYPT 0x78
 
int counter = 0;
String LoRaMessage = "";
 
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
 
void setup()
{
  Serial.begin(115200);
  while (!Serial);
 
  Serial.println(F("LoRa Sender"));
 
  //LoRa.setTxPower(TX_P);
  LoRa.setSyncWord(ENCRYPT);
  
  LoRa.setPins(NSS, RST, DI0);
  if (!LoRa.begin(BAND))
  {
    Serial.println(F("Starting LoRa failed!"));
    while (1);
  }
  if (!bme.begin(0x76))
  {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}
 
void loop()
{
  float temperature = bme.readTemperature();
  float pressure = bme.readPressure() / 100.0F;
  float altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
  float humidity = bme.readHumidity();
  
  Serial.print(F("Sending packet: "));
  Serial.println(counter);
  
  Serial.print(F("Temperature = "));
  Serial.print(temperature);
  Serial.println(F("*C"));
 
  Serial.print(F("Pressure = "));
  Serial.print(pressure);
  Serial.println(F("hPa"));
 
  Serial.print(F("Approx. Altitude = "));
  Serial.print(altitude);
  Serial.println(F("m"));
 
  Serial.print(F("Humidity = "));
  Serial.print(humidity);
  Serial.println(F("%"));
 
  Serial.println();
 
  LoRaMessage = String(counter) + "/" + String(temperature) + "&" + String(pressure) + "#" + String(altitude) + "@" + String(humidity);
 
  // send packet
  LoRa.beginPacket();
  LoRa.print(LoRaMessage);
  LoRa.endPacket();
 
  counter++;
 
  delay(3000);
}


Receiver Code

#include <SPI.h>
#include <LoRa_STM32.h>
 
#define SS PA4
#define RST PB0
#define DI0 PA1
 
#define TX_P 17
#define BAND 433E6
#define ENCRYPT 0x78
 
  String counter;
  String temperature;
  String pressure;
  String altitude;
  String humidity;
 
void setup()
{
  Serial.begin(115200);
  while (!Serial);
 
  Serial.println("LoRa Receiver");
  //LoRa.setTxPower(TX_P);
  LoRa.setSyncWord(ENCRYPT);
  
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND))
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}
 
void loop() {
  // try to parse packet
  int pos1,pos2,pos3,pos4;
  
  int packetSize = LoRa.parsePacket();
  if (packetSize)
  {
    // received a packet
    Serial.print("Received packet:  ");
    String LoRaData = LoRa.readString();
    Serial.print(LoRaData);
    // read packet
    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }
    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
 
    pos1 = LoRaData.indexOf('/');
    pos2 = LoRaData.indexOf('&');
    pos3 = LoRaData.indexOf('#');
    pos4 = LoRaData.indexOf('@');
 
    counter = LoRaData.substring(0, pos1);
    temperature = LoRaData.substring(pos1+1,pos2);
    pressure = LoRaData.substring(pos2+1,pos3);
    altitude = LoRaData.substring(pos3+1,pos4);
    humidity = LoRaData.substring(pos4+1,LoRaData.length());
 
    
    Serial.print(F("Packet No. = "));
    Serial.println(counter);
    
    Serial.print(F("Temperature = "));
    Serial.print(temperature);
    Serial.println(F("*C"));
  
    Serial.print(F("Pressure = "));
    Serial.print(pressure);
    Serial.println(F("hPa"));
  
    Serial.print(F("Approx. Altitude = "));
    Serial.print(altitude);
    Serial.println(F("m"));
  
    Serial.print(F("Humidity = "));
    Serial.print(humidity);
    Serial.println(F("%"));
    Serial.println();
  }
}





Hex

 :020000040800F2 :10000000000003200D3700085D3700085D37000849 :100010005D3700085D3700085D3700085D37000870 :100020000000000000000000000000005D...