Go Down

Topic: Aide pour code simple arduino (Read 434 times) previous topic - next topic

Thab

Bonjour à tous,

Je suis nouveau sur arduino, je cherche à faire un robot qui s'oriente vers le son qu'il reçoit (dans un plan horizontal de 180°)

Ma méthode est simple et fonctionne (j'en ai déjà vu des exemples) : je met deux micros
avec une tension seuil, quand la tension seuil d'un micro est dépassée, je note (avec la fonction micros() ) l'instant de dépassement, ensuite je fais la différence des deux instants, puis je retrouve l'angle avec:
cos(a)*d=v*dt
avec a l'angle que forment les micros avec la source sonore (je considère que les deux ont le même, sinon la formule ne marche pas) , d la distance entre les deux micros , dt la différence de temps et v la célérité du son dans l'air.

Ensuite , dans une deuxième partie que je n'aborde pas pour l'instant, je demande au servomoteur de m'amener à l'angle trouvé.

J'ai pour matériel une arduino uno, un servomoteur de course -90°/+90° , deux micros

Je viens à vous concernant le code:

Je me suis familiarisé avec les fonctions basiques d'arduino seulement et je suis face
à un petit (j'espère) pb: Je crains que dans la loop(), relever le temps quand le micro est "HIGH" ne suffise pas, puisque , les deux micros ne recevant pas le son au même moment, je devrais refaire plusieurs fois la loop() et  à chaque fois, le temps s'actualisera, puisque le micro va rester HIGH, alors le premier instant auquel l'intensité sonore a été dépassé pour un des micros (le premier à recevoir le son) sera remplacé par le second instant relevé, puis le troisième, ect... si bien qu'au final le programme ne s'exécutera que lorsque les deux micros reçoivent du son, alors la différence de temps calculée sera nulle, ce qui ne m'avance pas...

J'ai une idée, mais je n'ai jamais programmé en arduino donc je ne sais pas vraiment si ça marche:
Code: [Select]

"j'ai sauté les affectations liées aux branchements, ect...", on a l'angle a et les grandeurs définies précédemment dt, v, et d
d=0,3
v=340
dt=0
if pinmicro1==High
  t1=micros()
  while pinmicro2==Low
      dt=micros()-t1
"de même dans le sens inverse"
if pinmicro2==High
  t2=micros()
  while pinmicro1==Low
      dt=micros()-t2
a=arcos(v*dt/d)  (on peut appeler arcos sur arduino??)
"Puis on commande le servomoteur de nous amener à l'angle voulu mais comme je vous ai dit je ne me préoccupe pas de cette partie-là pour l'instant (je devrais?)


Auriez-vous un avis sur la question? Pensez-vous que mon code marche? Si oui est-il améliorable? Sinon que devrais-je faire?

Désolé j'ai probablement fait des erreurs de syntaxe , oublié des analogRead où ce genre de choses...

Merci beaucoup de votre temps.

J-M-L

#1
Jun 04, 2018, 08:58 am Last Edit: Jun 04, 2018, 08:58 am by J-M-L
Pourquoi reposter, vous avez déjà 50 réponses dans votre post sur ce sujet ??? ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

Ton explication est un peu confuse, mais je crois comprendre que tu as peur que la présence de 2 capteurs rende difficile le chronométrage. A priori pas de souci si tu gères bien ton temps.

Tu peux faire ça en définissant des drapeaux (des variables booléennes qui passeront à true lorsque une certaine condition sera remplie). Dans ton cas, tu veux faire le calcul seulement quand les deux capteurs auront fait leur mesure : ce sera ta condition.

Le problème vient du fait que tu ne sais pas dans quel ordre seront faites tes deux mesures. Tu peux faire un truc comme ceci (je te laisse faire le vrai code) :

Code: [Select]
Dans l'entête, définir deux booléens :

bool mesureDroite = false;
bool mesureGauche = false;

Dans la loop :

while (!mesureDroite && !mesureGauche) {
  if (!mesureDroite) --> écouter à droite ; si mesure --> mesureDroite = true;
  if (!mesureGauche) --> écouter à gauche ; si mesure --> mesureGauche = true;
}

--> Les deux mesures sont faites, faire les traitements
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Thab

Mon premier post demande essentiellement de l'aide sur les matériaux , je me dis que c'est plus simple de scinder les deux sujets .

Je ne suis pas sur de comprendre , je suppose que !mesure signifie : pas de mesure pour l'instant ?

Si tu ne te places dans la boucle que quand rien n'est détecté , comment peux-tu y obtenir les deux mesures (ne pouvant être effectuées qu'à la détection et donc en dehors de la boucle while non? )

Par ailleurs mon code ne fera pas l'affaire ?
Merci de votre patience (il en faut Avec moi)

lesept

Je ne commente pas ton code, je te dis juste comment je le ferais...
(Dans ton code, il faut mettre les condition des if et des while entre parenthèses)

Quote
je suppose que !mesure signifie : pas de mesure pour l'instant ?
Oui, c'est bien ça : tu mets les booléens à true lorsque la mesure est faite d'un côté puis de l'autre et à ce moment-là, lorsque les deux mesures ont été faites, tu sors du while.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Thab

D'accord je te suis mais le fait que du son soit reçu ne va pas nous faire directement sortir du while avant qu'on ait pu faire nos mesures ? C'est bien un "et" et non un "Ou" dans le while non? D'ailleurs meme si c'est un "Ou" , ne risque-t-il pas de ne pas mesurer le temps du deuxieme micro quand même étant donné que lorsqu'il sera mesurable on sera sorti du while ?

En fait ce que tu fais c'est que tu mesures le temps en boucle jusqu à ce qu'un son soit détecté , alors tu arrêtes de le mesurer c'est ca ?

lesept

Non, on reste dans le while 'tant que' les deux mesures ne sont pas faites : c'est donc un 'et'.
Mais a priori les deux mesures seront faites très rapidement l'une après l'autre, l'important est que ceci permet de faire les deux sans s'occuper de l'ordre.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Thab

Si c'est un "et", alors une des deux mesures ne pourra pas se faire, si?
Le "while" impose, quand on est dedans, que rien n'est détecté, et dans cette boucle on vérifie que rien ne se passe, vérification qui me semble (encore une fois, c'est comme ça que je vois les choses et c'est très probablement moi qui ai tort) inutile et qui marchera forcément.

lesept

Oui après réflexion tu as raison : c'est un 'ou' pas un 'et'. On sort du while quand les deux seront 'true', et il faudra les repositionner tous les deux à 'false' à la fin de la loop pour recommencer une phase de mesure.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up