Due servo e apertura porta

Salve stavo realizzando un progetto dove utilizzavo due servo motori (Tower Pro 9g) per aprire una porta a due ante. Quindi ho un servo motore che gestisce l’anta dx della porta e un altro che gestisce quella sinistra. Sto riscontando problemi sia per "calibrare " le due ante poichè mi trovo a gestire due angoli diversi dove per il servo di dx in apertura porta devo decrementare l’indice mentre per l’anta sx devo incrementare. Inoltre avrei necesstà di realizzare l’apertura delle due ante contemporaneamente . Ho scritto del codice che non soddisfa quello che vorrei realizzare:

#include <Servo.h> 
 
Servo dx;
Servo sx;
int button = 3;
// create servo object to control a servo 
// a maximum of eight servo objects can be created 
 
int posdx = 0;    // variable to store the servo position 
int possx = 0;
int val = 0;
int stato = 0;

void setup() 
{ 
  dx.attach(9);  // attaches the servo on pin 9 to the servo object 
  dx.write(105);
  
  sx.attach(10);
  sx.write(40);
  pinMode(button,INPUT);
  Serial.begin(9600);
  Serial.println(dx.read());
  Serial.println(sx.read());
} 
 
 
void loop() 
{ 
  val = digitalRead(button);
  if(val)
  {
  for(posdx = 105; posdx <= 0; posdx -= 1)
  {                                  
    dx.write(posdx);             
    delay(15);                       
  }
  
  for(possx = 40; possx <= 130; possx += 1)  
  {                                  
    sx.write(possx);              
    delay(15);                       
  }
  
  
  
  for(posdx = 0; posdx <= 105; posdx += 1)  
  {                                  
    dx.write(posdx);              
    delay(15);                        
  } 
  
  
  // SX
  
  for(possx = 130; possx <= 30; possx -= 1) 
  {                                  
    sx.write(possx);              
    delay(15);                      
  }
  }
  Serial.println(dx.read());
  Serial.println(sx.read());
}

Ma l’anta sinistra non capisco il perchè non passa per l’ultimo ciclo for e non riesco ad ottenere la simultaneità delle operazioni. Per fare questo dovrei utilizzare un ciclo per l’apertura di entrambe le ante e uno per la chisura ma questo non mi è possibile poichè ,come già detto gli angoli ,sono diversi e i servo funzionano al contrario (uno va incrementato l’altro decrementato).
Non so se sono stato molto chiaro. Grazie.

Lo puoi fare in diversi modi.
Puoi crearti due array in cui memorizzi le posizioni intermedie, il ciclo for lo farai sull’indice degli array.
Se fai 20 step, da 0 a 19, avrai una cosa simile a:

for (int i = 0; i < 20; i++)
{
int posdx = destra[i];
int possx = sinistra[i];
dx.write(posdx);
sx.write(possx);
delay(100);
}

Così ti basterà scrivere le 20 posizioni intermedie nei due array destra e sinistra.

Per chiudere ti basta un altro ciclo for in cui i parte da 19 e finisce a 0.

Se crei un array anche per i delay, puoi mettere ritardi diversi nei vari passi ed avere così una apertura lenta all’inizio, poi veloce in mezzo e poi lenta alla fine. La stessa cosa per la chiusura.
Ti basta creare un altro array pause e mettere il

pause[i]

come valore del delay nel for.

Ciao grazie mille per la risposta!
Ho modificato il programma in questo modo:

#include <Servo.h> 
 
Servo dx;
Servo sx;
int i;
// create servo object to control a servo 
// a maximum of eight servo objects can be created 
 
int posizionidx[] = {105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0};    // 22 
int posizionisx[] = {35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140}; //22
int poscorrdx;
int poscorrsx;
int val = 0;
int stato = 0;

void setup() 
{ 
  dx.attach(9);  // attaches the servo on pin 9 to the servo object 
  dx.write(105);
  
  sx.attach(10);
  sx.write(40);
  
  Serial.begin(9600);
  Serial.println(dx.read());
  Serial.println(sx.read());
  delay(3000);
} 
 
 
void loop() 
{ 
  if(val==0) {
  for(i=0;i<22;i++)
  {
    poscorrdx = posizionidx[i];
    poscorrsx = posizionisx[i];
    
    dx.write(poscorrdx);
    sx.write(poscorrsx);
    delay(200);
    Serial.println(poscorrdx);
    Serial.println(poscorrsx);
  }
  
  for(i=22;i<0;i--)
  {
    poscorrdx = posizionidx[i];
    poscorrsx = posizionisx[i];
    
    dx.write(poscorrdx);
    sx.write(poscorrsx);
    delay(200);
  }
val=1;
}}

Ora l’apertura è ok ma il secondo ciclo for non viene eseguito infatti le ante restano aperte, sapresti aiutarmi? Grazie. :slight_smile:

EDIT: Risolto, errore di scrittura ho invertito il minore con il maggiore! Grazie.

Un'altra domanda c'è qualche cosa che posso fare per evitare il "buzz" di uno dei due servo? ovvero quel fastidioso rumore che fa quando è fermo?