lesept:
Je suppose que tu voulais quelque chose commebyte 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.