[résolu]Waveshield + detecteur d'obstacle

Bonjour!

Tout d'abord, une petite présentation pour mon premier post sur ce forum.
Je suis actuellement animateur enfance en Service Civique à l' Antipode MJC à Rennes.
Ayant grâce à mon parcours scolaire quelques compétences en électronique et programmation, j'ai animé il y' a quelque mois la fabrication d' un robot avec des enfants, dans le cadre d'un événement autour des nouvelles technologies se déroulant à l'Antipode. Un truc très simple avec une alim de pc, quelques ampoules et ventilos récupérés à droite à gauche.
Et puis j'ai découvert Arduino!
Du coup le robot évolue, et acquiert peu à peu la parole, grâce à une waveshield, les samples étant enregistré par les enfants (voix, mais aussi son urbains retravaillé...)
Le système fonctionne, mais on aimerais que la lecture de sample se fasse au moment ou quelqu' un s'approche du robot.
Mais quand j'essai d'activer la lecture d'un sample en fonction de l'état du capteur, le prog me retourne tout simplement qu'il n'arrive pas à lire le fichier son.

Voici ma boucle:

void loop() {
  
if (digitalRead(11)==0){     
   long rand=random(7);
  
  putstring(".");            // uncomment this to see if the loop isnt running
  switch (rand) {
    case 1:

      playcomplete("SOUND1.WAV");
      break;
    case 2:

      playcomplete("SOUND2.WAV");
      break;
    case 3:

      playcomplete("SOUND3.WAV");
      break;
    case 4:

      playcomplete("SOUND4.WAV");
      break;
    case 5:

      playcomplete("SOUND5.WAV");
      break;
    case 6:

      playcomplete("SOUND6.WAV");
      }
    }  
  }

C'est ma première solution, j'ai tenté pas mal d'autres chose mais sans succès. Mes cours de prog étant maintenant assez loin, je commence vraiment à sécher.

Le capteur est un GP2Y0D810Z0F, il renvoi la valeur "0" quand il détecte un obstacle. Quand je force la condition du if à 0, aucun souci, les sons sont lus de manière aléatoire sans arrêt.

Voilà, si quelqu un à une piste à me soumettre, j'aimerai bien trouvé la solution avant Vendredi, ce serait vraiment sympa, les enfants ont vraiment envie de voir le robot s'activer tout seul!

Merci !

if (digitalRead(11)==0)
Si la valeur lue est presque égale à 0 V, le test ne fonctionne pas, bien que ce soit effectivement un état LOW.
Utiliser plutôt un booléen true/false bien tranché.

Merci pour la réponse.

Voici le nouveau code.

void loop() {
 if (digitalRead(11)==LOW)
     etat = true;
     else
     etat = false;
     
if (etat=true){     
   long rand=random(7);
  
  putstring(".");            // uncomment this to see if the loop isnt running
  switch (rand) {
    case 1:

      playcomplete("SOUND1.WAV");
      break;
    case 2:

      playcomplete("SOUND2.WAV");
      break;
    case 3:

      playcomplete("SOUND3.WAV");
      break;
    case 4:

      playcomplete("SOUND4.WAV");
      break;
    case 5:

      playcomplete("SOUND5.WAV");
      break;
    case 6:

      playcomplete("SOUND6.WAV");
      }
    }  
  }

ça ne fonctionne pas. Je ne pense pourtant pas m'être trompé dans le code, la variable "etat" est initialisé en "false", pourtant les sons sont joué de manière continu.
Je pense pouvoir simulé l' état bas, donc la détection du capteur, en reliant la pin 11 à la masse non? Car dans ce cas, le moniteur me renvoi, comme avant, ce genre de chose:

Couldn't open file SOUND5.WAV.Couldn't open file SOUND4.WAV.Couldn't open file SOUND2.WAV.Couldn't open file SOUND6.WAV.Couldn't open file SOUND4.WAV.Couldn't open file SOUND2.WAV.Couldn't open file SOUND1.WAV.Couldn't open file SOUND6.WAV.Couldn't open file SOUND3.WAV.Couldn't open file SOUND1.WAV..Couldn't open file SOUND3.WAV.Couldn't open file SOUND1.WAV.Couldn't open file SOUND3.WAV..Couldn't open file SOUND4.WAV.Couldn't open file SOUND1.WAV..Couldn't open file SOUND2.WAV.Couldn't open file SOUND1.WAV..Couldn't open file SOUND6.WAV.Couldn't open file SOUND3.WAV.Couldn't open file SOUND2.WAV.Couldn't open file SOUND4.WAV.Couldn't open file SOUND1.WAV.Couldn't open file SOUND4.WAV.Couldn't open file SOUND5.WAV..Couldn't open file SOUND5.WAV.Couldn't open file SOUND5.WAV

Le "." devant le "Couldn't" indique que la condition est remplie.

Sa y est!

En réfléchissant un peu, je me suis dit que la pin 11 était peut être inutilisable car occupé par la librairie. Du coup j'ai essayé avec la 12, même résultat... Et en farfouillant sur internet, j'ai découvert que les pins 11,12 et 13 sont utilisés par la biblio. Du coup je me suis rabattu sur la 6, et ça marche ! Comme quoi des fois faut pas chercher très loin...

En tout cas merci pour le coup de main. Par contre, je n'ai pas réussi à utilisé le booleen, ça fonctionne avec la condition en digitalRead, mais pourrait-tu m'indiquer comment tu l'aurait écrit avec un booleen?

Merci !

LOW et HIGH sont directement des booléens.

Bonjour,

if (etat=true){

Avec cette ligne le if est toujours vrai (== pour un test d'égalité).

Essaye d'utiliser une broche analogique en digital pour éviter tout conflit avec la librairie :wink:

Bonjour,

Code:

if (etat=true){

Avec cette ligne le if est toujours vrai (== pour un test d'égalité).

Je suis tellement dans la précipitation, j'en oublie les bases ! Pas bon ça !

Essaye d'utiliser une broche analogique en digital pour éviter tout conflit avec la librairie

Dans ce cas, le code est le même? digitalRead(A0) ?

Merci.

NutzRobba:
Je suis tellement dans la précipitation, j'en oublie les bases ! Pas bon ça !

Le principal c'est de s'en rendre compte avant de lancer le truc pour une démo ou autre :grin:
Ce genre de if foireux a toujours le don de tout bugger au pire moment possible (loi de murphy).

Remarque : if(x == true) ou if (x) c'est la même chose.
De même if(x == false) ou if (!x).

NutzRobba:
Dans ce cas, le code est le même? digitalRead(A0) ?

C'est ça.

Merci beaucoup!

Le robot fonctionne nikel, il a maintenant sa place dans le hall pour annoncer le programme de la structure !

Y'a plus qu'a le faire marcher maintenant...

A plus