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();
}
}
@Rouhi, 👍0
Обсуждение1 ответ
Первое, что приходит на ум, это слишком маленькая задержка между отправками. Вы не только наводняете эфир своими пакетами (добросовестное использование, 1% эфирного времени и все такое), но и после нескольких пакетов ваш получатель может не успевать за ним и начать пропускать пакеты.
Кроме того, существует определенная вероятность того, что другое устройство по соседству тоже отправляет пакеты и мешает вашей передаче. Ведь вы находитесь на стандартной частоте 433 МГц с настройками по умолчанию.
Попробуйте:
- Измените частоту показов на что-нибудь менее людное.
- Измените SF/BW на что-нибудь менее стандартное.
- Установите задержку между пингами примерно на 30 секунд.
- В зависимости от используемой вами библиотеки LoRa рассмотрите возможность использования CAD, обнаружения активности канала.
Я только что увидел, что вы используете библиотеку Arduino-LoRa. У него САПР, но не в основной ветке, а в отдельной ветке.
- Код застрял после инициализации с помощью RFM69
- Использование библиотеки Arduino LMIC с возможностью прерывания
- Как использовать SPI на Arduino?
- Как создать несколько запущенных потоков?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
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