Servo rotazione speculare e gestione cicli for [RISOLTO]

Ciao a tutti,

come riportato nel post aperto ieri nella sezione hardware, dovrei realizzato un progetto per un cosplay basato su due servomotori. Nell'altro post chiedevo informazioni hardware, ma nel frattempo volevo portarmi avanti con circuito e codice.

Prima di passare ai sistemi di controllo, volevo settare la funzione loop che permetteva ai servo di passare da una "posizione 0" ad una "posizione 1". Essendo speculari (ovvero immaginateveli montati uno di fronte all'altro) gli angoli saranno diversi. Per semplicità, diciamo che la posizione 0 del servo1 corrisponde a 0° mentre quella del 2 a 180°. La posizione 1 di entrambi a 90°.

Con un semplice "servo.write()" ottengo il mio obiettivo. Non potendo regolare la velocità del servo, pensavo di usare un ciclo for. Il problema è che con la mia poca esperienza con Arduino, al momento riesco a fare due cicli for separati che scriveranno due angoli diversi ("i" ed "f"), ma naturalmente viene eseguito prima quello del servo 1, poi quello del servo 2. Io vorrei che partissero insieme. Come posso fare?

Qui riporto il codice che porta da posizione 0-->1, attende 5 secondi e torna indietro.

#include <Servo.h>
#define PIN_SERVO_1 9   // sx vista da dietro
#define PIN_SERVO_2 10  // dx vista da dietro

int attesa = 5000;
int singlestep = 15;
Servo servo1; // classe oggetto, la seconda parola è il nome di tale oggetto. Se due servo, crearne due con nomi diversi
Servo servo2;

void setup() {
  servo1.attach(PIN_SERVO_1);
  servo2.attach(PIN_SERVO_2);
}

void loop() {
  ascesa();
  delay(attesa);
  discesa();
}
  

void ascesa(){
  for(int i = 0; i <= 90; i++){ // sposta testina da 0 a 100 gradi
    servo1.write(i);
    delay(singlestep);
  }
  for(int f = 180; f >= 90 ; f--){ // sposta testina da 180 a 100 gradi
    servo2.write(f);
    delay(singlestep);
  }
}

void discesa(){
   for(int i = 90; i >= 0; i--){ // sposta testina da 100 a 0 gradi
    servo1.write(i);
    delay(singlestep);
  }
  for(int f = 90; f <= 180 ; f++){ // sposta testina da 180 a 100 gradi
    servo2.write(f);
    delay(singlestep);
  }
}

Grazie mille!

Semplicemente utilizzando un solo ciclo for per settare entrambi i servi:

f = 180 - i;

Semplice no?

Sì,

grazie mille. Ieri sera si vede era troppo tardi per arrivarci. Ora il codice è semplicemente questo, usando anche controllo pulsante e tre posizioni (0-->1-->2-->0) premendo un semplice "push" button.

#include <Servo.h>
#define PIN_SERVO_1 9
#define PIN_SERVO_2 10

int pulsantePin = 2;
int attesa = 2000;
int singlestep = 20;
Servo servo1; // classe oggetto, la seconda parola è il nome di tale oggetto. Se due servo, crearne due con nomi diversi
Servo servo2;

void setup() {
  servo1.attach(PIN_SERVO_1);
  servo2.attach(PIN_SERVO_2);
  pinMode(pulsantePin, INPUT);
  servo1.write(0);
  servo2.write(180);
}

void loop() {
  int angolo_servo_1 = servo1.read();
  int angolo_servo_2 = servo2.read();
  if(digitalRead(pulsantePin) == HIGH && angolo_servo_1 < 80 && angolo_servo_2 > 100){
    ascesa1();
  }
  if(digitalRead(pulsantePin) == HIGH && angolo_servo_1 == 80 && angolo_servo_2 == 100){
    ascesa2();
  }
  if(digitalRead(pulsantePin) == HIGH && angolo_servo_1 == 140 && angolo_servo_2 == 40){
    discesa();
  }
}

void ascesa1(){
  for(int i = 0; i <= 80; i++){ // sposta testina da 0 a 80 gradi
    servo1.write(i);
    servo2.write(180 - i);
    delay(singlestep);
  }
}

void ascesa2(){
  for(int i = 80; i <= 140; i++){ // sposta testina da 80 a 140 gradi
    servo1.write(i);
    servo2.write(180 - i);
    delay(singlestep);
  }
}

void discesa(){
   for(int i = 140; i >= 0; i--){ // sposta testina da 140 a 0 gradi
    servo1.write(i);
    servo2.write(180 - i);
    delay(singlestep);
  }
}