problema con codigos de maestro y esclavos para 2 Arduinos Uno

hola, que tal. Estoy desarrollando 2 codigos para un brazo robotico que e armado, los códigos funcionan para dos Arduino Uno, uno funciona como maestro y el otro como esclavo. mi problema es que el código que hice no me funciona muy bien y quería saber si ustedes lo podrían ayudarme y poder decirme la solución del problema. no tengo mucho conocimiento en esto ya que lo que sobre programar lo aprendo de tutoriales de youtube.

#include <Ultrasonic.h>. 
#include <Servo.h>. 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);// RX,TX
Servo myServo;
Ultrasonic ultrasonic(7,6);
 int x;
void setup() { 
  mySerial.begin(9600);               
  Serial.begin (9600);       // inicializa el puerto seria a 9600 baudios
  myServo.attach(9);
  }
  
void loop() {

    for(int i=15;i<=165;i++){  
  myServo.write(i);
  delay(30);
  if (ultrasonic.Ranging(CM) <= 10 && ultrasonic.Ranging(CM) >= 1){
  mySerial.write('x');
  mySerial.write(ultrasonic.Ranging(CM));
  mySerial.write('y');
  mySerial.write(i);
  Serial.print("x");
  Serial.print(ultrasonic.Ranging(CM));
  Serial.println("y");
  Serial.println(i);

   delay(30);
   }
  }
  for(int i=165;i>15;i--){  
  myServo.write(i);
  delay(30);
  
  if (ultrasonic.Ranging(CM) <= 30 && ultrasonic.Ranging(CM) >= 1){
  mySerial.write('x');
  mySerial.write(ultrasonic.Ranging(CM));
  mySerial.write('y');
  mySerial.write(i);
  Serial.print("x");
  Serial.print(ultrasonic.Ranging(CM));
  Serial.println("y");
  Serial.println(i);
   delay(30);
   }
  }
}
#include <Servo.h>. 
int distancia = 0;
int angulo = 0;
char DATO;

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;


void setup() {
 
  Serial.begin(9600);
  servo1.attach(3);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);

}
void loop() {

  if(Serial.available()> 0){
   DATO = Serial.read();
   if ( ! isdigit(DATO)) {
   distancia=Serial.parseInt();
   angulo=Serial.parseInt();
   
    if(distancia <= 30 && distancia >= 1){
    distancia=map(distancia,0,30,30,100);
    
   switch (DATO) {
       case 'x':           
        servo1.write(distancia);

       case 'y': 
         servo2.write(angulo);
         break;
    }
   }    
  } 
 }
}

el primer codigo es el que funciona como maestro y el segundo como esclavo

Comencemos con algunos excesos

if (ultrasonic.Ranging(CM) <= 10 && ultrasonic.Ranging(CM) >= 1){
  mySerial.write('x');
  mySerial.write(ultrasonic.Ranging(CM));

Tres llamados a la misma función insumiendo un tiempo tremendo al hacerlo.
reemplázalo por

int sonar = ultrasonic.Ranging(CM);
if ( sonar <= 10 && sonar >= 1){
  mySerial.write('x');
  mySerial.write(sonar);

y quita ese delay(30) con tantas itereacciones pierdes mucho tiempo a menos que sea para posicionar.

en el otro código
Esto esta incompleto

switch (DATO) {
       case 'x':           
        servo1.write(distancia);

       case 'y': 
         servo2.write(angulo);
         break;
    }

Es así

switch (DATO) {
       case 'x':           
                  servo1.write(distancia);
                  break;
       case 'y': 
                 servo2.write(angulo);
                 break;
    }