RF24 команда radio.write ломает IMU фильтр

spoty76
Offline
Зарегистрирован: 07.06.2020

Здравствуйте, использую "MadgwickAHRS.h" чтобы преобразовывать показатели IMU acceleration и gyroscope с Arduino Nano 33 Iot. Я замечаю что в изоляции фильтр работает исправно, то-есть когда вращаю плату мне показывает правильные значения.

Если добавлю delay в void loop, фильтр ломается и значения очень медленно меняются и часто неправильные, ну допустим. Мне надо присылать данные через NRF24I01+. Из за команды radio.write фильтр ломается идентично - я получаю не верные данные. Если я уберу radio.write, все работает исправно. Моя мысль на этот счет что radio.write задерживает код, но как с этим бороться?

Код передатчика:

#include <Arduino_LSM6DS3.h>
#include "MadgwickAHRS.h"

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(2, 10); // CE, CSN

const byte address[6] = "00001";

float AccX, AccY, AccZ;
float GyroX, GyroY, GyroZ;

float roll, pitch, yaw;

unsigned long start = 0;

Madgwick filter;

void setup() {
  pinMode(pot, INPUT);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  
  Serial.begin(9600);
  //IMU initiation
 
  while (!Serial);
 
  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");
 
    while (1);
  }

  const float sensorRate = IMU.gyroscopeSampleRate();
  
  //UMI filter
  filter.begin(sensorRate);
  delay(20);
 

  ///////////////////////NRF//////////////////////////
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();

}
 
void loop() {
  
  if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable())
  {
    IMU.readGyroscope(GyroX, GyroY, GyroZ);
    IMU.readAcceleration(AccX, AccY, AccZ);

/////////ИСПОЛЬЗОВАНИЕ ФИЛЬТРА//////////////
     filter.updateIMU(GyroX, GyroY, GyroZ, AccX, AccY, AccZ);

  roll = filter.getRoll();
  pitch = filter.getPitch();
  yaw = filter.getYaw();

  Serial.print(roll);
 Serial.print("/");
   Serial.print(pitch);
   Serial.print("/");
  Serial.print(yaw);
 Serial.println("/");
  }
  

 //Radio delay
  if (millis() - start > 50)
 {
  byte arr[] = {1, 2, 12};
  
//Команда которая мешает, если убрать то значения с фильтра правильные
  radio.write(&arr, sizeof(arr));

  start = millis();
  }


}

Cпасибо

toc
Offline
Зарегистрирован: 09.02.2013

посмотрите метод radio.writeFast
вроде он не блокирующий

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Рекомендую почитать про прерывания.
Многое проясниться

spoty76
Offline
Зарегистрирован: 07.06.2020

Да, writeFast исправил проблему!