Voilà je bloque sur mon projet d'animation pour mon bateau télécommandé (il s'agit d'une reproduction d'un bateau des gardes côtes canadiens, de type RB-M45)
Pour ce bateau j'envisage l'animation d'une sirène d'intervention.
Ma radio est une FR-SKY X20S sous ETHOS, avec un récepteur SR8 Pro.
Je souhaite, dans un premier temps, pouvoir activer une sirène dans le bateau à l'aide d'un interrupteur sur ma radio et utilisant une carte arduino nano.
J'utilise simplement la fonction Tone avec une boucle FOR pour faire varier la tonalité.
A l'allumage du montage, j'arrive bien à déclencher la sirène, mais par contre impossible de l'arrêter. Je pense que je n'arrive pas à sortir de la boucle mais sans pour autant trouver la solution.
Voici le code utilisé :
Merci d'avance pour vos conseils
Bonne soirée
int data1;
const int HP=8;
void setup()
{
pinMode(HP, OUTPUT);
pinMode(9, INPUT);
}
void loop ()
{
data1=pulseIn(9,HIGH);
if (data1 <1500)
{
for (int B=1000; B>=500; B--)
{
tone (HP, B);
delay(4);
}
for (int B=500; B<=1000; B++)
{
tone (HP, B);
delay(4);
}
}
}
J'ai essayé mais ça ne fonctionne pas : j'acitve bien la sirène mais la boucle continue sans s'arrêter malgré le changement de position de l'interrupteur sur la radio :
position 1 : 988µs -> sirène activée
position 2 : 2012µs -> sirène (normalement ) activée
J'y ai apporté 2 "aménagements":
Un timout de 44000 uSecondes, ça évite, s'il n'y a pas de signal sur ce servo si le récepteur ou l'émetteur sont éteint(s), que le programme attende 1 seconde à chaque mesure, ce qui peut ralentir fortement ton programme.
Ajouté && (data1 > 0) dans la condition de démarrage de la sirène, en effet, si data1 vaut 0 (timout expliqué ci-dessus) on est dans les conditions de démarrage de la sirène (data1 <1500).
Il est bien claire que la sirène s'arrête à la fin d'un cycle complet et non pas sitôt la commande changée.
Bonsoir jp et merci une nouvelle fois pour ton aide.
Je vais faire un essai tout à l'heure mais j'avais pourtant testé avec la même syntaxe hier...
Pour tes améliorations, j'ai du mal à voir où tu les intègres dans le code : dans la loop ?
Bon si j'arrive à avoir le même résultat que toi je vais essayer d'aller un peu plus loin avec une seconde sirène sur un deuxième position de l'interrupteur...
Merci
C'est normal, j'ai oublié de te mette le code modifié ...
int data1;
const int HP = 8;
const int servo = 9;
void setup()
{
pinMode(HP, OUTPUT);
pinMode(servo, INPUT);
}
void loop ()
{
data1 = pulseIn(servo, HIGH, 44000);
if ((data1 <1500) && (data1 > 0)) // Si émetteur ou récepteur éteint, data1 = 0
{
for (int B=1000; B>=500; B--)
{
tone (HP, B);
delay(4);
}
for (int B=500; B<=1000; B++)
{
tone (HP, B);
delay(4);
}
}
else
{
noTone(HP);
}
}
Toutes mes excuses.
Le problème est qu'elles ne pourront pas fonctionner ensemble, la méthode utilisée actuelle est dite bloquante, c'est à dire que tu ne peut rien faire d'autre pendant ce temps.
Oui j'ai bien cette règle de fonctionnement en tête, c'est pour alterner entre l'une ou l'autre.
Aucun problème, merci encore pour ton aide.
Je me demande si je ne vais pas appliquer tes améliorations sur un autre de mes codes, qui répond à mes attentes, mais qui pourrait être amélioré avec ta proposition. Ce programme me permet de gérer les scenarios des feux de navigation, l'allumage/extinction d'un radar, de différents projecteurs et du balisage du pont. Je peux éventuellement le partager pour ceux que ça pourrait intéresser...
Surtout veinard d'avoir des gens comme toi pour aider
Voilà le code fonctionne, avec un inter 3 positions il est possible d'avoir une sirène avec 2 modes de fonctionnement. J'ai décalé le seuil inférieur à 1300µs et le seuil supérieur à 1700µs pour avoir une zone neutre plus large, pour le coup c'est bien large !!
Les tonalités, dans la fonction "tone", sont adaptables selon les goûts de chacun afin d'avoir l'effet de sirène recherché.
Peut-être qu'une dernière optimisation consisterait à remplacer les 2 delays par des millis...
Ah je n'avais pas parlé de la partie hardware mais pour cet exemple j'ai suivi le montage utilisé par Thonain dans une de ses vidéos sur youtube, j'ai donc utilisé un petit HP de récupération (8ohms/3W) un transistor TIP122 et 2 résistances de 18kOhms et 5,6Ohms, c'est tout !
A voir si besoin, je pourrai joindre le schéma mais le branchement est bien visible dans la vidéo.
Voici donc le code fonctionnel, grâce à jp :
int data1;
const int HP = 8;
const int servo = 9;
void setup()
{
pinMode(HP, OUTPUT);
pinMode(servo, INPUT);
}
void loop ()
{
data1 = pulseIn(servo, HIGH, 44000);
if ((data1 <1300) && (data1 > 0)) // Si émetteur ou récepteur éteint, data1 = 0
{
for (int B=1000; B>=500; B--)
{
tone (HP, B);
delay(4);
}
for (int B=500; B<=1000; B++)
{
tone (HP, B);
delay(4);
}
}
else
{
noTone(HP);
}
if ((data1 >1700) && (data1 > 0)) // Si émetteur ou récepteur éteint, data1 = 0
{
for (int B=900; B>=700; B--)
{
tone (HP, B);
delay(1);
}
for (int B=700; B<=900; B++)
{
tone (HP, B);
delay(0.8);
}
}
else
{
noTone(HP);
}
}