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 исправил проблему!