Arduino et capteur sonore..

a marqué ce sujet comme résolu.

Bonjour, je suis en train de chercher à programmer l’arduino avec un capteur sonore et un servo; pour que celui ci se déclenche à l’arrivée d’un son. ça marche à peu près même si je ne comprend pas tout ce que je fais. le programme est très court et ne répond pas toujours correctement;

ceci dit, j’ai un soucis pour conserver l’angle du servo : capteur HIGH angle 120 capteur LOW angle 10; le probleme est en cas de bruit continu, le servo refait sans cesse sa boucle pour aller à 120. il ne reste pas en continu tant que le capteur est HIGH; si quelqu’un à un petit temps pour m’aider..ce serait cool.

voici le micro programme qui ne doit pas être adapté j’imagine :

include <Servo.h>

const int capteur =0; int pinServo=2; Servo servo1;

void setup() { pinMode(capteur, INPUT); servo1.attach(pinServo); }

void loop() { if(digitalRead(capteur)== LOW)

{ servo1.write(10); delay(70); }

if(digitalRead(capteur)== HIGH) { servo1.write(120); delay(70); } }

+0 -0

Met en forme ton code s’il te plait. A l’avenir fait comme ça pour afficher du code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <Servo.h> 

const int capteur =0;
int pinServo=2;
Servo servo1;

void setup()
{
   pinMode(capteur, INPUT);
   servo1.attach(pinServo);
}

void loop()
{
if(digitalRead(capteur)== LOW)

   {
   servo1.write(10);
   delay(70);
   }

if(digitalRead(capteur)== HIGH)
   {
   servo1.write(120);
   delay(70);
   }
 }
+1 -0

Comme je comprend, ta boucle tournent. On va dire qu’il n’y a pas de son, donc le moteur va a 120.

Et la, tac il y a un son, le moteur va a 10 et attend 70ms (soit 0.07 secondes) et continue, mais si après il n’y a plus de son, il va retourner à 120°.

Tu ne dis pas de quel arduino tu disposes, donc je ne peux pas t’assurer que ce que je dis va changer quelque chose.

As-tu vérifié que ton pin de sortie est bien considéré "pwm" ?

Exemple

Car certaines sorties digitales sont prévues pour les moteurs, d’autres non.

Hello,

si je puis te suggérer quelques trucs :

  • sors ton delay(...) de tes conditions. ça ne changera pas le comportement mais comme c’est un truc commun aux deux if et que tu évalues toutes les possibilités…

  • ensuite, pour éviter que ton servo n’entre en oscillation, tente de stocker dans un tableau de booléens un certain nombre de "mesures" séparées d’un certain laps de temps. Implémente ensuite ce qu’on pourrait appeler un vote à la majorité : si dans ton tableau, tu trouves plus de valeurs où il y a du bruit que celles où il n’y en a pas, tu agis en conséquence. Tu filtres le bruit du bruit (xD). En gros, il te faut un peu de traitement du signal.

A++

Greg

+1 -0

MERCI winxaito, judepom et wilin d’avoir pris le temps.

alors Winxaito: oui c’est ça il est en boucle tant qu’il y a du son il revient à 10 et repart à 120 sans cesse. pas moyen de rester fixe. par contre sans son, il reste fixe.

Judepom : j’ai testé les pwm et le servo fait n’importe quoi; c’est pire. peut etre qu’il faut une programmation analogique pour lui permettre de traiter le signal.. je ne sais pas.merci pour le plan; bien clair.

wilin : si j’enleve delay, le moteur ne peut pas aller a son degré ; il fait des micros allers retours. pour l’histoire du tableau booléen et tout l’toutim, ça dépasse mes compétences actuelles.aurais tu un exemple pour je puisse voir a quoi ça ressemble..?

merci encore les gars.

Bonjour,

Essaie quelque chose dans le style là :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <Servo.h> 

const int capteur =0;
int pinServo=2;
Servo servo1;

const int buffersize = 5; // taille de la memoire
bool membuffer[buffersize];
int ind = 0; // position actuelle dans la memoire

int i = 0;
int cpt = 0;

void setup() {
  pinMode(capteur, INPUT);
  servo1.attach(pinServo);

  for (i=0; i<buffersize; i++) {
    membuffer[i] = false;
  }
}

void loop() {
  if(digitalRead(capteur) == HIGH) {
    membuffer[ind] = true;
  } else {
    membuffer[ind] = false;
  }
  ind = (ind + 1) % buffersize;

  cpt = 0;
  for (i=0; i<buffersize; i++) {
    if (membuffer[i]) {
      cpt++;
    }
  }

  if (cpt>=buffersize/2) {
    servo1.write(120);
  } else {
    servo1.write(10); 
  }

  delay(70);
}

Je n’ai pas pu le tester, n’ayant pas d’arduino.

MerciJudepom; je vais tester ça. ne faut il pas mettre le servo sur pin 9(pwm) et le capteur sur A0 ?

je viens de tester.. il ne se passe rien; j’ai aussi testé en changeant les pin dans le programme et sur la carte (uno). nada. à suivre…

+0 -0

J’ai laissé les pins que tu avais mis, mais il y a des chances qu’il vaille mieux changer.

De plus, tu n’avais pas précisé ton modèle d’arduino donc je n’ai pas pu vérifier que les I/Os étaient bons.

EDIT: Les ports PWM de l’arduino UNO sont marqués par un "-":

Sorties PWM arduino UNO

Comme je l’ai dis, je n’ai pas testé le code.

Sinon, tu peux essayer en comparant la valeur courante à la dernière valeur lue.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
int current = 0;
int last = 0;
int target = 10;

void setup() {
  pinMode(capteur, INPUT);
  servo1.attach(pinServo);
}

void loop() {
  current = digitalRead(capteur);

  if (last != current) {
    target = current == HIGH ? 120 : 10;
    last = current;
    delay(70);
  }

  servo1.write(target);
}

Comme précédemment, je n’ai pas testé, donc n’hésite pas à adapter.

+0 -0

merci encore de ton effort. là le servo gigotte tout le temps, si on envoie un son il va a son angle en tremblotant aussi.. en fait la carte est une sainsmart uno mais ça ne change rien je pense. j’ai testé sur differents broches. rien ne change. bref. je vais ptet garder le premier code que j’avais fait. je verrai une fois en place si ça passe niveau mouvement. merci

Augmente le delay à 500ms pour t’assurer que le mouvement soit complet, et met le servo.write() avant celui-ci (oui, c’était stupide de le faire bouger après :P).

En plus de ton servo, tu peux essayer de brancher une LED sur un autre pin et regarder si elle s’allume bien (sur un port PWM tu peut faire varier son intensité).

T’as la référence de ton capteur? Parce que il existe ce qu’on appelle le théorème de Shannon, qui t’oblige à mesurer un signal au moins deux fois plus rapidement que sa plus grande fréquence. Pour de l’audio, ça serait 20kHz, et donc tu devrais échantillonner à au moins 40kHz. Je sais pas si ton capteur effectue déjà un traitement ou pas… Si tu ne mesures pas correctement, il se peut que ta "boucle de réglage" n’agisse pas juste.

alors là le mouvement est très clean.par contre en son continu pareil, il retourne au point 0 pour refaire son mouvement sans cesse.. changer sur des pwm ne modifie pas le mouvement. Si je descends a delay 200 , le servo fait des allers retours sans cesse; à 400 ça marche.

Wheelin; le capteur c’est celui là : http://www.ebay.fr/itm/332029864873?_trksid=p2060353.m2749.l2649&var=541065393397&ssPageName=STRK%3AMEBIDX%3AIT

As-tu vérifié que ton capteur était bien réglé ? Tu as la LED d’activité sur ton capteur qui t’indique cela. Si en cas de bruit que tu considères suffisant pour être détecté elle clignote ne serait-ce qu’un tout petit peu, alors ton capteur est mal réglé. (Tu as la petite vis pour cela).

Pour le delay, c’est vraiment en fonction de ce que tu comptes faire avec. Si tu veux éviter que ça navigue non-stop, il faut que tu le règles sur le temps de déplacement d’une position à l’autre (à moins que tu aies un retour de position du servo).

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte