Lora SX1278 через короткое время перестает принимать

Я работаю с двумя модулями Lora ra-02 sx1278 и двумя Arduino Uno. Программирование на Arduino IDE 2.1.1

отправитель Схема отправителя

получатель Схема приёмника

Проблема в том, что получатель успешно принимает несколько пакетов, но затем плата больше не получает сигнал. Я знаю, что отправитель постоянно отправляет данные, потому что светодиод RX на Arduino мигает. Каждый раз, когда я перезагружаю плату приемника, она снова начинает прием, а затем прекращает прием после нескольких пакетов.

У меня возникла эта проблема при запуске базового примера отправки и получения самой библиотеки Lora. Вот библиотека, которую я использую из библиотек Arduino IDE: ссылка на библиотеку Лоры (Я просто изменил частоту на 433 для своего региона и уменьшил задержку отправки пакетов с 5 секунд до 1 секунды)

Я не смог найти в Интернете ничего полезного. Есть предложения?

Обновление: мой проект — автомобиль, управляемый жестами руки. Программу проекта я выложил на доски. С помощью этого кода, если машина-робот получает команду «стоп», она получает несколько пакетов каждую секунду, а затем, по прошествии приемлемого времени, больше не получает. Но если я подвигаю рукой, чтобы она отправила машине команды движения, она получит команду движения, и моторы заработают, но следующего пакета она не получит. Когда я отсоединил драйверы моторов от Arduino, он получил как минимум 15-20 пакетов. Судя по всему, пакеты он получает, но после работы драйверов и моторов вдруг ничего не получает. Я в замешательстве.

Отправитель:

#include <SPI.h>
#include <LoRa.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

int counter = 0;
String msg = "";
int xdata = 0;
int ydata = 0;
int flag=0;
Adafruit_MPU6050 mpu;

void setup() {
  Serial.begin(9600);
  while (!Serial)
  Serial.println("LoRa Sender");
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  Serial.println("MPU6050 Found!");
  LoRa.setTxPower(10);
}
void loop() {
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);
  xdata = a.acceleration.x;
  ydata = a.acceleration.y;
  Serial.println(counter);

  if((xdata>2)&&(flag==0))
  {
    flag=1;
    msg = "l";
    Serial.println("l");
    }
  if(xdata<-2 && flag==0)
  {
    flag=1;
    msg = "r";
    Serial.println("r");
    }
  if(ydata>2 && flag==0)
  {
    flag=1;
    msg = "b";
    Serial.println("b");
    }
  if(ydata<-2 && flag==0)
  {
    flag=1;
    msg = "f";
    Serial.println("f");
    }
  if((xdata<2)&&(xdata>-2)&&(ydata<2)&&(ydata>-2)&&(flag==1))
  {
    flag=0;
    msg = "s";
    Serial.println("s");
    }
  
  LoRa.beginPacket();
  LoRa.print(counter);
  LoRa.print(msg);
  LoRa.endPacket();
  counter++;
  delay(1000);
}

Получатель:

#include <SPI.h>
#include <LoRa.h>

int motor1pin1 = 3;   //передний левый
int motor1pin2 = 4;
int motor2pin1 = 5;   //передний правый
int motor2pin2 = 6;
int motor3pin1 = A0;  //назад вправо
int motor3pin2 = A1;
int motor4pin1 = A2;  //назад налево
int motor4pin2 = A3;
String  msg="";

void setup() {
  pinMode(motor1pin1, OUTPUT);
  pinMode(motor1pin2, OUTPUT);
  pinMode(motor2pin1, OUTPUT);
  pinMode(motor2pin2, OUTPUT);
  pinMode(motor3pin1, OUTPUT);
  pinMode(motor3pin2, OUTPUT);
  pinMode(motor4pin1, OUTPUT);
  pinMode(motor4pin2, OUTPUT);

  Serial.begin(9600);
  while (!Serial);

  Serial.println("LoRa Receiver");

  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {
  // пытаемся разобрать пакет
  int packetSize = LoRa.parsePacket();
  yield();
  if (packetSize) {
    //получил пакет
    Serial.print("Received packet '");
    // читаем пакет
    while (LoRa.available()) {
      msg=(char)LoRa.read();
      Serial.print(msg);
    }
    //Serial.println(msg);
    if(msg=="f")
    {
      digitalWrite(motor1pin1, HIGH);
      digitalWrite(motor1pin2, LOW);
      digitalWrite(motor2pin1, HIGH);
      digitalWrite(motor2pin2, LOW);     
      digitalWrite(motor3pin1, HIGH);
      digitalWrite(motor3pin2, LOW);      
      digitalWrite(motor4pin1, HIGH);
      digitalWrite(motor4pin2, LOW);
      Serial.println(" :  Forward");
    }
    else if(msg=="b")
    {
      digitalWrite(motor1pin1, LOW);
      digitalWrite(motor1pin2, HIGH);
      digitalWrite(motor2pin1, LOW);
      digitalWrite(motor2pin2, HIGH);      
      digitalWrite(motor3pin1, LOW);
      digitalWrite(motor3pin2, HIGH);      
      digitalWrite(motor4pin1, LOW);
      digitalWrite(motor4pin2, HIGH);      
      Serial.println(" :  Back");
    }
    else if(msg=="l")
    {
      digitalWrite(motor1pin1, LOW);
      digitalWrite(motor1pin2, HIGH);
      digitalWrite(motor2pin1, HIGH);
      digitalWrite(motor2pin2, LOW);      
      digitalWrite(motor3pin1, HIGH);
      digitalWrite(motor3pin2, LOW);      
      digitalWrite(motor4pin1, LOW);
      digitalWrite(motor4pin2, HIGH);
      Serial.println(" :  Left");
    }
    else if(msg=="r")
    {
      digitalWrite(motor1pin1, HIGH);
      digitalWrite(motor1pin2, LOW);
      digitalWrite(motor2pin1, LOW);
      digitalWrite(motor2pin2, HIGH);      
      digitalWrite(motor3pin1, LOW);
      digitalWrite(motor3pin2, HIGH);      
      digitalWrite(motor4pin1, HIGH);
      digitalWrite(motor4pin2, LOW);
      Serial.println(" :  Right");
    }
    else if(msg=="s")
    {
      digitalWrite(motor1pin1, LOW);
      digitalWrite(motor1pin2, LOW);
      digitalWrite(motor2pin1, LOW);
      digitalWrite(motor2pin2, LOW);      
      digitalWrite(motor3pin1, LOW);
      digitalWrite(motor3pin2, LOW);      
      digitalWrite(motor4pin1, LOW);
      digitalWrite(motor4pin2, LOW);      
      Serial.println(" :  Stop");
    }
    LoRa.receive();
  }
}

, 👍0

Обсуждение

1) В библиотеке 10 скетчей, вам нужно уточнить, какой из них вы используете. Мы не хотим гадать, какой именно. 2) Будет ли он аварийно завершать работу/перестанет работать, если вы измените интервал на 5 с вместо 1 с? 3) Кстати, Lora предназначена для связи на большом расстоянии (по сравнению с Wi-Fi) с ограниченным общим частотным ресурсом, прежде чем вы решите транслировать эфир каждую секунду (даже если вы используете его как одноранговую сеть), пожалуйста, отойдите подальше требования [рабочего цикла](https://lora.readthedocs.io/en/latest/#duty-cycle-time-on-air-toa)., @hcheung

@hcheung спасибо за ответ. 1) Я тестирую LoRaSender и LoRaReceiver. 2) Да. При большей задержке он получает больше пакетов, но снова останавливается. 3) У меня мало информации об этом. Можете ли вы рассказать мне об ограничениях? Я использую 433 МГц. Я прочитал ссылку, которую вы предоставили, но не знаю, каков рабочий цикл в моем случае., @Rouhi


1 ответ


0

Первое, что приходит на ум, это слишком маленькая задержка между отправками. Вы не только наводняете эфир своими пакетами (добросовестное использование, 1% эфирного времени и все такое), но и после нескольких пакетов ваш получатель может не успевать за ним и начать пропускать пакеты.

Кроме того, существует определенная вероятность того, что другое устройство по соседству тоже отправляет пакеты и мешает вашей передаче. Ведь вы находитесь на стандартной частоте 433 МГц с настройками по умолчанию.

Попробуйте:

  • Измените частоту показов на что-нибудь менее людное.
  • Измените SF/BW на что-нибудь менее стандартное.
  • Установите задержку между пингами примерно на 30 секунд.
  • В зависимости от используемой вами библиотеки LoRa рассмотрите возможность использования CAD, обнаружения активности канала.

Я только что увидел, что вы используете библиотеку Arduino-LoRa. У него САПР, но не в основной ветке, а в отдельной ветке.

,