Tremolio servo gestiti da Arduino UNO e Adafruit BNO055

Ciao a tutti. Sono alle prese con la gestione di due servo per stabilizzare una fotocamera. Per fare ciò uso un sensore inerziale montato su board Adafruit (BNO055) e un Arduino UNO.
In breve, il programma legge gli angoli di Eulero forniti dal sensore e li converte nell’angolo a cui deve posizionarsi il servo.
Il problema sta nel tremolio dei servo. Esso avviene ogni 3-4 secondi, ed è di un 5-10 gradi, malgrado il sensore sia immobile. Il tremolio di un servo è indipendente dall’altro servo. I dati inviati ai segnali dei servo (controllati con un serial print) non mostrano variazioni.
Il problema si riscontra sia usando Arduino UNO che Arduino NANO.
I servo anche non sono la causa del problema, infatti sono stati testati due Tower Pro Micro Servo SG90, due Grove-Servo, due GWServo S03N STD, due Master Midi-Servo DS3010 .
L’alimentazione e il cablaggio non sono la causa del problema, in quanto uso un DC power supply che alimenta il sistema. Il problema si riscontra anche usando una batteria da 12v e i necessari regolatori di tensione.
Il codice è il seguente. Si basa sul codice trovato online sul sito “Capturing IMU Data with a BNO055 Absolute Orientation Sensor - Projects” di Mark Hughes:

//---- Included Libraries ----//  
#include <Wire.h>                           // I²C library
#include <math.h>                           // trig functions
#include <Adafruit_Sensor.h>                // Base library for sensors
#include <Adafruit_BNO055.h>                // BNO055 specific library
#include <utility/imumaths.h>               // Vector, Matrix, and IMUMath library
#include <servo.h>                          // Standard Servo library

#define BNO055_SAMPLERATE_DELAY_MS (20)     // Set pause between samples

//---- Variable Declaration ----//

boolean debug = true;                       // true/false = extra/no information over serial

int rollPin  = 9;                           // Digital pin for roll
int pitchPin = 10;                          // Digital pin for pitch

float roll, pitch;                     // Variable to hold roll, pitch information

Adafruit_BNO055 bno = Adafruit_BNO055();    // Use object bno to hold information

Servo rollServo;                            // Create servo rollServo
Servo pitchServo;                           // Create servo pitchServo

void setup(void) {
  
  rollServo.attach(rollPin);                // The rollServo is connected at rollPin
  pitchServo.attach(pitchPin);              // The pitchServo is connected at pitchPin

  Serial.begin(115200);                     // Create serial connection at 115,000 Baud

  if (!bno.begin())                         // Attempt communication with sensor
  /*{
    Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
  }*/

  delay(1000);                               // Wait 1 seconds to allow it to initialize
  bno.setExtCrystalUse(true);               // Tell sensor to use external crystal
}

//---- Main Program Loop ----//
void loop() {

  //---- Request Euler Angles from Sensor ----//
  sensors_event_t event;
  bno.getEvent(&event);

 /* if (debug) {                             // If debug is true, send information over serial
    Serial.print("Measured Euler Roll-Pitch");
    Serial.print("\t pitch: "); Serial.print(event.orientation.y, 4); Serial.print("\t");
    Serial.print("\t  roll: "); Serial.print(event.orientation.z, 4); Serial.println();
  }
  */
  /* Remap information from the sensor over the 0° - 180° range of the servo
     The Roll values are between -90° and +90°
     The Pitch values are between -180° and +180°
  */
  int servoRoll =  map(event.orientation.z,  -90, 90, 180, 0);
  int servoPitch = map(event.orientation.y, -90, 90, 0, 180);

  servoRoll = constrain(servoRoll, 45, 135);  //limits roll angle range
  servoPitch = constrain(servoPitch, 70, 115);//limits pitch angle range


 /* if (debug) {                             // If debug is true, send information over serial
    Serial.print("Measured Euler Roll-Pitch");
    Serial.print("\t Pitch Servo: "); Serial.print(servoPitch); Serial.print("\t");
    Serial.print("\t  Roll Servo: "); Serial.print(servoRoll);  Serial.println();
  }
  // If debug is true, send information over serial
  if (debug) {
    Serial.println("Calculated Servo Roll-Pitch");
    Serial.print("\t roll:");  Serial.print(servoRoll, DEC);  Serial.print("\t");
    Serial.print("\t pitch:"); Serial.print(servoPitch, DEC); Serial.print("\t");
  }
  */

  rollServo.write(servoRoll);              // Send mapped value to rollServo
  pitchServo.write(servoPitch);            // Send mapped value to pitchServo

  delay(BNO055_SAMPLERATE_DELAY_MS);       // Wait before rerunning loop
}

Cercando su altri topic e forum, ho capito che potrebbe essere un problema di timer e interrupts, ma non riesco a trovare una soluzione che elimini il problema.

Se qualcuno avesse già avuto un problema simile e fosse in grado di darmi qualche consiglio gliene sarei estremamente grato.

Cordialmente, BWild

>BWild: in conformità al REGOLAMENTO della sezione Italiana del Forum, punto 13, il cross-posting è proibito (anche tra lingue diverse) e tu hai già posto la stessa domanda QUI.

Poi, NON avendolo tu ancora fatto, ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto :wink:) e di leggere con molta attenzione il REGOLAMENTO.

Infine, in conformità al suddetto regolamento, questo tuo thread viene chiuso e ti prego di continuare dove avevi cominciato (nella sezione di lingua Inglese). Grazie.

Guglielmo