Gestion d'une source de signal
Le circuit suivant est une version simplifiée d'un système plus complexe. À des fins de test, le 555 Timer a été ajouté pour servir de source de signal de test avec des fréquences définies par les résistances en série. Chaque signal arbitraire est indiqué par un bouton poussoir et l'Arduino doit pouvoir distinguer quel bouton a été enfoncé. Malheureusement, il ne peut y avoir que 3 boutons et d'autres ne peuvent pas être ajoutés. C'est là que le problème se produit. Comment pouvez-vous indiquer de manière fiable quel bouton-poussoir a été enfoncé sans interférer avec la forme d'onde arbitraire?
Au début, ma pensée originale était que l'Arduino échantillonne le signal basé sur cet échantillon, l'Arduino serait capable de dire quel bouton est enfoncé.
Lorsque le bouton 1 en rose est enfoncé, l'Arduino reçoit un échantillon suivant du signal.
843
848
849
849
849
849
// Time 0 when button is pushed
532
414
500
373
463
346
425
370
386
476
346
442
642
788
Déplacer l'entrée
// At t = 0 the Serial Monitor reads zero
998
998
998
998
998
0
0
0
0
0
998
0
0
0
0
0
0
0
0
0
998
0
0
0
0
998
0
0
0
998
998
998
0
998
0
0
0
998
0
0
0
0
Le déplacement de l'entrée analogique ne permet pas de distinguer plus facilement le bouton enfoncé. C'est pourquoi j'ai décidé de demander à la communauté comment gérer cela. J'ai essayé d'utiliser un relais et de coder simplement en dur tous les cas, mais le résultat est qu'un système n'est pas très robuste et est vulnérable à une rupture facile avec le temps.
Réponses
Il existe un moyen simple de lire plusieurs boutons-poussoirs à l'aide d'une seule entrée analogique.
Tout ce que vous avez à faire est de créer des diviseurs de tension à différentes tensions qui peuvent être lus à l'aide d'analogRead. La dernière résistance, R6, dans le schéma ci-dessous garantit que la broche lit 0 lorsqu'aucun bouton-poussoir n'est enfoncé (c.-à-d. Résistance pull-down). Dans le schéma ci-dessous, connectez Vcc à 5V sur l'Arduino.
Essayez-le, vous devriez pouvoir obtenir des valeurs bien espacées pour différents boutons poussoirs!
Après un jour ou deux de travail sur ce problème, j'ai trouvé qu'il était préférable d'éviter d'utiliser les broches analogiques et de ne pas interagir directement avec le 555 Timer. Il s'agit d'une version simplifiée d'un circuit plus complexe et le 555 Timer représente une source de signal arbitraire. Par exemple, sur la radio mobile, vous appuyez sur un bouton pour envoyer une certaine fréquence. C'est le concept ici, seules les fréquences ne peuvent pas encore être ajustées. Maintenant qu'il a été clarifié que le 555 Timer a été placé dans le circuit à des fins de débogage, voici la meilleure solution que j'ai trouvée à ce problème. Tout d'abord, j'ai trouvé qu'il était possible de lire à partir de la broche analogique de l'Arduino mais pas facile. Cela laisse beaucoup de place à l'erreur étant que la forme d'onde est arbitraire avec une fréquence aléatoire. Par conséquent, j'ai choisi d'utiliser les broches numériques sur l'Arduino.
const int D_pin10 = 10;
const int D_pin9 = 9;
const int D_pin8 = 8;
int led = 13;
void setup()
{
pinMode(D_pin10 , INPUT); // pin 10 is an input
pinMode(D_pin9 , INPUT); // pin 10 is an input
pinMode(D_pin8, INPUT); // pin 10 is an input
pinMode(led, OUTPUT);
}
void loop()
{
int High_Low10 =0;
int High_Low9 =0;
int High_Low8 =0;
High_Low10 = digitalRead(D_pin10);
High_Low9 = digitalRead(D_pin9);
High_Low8 = digitalRead(D_pin8);
if(High_Low10 == HIGH)
{
digitalWrite(led, HIGH);
}
else if(High_Low9 == HIGH)
{
digitalWrite(led, HIGH);
}
else if(High_Low8 == HIGH)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
delay(1000);
}