RF24 команда radio.write ломает IMU фильтр
- Войдите на сайт для отправки комментариев
Втр, 16/03/2021 - 19:13
Здравствуйте, использую "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пасибо
посмотрите метод radio.writeFast
вроде он не блокирующий
Рекомендую почитать про прерывания.
Многое проясниться
Да, writeFast исправил проблему!