ejecutar movimiento de servo en paralelo al resto del programa

hola espero que me pueda ayudar alguien, me explico lo unico que le falta a mi programa que quiero que haga es que el servo se mueva continuamente de izquierda a derecha y que no interrumpa las demas acciones de lectura y movimiento de los motores como he visto que pasa con el ejemplo que hay del servo que cuando se utiliza no se puede hacer ninguna otra cosa hasta que acaba, solo quiero que se hagan mas cosas aparte del servo como lo hago?? muchas gracias.

#include <Servo.h>

#include <Ultrasonic.h>
#define MOTOR_1_Adelante 8
#define MOTOR_1_Atras 9
#define MOTOR_2_Adelante 10
#define MOTOR_2_Atras 11
int led4 = 4;
int led3 = 3;
int led2 = 2;
Servo myservo;
int pos = 70;

#define TRIG 6
#define ECHO 7
#define Dist_Obstaculo 30.0
#define LOG false
Ultrasonic ultrasonic(TRIG, ECHO);
float Distancia = 0;

void setup() {
pinMode(MOTOR_1_Adelante, OUTPUT);
pinMode(MOTOR_1_Atras, OUTPUT);
pinMode(MOTOR_2_Adelante, OUTPUT);
pinMode(MOTOR_2_Atras, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
myservo.attach(5);
if (LOG) Serial.begin( 9600 );
}

void loop()
{
servo(); //ESTO ES LO QUE ME DA EL PROBLEMA SI NO UTILIZO EL SERVO LO DEMAS FUNCIONA COMO QUIERO, SE QUE ESTA ACCION INTERRUMPE TODO LO DEMAS, COMO LO PUEDO HACER PARA QUE LO HAGA TODO A LA VEZ??
{
Distancia = ultrasonic.Ranging(CM);
if (LOG) Serial.println(Distancia);
}
if (Distancia > Dist_Obstaculo )
{
irAdelante ();
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
}
if (Distancia < Dist_Obstaculo )
{
irDerecha ();
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
}
}

void checkDistancia ()
{
Distancia = ultrasonic.Ranging(CM);
if (LOG) Serial.println(Distancia);
}

void irAdelante ()
{
digitalWrite(MOTOR_1_Adelante, HIGH);
digitalWrite(MOTOR_1_Atras, LOW);
digitalWrite(MOTOR_2_Adelante, HIGH);
digitalWrite(MOTOR_2_Atras, LOW);
}

void irDerecha ()
{
digitalWrite(MOTOR_1_Adelante, HIGH);
digitalWrite(MOTOR_1_Atras, LOW);
digitalWrite(MOTOR_2_Adelante, LOW);
digitalWrite(MOTOR_2_Atras, HIGH);
delay(150);
digitalWrite(MOTOR_1_Adelante, LOW);
digitalWrite(MOTOR_1_Atras, LOW);
digitalWrite(MOTOR_2_Adelante, LOW);
digitalWrite(MOTOR_2_Atras, LOW);
delay(1000);
}

void servo()
{
for(pos = 70; pos <= 120; pos += 1)
{
myservo.write(pos);
delay(15);
}
for(pos = 120; pos>=70; pos-=1)
{
myservo.write(pos);
delay(15);
}
}

void servo()
{
for(pos = 70; pos <= 120; pos += 1)
{
myservo.write(pos);
delay(15);
}
for(pos = 120; pos>=70; pos-=1)
{
myservo.write(pos);
delay(15);
}
}

Una cosa importante de las funciones es que cuando se las llama toman el control. En tu caso se va a completar los dos ciclos “for” antes de que el void loop() se vuelva a ejecutar. Deberias modificar la función servo() para que cuando sea llamada, incremente un solo paso del servo mediante estructuras if o case .

Saludos

eso lo se pero como se hace? soy nuevo en esto y no tengo ni idea de nada meti las ordenes del servo con un if en el void loop y me pasa lo mismo asta que el servo no acaba un ciclo no lee lo demas si alguien me lo resuelve mil graciassss

Creas en la función servo dos variables auxiliares estáticas para que conserven su valores entre llamados, por ejemplo "pos" y "direccion"
a pos la incrementas o decrementas según el valor de "direccion" y a "direccion" le invertis el signo cuando llega a los valores limites del servo.

Saludos

Lorx21, siento decepcionarte, pero los procesadores NO pueden hacer dos cosas al mismo tiempo, o una o la otra. Ni siquiera la mayoría de los que montan nuestros ordenadores de mesa.
El truco esta en (sutilmente) alternar entre tareas.
Si tienes dos o mas motores, los vas moviendo un poquito cada vez y alternando entre ellos. Así da el pego de va todo a la vez. Pero no le pidas peras al olmo (Arduino)

void servo()
{
  int static pos=70;
 int static direccion;
 
switch  (direccion){
   case (0): 
     pos++;
     break;
   case (1) :
     pos--;
     break;
    default :
   direccion=0;
   }
    
switch   (pos){
   case (70):
     direccion=0;
     break;
   case (120) :
     direccion=1;
     break;
   
   }

 
 
      myservo.write(pos);         
 
}

ahora lo unico que hace es girar a la derecha…

#include <Servo.h>

#include <Ultrasonic.h>
#define MOTOR_1_Adelante 8
#define MOTOR_1_Atras 9
#define MOTOR_2_Adelante 10
#define MOTOR_2_Atras 11
int led4 = 4;
int led3 = 3;
int led2 = 2;
Servo myservo;
int pos = 70;

#define TRIG 6
#define ECHO 7
#define Dist_Obstaculo 30.0
#define LOG false
Ultrasonic ultrasonic(TRIG, ECHO);
float Distancia = 0;

void setup() {
pinMode(MOTOR_1_Adelante, OUTPUT);
pinMode(MOTOR_1_Atras, OUTPUT);
pinMode(MOTOR_2_Adelante, OUTPUT);
pinMode(MOTOR_2_Atras, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
myservo.attach(5);
if (LOG) Serial.begin( 9600 );
}

void loop()
{
checkDistancia();
servo();
{
Distancia = ultrasonic.Ranging(CM);
if (LOG) Serial.println(Distancia);
}
if (Distancia > Dist_Obstaculo )
{
irAdelante ();
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
}
if (Distancia < Dist_Obstaculo )
{
irDerecha ();
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
}
}

void checkDistancia ()
{
Distancia = ultrasonic.Ranging(CM);
if (LOG) Serial.println(Distancia);
}

void irAdelante ()
{
digitalWrite(MOTOR_1_Adelante, HIGH);
digitalWrite(MOTOR_1_Atras, LOW);
digitalWrite(MOTOR_2_Adelante, HIGH);
digitalWrite(MOTOR_2_Atras, LOW);
}

void irDerecha ()
{
digitalWrite(MOTOR_1_Adelante, HIGH);
digitalWrite(MOTOR_1_Atras, LOW);
digitalWrite(MOTOR_2_Adelante, LOW);
digitalWrite(MOTOR_2_Atras, HIGH);
delay(150);
digitalWrite(MOTOR_1_Adelante, LOW);
digitalWrite(MOTOR_1_Atras, LOW);
digitalWrite(MOTOR_2_Adelante, LOW);
digitalWrite(MOTOR_2_Atras, LOW);
delay(1000);
}

void servo()
{
int static pos=70;
int static direccion;

switch (direccion){
case (0):
pos++;
break;
case (1) :
pos–;
break;
default :
direccion=0;
}

switch (pos){
case (70):
direccion=0;
break;
case (120) :
direccion=1;
break;

}

myservo.write(pos);

}

tiene q haber algo para hacer lo q digo yo ya se que no puedo pedir mucho pero solo pido q mientras llee la distancia del objeto y siga de frente o gire el servo vaya x su cuenta haciendo de 70º a 120º todo el rato gracias por intentar ayudar recuerdo que no tengo ni idea de todo lo que decis solo se cosas muy basicas

se me olvido decir que con el programa del servo que escribiste gira solo un poco el servo y el coche gira un poco a la dercha luego el servo otro trocito y luego el coche de nuevo asi todo el rato

Lorx21:
se me olvido decir que con el programa del servo que escribiste gira solo un poco el servo y el coche gira un poco a la dercha luego el servo otro trocito y luego el coche de nuevo asi todo el rato

Si, con una separación de 1.15 segundos ....

Una cosa importante de las funciones es que cuando se las llama toman el control. En tu caso se va a completar los dos delay() antes de que el void loop() se vuelva a ejecutar. Deberías modificar la función void irDerecha () para que cuando sea llamada, no quede detenida.
Saludos