Magieweb,
remplacer les delay() par des boucles while ne va pas servir à grandes choses. Si je te comprends bien, tu as des soucis que ton controle de moteur va manquer de précision si le robot est occupé avec l'ultrason.
D'abord if faut se poser la question, quel temps de réaction est nécessaire pour tes moteurs. Si ton récepteur ultrason est la seul source de stimulus pour ton robot et la gestion des moteurs est reduit a ajuster la vitesse, ta première idée suffisait.
int vitesse=0;
loop () {
// Ping ultrason
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
// Mesure ultrason
int duration = pulseIn(inPin, HIGH);
int cm = microsecondsToCentimeters(duration);
// Controle du moteur
if (cm < 30 && vitesse > VStop) {
// Freiner
vitesse = VStop;
setSpeed (vitesse);
}
elsif (cm >= 30 && vitesse < VFoncer) {
// Foncer
vitesse = VFoncer;
setSpeed (vitesse);
}
}
Un petit détail, je contrôle la vitesse que si elle doit changer, dans certaines instances c'est préférable, dans d'autres ça joue aucun rôle.
Tu commences à avoir de problèmes, lorsque le temps que tu prends pour les mesures te bloque le moteur ou vice-versa. Dans ce cas, tu as deux scénario possible:
Si les durées sont relativement longes (quelques millisecondes), tu crée quasi un calendrier avec des tâches et dans loop() tu enlèves tout delay() ou boucles d'attente. A chaque interation de loop, tu vérifies seulement sur le calendrier ce qui est à faire à ce tour.
Si les durées sont courtes (microsecondes) tu vas avoir besoin de fonctions d'interruption. Mais ça, c'est un peu plus compliquer et souvent pas nécessaire.
Korman