Gestion d'une source de signal

Oct 07 2020

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

3 SiddharthKothari Oct 07 2020 at 19:22

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!

1 DavidWisniewski Oct 09 2020 at 16:19

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.

en utilisant les broches numériques, je n'ai plus qu'à me soucier de savoir si le bouton est haut ou bas. Ensuite, les transistors NPN ont été utilisés pour agir comme interrupteurs une fois que le bouton est enfoncé. Les diodes ont ensuite été ajoutées pour maintenir une tension constante à travers la base du transistor. À des fins de test, l'écran LCD a été retiré et remplacé par une LED. En ce qui concerne le code, il n'y a rien d'extraordinaire ou de complexe comme indiqué ci-dessous. Par conséquent, je pense que c'est peut-être la meilleure façon de résoudre ce problème.

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);
}