Un delay qui corresponde au temps de rotation d'un servo

Bonjour,
Hier j'ai joué avec mes SG90. La Datasheet nous parle de 0.1s pour 60deg, soit 0.3s pour 180deg.
Je pensais faire une fonction pour bouger mes servos, et qu'elle intègre une pause pour s'assurer que les servos sont bien arrivés.
En gros, si mon servo est à 0deg, que je lui dis servo.write(180), et bien qu'une pause de 0.3 se fasse. Ce produit en croix, je le fais avec map.

Seulement, depuis hier, j'ai essayé servo.read() dans tous les sens, avec byte, int, en déclarant la variable avant... j'ai pas compris quelque chose, et je ne comprends pas l'erreur.

Au secours.

#include <Servo.h>
Servo servo5;
Servo servo6;
byte angle5;
byte angle6;
int ledpin = 13;


void setup() {
  Serial.begin(9600);
  servo5.attach(5);
  servo6.attach(6);
  pinMode(ledpin, OUTPUT);

}

void loop() {
  // on commande les servos, les temps de pause se font automatiquement, enfin normalement
  servomove(0, 0); //servo5 à 0deg, servo6 à 0deg
  servomove(180, 180);
  servomove(0, 180);
  servomove(180, 0);
  servomove(90, 90);

}

void servomove(byte pos5, byte pos6) {
  digitalWrite(ledpin, HIGH); //allume la led pour montrer qu'il bosse
  servo5.read(byte oldpos5);  //j'essaie de lire la position actuelle
  servo6.read(byte oldpos6);  //id

  servo5.write(pos5);  //les servo se mettent en mouvement
  servo6.write(pos6);  //id

  //calcul du delay exact, 0.1s pour 60deg
  byte ecart5 = abs(oldpos5 - pos5); //compare la position origine du servo à la position de destination
  byte ecart6 = abs(oldpos6 - pos6); //id
  byte ecartmax = max(ecart5, ecart6); //compare les ecart, stocke le plus grand des deux
  map(byte iecart, 0, 300 , 0 , 180);  //fait le produit en croix entre le temps nécessaire et l'écart max relevé   //val = map(val, 0, 1023, 0, 180);
  delay(iecart);  //pause pile poil
  digitalWrite(ledpin, LOW); //éteint la led
}

Question bonus: le signal que j'envoie avec servo.write, est-ce que je peux l'envoyer à deux servos en même temps, sur le même pin (avec une soudure) ?

J'ai trouvé.
je poste la solution si ça fonctionne.

Je suppose que tu voulais quelque chose comme

byte temps = map (ecartmax , 0 , 300 , 0 , 180);
delay(temps);

lesept:
Je suppose que tu voulais quelque chose comme

byte temps = map (ecartmax , 0 , 300 , 0 , 180);

delay(temps);

Ouais ^^ j'ai du mal avec cette syntaxe. J'ai contourné le problème quand je me suis aperçu que ça ne fonctionnait pas

  rotime = ecartmax*1.9;  //300 ms / 180 deg = 1.7 ms/deg, j'ai vu large
  delay(rotime);

C'est pas joli, mais je me suis aperçu, comme noté en commentaire, que faire demi-tour, ça lui prend du temps. Quand le servo doit faire 0 à 180, il fait peut-être 0.3s
Mais quand on lui fait faire 0/180/0, il met plus de 0.6s

Le map est plus élégant, mais mon équation semble plus simple à régler...

Au final, voici mon code qui marche, fait maison, sans tricher. Les SG90 chauffent un peu, mais c'est choupinet ces trucs qui gigotent.

//  petite fonction sympa pour commander des servos
//  le temps de rotation optimal d'une commande à une autre
//  est automatiquement défini par la fonction
//  mon premier code qui marche, comme un grand!
//  kammo, 16/4/2018


#include <Servo.h>
Servo servo5; //pin 5 et 6 sont PWM
Servo servo6;
byte angle5;
byte angle6;
int ledpin = 13; //led témoin


void setup() {
  Serial.begin(9600);
  servo5.attach(5);  //servo5 est sur le pin D5
  servo6.attach(6);
  pinMode(ledpin, OUTPUT); //le pin led est une sortie

}

void loop() {
  // on commande les servos, delay() automatique
  servomove(0, 0); // fonction(position du servo5, position du servo6
  servomove(180, 0);
  servomove(0, 0);
  servomove(180, 90);
  servomove(0, 0);
  servomove(0,180);

}

void servomove(byte pos5, byte pos6) {
  digitalWrite(ledpin, HIGH); //allume la led pour montrer qu'il bosse
  byte oldpos5 = servo5.read();  //j'essaie de lire la position actuelle
  byte oldpos6 = servo6.read();  //id

  servo5.write(pos5);  //les servo se mettent en mouvement
  servo6.write(pos6);  //id

  //calcul du delay exact, 0.1s pour 60deg
  byte ecart5 = abs(oldpos5 - pos5); //compare la position origine du servo à la position de destination
  byte ecart6 = abs(oldpos6 - pos6); //id
  byte ecartmax = max(ecart5, ecart6); //compare les ecart, stocke le plus grand des deux
  int rotime; //temps de rotation
  /*Serial.println("Mesure d'écart sur servo5");
  Serial.print(oldpos5);
  Serial.print("     ");
  Serial.println(oldpos6);
  Serial.print(pos5);
  Serial.print("     ");
  Serial.println(pos6);
  Serial.print(ecart5);
  Serial.print("     ");
  Serial.println(ecart6);
  Serial.println (" ");
  Serial.print("Ecart max  ");
  Serial.println(ecartmax);
  Serial.println(rotime);*/
  
  rotime = ecartmax*1.9;  //300 ms / 180 deg = 1.7 ms/deg, j'ai vu large
  delay(rotime);
  digitalWrite(ledpin, LOW); //éteint la led
}

question bonus: oui, ça marche, le même signal de position peut être envoyé à deux servos en même temps.