Problema con esc e servo, con librerie EasyTransfer, servo, max7456 e i2cdev

Ciao a tutti e buon ferragosto.
Come accennato nel titolo ho un problema con il comando di servo ed esc utilizzando le suddette librerie.
Video del problema
Dico subito che ho provato ad utilizzare esclusivamente l'invio dei comandi, omettendo dal codice tutto quello che riguarda l'osd e la IMU e il servo e gli esc funzionano benissimo.
Qualcuno potrebbe fare un'ipotesi sul motivo del problema? Altrimenti dovrò utilizzare un arduino per ricevere i comandi e comandare i motori ed il servo e un'altro arduino per la lettura dei sensori e dei valori dell'IMU e scriverli a schermo.
Aggiungo che utilizzo 2 schedine con RS485 per la comunicazione.

Software della base:

#include <EasyTransfer.h>
EasyTransfer ETout;

struct SEND_DATA_STRUCTURE{
          byte fw_Motor_Sx_command;
          byte fw_Motor_Dx_command;
          byte up_Motor_Sx_command;
          byte up_Motor_Dx_command;
          byte tilt_Camera_command;
          byte on_off_led;
       };
       
SEND_DATA_STRUCTURE txdata;


#define FWD_REW A4
#define RIGHT_LEFT A3
#define UP_DOWN A1
#define BUTTON_UP_CAMERA A0
#define BUTTON_DOWN_CAMERA A2
#define BUTTON_ON_OFF_LIGHT A5

static const float JS_CENTER_0_RANGE = 50; 
static const float JS_CENTER_1_RANGE = 50;
static const float JS_CENTER_2_RANGE = 50;
static const int JS_CENTER_0 = 512; 
static const int JS_CENTER_1 = 512;
static const int JS_CENTER_2 = 512;

int Js_Center_0_Range = 0;
int Js_Center_0 = 0;
int Js_Center_1_Range = 0;
int Js_Center_1 = 0;
int Js_Center_2_Range = 0;
int Js_Center_2 = 0;

static const int JS_RANGE_0 = 1023; 
static const int JS_RANGE_1 = 1023;
static const int JS_RANGE_2 = 1023;
static const int JS_DIR_0 = 1; // +1 or -1
static const int JS_DIR_1 = 1;
static const int JS_DIR_2 = 1;

int thrusterLeftCommand;
int thrusterRightCommand;
int cameraCommand = 128;

int ledState = LOW;        
int buttonState;            
int lastButtonState = LOW;   
unsigned long lastDebounceTime = 0;  
unsigned long debounceDelay = 50;   

void mapJoy() {
  Js_Center_0_Range = ((JS_CENTER_0_RANGE / JS_RANGE_0) * 200);
  Js_Center_0 = map(JS_CENTER_0,
                        0,                              
                        JS_RANGE_0,
                        -100,
                        100);

  Js_Center_1_Range = ((JS_CENTER_1_RANGE / JS_RANGE_1) * 200);
  Js_Center_1 = map(JS_CENTER_1,
                        0,
                        JS_RANGE_1,
                        -100,
                        100);

  Js_Center_2_Range = ((JS_CENTER_2_RANGE / JS_RANGE_2) * 200);
  Js_Center_2 = map(JS_CENTER_2,
                        0, 
                        JS_RANGE_2,
                        -100, 
                        100); 

  }

void setup() {
  Serial.begin(19200);

  ETout.begin(details(txdata), &Serial);
  mapJoy();
  delay(1000);
}

void loop() {  

int reading = digitalRead(BUTTON_ON_OFF_LIGHT);
if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  lastButtonState = reading;
  
int camera_up = analogRead(BUTTON_UP_CAMERA);
if (camera_up > 900) cameraCommand ++;
if (cameraCommand > 220) cameraCommand = 220;
int camera_down = analogRead(BUTTON_DOWN_CAMERA);
if (camera_down > 900) cameraCommand --;
if (cameraCommand < 35) cameraCommand = 35;

  int forwardCommand = analogRead(FWD_REW);
  int turnCommand = analogRead(RIGHT_LEFT);
  int verticalCommand = analogRead(UP_DOWN);

  forwardCommand = map(forwardCommand,
                             0,
JS_RANGE_0,                       // Joystick high value
                             100,                            // Command low value
                             -100);                            // Command high value
  turnCommand = map(turnCommand,                              // raw joystick value
                             0,                               // Joystick low value
                             JS_RANGE_1,                      // Joystick high value
                             -100,                            // Command low value
                             100);                            // Command high value
  verticalCommand = map(verticalCommand,                      // raw joystick value
                             0,                               // Joystick low value
                             JS_RANGE_2,                      // Joystick high value
                             -100,                            // Command low value
                             100);                            // Command high value

  if ((turnCommand > Js_Center_1 - Js_Center_1_Range) && 
       (turnCommand < Js_Center_1 + Js_Center_1_Range)) 
    {
     if ((forwardCommand > Js_Center_0 - Js_Center_0_Range) &&
         (forwardCommand < Js_Center_0 + Js_Center_0_Range))
       {
        thrusterLeftCommand = Js_Center_0;
        thrusterRightCommand = Js_Center_0;
       }
     else 
       {
        thrusterLeftCommand = forwardCommand - Js_Center_0_Range;
        thrusterRightCommand = forwardCommand - Js_Center_0_Range;
       }
    }
  else if ((forwardCommand > Js_Center_0 - Js_Center_0_Range) &&
          (forwardCommand < Js_Center_0 + Js_Center_0_Range))
       {
        if ((turnCommand > Js_Center_1 - Js_Center_1_Range) && 
            (turnCommand < Js_Center_1 + Js_Center_1_Range)) 
          {
           thrusterLeftCommand = Js_Center_0;
           thrusterRightCommand = Js_Center_0;
          }
        else 
          {

           thrusterLeftCommand = - turnCommand + Js_Center_1_Range;
           thrusterRightCommand = turnCommand - Js_Center_1_Range;
          }
       }
     else if (forwardCommand > Js_Center_0 + Js_Center_0_Range) 
       {

          thrusterLeftCommand = forwardCommand - turnCommand;
          thrusterRightCommand = forwardCommand + turnCommand;
       }
     else if (forwardCommand < Js_Center_0 - Js_Center_0_Range)
       {

        thrusterLeftCommand = forwardCommand + turnCommand;
        thrusterRightCommand = forwardCommand - turnCommand;
    }
  if (thrusterLeftCommand > 100) thrusterLeftCommand = 100;
  else if (thrusterLeftCommand < -100) thrusterLeftCommand = -100;
  if (thrusterRightCommand > 100) thrusterRightCommand = 100;
  else if (thrusterRightCommand < -100) thrusterRightCommand = -100;
  txdata.fw_Motor_Sx_command = map(thrusterLeftCommand, -100, 100, 0, 255);
  txdata.fw_Motor_Dx_command = map(thrusterRightCommand, -100, 100, 0, 255);
  txdata.up_Motor_Sx_command = map(verticalCommand, 100, -100, 0, 255);
  txdata.up_Motor_Dx_command = map(verticalCommand, 100, -100, 0, 255);
  txdata.tilt_Camera_command = cameraCommand;
  txdata.on_off_led = ledState;
  ETout.sendData();
}

Aggiungo un alto post perchè non ci va tutto!!

Software del rov:

////////////////////// Easy Trasfer /////////////////
#include <EasyTransfer.h>
EasyTransfer ETin;

struct RECEIVE_DATA_STRUCTURE{
          byte fw_Motor_Sx_command;
          byte fw_Motor_Dx_command;
          byte up_Motor_Sx_command;
          byte up_Motor_Dx_command;
          byte tilt_Camera_command;
          byte on_off_led;
       };

RECEIVE_DATA_STRUCTURE rxdata;

#include <Servo.h>

static const int CENTER_THROTTLE= 1500; // STOP and ARM value

static const byte THRUSTER_LEFT = 6;
static const byte THRUSTER_RIGHT = 7;
static const byte THRUSTER_VERTICAL_LEFT = 4;
static const byte THRUSTER_VERTICAL_RIGHT = 5;
static const byte SERVO_CAMERA = 8;
static const byte LED_PIN = 9;

Servo thrusterLeft;
Servo thrusterRight;
Servo thrusterVerticalLeft;
Servo thrusterVerticalRight;
Servo servoCamera;

byte ledState = LOW; 


#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"

#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

MPU6050 mpu(0x69);

#define HMC5883L_DEFAULT_ADDRESS    0x1E
#define HMC5883L_RA_DATAX_H         0x03
#define HMC5883L_RA_DATAZ_H         0x05
#define HMC5883L_RA_DATAY_H         0x07


bool dmpReady = false;  // set true if DMP init was successful
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
int16_t mx, my, mz;     //To store magnetometer readings
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector
float heading;          // Simple magnetic heading. (NOT COMPENSATED FOR PITCH AND ROLL)

byte compassCalibrated = 1;


double mxMin = 0;
double mxMax = 0;
double myMin = 0;
double myMax = 0;
double mzMin = 0;
double mzMax = 0;
double mxOffSet = 18; //tested 
double myOffSet = - 103.50; 
double mzOffSet = - 38.5;

//=================================================================
//==                         OSD MAX7456                         ==
//=================================================================

// Included Libraries //////////////////////////////////////////////////////////

  #include <SPI.h>
  #include <MAX7456.h>

 const byte osdChipSelect = 10;
 const byte masterOutSlaveIn = 11;
 const byte masterInSlaveOut = 12;
 const byte slaveClock = 13;
 const byte osdReset = 0;
 
 MAX7456 OSD( osdChipSelect );
 // Timer
    char time[] = "00:00:00";
    char timeMillis[3];
    int msOffset = (timeMillis[3] - '0') * 100 + (timeMillis[2] - '0') * 10 + (time[1] - '0');
    bool toggle = false;
 // Fine Timer
    int z = 0;
    int x = 0; 
    
    int posPitchOSDPrecedente = 0;
 // Array dei caratteri per l'indicazione della bussola
    char compassOsd[] = " N \xF9 \xF9 NW \xF9 \xF9 W \xF9 \xF9 SW \xF9 \xF9 S \xF9 \xF9 SE \xF9 \xF9 E \xF9 \xF9 NE \xF9 \xF9";
    char actualCompassOsd[] = "                    ";
    char posizione [] = {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
 
// ================================================================
// ===                      INITIAL SETUP                       ===
// ================================================================

void setup() {
  
  //SERVO ATTACH
  thrusterLeft.attach(THRUSTER_LEFT);
  thrusterRight.attach(THRUSTER_RIGHT);
  thrusterVerticalLeft.attach(THRUSTER_VERTICAL_LEFT);
  thrusterVerticalRight.attach(THRUSTER_VERTICAL_RIGHT);
  servoCamera.attach(SERVO_CAMERA);
  thrusterLeft.writeMicroseconds(CENTER_THROTTLE);
  thrusterRight.writeMicroseconds(CENTER_THROTTLE);
  thrusterVerticalLeft.writeMicroseconds(CENTER_THROTTLE);
  thrusterVerticalRight.writeMicroseconds(CENTER_THROTTLE);
  servoCamera.write(90);
  pinMode(LED_PIN, OUTPUT); 
  digitalWrite(LED_PIN, ledState);
  
  
    // join I2C bus (I2Cdev library doesn't do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
        TWBR = 12; // 400kHz I2C clock (200kHz if CPU is 8MHz). Comment this line if having compilation difficulties with TWBR.
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(200, true);
    #endif
   
    Serial.begin(19200);
    ETin.begin(details(rxdata), &Serial);

delay (2000);

    // load and configure the DMP

    devStatus = mpu.dmpInitialize();

   // supply your own gyro offsets here, scaled for min sensitivity
    mpu.setXGyroOffset(-9);//(-6);
    mpu.setYGyroOffset(-28);//(-35);
    mpu.setZGyroOffset(-22);//(-19);
    mpu.setXAccelOffset(-3808);//(-3699);
    mpu.setYAccelOffset(1081);//(1113);
    mpu.setZAccelOffset(1350);//(1377); // 1688 factory default for my test chip
    
    // Magnetometer configuration

  mpu.setI2CMasterModeEnabled(0);
  mpu.setI2CBypassEnabled(1);

  Wire.beginTransmission(HMC5883L_DEFAULT_ADDRESS);
  Wire.write(0x02); 
  Wire.write(0x00);  // Set continuous mode
  Wire.endTransmission();
  delay(5);

  Wire.beginTransmission(HMC5883L_DEFAULT_ADDRESS);
  Wire.write(0x00);
  Wire.write(B00011000);  // 75Hz
  Wire.endTransmission();
  delay(5);

  mpu.setI2CBypassEnabled(0);

  // X axis word
  mpu.setSlaveAddress(0, HMC5883L_DEFAULT_ADDRESS | 0x80); // 0x80 turns 7th bit ON, according to datasheet, 7th bit controls Read/Write direction
  mpu.setSlaveRegister(0, HMC5883L_RA_DATAX_H);
  mpu.setSlaveEnabled(0, true);
  mpu.setSlaveWordByteSwap(0, false);
  mpu.setSlaveWriteMode(0, false);
  mpu.setSlaveWordGroupOffset(0, false);
  mpu.setSlaveDataLength(0, 2);

  // Y axis word
  mpu.setSlaveAddress(1, HMC5883L_DEFAULT_ADDRESS | 0x80);
  mpu.setSlaveRegister(1, HMC5883L_RA_DATAY_H);
  mpu.setSlaveEnabled(1, true);
  mpu.setSlaveWordByteSwap(1, false);
  mpu.setSlaveWriteMode(1, false);
  mpu.setSlaveWordGroupOffset(1, false);
  mpu.setSlaveDataLength(1, 2);

  // Z axis word
  mpu.setSlaveAddress(2, HMC5883L_DEFAULT_ADDRESS | 0x80);
  mpu.setSlaveRegister(2, HMC5883L_RA_DATAZ_H);
  mpu.setSlaveEnabled(2, true);
  mpu.setSlaveWordByteSwap(2, false);
  mpu.setSlaveWriteMode(2, false);
  mpu.setSlaveWordGroupOffset(2, false);
  mpu.setSlaveDataLength(2, 2);

  mpu.setI2CMasterModeEnabled(1);

    
    // make sure it worked (returns 0 if so)
    if (devStatus == 0) {
        // turn on the DMP, now that it's ready
        mpu.setDMPEnabled(true);

        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        dmpReady = true;

        // get expected DMP packet size for later comparison
        packetSize = mpu.dmpGetFIFOPacketSize();
    } else {

    }
// ================================================================
// ===                    SETUP MAX7456                         ===
// ================================================================
    SPI.begin();
    SPI.setClockDivider( SPI_CLOCK_DIV2 );      // Must be less than 10MHz.
    
    // Initialize the MAX7456 OSD:
    OSD.begin(MAX7456_COLS_P1,MAX7456_ROWS_P1,MAX7456_FULLSCREEN);                                // Use NTSC with default area.
    OSD.setSwitchingTime( 5 );                  // Set video croma distortion 
                                                //   to a minimum.
    //OSD.setCharEncoding( MAX7456_ASCII );       // Only needed if ascii font.
    OSD.display();                              // Activate the text display.
    OSD.setDefaultSystem(MAX7456_PAL);
    OSD.clear();

  
  // Compass OSD
  
 
  
}

Il loop lo metto dopo, non ci sta.

Il loop:

================================================================
// ===                    MAIN PROGRAM LOOP                     ===
// ================================================================

void loop() {
  
        
          while (OSD.notInVSync()) {
      
      ///STAMPA "VOLT"
      OSD.setCursor( 5, -1);
      OSD.print( F("\xB3") );
      OSD.setCursor( 6, -1);
      OSD.print( F("\xB4") );
      OSD.setCursor( 7, -1);
      ///FINE STAMPA "VOLT"
      int sensorVolt = analogRead(A0);

      // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
      float voltage = sensorVolt * (14.5 / 1023.0);

      OSD.setCursor( 7, -1 );
      OSD.print(voltage);
      
      ///STAMPA PROFONDITA
      int sensorProf = analogRead(A1);

      float prof = (sensorProf - 102)  * (1.2207) * 0.703;
      OSD.setCursor( 14, -1 );
      OSD.print("Prof: ");
      if (sensorProf > 99) OSD.setCursor( 19, -1 );
      else OSD.setCursor( 20, -1 );
      OSD.print(sensorProf);

    // if programming failed, don't try to do anything
    if (!dmpReady) return;
    
    
    mpu.resetFIFO(); //Resetta il buffer per non usare l'interrupt
    while (fifoCount < packetSize) {fifoCount = mpu.getFIFOCount();}
    
        // read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;

            // display Euler angles in degrees
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetGravity(&gravity, &q);
            mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
            
            //Read magnetometer measures
            mx=mpu.getExternalSensorWord(0) - mxOffSet;
            my=mpu.getExternalSensorWord(2) - myOffSet;
            mz=mpu.getExternalSensorWord(4) - mzOffSet;
            
           // CALCOLA VALORE BUSSOLA COMPENSATA
  double Xh = mx * cos(ypr[1]) + my * sin(ypr[2]) * sin(ypr[1]) - mz * cos(ypr[2])*sin(ypr[1]);
  double Yh = my * cos(ypr[2]) - mz * sin(ypr[2]);
  heading = atan2 ( Yh, Xh );
  if(heading < 0) heading += 2*PI;
  if(heading > 2*PI) heading -= 2*PI;
  int headingDegrees = heading * 180/M_PI; 
           //FINE CALCOLA VALORE BUSSOLA COMPENSATA
            
            // STAMPA I GRADI DELLA BUSSOLA SULL'OSD//
                     
            if (headingDegrees >= 100) {
              OSD.setCursor( 12, 2);
              OSD.print(headingDegrees);
              
            }
            else if (headingDegrees <= 9) {
              OSD.setCursor( 12, 2);
              OSD.print("0");
              OSD.setCursor( 13, 2);
              OSD.print("0");
              OSD.setCursor( 14, 2);
              OSD.print(headingDegrees);
              
            }
            else if (9 < headingDegrees < 100) {
              OSD.setCursor( 12, 2);
              OSD.print("0");
              OSD.setCursor( 13, 2);
              OSD.print(headingDegrees); 
            }
            /// FINE STAMPA I GRADI DELLA BUSSOLA SULL'OSD///
            
 /// DIREZIONE BUSSOLA
            int centralInitOsdCompass = map(headingDegrees, 0, 360, 0, 51);
            for (int y = 0; y < 19; y++) 
              {
               int osdCompassArrayFinal = centralInitOsdCompass + (posizione [y]);
               if (osdCompassArrayFinal > 51) {osdCompassArrayFinal = osdCompassArrayFinal - 51;}
               if (osdCompassArrayFinal < 0) {osdCompassArrayFinal = osdCompassArrayFinal + 52;}
               actualCompassOsd[y] = compassOsd[osdCompassArrayFinal];
              }
              OSD.setCursor( 3, 0);
              OSD.print(actualCompassOsd);
              OSD.setCursor( 13, 1);
              OSD.print((char)214);
 /// FINE DIREZIONE BUSSOLA     
 /// INDICAZIONE PITCH
              OSD.setCursor( 0, 0);
              OSD.print(F("\xCD")); // 9
              OSD.print(F("\xC4")); // 0
              OSD.setCursor( 1, 1);
    //OSD.print((char)60);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 1, 2);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 0, 3);
              OSD.print(F("\xC8")); // 4
              OSD.setCursor( 1, 3);
              OSD.print(F("\xC9")); // 5
              OSD.setCursor( 1, 4);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 1, 5);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 1, 6);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 1, 7);
              OSD.print(F("\xC4")); // 0
              OSD.setCursor( 1, 8);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 1, 9);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 1, 10);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 0, 11);
              OSD.print(F("\xC8")); // 4
              OSD.setCursor( 1, 11);
              OSD.print(F("\xC9")); // 5
              OSD.setCursor( 1, 12);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 1, 13);
              OSD.print(F("\xF9")); // trattino
              OSD.setCursor( 0, 14);
              OSD.print(F("\xCD")); // 9
              OSD.setCursor( 1, 14);
              OSD.print(F("\xC4")); // 0
              
              int pitchDMP = (ypr[1] * 180/M_PI);
/// SCRIVE I GRADI DEL PITCH
              if (pitchDMP < 0)
              {
                if (pitchDMP >= -9)
                {
                  OSD.setCursor( 2, 7);
                  OSD.print("0");
                  OSD.setCursor( 3, 7);
                  OSD.print(pitchDMP);
                }
                else if (pitchDMP <= -10)
                {
                  OSD.setCursor( 2, 7);
                  OSD.print(pitchDMP);
                }
                OSD.setCursor( 2, 7);
                OSD.print(F("\xF9"));
              }
              else if (pitchDMP >= 0)
              {
                OSD.setCursor( 2, 7);
                OSD.print(" ");
                if (pitchDMP <= 9) 
                {
                  OSD.setCursor( 3, 7);
                  OSD.print("0");
                  OSD.setCursor( 4, 7);
                  OSD.print(pitchDMP);
                }
                else if (9 < pitchDMP < 91) 
                {
                  OSD.setCursor( 3, 7);
                  OSD.print(pitchDMP);
                } 
                
              }
/// SCRIVE LA FRECCIA DEL PITCH CANCELLANDO LA VECCHIA            
              int posPitchOSD = map(pitchDMP, -90, 90, 14, - 1);
              OSD.setCursor( 2, posPitchOSD);
              OSD.print((char)60);
              if (posPitchOSDPrecedente != posPitchOSD)
              {
                OSD.setCursor( 2, posPitchOSD);
                OSD.print(" ");
                OSD.setCursor( 2, posPitchOSD - 1);
                OSD.print(" ");
                OSD.setCursor( 2, posPitchOSD + 1);
                OSD.print(" ");
                posPitchOSDPrecedente = posPitchOSD;
              }
              
        if (ETin.receiveData()) {
         thrusterLeft.writeMicroseconds(map(rxdata.fw_Motor_Sx_command, 0, 255, 1200, 1800));
         thrusterRight.writeMicroseconds(map(rxdata.fw_Motor_Dx_command, 0, 255, 1200, 1800));
         thrusterVerticalLeft.writeMicroseconds(map(rxdata.up_Motor_Sx_command, 0, 255, 1200, 1800));
         thrusterVerticalRight.writeMicroseconds(map(rxdata.up_Motor_Dx_command, 0, 255, 1200, 1800));
         servoCamera.write(map(rxdata.tilt_Camera_command, 0, 255, 30, 140));
         digitalWrite(LED_PIN, rxdata.on_off_led);
       }
       
       OSD.setCursor( 10, 3);
       OSD.print(map(rxdata.fw_Motor_Sx_command, 0, 255, 1200, 1800));
       OSD.setCursor( 11, 5);
       OSD.print(map(rxdata.fw_Motor_Dx_command, 0, 255, 1200, 1800));
       
      }
}

EasyTransfer.zip (96.6 KB)

max7456.zip (88.8 KB)

I2Cdev.zip (14.2 KB)

MPU6050.zip (62.5 KB)

Provato ad usare la libreria servotimer2, stesso identico comportamento, se stacco l'rs485, fisicamente, invece i motori restano immobili, così, visto che la seriale hardware è occupata, ho provato a visualizzare i valori letti dalla rs485 ed effettivamente variano quando i motori scattano, cosa strana, visto che la trasmissione invece non cambia.
Cosa potrebbe interferire con la lettura della seriale hardware?

Risolto con 2 arduino, tanto spazio ce n'è! Ora 1 si occupa di comandare motori e servo e l'altro legge i sensori, l'imu e sovrappone sul segnale video.