Incompréhension de ce programme...

Bonjour,

Je débute sur Arduino avec un châssis roulant de chez EasyRobotics.

Voici mon premier programme qui fait avancer et reculer sans cesse le robot :

int moteurGauche = 3 ; 
int moteurDroit = 11 ; 
int dirGauche = 12 ; 
int dirDroite = 13 ;


void setup()
{
pinMode(moteurGauche, OUTPUT) ; 
pinMode(moteurDroit, OUTPUT) ;
pinMode(dirGauche, OUTPUT) ;
pinMode(dirDroite, OUTPUT) ;

analogWrite(moteurGauche, 175) ;
analogWrite(moteurDroit, 140) ;
}

void loop()
{
avance() ;
delay(5000) ;
recule() ;
delay(5000) ; 
}

//fonction pour faire avancer, reculer, etc...

void avance()
{
digitalWrite(dirGauche, HIGH) ;
digitalWrite(dirDroite, HIGH) ;
}
void recule()
{
digitalWrite(dirGauche, LOW) ;
digitalWrite(dirDroite, LOW) ;
}

Après plusieurs essai je me suis aperçu que c'était la fonction delay qui fixer le temps de fonctionnement de chaque moteur donc la distance qu'il allait parcourir.

Et c'est la que je ne comprend pas pourquoi. La fonction delay est censé arrêter le programme en cours de la valeur entre parenthèse. Donc pourquoi le faite d'arrêté le programme durant 5s fait que ce sont les moteurs qui fonctionne durant 5s.....??????

Quand j'ai écrit ce programme je me suis dit que sa ne pourrait pas marcher vu que rien n'indiquer au moteur combien de temps devais il tourner et pourtant malgré sa...

Merci de m'éclairer :)

Exemple : Tu allumes la lumière dans la cuisine et tu sors pour aller faire une sieste sur le canapé, si tu n'a pas changé la position de l'interrupteur.... et ben la lumière va rester allumée pendant ta sieste.

Les sorties restent dans la dernière position pendant le delay()

C'est vrai qu'avec une approche un peu sémantique, c'est-à-dire digne d'un humain moyen (par opposition au bidouilleur acharné), le code ci-dessous est trompeur.

void loop()
{
avance() ;
delay(5000) ;
recule() ;
delay(5000) ; 
}

Naïvement on pourrait croire qu'on avance un peu, puis on attend 5 secondes, etc.

Le nom des fonctions aurait pu être mieux choisi, pour correspondre davantage à l'action induite. J'imagine que la version ci-dessous te semblerait moins perturbante

void loop()
{
enclencherLaMarcheAvant() ;
delay(5000) ;
enclencherLaMarcheArriere() ;
delay(5000) ; 
}

En faite le délai de 5s, dit au programme d’attendre ce laps de temps avec de passer à l’instruction suivante si je vous suis bien?

Donc il avance effectivement durant 5s…

Je ne pense pas que ce soit la meilleur façon pour faire faire ces premier tour de roue à un Robot. Car en plus la vitesse de rotation
des moteurs intervient dans la temps de déplacement sur une distance souhaité.

Y’a t’il une sorte de fonction propre au langage Arduino pour faire une correspondance entre le déplacement effectuer en
un tour de roue et la distance que l’on souhaite parcourir?

Un exemple simple, lui faire faire un trajet représentant un carré de 60cm de coter.

Mon matériel actuel utilise un châssis roulant EasyRobotics avec deux ServoMoteur don j’ai retiré toute l’électronique
et qui sont pilotés par une carte Ardumoto.

Je vous rassure je fait partie de ceux qui aime chercher et qui n’attend pas une réponse avec la solution
mais juste me mettre sur la voie :wink:

bonjour,

Y'a t'il une sorte de fonction propre au langage Arduino pour faire une correspondance entre le déplacement effectuer en un tour de roue et la distance que l'on souhaite parcourir?

Un exemple simple, lui faire faire un trajet représentant un carré de 60cm de coter.

disons que c'est du calcul pur et dur. rayon roue? c'est loin mais de mémoire ca doit être 2xPIxR

C'est pour celà que sur les robots qui se veulent un peu plus évoluer (materiellement parlant en tout cas) il y a un asservissement de la position. Soit moteur CC + fourche IR, soit moteur pas à pas.

La ton problème c'est que sur moteur CC seul c'est compliqué. Le moindre paramètre changé et ta correspondance temps moteur / distance partira en cacahuète ...

Je ne souhaite pas bruler les étapes donc déjà dans un premier temps je vais faire en sorte

qu'il puisse avancer droit. Car la différence entre les moteurs fait qu'il d'écrit un arc de

cercle quand il avance :(

Est il possible pour commencer de ne faire qu'un asservissement en "Position" ou en "Vitesse"?

Je ne sais pas lequel est le plus approprié???

Pour faire un asservissement, il faut une information en retour pour fermer la boucle.
Il va falloir ajouter des capteurs sur tes roues pour avoir une information sur leur vitesse de rotation.

Au delà de la recommandation de fdufnews, si tu veux bricoler "à la main" en attendant d'avoir mieux materiellement, au lieu d'utiliser digitalWrite() utilise analogWrite() pourvu que tu te raccordes à un pin PWM

Je pense que mes moteurs sont loin d’être mauvais et les changer n’apportera pas de changement sinon les
asservissement n’existerais pas :wink:

Pour les encodeurs, j’ai déjà une idée de la manière de les mettre en place mais ma question porté surtout sur
le faite de quelle asservissement j’ai besoin ?

Je sais qu’il existe en “Vitesse”, “position” et “Angle”. Pour commencer et me faire la main, du quelle est je besoin
pour que le Robot puisse garder une trajectoire rectiligne?

A priori c'est un asservissement en vitesse qui est nécessaire. Si les 2 roues tournent à la même vitesse la trajectoire sera rectiligne. Les asservissement en position et angle sont plutôt réservés aux cas où on veut positionner précisément un actionneur sur une trajectoire (CNC, bras robot, ..)

Je vais creuser de ce coter la alors ;)