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!
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é.
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.
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?
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
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) ?