Je suis à la fois content de moi et à la fois très frustré.
Dans un but de HighSpeed Photography, j'ai réussi à faire un montage qui tient la route et un code qui fait ce que je veux.
Sauf qu'il ne le fait pas quand je veux.
Normalement, il doit attendre Un premier bruit fort pour déclencher l'appareil photo (qui est en mode BULB)
Le son est géré par en sensor qui me renvoie un signal digital si je dépasse un seuil réglé par un potentiomètre intégré au sensor. Pas de threshold dans le code donc puis géré dans le sensor directement.
Au boum suivant, il doit déclencher le flash.
Puis après une petite pause, il doit couper l'appareil photo.
Seulement, avant qu'il y ait du bruit, il me déclenche le flash. Ensuite l'appareil photo, ensuite il coupe l'appareil photo. Mais il n'attend aucun bruit pour faire les choses, dans le mauvais ordre qui plus est (mais je n'en suis pas sur à 100% il les fait peut-être presque en même temps et le flash est plus rapide que l'appareil).
Voici mon code
int flashPin = 13; // pin qui declenche le flash
int soundPin = 7; // pin qui capte le signal du son
int boutonPin = 7; // pin qui lit le bouton. Idem que son en attendant achat bouton
int dslrPin = 5; // pin qui declenche la cam
int lightPin = 3; // pin qui capte la variation lumineuse
int relayPin = 2; // pin qui coupe la lumiere dans la piece
int bruit = 0; // variable de lecture du son
int bouton = 0; // variable de lecture du bouton start
int etape = 1; // variable d'etat
void setup()
{
pinMode(soundPin, INPUT); // capteur du son est une entree
pinMode(lightPin, INPUT); // capteur de lumiere est une entree
pinMode(boutonPin, INPUT); // bouton de mise en route (soundtrigger en attendant achat)
pinMode(dslrPin, OUTPUT); // declenchement de la cam est une sortie
pinMode(flashPin, OUTPUT); // declenchement du flash est une sortie
pinMode(relayPin, OUTPUT); // relais 220V pour couper ou allumer la lampe dans la piece
}
void loop()
{
switch(etape) {
case 1: {
// on attend le bouton de mise en route qui existe pas encore donc sound a la place
bruit = digitalRead(soundPin); // lecture du son
if (bruit = HIGH)
{
// digitalWrite(relayPin, LOW); // on coupe la lumiere via le relais
delay(50); // on attend 50 millisecondes pourrait etre remplace par lecture lightPin
digitalWrite(dslrPin, HIGH); // on ouvre obturateur du dslr
etape++; //increment pour etape suivante
}
break;
}
case 2: {
// on ecoute le son de declenchement
bruit = digitalRead(soundPin); // lecture du son
if (bruit = HIGH)
{
digitalWrite(flashPin, HIGH); // declenchement du flash
delay(20);
digitalWrite(flashPin, LOW); // arret envoi signal au flash
etape++; //increment pour etape suivante
}
break;
}
case 3: {
// on revient dans le monde normal
delay(50); // petite pause
digitalWrite(dslrPin, LOW); // fermeture obturateur
delay(50); // petite pause
// digitalWrite(relayPin, HIGH); // on allume la lumiere
etape++; //increment pour etape suivante
break;
}
default: {
break; // on ne fait rien
}
}
}
Sais-tu combien de temps ton capteur de bruit maintient-il le signal haut sur soundPin ?
Parce qu'effectivement s'il dure plus que le temps de traitement de la première étape...
J'ai mis des pauses, j'ai baissé le potentiomètre au plus plus bas et pourtant même comportement, moins rapide bien sur.
int flashPin = 13; // pin qui declenche le flash
int soundPin = 7; // pin qui capte le signal du son
int boutonPin = 7; // pin qui lit le bouton. Idem que son en attendant achat bouton
int dslrPin = 5; // pin qui declenche la cam
int lightPin = 3; // pin qui capte la variation lumineuse
int relayPin = 2; // pin qui coupe la lumiere dans la piece
int bruit = 0; // variable de lecture du son
int bouton = 0; // variable de lecture du bouton start
int etape = 1; // variable d'etat
void setup()
{
pinMode(soundPin, INPUT); // capteur du son est une entree
pinMode(lightPin, INPUT); // capteur de lumiere est une entree
pinMode(boutonPin, INPUT); // bouton de mise en route (soundtrigger en attendant achat)
pinMode(dslrPin, OUTPUT); // declenchement de la cam est une sortie
pinMode(flashPin, OUTPUT); // declenchement du flash est une sortie
pinMode(relayPin, OUTPUT); // relais 220V pour couper ou allumer la lampe dans la piece
}
void loop()
{
switch(etape) {
case 1: {
// on attend le bouton de mise en route qui existe pas encore donc sound a la place
delay(5000);
bruit = digitalRead(soundPin); // lecture du son
if (bruit = HIGH)
{
// digitalWrite(relayPin, LOW); // on coupe la lumiere via le relais
delay(50); // on attend 50 millisecondes pourrait etre remplace par lecture lightPin
digitalWrite(dslrPin, HIGH); // on ouvre obturateur du dslr
etape++; //increment pour etape suivante
}
break;
}
case 2: {
// on ecoute le son de declenchement
delay(5000);
bruit = digitalRead(soundPin); // lecture du son
if (bruit = HIGH)
{
digitalWrite(flashPin, HIGH); // declenchement du flash
delay(20);
digitalWrite(flashPin, LOW); // arret envoi signal au flash
etape++; //increment pour etape suivante
}
break;
}
case 3: {
// on revient dans le monde normal
delay(5000); // petite pause
digitalWrite(dslrPin, LOW); // fermeture obturateur
delay(50); // petite pause
// digitalWrite(relayPin, HIGH); // on allume la lumiere
etape++; //increment pour etape suivante
break;
}
default: {
break; // on ne fait rien
}
}
}
Tu devrais tester le sensor en lui même, dans ta boucle tu met la led du pin 13 à l’état que tu reçoit, et tu regarde si en tournant le potentiomètre elle s'éteint
int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // soundsensor connected to digital pin 7
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}
void loop()
{
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button's value
}
Quand je "frappe" sur le bureau, la LED 13 s'allume
Si j'augmente le potentiomètre (enfin je tourne dans le sens des aiguilles d'une montre, ce que j'assimile à augmenter), la LED est allumée constamment. Quand je frappe sur le bureau, elle s'éteint.
Si je pousse le potentiomètre à fond, elle reste allumée tout le temps.
A noter, il y a deux leds sur le sensor.
Si on regarde l'image
La led en haut de l'image (texte en Chinois au dessus de VCC) est allumée dès qu'il y a du courant.
La led en bas de l'image (texte en Chinois en dessous de OUT) est allumée à l'opposé de la LED 13 de l'Arduino.
Quand il réagit au bruit, l'allumage de la LED 13 éteint la LED en question sur le senseur. Et quand la LED 13 s'éteint, la LED du sensor se rallume.
Quand je change le potentiomètre, j'ai cette LED allumée tout le temps (quand je suis sous le niveau de bruit ambiant) ou éteinte tout le temps quand le potentiomètre est monté.
Dans le setup, c'est pas tout de déclarer qui est en sortie et qui est en entrée, il faut aussi fixer les états des sorties qui sont dans un état indéterminées.
c'est juste que c'est inversé dans ce cas là, règle ton potentiomètre pour que la led du capteur ne soit allumée que quand tu tape sur la table et remplace dans ton code les :
Alors en fait, c'est l'ensemble de vos réponses qui a amené à la solution.
D'abord le signal du sensor est inversé et ensuite le signal restait trop longtemps actif donc il faisait les 4 étapes à chaque fois.
Voici mon code final, y compris l'écriture sur le port série pour le débogage. :
int flashPin = 13; // pin qui declenche le flash
int soundPin = 7; // pin qui capte le signal du son
int boutonPin = 7; // pin qui lit le bouton. Idem que son en attendant achat bouton
int dslrPin = 5; // pin qui declenche la cam
int lightPin = 3; // pin qui capte la variation lumineuse
int relayPin = 2; // pin qui coupe la lumiere dans la piece
int bruit = 0; // variable de lecture du son
int bouton = 0; // variable de lecture du bouton start
int etape = 1; // variable d'etat
void setup()
{
pinMode(soundPin, INPUT); // capteur du son est une entree
pinMode(lightPin, INPUT); // capteur de lumiere est une entree
pinMode(boutonPin, INPUT); // bouton de mise en route (soundtrigger en attendant achat)
pinMode(dslrPin, OUTPUT); // declenchement de la cam est une sortie
pinMode(flashPin, OUTPUT); // declenchement du flash est une sortie
pinMode(relayPin, OUTPUT); // relais 220V pour couper ou allumer la lampe dans la piece
Serial.begin(19200);
}
void loop()
{
switch(etape) {
case 1: {
// on attend le bouton de mise en route qui existe pas encore donc sound a la place
bruit = digitalRead(soundPin); // lecture du son
if (bruit != HIGH)
{
// digitalWrite(relayPin, LOW); // on coupe la lumiere via le relais
delay(50); // on attend 50 millisecondes pourrait etre remplace par lecture lightPin
digitalWrite(dslrPin, HIGH); // on ouvre obturateur du dslr
Serial.print( bruit );
Serial.print( etape );
Serial.println ();
delay(500); // petite pause
etape++; //increment pour etape suivante
}
break;
}
case 2: {
// on ecoute le son de declenchement
bruit = digitalRead(soundPin); // lecture du son
if (bruit != HIGH)
{
digitalWrite(flashPin, HIGH); // declenchement du flash
delay(20);
digitalWrite(flashPin, LOW); // arret envoi signal au flash
Serial.print( bruit );
Serial.print( etape );
Serial.println ();
delay(500); // petite pause
etape++; //increment pour etape suivante
}
break;
}
case 3: {
// on revient dans le monde normal
digitalWrite(dslrPin, LOW); // fermeture obturateur
delay(50); // petite pause
// digitalWrite(relayPin, HIGH); // on allume la lumiere
Serial.print( bruit );
Serial.print( etape );
Serial.println ();
delay(500); // petite pause
etape++; //increment pour etape suivante
break;
}
default: {
Serial.print( bruit );
Serial.print( etape );
Serial.println ();
etape = 1;
break; // on ne fait rien
}
}
}